@@ -37,22 +37,31 @@ std::vector<Eigen::Vector3d> Deskew(const std::vector<Eigen::Vector3d> &frame,
3737 const std::vector<double > ×tamps,
3838 const Sophus::SE3d &relative_motion) {
3939 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+ }
5665 }();
5766 return deskewed_frame;
5867}
0 commit comments