Vulcan
Aerospace Engineering Utilities Built on Janus
Loading...
Searching...
No Matches
TransformProvider.hpp
Go to the documentation of this file.
1// Vulcan Transform Providers
2// Edge-local transform interface for frame-tree execution
3#pragma once
4
7
8#include <janus/math/Quaternion.hpp>
9
10#include <memory>
11#include <utility>
12
13namespace vulcan {
14
16template <typename Scalar> struct TransformProvider {
17 virtual ~TransformProvider() = default;
18
19 [[nodiscard]] virtual Vec3<Scalar>
20 to_parent(const Vec3<Scalar> &v) const = 0;
21
22 [[nodiscard]] virtual Vec3<Scalar>
23 from_parent(const Vec3<Scalar> &v) const = 0;
24
25 [[nodiscard]] virtual Vec3<Scalar>
26 position_to_parent(const Vec3<Scalar> &pos) const {
27 return to_parent(pos);
28 }
29
30 [[nodiscard]] virtual Vec3<Scalar>
31 position_from_parent(const Vec3<Scalar> &pos) const {
32 return from_parent(pos);
33 }
34};
35
37template <typename Scalar>
38class CoordinateFrameProvider final : public TransformProvider<Scalar> {
39 public:
41 : frame_(std::move(frame)) {}
42
43 [[nodiscard]] Vec3<Scalar> to_parent(const Vec3<Scalar> &v) const override {
44 return frame_.to_ecef(v);
45 }
46
47 [[nodiscard]] Vec3<Scalar>
48 from_parent(const Vec3<Scalar> &v) const override {
49 return frame_.from_ecef(v);
50 }
51
52 [[nodiscard]] Vec3<Scalar>
53 position_to_parent(const Vec3<Scalar> &pos) const override {
54 return frame_.position_to_ecef(pos);
55 }
56
57 [[nodiscard]] Vec3<Scalar>
58 position_from_parent(const Vec3<Scalar> &pos) const override {
59 return frame_.position_from_ecef(pos);
60 }
61
62 [[nodiscard]] const CoordinateFrame<Scalar> &frame() const {
63 return frame_;
64 }
65
66 private:
68};
69
71template <typename Scalar>
72class DCMProvider final : public TransformProvider<Scalar> {
73 public:
74 explicit DCMProvider(const Mat3<Scalar> &R_child_to_parent)
75 : R_(R_child_to_parent) {}
76
77 [[nodiscard]] Vec3<Scalar> to_parent(const Vec3<Scalar> &v) const override {
78 return R_ * v;
79 }
80
81 [[nodiscard]] Vec3<Scalar>
82 from_parent(const Vec3<Scalar> &v) const override {
83 return R_.transpose() * v;
84 }
85
86 private:
87 Mat3<Scalar> R_;
88};
89
91template <typename Scalar>
92class QuaternionProvider final : public TransformProvider<Scalar> {
93 public:
95 const janus::Quaternion<Scalar> &q_child_to_parent)
96 : q_(q_child_to_parent) {}
97
98 [[nodiscard]] Vec3<Scalar> to_parent(const Vec3<Scalar> &v) const override {
99 return q_.rotate(v);
100 }
101
102 [[nodiscard]] Vec3<Scalar>
103 from_parent(const Vec3<Scalar> &v) const override {
104 return q_.conjugate().rotate(v);
105 }
106
107 private:
108 janus::Quaternion<Scalar> q_;
109};
110
111} // namespace vulcan
Vec3< Scalar > to_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:43
const CoordinateFrame< Scalar > & frame() const
Definition TransformProvider.hpp:62
CoordinateFrameProvider(CoordinateFrame< Scalar > frame)
Definition TransformProvider.hpp:40
Vec3< Scalar > position_from_parent(const Vec3< Scalar > &pos) const override
Definition TransformProvider.hpp:58
Vec3< Scalar > position_to_parent(const Vec3< Scalar > &pos) const override
Definition TransformProvider.hpp:53
Vec3< Scalar > from_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:48
Vec3< Scalar > to_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:77
Vec3< Scalar > from_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:82
DCMProvider(const Mat3< Scalar > &R_child_to_parent)
Definition TransformProvider.hpp:74
Vec3< Scalar > from_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:103
QuaternionProvider(const janus::Quaternion< Scalar > &q_child_to_parent)
Definition TransformProvider.hpp:94
Vec3< Scalar > to_parent(const Vec3< Scalar > &v) const override
Definition TransformProvider.hpp:98
Definition Aerodynamics.hpp:11
Definition FramePrimitives.hpp:44
Interface for a frame edge transform (child <-> parent).
Definition TransformProvider.hpp:16
virtual Vec3< Scalar > from_parent(const Vec3< Scalar > &v) const =0
virtual Vec3< Scalar > to_parent(const Vec3< Scalar > &v) const =0
virtual ~TransformProvider()=default
virtual Vec3< Scalar > position_to_parent(const Vec3< Scalar > &pos) const
Definition TransformProvider.hpp:26
virtual Vec3< Scalar > position_from_parent(const Vec3< Scalar > &pos) const
Definition TransformProvider.hpp:31