42 double timestamp,
const Eigen::Affine3d& locator_pose,
43 const Eigen::Affine3d& novatel_pose) {
44 if (!has_initialized_) {
45 lidar_poses_[head_index_].locator_pose = locator_pose;
46 lidar_poses_[head_index_].locator_pose.linear() = novatel_pose.linear();
47 lidar_poses_[head_index_].novatel_pose = novatel_pose;
48 lidar_poses_[head_index_].timestamp = timestamp;
50 has_initialized_ =
true;
53 unsigned int empty_position =
54 (head_index_ + used_buffer_size_) % s_buffer_size_;
55 lidar_poses_[empty_position].locator_pose = locator_pose;
56 lidar_poses_[empty_position].novatel_pose = novatel_pose;
57 lidar_poses_[empty_position].timestamp = timestamp;
59 if (used_buffer_size_ == s_buffer_size_) {
60 head_index_ = (head_index_ + 1) % s_buffer_size_;
68 double timestamp,
const Eigen::Affine3d& novatel_pose) {
69 Eigen::Affine3d pose = novatel_pose;
70 if (used_buffer_size_ > 0) {
71 pose.translation()[0] = 0;
72 pose.translation()[1] = 0;
73 pose.translation()[2] = 0;
74 Eigen::Affine3d predict_pose;
77 Eigen::Quaterniond novatel_quat(novatel_pose.linear());
78 novatel_quat.normalize();
80 novatel_quat.w(), novatel_quat.x(), novatel_quat.y(), novatel_quat.z());
81 Eigen::Vector3d pose_ev;
86 for (
unsigned int c = 0, i = head_index_; c < used_buffer_size_;
87 ++c, i = (i + 1) % s_buffer_size_) {
88 predict_pose.translation() = lidar_poses_[i].locator_pose.translation() -
89 lidar_poses_[i].novatel_pose.translation() +
90 novatel_pose.translation();
91 pose.translation() += predict_pose.translation();
93 Eigen::Quaterniond pair_locator_quat(
94 lidar_poses_[i].locator_pose.linear());
95 pair_locator_quat.normalize();
96 Eigen::Quaterniond pair_novatel_quat(
97 lidar_poses_[i].novatel_pose.linear());
98 pair_novatel_quat.normalize();
99 Eigen::Quaterniond predict_pose_quat =
100 pair_locator_quat * pair_novatel_quat.inverse() * novatel_quat;
101 predict_pose_quat.normalized();
104 predict_pose_quat.w(), predict_pose_quat.x(), predict_pose_quat.y(),
105 predict_pose_quat.z());
106 double predict_yaw = predict_pose_ev.yaw();
107 if (novatel_ev.yaw() > 0) {
108 if (novatel_ev.yaw() - predict_pose_ev.yaw() > M_PI) {
109 predict_yaw = predict_pose_ev.yaw() + M_PI * 2.0;
112 if (predict_pose_ev.yaw() - novatel_ev.yaw() > M_PI) {
113 predict_yaw = predict_pose_ev.yaw() - M_PI * 2.0;
116 pose_ev[2] += predict_yaw;
119 pose.translation() *= (1.0 / weight);
120 pose_ev[0] = novatel_ev.pitch();
121 pose_ev[1] = novatel_ev.roll();
122 pose_ev[2] *= (1.0 / weight);
123 if (std::abs(pose_ev[2]) > M_PI) {
124 if (pose_ev[2] > 0) {
125 pose_ev[2] -= 2.0 * M_PI;
127 pose_ev[2] += 2.0 * M_PI;
132 Eigen::Quaterniond tmp_qbn = pose_euler.ToQuaternion();
134 pose.linear() = tmp_qbn.toRotationMatrix();