18 #include "nav2_util/odometry_utils.hpp"
20 using namespace std::chrono;
21 using namespace std::chrono_literals;
26 void OdomSmoother::odomCallback(
const nav_msgs::msg::Odometry::SharedPtr msg)
28 std::lock_guard<std::mutex> lock(odom_mutex_);
29 received_odom_ =
true;
32 if (!odom_history_.empty()) {
34 auto current_time = rclcpp::Time(msg->header.stamp);
37 auto front_time = rclcpp::Time(odom_history_.front().header.stamp);
40 while (current_time - front_time > odom_history_duration_) {
41 const auto & odom = odom_history_.front();
42 odom_cumulate_.twist.twist.linear.x -= odom.twist.twist.linear.x;
43 odom_cumulate_.twist.twist.linear.y -= odom.twist.twist.linear.y;
44 odom_cumulate_.twist.twist.linear.z -= odom.twist.twist.linear.z;
45 odom_cumulate_.twist.twist.angular.x -= odom.twist.twist.angular.x;
46 odom_cumulate_.twist.twist.angular.y -= odom.twist.twist.angular.y;
47 odom_cumulate_.twist.twist.angular.z -= odom.twist.twist.angular.z;
48 odom_history_.pop_front();
50 if (odom_history_.empty()) {
55 front_time = rclcpp::Time(odom_history_.front().header.stamp);
59 odom_history_.push_back(*msg);
63 void OdomSmoother::updateState()
65 const auto & odom = odom_history_.back();
66 odom_cumulate_.twist.twist.linear.x += odom.twist.twist.linear.x;
67 odom_cumulate_.twist.twist.linear.y += odom.twist.twist.linear.y;
68 odom_cumulate_.twist.twist.linear.z += odom.twist.twist.linear.z;
69 odom_cumulate_.twist.twist.angular.x += odom.twist.twist.angular.x;
70 odom_cumulate_.twist.twist.angular.y += odom.twist.twist.angular.y;
71 odom_cumulate_.twist.twist.angular.z += odom.twist.twist.angular.z;
73 vel_smooth_.header = odom.header;
74 vel_smooth_.twist.linear.x = odom_cumulate_.twist.twist.linear.x / odom_history_.size();
75 vel_smooth_.twist.linear.y = odom_cumulate_.twist.twist.linear.y / odom_history_.size();
76 vel_smooth_.twist.linear.z = odom_cumulate_.twist.twist.linear.z / odom_history_.size();
77 vel_smooth_.twist.angular.x = odom_cumulate_.twist.twist.angular.x / odom_history_.size();
78 vel_smooth_.twist.angular.y = odom_cumulate_.twist.twist.angular.y / odom_history_.size();
79 vel_smooth_.twist.angular.z = odom_cumulate_.twist.twist.angular.z / odom_history_.size();