Source code for RCAIDE.Library.Mission.Common.Unpack_Unknowns.orientation
# RCAIDE/Library/Missions/Common/Unpack_Unknowns/orientation.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# Unpack Unknowns
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def orientation(segment):
"""
Updates vehicle orientation states from solver unknowns
Parameters
----------
segment : Segment
The mission segment being analyzed
- assigned_control_variables : Data
Control configurations
- body_angle : Control
Body angle control settings
- bank_angle : Control
Bank angle control settings
- velocity : Control
Velocity control settings
- altitude : Control
Altitude control settings
- trim_lift_coefficient : float, optional
Target lift coefficient for trim
- angle_of_attack : float
Fixed angle of attack [rad]
- bank_angle : float
Fixed bank angle [rad]
- state : Data
Current segment state
- conditions : Data
Flight conditions
- frames.body.inertial_rotations : array
Body orientation angles [rad]
- frames.planet.true_heading : array
Vehicle heading [rad]
- frames.inertial.velocity_vector : array
Vehicle velocity [m/s]
- frames.inertial.position_vector : array
Vehicle position [m]
- unknowns : Data
Solver variables
- body_angle : array
Body angle values [rad]
- bank_angle : array
Bank angle values [rad]
- velocity : array
Velocity values [m/s]
- altitude : array
Altitude values [m]
- ones_row : function
Creates array of ones with specified columns
Returns
-------
None
Updates segment conditions directly
Notes
-----
This function applies orientation-related solver values to the segment state,
handling body angles, trim conditions, and trajectory controls. It manages
both active control and fixed orientation cases.
The function processes:
1. Body angle control
- Trim conditions
- Active angle control
- Fixed angle of attack
2. Bank angle control
- Active bank control
- Fixed bank angle
3. Heading alignment
4. Velocity control
5. Altitude control
**Major Assumptions**
* Valid angle definitions
* Proper control assignments
* Compatible trim conditions
* Well-defined reference frames
See Also
--------
RCAIDE.Framework.Mission.Segments
"""
ctrls = segment.assigned_control_variables
# Body Angle Control
if segment.trim_lift_coefficient != None:
segment.state.conditions.aerodynamics.coefficients.lift.total = segment.trim_lift_coefficient * segment.state.ones_row(1)
else:
if ctrls.body_angle.active:
segment.state.conditions.frames.body.inertial_rotations[:,1] = segment.state.unknowns.body_angle[:,0]
else:
segment.state.conditions.frames.body.inertial_rotations[:,1] = segment.angle_of_attack
if ctrls.bank_angle.active:
segment.state.conditions.frames.body.inertial_rotations[:,0] = segment.state.unknowns.bank_angle[:,0]
else:
segment.state.conditions.frames.body.inertial_rotations[:,0] = segment.bank_angle
segment.state.conditions.frames.body.inertial_rotations[:,2] = segment.state.conditions.frames.planet.true_heading[:,0]
# Velocity Control
if ctrls.velocity.active:
segment.state.conditions.frames.inertial.velocity_vector[:,0] = segment.state.unknowns.velocity[:,0]
# Altitude Control
if ctrls.altitude.active:
segment.state.conditions.frames.inertial.position_vector[:,2] = -segment.state.unknowns.altitude[:,0]
return