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/rclcpp.hpp"
31 #include "nav2_ros_common/node_utils.hpp"
51 template<
typename NodeT>
54 double filter_duration = 0.3,
55 const std::string & odom_topic =
"odom")
56 : odom_history_duration_(rclcpp::Duration::from_seconds(filter_duration))
60 odom_sub_ = nav2::interfaces::create_subscription<nav_msgs::msg::Odometry>(
64 odom_cumulate_.twist.twist.linear.x = 0;
65 odom_cumulate_.twist.twist.linear.y = 0;
66 odom_cumulate_.twist.twist.linear.z = 0;
67 odom_cumulate_.twist.twist.angular.x = 0;
68 odom_cumulate_.twist.twist.angular.y = 0;
69 odom_cumulate_.twist.twist.angular.z = 0;
78 std::lock_guard<std::mutex> lock(odom_mutex_);
79 if (!received_odom_) {
81 rclcpp::get_logger(
"OdomSmoother"),
82 "OdomSmoother has not received any data yet, returning empty Twist");
83 geometry_msgs::msg::Twist twist;
86 return vel_smooth_.twist;
95 std::lock_guard<std::mutex> lock(odom_mutex_);
96 if (!received_odom_) {
98 rclcpp::get_logger(
"OdomSmoother"),
99 "OdomSmoother has not received any data yet, returning empty Twist");
100 geometry_msgs::msg::TwistStamped twist_stamped;
101 return twist_stamped;
112 std::lock_guard<std::mutex> lock(odom_mutex_);
113 if (!received_odom_) {
115 rclcpp::get_logger(
"OdomSmoother"),
116 "OdomSmoother has not received any data yet, returning empty Twist");
117 geometry_msgs::msg::Twist twist;
120 return odom_history_.back().twist.twist;
129 std::lock_guard<std::mutex> lock(odom_mutex_);
130 geometry_msgs::msg::TwistStamped twist_stamped;
131 if (!received_odom_) {
133 rclcpp::get_logger(
"OdomSmoother"),
134 "OdomSmoother has not received any data yet, returning empty Twist");
135 return twist_stamped;
137 twist_stamped.header = odom_history_.back().header;
138 twist_stamped.twist = odom_history_.back().twist.twist;
139 return twist_stamped;
147 void odomCallback(
const nav_msgs::msg::Odometry::ConstSharedPtr & msg);
154 bool received_odom_{
false};
155 nav2::Subscription<nav_msgs::msg::Odometry>::SharedPtr odom_sub_;
156 nav_msgs::msg::Odometry odom_cumulate_;
157 geometry_msgs::msg::TwistStamped vel_smooth_;
158 std::mutex odom_mutex_;
160 rclcpp::Duration odom_history_duration_;
161 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.