3131#include < string>
3232#include < vector>
3333
34- #include " controller_interface/controller_interface.hpp"
34+ #include < controller_interface/controller_interface.hpp>
35+ #include < hardware_interface/handle.hpp>
36+ #include < rclcpp/rclcpp.hpp>
37+ #include < rclcpp_lifecycle/state.hpp>
38+ #include < realtime_tools/realtime_box.hpp>
39+ #include < realtime_tools/realtime_buffer.hpp>
40+ #include < realtime_tools/realtime_publisher.hpp>
41+
42+ #include < geometry_msgs/msg/twist.hpp>
43+ #include < geometry_msgs/msg/twist_stamped.hpp>
44+ #include < nav_msgs/msg/odometry.hpp>
45+ #include < tf2_msgs/msg/tf_message.hpp>
46+
47+ #include " mecanum_drive_controller/mecanum_drive_controller_parameters.hpp"
3548#include " mecanum_drive_controller/odometry.hpp"
3649#include " mecanum_drive_controller/speed_limiter.hpp"
3750#include " mecanum_drive_controller/visibility_control.h"
38- #include " geometry_msgs/msg/twist.hpp"
39- #include " geometry_msgs/msg/twist_stamped.hpp"
40- #include " hardware_interface/handle.hpp"
41- #include " nav_msgs/msg/odometry.hpp"
4251#include " odometry.hpp"
43- #include " rclcpp/rclcpp.hpp"
44- #include " rclcpp_lifecycle/state.hpp"
45- #include " realtime_tools/realtime_box.hpp"
46- #include " realtime_tools/realtime_buffer.hpp"
47- #include " realtime_tools/realtime_publisher.hpp"
48- #include " tf2_msgs/msg/tf_message.hpp"
49-
50- #include < mecanum_drive_controller/mecanum_drive_controller_parameters.hpp>
5152
5253namespace mecanum_drive_controller
5354{
5455class MecanumDriveController : public controller_interface ::ControllerInterface
5556{
56- using Twist = geometry_msgs::msg::TwistStamped;
57+ using TwistStamped = geometry_msgs::msg::TwistStamped;
5758
5859public:
5960 MECANUM_DRIVE_CONTROLLER_PUBLIC
@@ -66,28 +67,35 @@ class MecanumDriveController : public controller_interface::ControllerInterface
6667 controller_interface::InterfaceConfiguration state_interface_configuration () const override ;
6768
6869 MECANUM_DRIVE_CONTROLLER_PUBLIC
69- controller_interface::return_type update (const rclcpp::Time& time, const rclcpp::Duration& period) override ;
70+ controller_interface::return_type update (
71+ const rclcpp::Time & time, const rclcpp::Duration & period) override ;
7072
7173 MECANUM_DRIVE_CONTROLLER_PUBLIC
7274 controller_interface::CallbackReturn on_init () override ;
7375
7476 MECANUM_DRIVE_CONTROLLER_PUBLIC
75- controller_interface::CallbackReturn on_configure (const rclcpp_lifecycle::State& previous_state) override ;
77+ controller_interface::CallbackReturn on_configure (
78+ const rclcpp_lifecycle::State & previous_state) override ;
7679
7780 MECANUM_DRIVE_CONTROLLER_PUBLIC
78- controller_interface::CallbackReturn on_activate (const rclcpp_lifecycle::State& previous_state) override ;
81+ controller_interface::CallbackReturn on_activate (
82+ const rclcpp_lifecycle::State & previous_state) override ;
7983
8084 MECANUM_DRIVE_CONTROLLER_PUBLIC
81- controller_interface::CallbackReturn on_deactivate (const rclcpp_lifecycle::State& previous_state) override ;
85+ controller_interface::CallbackReturn on_deactivate (
86+ const rclcpp_lifecycle::State & previous_state) override ;
8287
8388 MECANUM_DRIVE_CONTROLLER_PUBLIC
84- controller_interface::CallbackReturn on_cleanup (const rclcpp_lifecycle::State& previous_state) override ;
89+ controller_interface::CallbackReturn on_cleanup (
90+ const rclcpp_lifecycle::State & previous_state) override ;
8591
8692 MECANUM_DRIVE_CONTROLLER_PUBLIC
87- controller_interface::CallbackReturn on_error (const rclcpp_lifecycle::State& previous_state) override ;
93+ controller_interface::CallbackReturn on_error (
94+ const rclcpp_lifecycle::State & previous_state) override ;
8895
8996 MECANUM_DRIVE_CONTROLLER_PUBLIC
90- controller_interface::CallbackReturn on_shutdown (const rclcpp_lifecycle::State& previous_state) override ;
97+ controller_interface::CallbackReturn on_shutdown (
98+ const rclcpp_lifecycle::State & previous_state) override ;
9199
92100protected:
93101 struct WheelHandle
@@ -96,9 +104,9 @@ class MecanumDriveController : public controller_interface::ControllerInterface
96104 std::reference_wrapper<hardware_interface::LoanedCommandInterface> velocity;
97105 };
98106
99- const char * feedback_type () const ;
100- controller_interface::CallbackReturn configure_wheel (const std::string& wheel_name,
101- std::unique_ptr<WheelHandle>& registered_handle);
107+ const char * feedback_type () const ;
108+ controller_interface::CallbackReturn configure_wheel (
109+ const std::string & wheel_name, std::unique_ptr<WheelHandle> & registered_handle);
102110
103111 std::string front_left_wheel_name_;
104112 std::string front_right_wheel_name_;
@@ -117,42 +125,48 @@ class MecanumDriveController : public controller_interface::ControllerInterface
117125 Odometry odometry_;
118126
119127 std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> odometry_publisher_ = nullptr ;
120- std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>> realtime_odometry_publisher_ = nullptr ;
128+ std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>
129+ realtime_odometry_publisher_ = nullptr ;
121130
122- std::shared_ptr<rclcpp::Publisher<tf2_msgs::msg::TFMessage>> odometry_transform_publisher_ = nullptr ;
123- std::shared_ptr<realtime_tools::RealtimePublisher<tf2_msgs::msg::TFMessage>> realtime_odometry_transform_publisher_ =
124- nullptr ;
131+ std::shared_ptr<rclcpp::Publisher<tf2_msgs::msg::TFMessage>> odometry_transform_publisher_ =
132+ nullptr ;
133+ std::shared_ptr<realtime_tools::RealtimePublisher<tf2_msgs::msg::TFMessage>>
134+ realtime_odometry_transform_publisher_ = nullptr ;
125135
126136 // Timeout to consider cmd_vel commands old
127- std::chrono::milliseconds cmd_vel_timeout_{ 500 };
137+ std::chrono::milliseconds cmd_vel_timeout_{500 };
128138
129139 bool subscriber_is_active_ = false ;
130- rclcpp::Subscription<Twist >::SharedPtr velocity_command_subscriber_ = nullptr ;
140+ rclcpp::Subscription<TwistStamped >::SharedPtr velocity_command_subscriber_ = nullptr ;
131141
132- realtime_tools::RealtimeBox <std::shared_ptr<Twist >> received_velocity_msg_ptr_{ nullptr };
142+ realtime_tools::RealtimeBuffer <std::shared_ptr<TwistStamped >> received_velocity_msg_ptr_{nullptr };
133143
134- std::queue<Twist > previous_commands_; // last two commands
144+ std::queue<TwistStamped > previous_commands_; // last two commands
135145
136146 // speed limiters
137147 SpeedLimiter limiter_linear_x_;
138148 SpeedLimiter limiter_linear_y_;
139149 SpeedLimiter limiter_angular_;
140150
141151 bool publish_limited_velocity_ = false ;
142- std::shared_ptr<rclcpp::Publisher<Twist>> limited_velocity_publisher_ = nullptr ;
143- std::shared_ptr<realtime_tools::RealtimePublisher<Twist>> realtime_limited_velocity_publisher_ = nullptr ;
152+ std::shared_ptr<rclcpp::Publisher<TwistStamped>> limited_velocity_publisher_ = nullptr ;
153+ std::shared_ptr<realtime_tools::RealtimePublisher<TwistStamped>>
154+ realtime_limited_velocity_publisher_ = nullptr ;
144155
145- rclcpp::Time previous_update_timestamp_{ 0 };
156+ rclcpp::Time previous_update_timestamp_{0 };
146157
147158 // publish rate limiter
148159 double publish_rate_ = 50.0 ;
149160 rclcpp::Duration publish_period_ = rclcpp::Duration::from_nanoseconds(0 );
150- rclcpp::Time previous_publish_timestamp_{ 0 };
161+ rclcpp::Time previous_publish_timestamp_{0 };
151162
152163 bool is_halted = false ;
153164
154165 bool reset ();
155166 void halt ();
167+
168+ private:
169+ void reset_buffers ();
156170};
157171} // namespace mecanum_drive_controller
158172#endif // MECANUM_DRIVE_CONTROLLER__MECANUM_DRIVE_CONTROLLER_HPP_
0 commit comments