9#include <janus/math/Linalg.hpp>
30template <
typename Scalar>
32 const Vec3<Scalar> &r_ecef,
36 Vec3<Scalar> omega_ecef;
37 omega_ecef << Scalar(0), Scalar(0), Scalar(m.omega);
40 Vec3<Scalar> omega_cross_r = janus::cross(omega_ecef, r_ecef);
44 Vec3<Scalar> v_ecef_inertial = v_ecef + omega_cross_r;
61template <
typename Scalar>
63 const Vec3<Scalar> &r_ecef,
67 Vec3<Scalar> v_ecef_inertial = eci.
to_ecef(v_eci);
70 Vec3<Scalar> omega_ecef;
71 omega_ecef << Scalar(0), Scalar(0), Scalar(m.omega);
74 Vec3<Scalar> omega_cross_r = janus::cross(omega_ecef, r_ecef);
76 return v_ecef_inertial - omega_cross_r;
105template <
typename Scalar>
107 const Vec3<Scalar> &v_ecef,
111 omega << Scalar(0), Scalar(0), Scalar(m.omega);
114 Vec3<Scalar> coriolis = Scalar(-2) * janus::cross(omega, v_ecef);
117 Vec3<Scalar> omega_cross_r = janus::cross(omega, r_ecef);
118 Vec3<Scalar> centrifugal = -janus::cross(omega, omega_cross_r);
120 return coriolis + centrifugal;
129template <
typename Scalar>
133 omega << Scalar(0), Scalar(0), Scalar(m.omega);
135 return Scalar(-2) * janus::cross(omega, v_ecef);
144template <
typename Scalar>
149 omega << Scalar(0), Scalar(0), Scalar(m.omega);
151 Vec3<Scalar> omega_cross_r = janus::cross(omega, r_ecef);
152 return -janus::cross(omega, omega_cross_r);
165template <
typename Scalar>
167 const Vec3<Scalar> &r_observer) {
168 return r_target - r_observer;
177template <
typename Scalar>
178Scalar
range(
const Vec3<Scalar> &r1,
const Vec3<Scalar> &r2) {
179 return janus::norm(r1 - r2);
190template <
typename Scalar>
191Scalar
range_rate(
const Vec3<Scalar> &r_target,
const Vec3<Scalar> &v_target,
192 const Vec3<Scalar> &r_observer,
193 const Vec3<Scalar> &v_observer) {
194 Vec3<Scalar> r_rel = r_target - r_observer;
195 Vec3<Scalar> v_rel = v_target - v_observer;
197 Scalar r_mag = janus::norm(r_rel);
198 Scalar eps = Scalar(1e-10);
199 Scalar is_zero = r_mag < eps;
202 Scalar rdot = janus::dot(r_rel, v_rel) / r_mag;
205 return janus::where(is_zero, Scalar(0), rdot);
229template <
typename Scalar>
233 Scalar sin_lat = janus::sin(lat);
234 Scalar cos_lat = janus::cos(lat);
237 Scalar denom = janus::sqrt(Scalar(1) - Scalar(m.e2) * sin_lat * sin_lat);
239 Scalar(m.a) * (Scalar(1) - Scalar(m.e2)) / (denom * denom * denom);
243 Scalar R_e = Scalar(m.a) / denom + alt;
247 omega << -v_ned(0) / R_n, v_ned(1) / R_e, v_ned(1) * janus::tan(lat) / R_e;
264template <
typename Scalar>
272 Scalar sin_lat = janus::sin(lat);
273 Scalar cos_lat = janus::cos(lat);
275 Vec3<Scalar> omega_earth_ned;
276 omega_earth_ned << Scalar(m.omega) * cos_lat, Scalar(0),
277 -Scalar(m.omega) * sin_lat;
279 return omega_ned_ecef + omega_earth_ned;
Definition Aerodynamics.hpp:11
Scalar range(const Vec3< Scalar > &r1, const Vec3< Scalar > &r2)
Definition FrameKinematics.hpp:178
Vec3< Scalar > coriolis_centrifugal(const Vec3< Scalar > &r_ecef, const Vec3< Scalar > &v_ecef, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:106
Vec3< Scalar > centrifugal_acceleration(const Vec3< Scalar > &r_ecef, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:146
Vec3< Scalar > velocity_eci_to_ecef(const Vec3< Scalar > &v_eci, const Vec3< Scalar > &r_ecef, const CoordinateFrame< Scalar > &eci, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:62
Vec3< Scalar > coriolis_acceleration(const Vec3< Scalar > &v_ecef, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:130
Vec3< Scalar > velocity_ecef_to_eci(const Vec3< Scalar > &v_ecef, const Vec3< Scalar > &r_ecef, const CoordinateFrame< Scalar > &eci, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:31
Scalar range_rate(const Vec3< Scalar > &r_target, const Vec3< Scalar > &v_target, const Vec3< Scalar > &r_observer, const Vec3< Scalar > &v_observer)
Definition FrameKinematics.hpp:191
Vec3< Scalar > relative_position(const Vec3< Scalar > &r_target, const Vec3< Scalar > &r_observer)
Definition FrameKinematics.hpp:166
Vec3< Scalar > omega_ned_wrt_eci(const Vec3< Scalar > &v_ned, Scalar lat, Scalar alt, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:265
Vec3< Scalar > omega_ned_wrt_ecef(const Vec3< Scalar > &v_ned, Scalar lat, Scalar alt, const EarthModel &m=EarthModel::WGS84())
Definition FrameKinematics.hpp:230
Definition FramePrimitives.hpp:44
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
Definition EarthModel.hpp:27
static constexpr EarthModel WGS84()
WGS84 reference ellipsoid (most common for GPS/navigation).
Definition EarthModel.hpp:45