cpp-toolbox  0.0.1
A toolbox library for C++
Loading...
Searching...
No Matches
kitti_odometry_pair_dataset_impl.hpp
Go to the documentation of this file.
1#pragma once
2
5
6#include <cmath>
7
8namespace toolbox::io {
9
10template<typename DataType>
12 const std::string& sequence_path,
13 std::size_t skip)
14 : base_dataset_(sequence_path), skip_(skip) {
15
16 if (skip_ == 0) {
17 throw std::invalid_argument("Skip must be at least 1");
18 }
19
20 LOG_INFO_S << "Created KITTI pair dataset with skip=" << skip_
21 << ", " << size_impl() << " pairs available";
22}
23
24template<typename DataType>
25std::optional<kitti_odometry_frame_pair_t<DataType>>
27
28 // Check if pair is valid
29 if (index >= size_impl()) {
30 return std::nullopt;
31 }
32
33 // Note: Caching disabled for pair datasets due to unique_ptr ownership
34 // Each access creates a new pair with fresh point cloud copies
35
36 // Compute frame indices
37 const std::size_t source_idx = get_source_frame_index(index);
38 const std::size_t target_idx = get_target_frame_index(index);
39
40 // Load source frame
41 auto source_frame = base_dataset_[source_idx];
42 if (!source_frame) {
43 LOG_ERROR_S << "Failed to load source frame " << source_idx;
44 return std::nullopt;
45 }
46
47 // Load target frame
48 auto target_frame = base_dataset_[target_idx];
49 if (!target_frame) {
50 LOG_ERROR_S << "Failed to load target frame " << target_idx;
51 return std::nullopt;
52 }
53
54 // Create pair
55 pair_type pair;
56 pair.source_cloud = std::move(source_frame->cloud);
57 pair.target_cloud = std::move(target_frame->cloud);
58 pair.source_pose = source_frame->pose;
59 pair.target_pose = target_frame->pose;
60 pair.source_index = source_idx;
61 pair.target_index = target_idx;
62
63 // Compute relative transform
65 pair.source_pose, pair.target_pose);
66
67 // Optionally compute overlap
68 if (compute_overlap_ && pair.source_cloud && pair.target_cloud) {
69 // Transform target to source frame for overlap computation
70 Eigen::Matrix<DataType, 4, 4> inverse_transform = pair.relative_transform.inverse();
71 auto target_in_source = transform_point_cloud(
72 *pair.target_cloud, inverse_transform);
73
74 auto overlap = compute_overlap_ratio(
75 *pair.source_cloud, *target_in_source);
76
77 LOG_DEBUG_S << "Pair " << index << " overlap ratio: " << overlap;
78 }
79
80 return pair;
81}
82
83template<typename DataType>
84std::vector<std::size_t>
86 DataType min_translation,
87 DataType min_rotation) const {
88
89 std::vector<std::size_t> result;
90
91 for (std::size_t i = 0; i < size_impl(); ++i) {
92 auto pair = at_impl(i);
93 if (!pair) continue;
94
95 // Extract translation
96 Eigen::Vector3<DataType> translation =
97 pair->relative_transform.template block<3, 1>(0, 3);
98 DataType trans_norm = translation.norm();
99
100 // Extract rotation angle (from rotation matrix)
101 Eigen::Matrix3<DataType> R =
102 pair->relative_transform.template block<3, 3>(0, 0);
103 DataType trace = R.trace();
104 DataType angle = std::acos(std::min(std::max((trace - 1) / 2,
105 DataType(-1)),
106 DataType(1)));
107
108 if (trans_norm >= min_translation || angle >= min_rotation) {
109 result.push_back(i);
110 }
111 }
112
113 return result;
114}
115
116template<typename DataType>
118 const point_cloud_t<DataType>& source,
119 const point_cloud_t<DataType>& target,
120 DataType threshold) const {
121
122 if (source.empty() || target.empty()) {
123 return DataType(0);
124 }
125
126 // Simple brute-force overlap computation
127 // In practice, you'd want to use a KD-tree for efficiency
128 std::size_t overlap_count = 0;
129
130 for (const auto& src_pt : source.points) {
131 bool has_close_point = false;
132
133 for (const auto& tgt_pt : target.points) {
134 DataType dist = src_pt.distance(tgt_pt);
135 if (dist < threshold) {
136 has_close_point = true;
137 break;
138 }
139 }
140
141 if (has_close_point) {
142 overlap_count++;
143 }
144 }
145
146 return static_cast<DataType>(overlap_count) /
147 static_cast<DataType>(source.size());
148}
149
150} // namespace toolbox::io
KITTI Odometry frame pair dataset loader.
Definition kitti_odometry_pair_dataset.hpp:34
std::size_t size_impl() const
Get number of frame pairs.
Definition kitti_odometry_pair_dataset.hpp:90
std::optional< pair_type > at_impl(std::size_t index) const
Load frame pair at specific index.
Definition kitti_odometry_pair_dataset_impl.hpp:26
std::vector< std::size_t > get_pairs_with_motion(DataType min_translation=0.1, DataType min_rotation=0.01) const
Get pairs with specific relative motion threshold.
Definition kitti_odometry_pair_dataset_impl.hpp:85
kitti_odometry_pair_dataset_t(const std::string &sequence_path, std::size_t skip=1)
Constructor.
Definition kitti_odometry_pair_dataset_impl.hpp:11
包含点和相关数据的点云类 / A point cloud class containing points and associated data
Definition point.hpp:268
auto size() const -> std::size_t
获取点云中的点数 / Get number of points in cloud
Definition point_impl.hpp:293
auto empty() const -> bool
检查点云是否为空 / Check if cloud is empty
Definition point_impl.hpp:299
#define LOG_DEBUG_S
DEBUG级别流式日志的宏 / Macro for DEBUG level stream logging.
Definition thread_logger.hpp:1329
#define LOG_INFO_S
INFO级别流式日志的宏 / Macro for INFO level stream logging.
Definition thread_logger.hpp:1330
#define LOG_ERROR_S
ERROR级别流式日志的宏 / Macro for ERROR level stream logging.
Definition thread_logger.hpp:1332
< 用于列出目录下的文件/For listing files in a directory
Definition dataloader.hpp:15
std::unique_ptr< point_cloud_t< DataType > > transform_point_cloud(const point_cloud_t< DataType > &cloud, const Eigen::Matrix< DataType, 4, 4 > &transform)
Transform point cloud using transformation matrix.
Definition kitti_extended_impl.hpp:299
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
Frame pair data for registration tasks.
Definition kitti_types.hpp:57
std::size_t source_index
Source frame index.
Definition kitti_types.hpp:74
std::size_t target_index
Target frame index.
Definition kitti_types.hpp:77
Eigen::Matrix< DataType, 4, 4 > source_pose
Source global pose.
Definition kitti_types.hpp:65
Eigen::Matrix< DataType, 4, 4 > relative_transform
Relative transformation from source to target (T_target_source)
Definition kitti_types.hpp:71
std::unique_ptr< point_cloud_t< DataType > > target_cloud
Target point cloud.
Definition kitti_types.hpp:62
Eigen::Matrix< DataType, 4, 4 > target_pose
Target global pose.
Definition kitti_types.hpp:68
std::unique_ptr< point_cloud_t< DataType > > source_cloud
Source point cloud.
Definition kitti_types.hpp:59