@@ -37,22 +37,31 @@ std::vector<Eigen::Vector3d> Deskew(const std::vector<Eigen::Vector3d> &frame,
37
37
const std::vector<double > ×tamps,
38
38
const Sophus::SE3d &relative_motion) {
39
39
const std::vector<Eigen::Vector3d> &deskewed_frame = [&]() {
40
- const auto &omega = relative_motion.log ();
41
- const Sophus::SE3d &inverse_motion = relative_motion.inverse ();
42
- std::vector<Eigen::Vector3d> deskewed_frame (frame.size ());
43
- tbb::parallel_for (
44
- // Index Range
45
- tbb::blocked_range<size_t >{0 , deskewed_frame.size ()},
46
- // Parallel Compute
47
- [&](const tbb::blocked_range<size_t > &r) {
48
- for (size_t idx = r.begin (); idx < r.end (); ++idx) {
49
- const auto &point = frame.at (idx);
50
- const auto &stamp = timestamps.at (idx);
51
- const auto pose = inverse_motion * Sophus::SE3d::exp (stamp * omega);
52
- deskewed_frame.at (idx) = pose * point;
53
- };
54
- });
55
- return deskewed_frame;
40
+ if (timestamps.empty ()) {
41
+ return frame;
42
+ } else {
43
+ const auto &[min, max] = std::minmax_element (timestamps.cbegin (), timestamps.cend ());
44
+ const double min_time = *min;
45
+ const double max_time = *max;
46
+ const auto normalize = [&](const double t) {
47
+ return (t - min_time) / (max_time - min_time);
48
+ };
49
+ const auto &omega = relative_motion.log ();
50
+ std::vector<Eigen::Vector3d> deskewed_frame (frame.size ());
51
+ tbb::parallel_for (
52
+ // Index Range
53
+ tbb::blocked_range<size_t >{0 , deskewed_frame.size ()},
54
+ // Parallel Compute
55
+ [&](const tbb::blocked_range<size_t > &r) {
56
+ for (size_t idx = r.begin (); idx < r.end (); ++idx) {
57
+ const auto &point = frame.at (idx);
58
+ const auto &stamp = normalize (timestamps.at (idx));
59
+ const auto pose = Sophus::SE3d::exp ((stamp - 1.0 ) * omega);
60
+ deskewed_frame.at (idx) = pose * point;
61
+ };
62
+ });
63
+ return deskewed_frame;
64
+ }
56
65
}();
57
66
return deskewed_frame;
58
67
}
0 commit comments