8#include <janus/math/Trig.hpp>
29template <
typename Scalar>
47template <
typename Scalar>
74template <
typename Scalar>
76 Scalar sin_lat = janus::sin(lat_gc);
77 Scalar cos_lat = janus::cos(lat_gc);
78 Scalar sin_lon = janus::sin(lon);
79 Scalar cos_lon = janus::cos(lon);
85 north << -sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat;
90 east << -sin_lon, cos_lon, Scalar(0);
95 down << -cos_lat * cos_lon, -cos_lat * sin_lon, -sin_lat;
108template <
typename Scalar>
123template <
typename Scalar>
124CoordinateFrame<Scalar>
140template <
typename Scalar>
141CoordinateFrame<Scalar>
169template <
typename Scalar>
170CoordinateFrame<Scalar>
172 const Scalar &elevation,
175 const Scalar sin_lat = janus::sin(lla_origin.
lat);
176 const Scalar cos_lat = janus::cos(lla_origin.
lat);
177 const Scalar sin_lon = janus::sin(lla_origin.
lon);
178 const Scalar cos_lon = janus::cos(lla_origin.
lon);
182 north << -sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat;
185 east << -sin_lon, cos_lon, Scalar(0);
188 down << -cos_lat * cos_lon, -cos_lat * sin_lon, -sin_lat;
191 const Scalar sin_az = janus::sin(azimuth);
192 const Scalar cos_az = janus::cos(azimuth);
193 const Scalar sin_el = janus::sin(elevation);
194 const Scalar cos_el = janus::cos(elevation);
198 Vec3<Scalar> horiz_fwd = cos_az * north + sin_az * east;
201 Vec3<Scalar> horiz_right = -sin_az * north + cos_az * east;
205 Vec3<Scalar> rail_x = cos_el * horiz_fwd - sin_el * down;
208 Vec3<Scalar> rail_y = horiz_right;
211 Vec3<Scalar> rail_z = sin_el * horiz_fwd + cos_el * down;
214 Vec3<Scalar>::Zero());
227template <
typename Scalar>
228CoordinateFrame<Scalar>
230 const Scalar &elevation,
233 return local_rail(lla, azimuth, elevation, m);
256template <
typename Scalar>
257CoordinateFrame<Scalar>
261 const Scalar sin_lat = janus::sin(lla_origin.
lat);
262 const Scalar cos_lat = janus::cos(lla_origin.
lat);
263 const Scalar sin_lon = janus::sin(lla_origin.
lon);
264 const Scalar cos_lon = janus::cos(lla_origin.
lon);
268 east << -sin_lon, cos_lon, Scalar(0);
271 north << -sin_lat * cos_lon, -sin_lat * sin_lon, cos_lat;
274 up << cos_lat * cos_lon, cos_lat * sin_lon, sin_lat;
279 const Scalar sin_b = janus::sin(bearing);
280 const Scalar cos_b = janus::cos(bearing);
282 Vec3<Scalar> downrange = cos_b * north + sin_b * east;
283 Vec3<Scalar> crossrange = -sin_b * north + cos_b * east;
287 Vec3<Scalar>::Zero());
299template <
typename Scalar>
300CoordinateFrame<Scalar>
322template <
typename Scalar>
324 const Scalar &bearing,
333 Vec3<Scalar> delta = r_ecef - r_ref;
338 cda(0) = delta.dot(cda_frame.
x_axis);
339 cda(1) = delta.dot(cda_frame.
y_axis);
340 cda(2) = delta.dot(cda_frame.
z_axis);
355template <
typename Scalar>
357 const Scalar &bearing,
367 Vec3<Scalar> delta = cda(0) * cda_frame.
x_axis + cda(1) * cda_frame.
y_axis +
368 cda(2) * cda_frame.
z_axis;
370 return r_ref + delta;
Definition Aerodynamics.hpp:11
CoordinateFrame< Scalar > local_enu(Scalar lon, Scalar lat_gd)
Definition FrameLocal.hpp:48
CoordinateFrame< Scalar > local_geocentric(Scalar lon, Scalar lat_gc)
Definition FrameLocal.hpp:75
CoordinateFrame< Scalar > local_enu_at(const Vec3< Scalar > &r_ecef, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:142
CoordinateFrame< Scalar > local_ned(Scalar lon, Scalar lat_gd)
Definition FrameLocal.hpp:30
CoordinateFrame< Scalar > local_rail(const LLA< Scalar > &lla_origin, const Scalar &azimuth, const Scalar &elevation, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:171
Vec3< Scalar > lla_to_ecef(const LLA< Scalar > &lla, const EarthModel &m=EarthModel::WGS84())
Definition Geodetic.hpp:152
Vec3< Scalar > ecef_to_cda(const Vec3< Scalar > &r_ecef, const LLA< Scalar > &lla_ref, const Scalar &bearing, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:323
Spherical< Scalar > ecef_to_spherical(const Vec3< Scalar > &r)
Definition Geodetic.hpp:190
CoordinateFrame< Scalar > local_rail_at(const Vec3< Scalar > &r_ecef, const Scalar &azimuth, const Scalar &elevation, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:229
LLA< Scalar > ecef_to_lla(const Vec3< Scalar > &r, const EarthModel &m=EarthModel::WGS84())
Definition Geodetic.hpp:78
Vec3< Scalar > cda_to_ecef(const Vec3< Scalar > &cda, const LLA< Scalar > &lla_ref, const Scalar &bearing, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:356
CoordinateFrame< Scalar > local_cda_at(const Vec3< Scalar > &r_ecef, const Scalar &bearing, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:301
CoordinateFrame< Scalar > local_cda(const LLA< Scalar > &lla_origin, const Scalar &bearing, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:258
CoordinateFrame< Scalar > local_geocentric_at(const Vec3< Scalar > &r_ecef)
Definition FrameLocal.hpp:109
CoordinateFrame< Scalar > local_ned_at(const Vec3< Scalar > &r_ecef, const EarthModel &m=EarthModel::WGS84())
Definition FrameLocal.hpp:125
Definition FramePrimitives.hpp:44
Vec3< Scalar > y_axis
Unit Y basis vector in ECEF.
Definition FramePrimitives.hpp:46
static CoordinateFrame enu(Scalar lon, Scalar lat)
Definition FramePrimitives.hpp:301
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 > x_axis
Unit X basis vector in ECEF.
Definition FramePrimitives.hpp:45
Definition EarthModel.hpp:27
static constexpr EarthModel WGS84()
WGS84 reference ellipsoid (most common for GPS/navigation).
Definition EarthModel.hpp:45
Definition Geodetic.hpp:27
Scalar lon
Longitude [rad], positive East, range [-π, π].
Definition Geodetic.hpp:28
Scalar lat
Geodetic latitude [rad], range [-π/2, π/2].
Definition Geodetic.hpp:29
Definition Geodetic.hpp:49
Scalar lon
Longitude [rad], positive East, range [-π, π].
Definition Geodetic.hpp:50
Scalar lat_gc
Geocentric latitude [rad], range [-π/2, π/2].
Definition Geodetic.hpp:51