Source code for RCAIDE.Library.Mission.Common.Update.curvilinear_inertial_horizontal_position
# RCAIDE/Library/Missions/Common/Update/curvilinear_inertial_horizontal_position.py
#
#
# Created: September 2023, M. Clarke
# ----------------------------------------------------------------------------------------------------------------------
# IMPORT
# ----------------------------------------------------------------------------------------------------------------------
# Package imports
import numpy as np
from RCAIDE.Framework.Core import Units
# ----------------------------------------------------------------------------------------------------------------------
# Integrate Position
# ----------------------------------------------------------------------------------------------------------------------
[docs]
def curvilinear_inertial_horizontal_position(segment):
""" Determines how far the airplane has traveled and calculates position.
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 = conditions.frames.planet.true_heading
x0 = conditions.frames.inertial.position_vector[0, 0]
y0 = conditions.frames.inertial.position_vector[0, 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
R = segment.turn_radius
sign = np.sign(segment.turn_angle)
# integrate
speed = np.sqrt(vx[:, 0]**2+vx[:, 1]**2)
arc_length = np.dot(I,speed)
theta = psi - sign * 90 * Units.degrees # Angle from circle center to the flight trajectory
beta = psi[0, 0] + sign * 90 * Units.degrees # Angle to the center of the circle from the initial position
delta_x = R * np.cos(beta) + R * np.cos(theta) # vector addition with a vector from the starting point to the center and then from the center to the position
delta_y = R * np.sin(beta) + R * np.sin(theta)
x_position = x0 + delta_x
y_position = y0 + delta_y
# pack
conditions.frames.inertial.position_vector[:,0] = x_position[:,0]
conditions.frames.inertial.position_vector[:,1] = y_position[:,0]
conditions.frames.inertial.aircraft_range[:,0] = R0 + arc_length
return