27 return static_cast<int>(
frames.size()) - 1;
39 nodes_.emplace_back();
62 const int depth =
depth_of(parent_id) + 1;
68 nodes_.emplace_back(
id, parent_id, name, depth);
78 const std::vector<FrameID> path_a = path_to_root(from);
79 const std::vector<FrameID> path_b = path_to_root(to);
80 if (path_a.empty() || path_b.empty()) {
84 int ia =
static_cast<int>(path_a.size()) - 1;
85 int ib =
static_cast<int>(path_b.size()) - 1;
87 bool found_lca =
false;
89 while (ia >= 0 && ib >= 0 && path_a[ia] == path_b[ib]) {
106 for (
int i = 0; i <= ia + 1; ++i) {
107 result.
frames.push_back(path_a[
static_cast<size_t>(i)]);
111 for (
int i = ib; i >= 0; --i) {
112 result.
frames.push_back(path_b[
static_cast<size_t>(i)]);
122 return nodes_[
id.id];
126 return id.id < nodes_.size();
138 std::vector<FrameID> children;
139 children.reserve(nodes_.size());
140 for (
const auto &node : nodes_) {
144 if (node.parent_id ==
id) {
145 children.push_back(node.id);
153 [[nodiscard]]
size_t size()
const {
return nodes_.size(); }
160 std::vector<FrameNode> nodes_;
161 uint32_t next_user_id_ = 0;
165 const auto expected =
static_cast<uint32_t
>(nodes_.size());
166 if (
id.
id != expected) {
168 "Builtin frame enum values must be contiguous");
173 throw CoordinateError(
174 "Builtin frame tree exceeded MAX_FRAME_DEPTH");
177 nodes_.emplace_back(
id, parent, name, depth);
180 [[nodiscard]] std::vector<FrameID> path_to_root(FrameID
id)
const {
185 std::vector<FrameID> path;
188 FrameID current = id;
190 path.push_back(current);
191 const auto &node =
get_node(current);
192 if (node.is_root || node.parent_id == current) {
196 throw CoordinateError(
"Frame tree contains missing parent");
198 current = node.parent_id;
201 throw CoordinateError(
"Frame tree exceeded MAX_FRAME_DEPTH");
Exception hierarchy for Vulcan aerospace library.
Coordinate system errors (invalid LLA, singularities).
Definition VulcanError.hpp:53
FrameID register_frame(const std::string &name, FrameID parent_id)
Register a user-defined frame as a child of an existing frame.
Definition FrameRegistry.hpp:54
static FrameRegistry default_aerospace()
Definition FrameRegistry.hpp:155
FrameRegistry()
Definition FrameRegistry.hpp:34
const FrameNode & get_node(FrameID id) const
Definition FrameRegistry.hpp:118
size_t size() const
Definition FrameRegistry.hpp:153
int depth_of(FrameID id) const
Definition FrameRegistry.hpp:151
std::vector< FrameID > children_of(FrameID id) const
Definition FrameRegistry.hpp:133
FramePath find_path(FrameID from, FrameID to) const
Find path between two frames using lowest common ancestor.
Definition FrameRegistry.hpp:73
FrameID parent_of(FrameID id) const
Definition FrameRegistry.hpp:129
bool has_frame(FrameID id) const
Definition FrameRegistry.hpp:125
Definition Aerodynamics.hpp:11
BuiltinFrame
Built-in frame identifiers.
Definition FrameID.hpp:10
@ ENU
Definition FrameID.hpp:14
@ Wind
Definition FrameID.hpp:16
@ Rail
Definition FrameID.hpp:19
@ Stability
Definition FrameID.hpp:17
@ Body
Definition FrameID.hpp:15
@ _BuiltinCount
Definition FrameID.hpp:21
@ CDA
Definition FrameID.hpp:20
@ NED
Definition FrameID.hpp:13
@ ECEF
Definition FrameID.hpp:12
@ Geocentric
Definition FrameID.hpp:18
constexpr FrameID FRAME_ECI
Definition FrameID.hpp:49
constexpr FrameID FRAME_BODY
Definition FrameID.hpp:53
constexpr FrameID FRAME_ECEF
Definition FrameID.hpp:50
constexpr int MAX_FRAME_DEPTH
Maximum supported frame tree depth.
Definition FrameNode.hpp:13
constexpr FrameID FRAME_NED
Definition FrameID.hpp:51
Universal frame identifier.
Definition FrameID.hpp:25
A node in the frame tree (setup-time structure only).
Definition FrameNode.hpp:16
int depth
Definition FrameNode.hpp:20
FrameID parent_id
Definition FrameNode.hpp:18
Ordered path between frames from source to target.
Definition FrameRegistry.hpp:15
std::vector< FrameID > frames
Definition FrameRegistry.hpp:16
int descending_count
Definition FrameRegistry.hpp:19
bool is_valid() const
Definition FrameRegistry.hpp:21
int ascending_count
Definition FrameRegistry.hpp:18
int length() const
Definition FrameRegistry.hpp:23
FrameID lca
Definition FrameRegistry.hpp:17