11#include <janus/math/Linalg.hpp>
12#include <janus/math/Quaternion.hpp>
13#include <janus/math/Trig.hpp>
27template <
typename Scalar>
30 const janus::Quaternion<Scalar> &q_body_to_ned) {
36 Vec3<Scalar> x_body = Vec3<Scalar>::UnitX();
37 Vec3<Scalar> y_body = Vec3<Scalar>::UnitY();
38 Vec3<Scalar> z_body = Vec3<Scalar>::UnitZ();
41 Vec3<Scalar> x_body_ned = q_body_to_ned.rotate(x_body);
42 Vec3<Scalar> y_body_ned = q_body_to_ned.rotate(y_body);
43 Vec3<Scalar> z_body_ned = q_body_to_ned.rotate(z_body);
46 Vec3<Scalar> x_body_ecef = ned.
to_ecef(x_body_ned);
47 Vec3<Scalar> y_body_ecef = ned.
to_ecef(y_body_ned);
48 Vec3<Scalar> z_body_ecef = ned.
to_ecef(z_body_ned);
60template <
typename Scalar>
61janus::Quaternion<Scalar>
72 R.col(0) = x_body_ned;
73 R.col(1) = y_body_ned;
74 R.col(2) = z_body_ned;
78 return janus::Quaternion<Scalar>::from_rotation_matrix(R);
98template <
typename Scalar>
100 Scalar yaw, Scalar pitch, Scalar roll) {
103 auto q = janus::Quaternion<Scalar>::from_euler(roll, pitch, yaw);
122template <
typename Scalar>
153template <
typename Scalar>
157 Vec3<Scalar> v_ned = ned.
from_ecef(velocity_ecef);
160 Scalar v_mag = janus::norm(velocity_ecef);
161 Scalar eps = Scalar(1e-10);
164 Scalar is_zero = v_mag < eps;
167 Vec3<Scalar> x_vel_ned;
168 x_vel_ned << v_ned(0) / v_mag, v_ned(1) / v_mag, v_ned(2) / v_mag;
171 x_vel_ned(0) = janus::where(is_zero, Scalar(1), x_vel_ned(0));
172 x_vel_ned(1) = janus::where(is_zero, Scalar(0), x_vel_ned(1));
173 x_vel_ned(2) = janus::where(is_zero, Scalar(0), x_vel_ned(2));
176 Scalar v_horiz = janus::sqrt(v_ned(0) * v_ned(0) + v_ned(1) * v_ned(1));
177 Scalar is_vertical = v_horiz < eps;
180 Vec3<Scalar> y_vel_ned;
181 y_vel_ned << v_ned(1) / v_horiz, -v_ned(0) / v_horiz, Scalar(0);
184 y_vel_ned(0) = janus::where(is_vertical, Scalar(0), y_vel_ned(0));
185 y_vel_ned(1) = janus::where(is_vertical, Scalar(1), y_vel_ned(1));
186 y_vel_ned(2) = janus::where(is_vertical, Scalar(0), y_vel_ned(2));
189 y_vel_ned(0) = janus::where(is_zero, Scalar(0), y_vel_ned(0));
190 y_vel_ned(1) = janus::where(is_zero, Scalar(1), y_vel_ned(1));
193 Vec3<Scalar> z_vel_ned = janus::cross(x_vel_ned, y_vel_ned);
196 Vec3<Scalar> x_vel = ned.
to_ecef(x_vel_ned);
197 Vec3<Scalar> y_vel = ned.
to_ecef(y_vel_ned);
198 Vec3<Scalar> z_vel = ned.
to_ecef(z_vel_ned);
214template <
typename Scalar>
216 Scalar vn = velocity_ned(0);
217 Scalar ve = velocity_ned(1);
218 Scalar vd = velocity_ned(2);
221 Scalar v_horiz = janus::sqrt(vn * vn + ve * ve);
224 Scalar v_total = janus::norm(velocity_ned);
225 Scalar eps = Scalar(1e-10);
226 Scalar is_zero = v_total < eps;
230 Scalar gamma = janus::atan2(-vd, v_horiz);
231 gamma = janus::where(is_zero, Scalar(0), gamma);
234 Scalar psi = janus::atan2(ve, vn);
235 psi = janus::where(is_zero, Scalar(0), psi);
238 angles << gamma, psi;
248template <
typename Scalar>
251 Vec3<Scalar> v_ned = ned.
from_ecef(velocity_ecef);
269template <
typename Scalar>
272 Vec3<Scalar> v_body = body.
from_ecef(velocity_ecef);
Vec2< Scalar > aero_angles(const Vec3< Scalar > &velocity_body)
Compute aerodynamic angles from velocity in body frame.
Definition Aerodynamics.hpp:113
Definition Aerodynamics.hpp:11
Vec3< Scalar > euler_from_body(const CoordinateFrame< Scalar > &body, const CoordinateFrame< Scalar > &ned)
Definition FrameVehicle.hpp:123
Vec2< Scalar > aero_angles(const Vec3< Scalar > &velocity_ecef, const CoordinateFrame< Scalar > &body)
Definition FrameVehicle.hpp:270
CoordinateFrame< Scalar > velocity_frame(const Vec3< Scalar > &velocity_ecef, const CoordinateFrame< Scalar > &ned)
Definition FrameVehicle.hpp:154
CoordinateFrame< Scalar > body_from_euler(const CoordinateFrame< Scalar > &ned, Scalar yaw, Scalar pitch, Scalar roll)
Definition FrameVehicle.hpp:99
Vec3< Scalar > euler_from_dcm(const Mat3< Scalar > &R, EulerSequence seq)
Definition EulerSequences.hpp:520
janus::Quaternion< Scalar > quaternion_from_body(const CoordinateFrame< Scalar > &body, const CoordinateFrame< Scalar > &ned)
Definition FrameVehicle.hpp:62
CoordinateFrame< Scalar > body_from_quaternion(const CoordinateFrame< Scalar > &ned, const janus::Quaternion< Scalar > &q_body_to_ned)
Definition FrameVehicle.hpp:29
Vec2< Scalar > flight_path_angles(const Vec3< Scalar > &velocity_ned)
Definition FrameVehicle.hpp:215
@ ZYX
Yaw-Pitch-Roll (aerospace standard).
Definition EulerSequences.hpp:39
Definition FramePrimitives.hpp:44
Vec3< Scalar > y_axis
Unit Y basis vector in ECEF.
Definition FramePrimitives.hpp:46
Vec3< Scalar > to_ecef(const Vec3< Scalar > &v) const
Definition FramePrimitives.hpp:90
Vec3< Scalar > from_ecef(const Vec3< Scalar > &v) const
Definition FramePrimitives.hpp:75
Vec3< Scalar > z_axis
Unit Z basis vector in ECEF.
Definition FramePrimitives.hpp:47
Vec3< Scalar > origin
Frame origin in ECEF [m].
Definition FramePrimitives.hpp:48
Vec3< Scalar > x_axis
Unit X basis vector in ECEF.
Definition FramePrimitives.hpp:45