Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
VehicleProviders.hpp
Go to the documentation of this file.
1// Vulcan Vehicle Providers
2// Providers for vehicle-relative frame edges (Body/Wind/Stability)
3#pragma once
4
7
8#include <janus/math/Quaternion.hpp>
9#include <janus/math/Trig.hpp>
10
11namespace vulcan {
12
14template <typename Scalar>
15class BodyProvider final : public TransformProvider<Scalar> {
16 public:
17 BodyProvider(Scalar yaw, Scalar pitch, Scalar roll)
18 : q_(janus::Quaternion<Scalar>::from_euler(roll, pitch, yaw)) {}
19
20 explicit BodyProvider(const janus::Quaternion<Scalar> &q_body_to_ned)
21 : q_(q_body_to_ned) {}
22
23 [[nodiscard]] Vec3<Scalar>
24 to_parent(const Vec3<Scalar> &v_body) const override {
25 return q_.rotate(v_body);
26 }
27
28 [[nodiscard]] Vec3<Scalar>
29 from_parent(const Vec3<Scalar> &v_ned) const override {
30 return q_.conjugate().rotate(v_ned);
31 }
32
33 [[nodiscard]] const janus::Quaternion<Scalar> &quaternion() const {
34 return q_;
35 }
36
37 private:
38 janus::Quaternion<Scalar> q_;
39};
40
42template <typename Scalar>
43class WindProvider final : public TransformProvider<Scalar> {
44 public:
45 WindProvider(Scalar alpha, Scalar beta) {
46 const Scalar ca = janus::cos(alpha);
47 const Scalar sa = janus::sin(alpha);
48 const Scalar cb = janus::cos(beta);
49 const Scalar sb = janus::sin(beta);
50
51 // v_body = R * v_wind
52 R_(0, 0) = ca * cb;
53 R_(0, 1) = -ca * sb;
54 R_(0, 2) = -sa;
55
56 R_(1, 0) = sb;
57 R_(1, 1) = cb;
58 R_(1, 2) = Scalar(0);
59
60 R_(2, 0) = sa * cb;
61 R_(2, 1) = -sa * sb;
62 R_(2, 2) = ca;
63 }
64
65 [[nodiscard]] Vec3<Scalar>
66 to_parent(const Vec3<Scalar> &v_wind) const override {
67 return R_ * v_wind;
68 }
69
70 [[nodiscard]] Vec3<Scalar>
71 from_parent(const Vec3<Scalar> &v_body) const override {
72 return R_.transpose() * v_body;
73 }
74
75 [[nodiscard]] const Mat3<Scalar> &dcm() const { return R_; }
76
77 private:
78 Mat3<Scalar> R_;
79};
80
82template <typename Scalar>
83class StabilityProvider final : public TransformProvider<Scalar> {
84 public:
85 explicit StabilityProvider(Scalar alpha) {
86 const Scalar ca = janus::cos(alpha);
87 const Scalar sa = janus::sin(alpha);
88
89 // v_body = R * v_stability
90 R_(0, 0) = ca;
91 R_(0, 1) = Scalar(0);
92 R_(0, 2) = -sa;
93
94 R_(1, 0) = Scalar(0);
95 R_(1, 1) = Scalar(1);
96 R_(1, 2) = Scalar(0);
97
98 R_(2, 0) = sa;
99 R_(2, 1) = Scalar(0);
100 R_(2, 2) = ca;
101 }
102
103 [[nodiscard]] Vec3<Scalar>
104 to_parent(const Vec3<Scalar> &v_stability) const override {
105 return R_ * v_stability;
106 }
107
108 [[nodiscard]] Vec3<Scalar>
109 from_parent(const Vec3<Scalar> &v_body) const override {
110 return R_.transpose() * v_body;
111 }
112
113 private:
114 Mat3<Scalar> R_;
115};
116
117} // namespace vulcan
const janus::Quaternion< Scalar > & quaternion() const
Definition VehicleProviders.hpp:33
Vec3< Scalar > from_parent(const Vec3< Scalar > &v_ned) const override
Definition VehicleProviders.hpp:29
Vec3< Scalar > to_parent(const Vec3< Scalar > &v_body) const override
Definition VehicleProviders.hpp:24
BodyProvider(const janus::Quaternion< Scalar > &q_body_to_ned)
Definition VehicleProviders.hpp:20
BodyProvider(Scalar yaw, Scalar pitch, Scalar roll)
Definition VehicleProviders.hpp:17
StabilityProvider(Scalar alpha)
Definition VehicleProviders.hpp:85
Vec3< Scalar > from_parent(const Vec3< Scalar > &v_body) const override
Definition VehicleProviders.hpp:109
Vec3< Scalar > to_parent(const Vec3< Scalar > &v_stability) const override
Definition VehicleProviders.hpp:104
const Mat3< Scalar > & dcm() const
Definition VehicleProviders.hpp:75
Vec3< Scalar > to_parent(const Vec3< Scalar > &v_wind) const override
Definition VehicleProviders.hpp:66
WindProvider(Scalar alpha, Scalar beta)
Definition VehicleProviders.hpp:45
Vec3< Scalar > from_parent(const Vec3< Scalar > &v_body) const override
Definition VehicleProviders.hpp:71
Definition Aerodynamics.hpp:11
Interface for a frame edge transform (child <-> parent).
Definition TransformProvider.hpp:16