26
26
#include < string>
27
27
#include < vector>
28
28
29
- #include " controller_interface/controller_interface .hpp"
29
+ #include " controller_interface/chainable_controller_interface .hpp"
30
30
#include " diff_drive_controller/odometry.hpp"
31
31
#include " diff_drive_controller/speed_limiter.hpp"
32
32
#include " diff_drive_controller/visibility_control.h"
37
37
#include " odometry.hpp"
38
38
#include " rclcpp/rclcpp.hpp"
39
39
#include " rclcpp_lifecycle/state.hpp"
40
- #include " realtime_tools/realtime_box.h"
41
40
#include " realtime_tools/realtime_buffer.h"
42
41
#include " realtime_tools/realtime_publisher.h"
43
42
#include " tf2_msgs/msg/tf_message.hpp"
47
46
48
47
namespace diff_drive_controller
49
48
{
50
- class DiffDriveController : public controller_interface ::ControllerInterface
49
+ class DiffDriveController : public controller_interface ::ChainableControllerInterface
51
50
{
52
51
using Twist = geometry_msgs::msg::TwistStamped;
53
52
@@ -61,10 +60,13 @@ class DiffDriveController : public controller_interface::ControllerInterface
61
60
DIFF_DRIVE_CONTROLLER_PUBLIC
62
61
controller_interface::InterfaceConfiguration state_interface_configuration () const override ;
63
62
64
- DIFF_DRIVE_CONTROLLER_PUBLIC
65
- controller_interface::return_type update (
63
+ DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::return_type
64
+ update_reference_from_subscribers (
66
65
const rclcpp::Time & time, const rclcpp::Duration & period) override ;
67
66
67
+ DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::return_type
68
+ update_and_write_commands (const rclcpp::Time & time, const rclcpp::Duration & period) override ;
69
+
68
70
DIFF_DRIVE_CONTROLLER_PUBLIC
69
71
controller_interface::CallbackReturn on_init () override ;
70
72
@@ -92,7 +94,15 @@ class DiffDriveController : public controller_interface::ControllerInterface
92
94
controller_interface::CallbackReturn on_shutdown (
93
95
const rclcpp_lifecycle::State & previous_state) override ;
94
96
97
+ using ControllerTwistReferenceMsg = geometry_msgs::msg::TwistStamped;
98
+
95
99
protected:
100
+
101
+ bool on_set_chained_mode (bool chained_mode) override ;
102
+
103
+ std::vector<hardware_interface::CommandInterface> on_export_reference_interfaces () override ;
104
+
105
+
96
106
struct WheelHandle
97
107
{
98
108
std::reference_wrapper<const hardware_interface::LoanedStateInterface> feedback;
@@ -114,7 +124,7 @@ class DiffDriveController : public controller_interface::ControllerInterface
114
124
Odometry odometry_;
115
125
116
126
// Timeout to consider cmd_vel commands old
117
- std::chrono::milliseconds cmd_vel_timeout_{ 500 } ;
127
+ rclcpp:: Duration ref_timeout_ = rclcpp:: Duration ::from_seconds( 0.5 ) ;
118
128
119
129
std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> odometry_publisher_ = nullptr ;
120
130
std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>
@@ -130,7 +140,7 @@ class DiffDriveController : public controller_interface::ControllerInterface
130
140
rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr
131
141
velocity_command_unstamped_subscriber_ = nullptr ;
132
142
133
- realtime_tools::RealtimeBox <std::shared_ptr<Twist >> received_velocity_msg_ptr_{nullptr };
143
+ realtime_tools::RealtimeBuffer <std::shared_ptr<ControllerTwistReferenceMsg >> received_velocity_msg_ptr_{nullptr };
134
144
135
145
std::queue<Twist> previous_commands_; // last two commands
136
146
@@ -155,6 +165,12 @@ class DiffDriveController : public controller_interface::ControllerInterface
155
165
156
166
bool reset ();
157
167
void halt ();
168
+
169
+ private:
170
+ // callback for topic interface
171
+ void reference_callback (
172
+ const std::shared_ptr<ControllerTwistReferenceMsg> msg);
173
+ void reference_callback_unstamped (const std::shared_ptr<geometry_msgs::msg::Twist> msg);
158
174
};
159
175
} // namespace diff_drive_controller
160
176
#endif // DIFF_DRIVE_CONTROLLER__DIFF_DRIVE_CONTROLLER_HPP_
0 commit comments