16 #ifndef NAV2_UTIL__ODOMETRY_UTILS_HPP_
17 #define NAV2_UTIL__ODOMETRY_UTILS_HPP_
26 #include "geometry_msgs/msg/twist.hpp"
27 #include "geometry_msgs/msg/twist_stamped.hpp"
28 #include "nav_msgs/msg/odometry.hpp"
29 #include "nav2_ros_common/lifecycle_node.hpp"
30 #include "rclcpp/duration.hpp"
31 #include "rclcpp/logger.hpp"
32 #include "rclcpp/logging.hpp"
33 #include "rclcpp/node.hpp"
34 #include "nav2_ros_common/node_utils.hpp"
54 template<
typename NodeT>
57 double filter_duration = 0.3,
58 const std::string & odom_topic =
"odom")
59 : odom_history_duration_(rclcpp::Duration::from_seconds(filter_duration))
63 odom_sub_ = nav2::interfaces::create_subscription<nav_msgs::msg::Odometry>(
67 odom_cumulate_.twist.twist.linear.x = 0;
68 odom_cumulate_.twist.twist.linear.y = 0;
69 odom_cumulate_.twist.twist.linear.z = 0;
70 odom_cumulate_.twist.twist.angular.x = 0;
71 odom_cumulate_.twist.twist.angular.y = 0;
72 odom_cumulate_.twist.twist.angular.z = 0;
81 std::lock_guard<std::mutex> lock(odom_mutex_);
82 if (!received_odom_) {
84 rclcpp::get_logger(
"OdomSmoother"),
85 "OdomSmoother has not received any data yet, returning empty Twist");
86 geometry_msgs::msg::Twist twist;
89 return vel_smooth_.twist;
98 std::lock_guard<std::mutex> lock(odom_mutex_);
99 if (!received_odom_) {
101 rclcpp::get_logger(
"OdomSmoother"),
102 "OdomSmoother has not received any data yet, returning empty Twist");
103 geometry_msgs::msg::TwistStamped twist_stamped;
104 return twist_stamped;
115 std::lock_guard<std::mutex> lock(odom_mutex_);
116 if (!received_odom_) {
118 rclcpp::get_logger(
"OdomSmoother"),
119 "OdomSmoother has not received any data yet, returning empty Twist");
120 geometry_msgs::msg::Twist twist;
123 return odom_history_.back().twist.twist;
132 std::lock_guard<std::mutex> lock(odom_mutex_);
133 geometry_msgs::msg::TwistStamped twist_stamped;
134 if (!received_odom_) {
136 rclcpp::get_logger(
"OdomSmoother"),
137 "OdomSmoother has not received any data yet, returning empty Twist");
138 return twist_stamped;
140 twist_stamped.header = odom_history_.back().header;
141 twist_stamped.twist = odom_history_.back().twist.twist;
142 return twist_stamped;
150 void odomCallback(
const nav_msgs::msg::Odometry::ConstSharedPtr & msg);
157 bool received_odom_{
false};
158 nav2::Subscription<nav_msgs::msg::Odometry>::SharedPtr odom_sub_;
159 nav_msgs::msg::Odometry odom_cumulate_;
160 geometry_msgs::msg::TwistStamped vel_smooth_;
161 std::mutex odom_mutex_;
163 rclcpp::Duration odom_history_duration_;
164 std::deque<nav_msgs::msg::Odometry> odom_history_;
void updateState()
Update internal state of the smoother after getting new data.
geometry_msgs::msg::TwistStamped getRawTwistStamped()
Get raw twist stamped msg from smoother (without smoothing)
geometry_msgs::msg::Twist getRawTwist()
Get raw twist msg from smoother (without smoothing)
OdomSmoother(const NodeT &parent, double filter_duration=0.3, const std::string &odom_topic="odom")
Overloadded Constructor for nav_util::LifecycleNode parent that subscribes to an Odometry topic.
geometry_msgs::msg::Twist getTwist()
Get twist msg from smoother.
void odomCallback(const nav_msgs::msg::Odometry::ConstSharedPtr &msg)
Callback of odometry subscriber to process.
geometry_msgs::msg::TwistStamped getTwistStamped()
Get twist stamped msg from smoother.