Source code for RCAIDE.Library.Mission.Common.Update.linear_inertial_horizontal_position
# RCAIDE/Library/Missions/Common/Update/linear_inertial_horizontal_position.py
#
#
# Created: Jul 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# RCAIDE imports
import RCAIDE
# Package imports
import numpy as np
# ----------------------------------------------------------------------------------------------------------------------
# Integrate Position
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def linear_inertial_horizontal_position(segment):
""" Determines how far the airplane has traveled.
Assumptions:
Assumes a flat earth, this is planar motion.
Inputs:
segment.state.conditions:
frames.inertial.position_vector [meters]
frames.inertial.velocity_vector [meters/second]
segment.state.numerics.time.integrate [float]
Outputs:
segment.state.conditions:
frames.inertial.position_vector [meters]
Properties Used:
N/A
"""
conditions = segment.state.conditions
psi = segment.true_course # sign convetion is clockwise positive
cpts = int(segment.state.numerics.number_of_control_points)
x0 = conditions.frames.inertial.position_vector[0,None,0:1+1]
R0 = conditions.frames.inertial.aircraft_range[0,None,0:1+1]
vx = conditions.frames.inertial.velocity_vector[:,0:1+1]
I = segment.state.numerics.time.integrate
trajectory = np.repeat( np.atleast_2d(np.array([np.cos(psi),np.sin(psi)])),cpts , axis = 0)
# integrate to compute position credit
x = np.dot(I,vx)
x[:,1] = x[:,0]
conditions.frames.inertial.position_vector[:,0:1+1] = x0 + x[:,:]*trajectory
# do not apply apply range credit for loiter
if type(segment) == RCAIDE.Framework.Mission.Segments.Cruise.Constant_Dynamic_Pressure_Constant_Altitude_Loiter or \
type(segment) == RCAIDE.Framework.Mission.Segments.Cruise.Constant_Mach_Constant_Altitude_Loiter or \
type(segment) == RCAIDE.Framework.Mission.Segments.Cruise.Constant_Speed_Constant_Altitude_Loiter:
conditions.frames.inertial.aircraft_range[:,0] = R0[0]
else:
conditions.frames.inertial.aircraft_range[:,0] = R0 + x[:,0]
# compute climb rate
conditions.frames.inertial.climb_rate[:,0] = np.gradient(-conditions.frames.inertial.position_vector[:,2],conditions.frames.inertial.time[:,0] )
return