21 #include <boost/algorithm/string.hpp>
23 #include <nav_msgs/Odometry.h>
24 #include <geometry_msgs/TransformStamped.h>
27 namespace extra_plugins {
28 using mavlink::common::MAV_FRAME;
29 using mavlink::common::MAV_ESTIMATOR_TYPE;
30 using Matrix6d = Eigen::Matrix<double, 6, 6, Eigen::RowMajor>;
46 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
94 Eigen::Affine3d &tf_source2target)
120 void handle_odom(
const mavlink::mavlink_message_t *msg, mavlink::common::msg::ODOMETRY &odom_msg)
125 Eigen::Affine3d tf_parent2parent_des;
126 Eigen::Affine3d tf_child2child_des;
132 Matrix6d cov_pose = Matrix6d::Zero();
136 Matrix6d cov_vel = Matrix6d::Zero();
139 Eigen::Vector3d position {};
140 Eigen::Quaterniond orientation {};
141 Eigen::Vector3d lin_vel {};
142 Eigen::Vector3d ang_vel {};
146 auto odom = boost::make_shared<nav_msgs::Odometry>();
154 position = Eigen::Vector3d(tf_parent2parent_des.linear() * Eigen::Vector3d(odom_msg.x, odom_msg.y, odom_msg.z));
161 Eigen::Affine3d tf_childDes2parentDes = tf_parent2parent_des * q_child2parent * tf_child2child_des.inverse();
162 orientation = Eigen::Quaterniond(tf_childDes2parentDes.linear());
169 lin_vel = Eigen::Vector3d(tf_child2child_des.linear() * Eigen::Vector3d(odom_msg.vx, odom_msg.vy, odom_msg.vz));
170 ang_vel = Eigen::Vector3d(tf_child2child_des.linear() * Eigen::Vector3d(odom_msg.rollspeed, odom_msg.pitchspeed, odom_msg.yawspeed));
177 r_pose.block<3, 3>(0, 0) = r_pose.block<3, 3>(3, 3) = tf_parent2parent_des.linear();
179 cov_pose = r_pose * cov_pose * r_pose.transpose();
180 Eigen::Map<Matrix6d>(odom->pose.covariance.data(), cov_pose.rows(), cov_pose.cols()) = cov_pose;
183 r_vel.block<3, 3>(0, 0) = r_vel.block<3, 3>(3, 3) = tf_child2child_des.linear();
184 cov_vel = r_vel * cov_vel * r_vel.transpose();
185 Eigen::Map<Matrix6d>(odom->twist.covariance.data(), cov_vel.rows(), cov_vel.cols()) = cov_vel;
206 Eigen::Affine3d tf_parent2parent_des;
207 Eigen::Affine3d tf_child2child_des;
223 Eigen::Vector3d position {};
224 Eigen::Quaterniond orientation {};
225 Eigen::Vector3d lin_vel {};
226 Eigen::Vector3d ang_vel {};
230 mavlink::common::msg::ODOMETRY
msg {};
238 position = Eigen::Vector3d(tf_parent2parent_des.linear() *
ftf::to_eigen(odom->pose.pose.position));
243 Eigen::Quaterniond q_child2parent(
ftf::to_eigen(odom->pose.pose.orientation));
244 Eigen::Affine3d tf_childDes2parentDes = tf_parent2parent_des * q_child2parent * tf_child2child_des.inverse();
245 orientation = Eigen::Quaterniond(tf_childDes2parentDes.linear());
250 lin_vel = Eigen::Vector3d(tf_child2child_des.linear() *
ftf::to_eigen(odom->twist.twist.linear));
251 ang_vel = Eigen::Vector3d(tf_child2child_des.linear() *
ftf::to_eigen(odom->twist.twist.angular));
254 r_pose.block<3, 3>(0, 0) = r_pose.block<3, 3>(3, 3) = tf_parent2parent_des.linear();
255 r_vel.block<3, 3>(0, 0) = r_vel.block<3, 3>(3, 3) = tf_child2child_des.linear();
256 cov_pose_map = r_pose * cov_pose_map * r_pose.transpose();
257 cov_vel_map = r_vel * cov_vel_map * r_vel.transpose();
263 msg.time_usec = odom->header.stamp.toNSec() / 1e3;
272 msg.x = position.x();
273 msg.y = position.y();
274 msg.z = position.z();
275 msg.vx = lin_vel.x();
276 msg.vy = lin_vel.y();
277 msg.vz = lin_vel.z();
278 msg.rollspeed = ang_vel.x();
279 msg.pitchspeed = ang_vel.y();
280 msg.yawspeed = ang_vel.z();