8#include <janus/math/Linalg.hpp>
9#include <janus/math/Quaternion.hpp>
10#include <janus/math/Rotations.hpp>
11#include <janus/math/Trig.hpp>
56 :
x_axis(Vec3<Scalar>::UnitX()),
y_axis(Vec3<Scalar>::UnitY()),
57 z_axis(Vec3<Scalar>::UnitZ()),
origin(Vec3<Scalar>::Zero()) {}
61 const Vec3<Scalar> &z,
const Vec3<Scalar> &o)
75 [[nodiscard]] Vec3<Scalar>
from_ecef(
const Vec3<Scalar> &v)
const {
77 result(0) = janus::dot(v,
x_axis);
78 result(1) = janus::dot(v,
y_axis);
79 result(2) = janus::dot(v,
z_axis);
90 [[nodiscard]] Vec3<Scalar>
to_ecef(
const Vec3<Scalar> &v)
const {
98 [[nodiscard]] Vec3<Scalar>
100 Vec3<Scalar> relative = pos_ecef -
origin;
108 [[nodiscard]] Vec3<Scalar>
123 [[nodiscard]] Mat3<Scalar>
dcm()
const {
156 return janus::Quaternion<Scalar>::from_rotation_matrix(
dcm_inverse());
169 const Vec3<Scalar> &o = Vec3<Scalar>::Zero()) {
172 Mat3<Scalar> R = q.to_rotation_matrix();
173 Mat3<Scalar> R_T = R.transpose();
189 [[nodiscard]]
bool is_valid(
double tol = 1e-9)
const {
190 if constexpr (std::is_floating_point_v<Scalar>) {
192 double norm_x =
x_axis.norm();
193 double norm_y =
y_axis.norm();
194 double norm_z =
z_axis.norm();
195 if (std::abs(norm_x - 1.0) > tol)
197 if (std::abs(norm_y - 1.0) > tol)
199 if (std::abs(norm_z - 1.0) > tol)
206 if (std::abs(dot_xy) > tol)
208 if (std::abs(dot_yz) > tol)
210 if (std::abs(dot_xz) > tol)
247 Scalar c = janus::cos(gmst);
248 Scalar s = janus::sin(gmst);
250 Vec3<Scalar> x_eci, y_eci, z_eci;
251 x_eci << c, -s, Scalar(0);
252 y_eci << s, c, Scalar(0);
253 z_eci << Scalar(0), Scalar(0), Scalar(1);
270 Scalar sin_lat = janus::sin(lat);
271 Scalar cos_lat = janus::cos(lat);
272 Scalar sin_lon = janus::sin(lon);
273 Scalar cos_lon = janus::cos(lon);
277 north << -sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat;
281 east << -sin_lon, cos_lon, Scalar(0);
285 down << -cos_lat * cos_lon, -cos_lat * sin_lon, -sin_lat;
302 Scalar sin_lat = janus::sin(lat);
303 Scalar cos_lat = janus::cos(lat);
304 Scalar sin_lon = janus::sin(lon);
305 Scalar cos_lon = janus::cos(lon);
309 east << -sin_lon, cos_lon, Scalar(0);
313 north << -sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat;
317 up << cos_lat * cos_lon, cos_lat * sin_lon, sin_lat;
333template <
typename Scalar>
338 Vec3<Scalar> v_ecef = from.
to_ecef(v);
350template <
typename Scalar>
Definition Aerodynamics.hpp:11
Vec3< Scalar > transform_vector(const Vec3< Scalar > &v, const CoordinateFrame< Scalar > &from, const CoordinateFrame< Scalar > &to)
Definition FramePrimitives.hpp:334
Vec3< Scalar > transform_position(const Vec3< Scalar > &pos, const CoordinateFrame< Scalar > &from, const CoordinateFrame< Scalar > &to)
Definition FramePrimitives.hpp:351
Definition FramePrimitives.hpp:44
Vec3< Scalar > position_from_ecef(const Vec3< Scalar > &pos_ecef) const
Definition FramePrimitives.hpp:99
Vec3< Scalar > y_axis
Unit Y basis vector in ECEF.
Definition FramePrimitives.hpp:46
Mat3< Scalar > dcm() const
Definition FramePrimitives.hpp:123
Vec3< Scalar > to_ecef(const Vec3< Scalar > &v) const
Definition FramePrimitives.hpp:90
Vec3< Scalar > position_to_ecef(const Vec3< Scalar > &pos_local) const
Definition FramePrimitives.hpp:109
static CoordinateFrame eci(Scalar gmst)
Definition FramePrimitives.hpp:243
CoordinateFrame(const Vec3< Scalar > &x, const Vec3< Scalar > &y, const Vec3< Scalar > &z, const Vec3< Scalar > &o)
Construct from basis vectors and origin.
Definition FramePrimitives.hpp:60
static CoordinateFrame ecef()
Definition FramePrimitives.hpp:231
static CoordinateFrame enu(Scalar lon, Scalar lat)
Definition FramePrimitives.hpp:301
static CoordinateFrame from_quaternion(const janus::Quaternion< Scalar > &q, const Vec3< Scalar > &o=Vec3< Scalar >::Zero())
Definition FramePrimitives.hpp:168
Vec3< Scalar > from_ecef(const Vec3< Scalar > &v) const
Definition FramePrimitives.hpp:75
bool is_valid(double tol=1e-9) const
Definition FramePrimitives.hpp:189
Vec3< Scalar > z_axis
Unit Z basis vector in ECEF.
Definition FramePrimitives.hpp:47
static CoordinateFrame ned(Scalar lon, Scalar lat)
Definition FramePrimitives.hpp:269
Vec3< Scalar > origin
Frame origin in ECEF [m].
Definition FramePrimitives.hpp:48
Mat3< Scalar > dcm_inverse() const
Definition FramePrimitives.hpp:139
CoordinateFrame()
Default constructor - creates ECEF identity frame.
Definition FramePrimitives.hpp:55
Vec3< Scalar > x_axis
Unit X basis vector in ECEF.
Definition FramePrimitives.hpp:45
janus::Quaternion< Scalar > quaternion() const
Definition FramePrimitives.hpp:151