cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
kitti_pose_reader_impl.hpp
Go to the documentation of this file.
1#pragma once
2
4
5namespace toolbox::io {
6
7template<typename DataType>
8bool kitti_pose_reader_t<DataType>::load(const std::string& poses_file) {
9 try {
10 poses_ = read_kitti_poses<DataType>(poses_file);
11 return !poses_.empty();
12 } catch (const std::exception&) {
13 poses_.clear();
14 return false;
15 }
16}
17
18template<typename DataType>
19Eigen::Matrix<DataType, 4, 4> kitti_pose_reader_t<DataType>::get_pose(
20 std::size_t index) const {
21
22 if (index >= poses_.size()) {
23 throw kitti_index_out_of_range(index, poses_.size());
24 }
25
26 return poses_[index];
27}
28
29template<typename DataType>
30std::optional<Eigen::Matrix<DataType, 4, 4>>
32
33 if (index >= poses_.size()) {
34 return std::nullopt;
35 }
36
37 return poses_[index];
38}
39
40template<typename DataType>
42 std::size_t from_index,
43 std::size_t to_index) const {
44
45 if (from_index >= poses_.size()) {
46 throw kitti_index_out_of_range(from_index, poses_.size());
47 }
48
49 if (to_index >= poses_.size()) {
50 throw kitti_index_out_of_range(to_index, poses_.size());
51 }
52
54 poses_[from_index], poses_[to_index]);
55}
56
57template<typename DataType>
59 if (poses_.size() < 2) {
60 return DataType(0);
61 }
62
63 DataType total_length = 0;
64
65 for (std::size_t i = 1; i < poses_.size(); ++i) {
66 // Extract translations
67 Eigen::Vector3<DataType> pos_prev = poses_[i-1].template block<3, 1>(0, 3);
68 Eigen::Vector3<DataType> pos_curr = poses_[i].template block<3, 1>(0, 3);
69
70 // Compute distance
71 total_length += (pos_curr - pos_prev).norm();
72 }
73
74 return total_length;
75}
76
77template<typename DataType>
78std::pair<Eigen::Vector3<DataType>, Eigen::Vector3<DataType>>
80
81 if (poses_.empty()) {
82 return std::make_pair(
83 Eigen::Vector3<DataType>::Zero(),
84 Eigen::Vector3<DataType>::Zero()
85 );
86 }
87
88 // Initialize with first position
89 Eigen::Vector3<DataType> min_point = poses_[0].template block<3, 1>(0, 3);
90 Eigen::Vector3<DataType> max_point = min_point;
91
92 // Find bounds
93 for (const auto& pose : poses_) {
94 Eigen::Vector3<DataType> position = pose.template block<3, 1>(0, 3);
95
96 min_point.x() = std::min(min_point.x(), position.x());
97 min_point.y() = std::min(min_point.y(), position.y());
98 min_point.z() = std::min(min_point.z(), position.z());
99
100 max_point.x() = std::max(max_point.x(), position.x());
101 max_point.y() = std::max(max_point.y(), position.y());
102 max_point.z() = std::max(max_point.z(), position.z());
103 }
105 return std::make_pair(min_point, max_point);
106}
107
108} // namespace toolbox::io
Exception thrown when accessing out of bounds frame.
Definition kitti_exceptions.hpp:66
Eigen::Matrix< DataType, 4, 4 > get_relative_transform(std::size_t from_index, std::size_t to_index) const
Compute relative transformation between two frames.
Definition kitti_pose_reader_impl.hpp:41
std::pair< Eigen::Vector3< DataType >, Eigen::Vector3< DataType > > get_trajectory_bounds() const
Get trajectory bounds.
Definition kitti_pose_reader_impl.hpp:79
std::optional< Eigen::Matrix< DataType, 4, 4 > > try_get_pose(std::size_t index) const
Get pose at specific index (safe version)
Definition kitti_pose_reader_impl.hpp:31
DataType compute_trajectory_length() const
Compute trajectory length.
Definition kitti_pose_reader_impl.hpp:58
Eigen::Matrix< DataType, 4, 4 > get_pose(std::size_t index) const
Get pose at specific index.
Definition kitti_pose_reader_impl.hpp:19
bool load(const std::string &poses_file)
Load poses from file.
Definition kitti_pose_reader_impl.hpp:8
< 用于列出目录下的文件/For listing files in a directory
Definition dataloader.hpp:15
Eigen::Matrix< DataType, 4, 4 > compute_relative_transform(const Eigen::Matrix< DataType, 4, 4 > &from_pose, const Eigen::Matrix< DataType, 4, 4 > &to_pose)
Compute relative transformation between two poses.
Definition kitti_extended_impl.hpp:291