Skip to content

Commit dea3d3c

Browse files
committed
Make diff drive controller chainable
1 parent 22356e0 commit dea3d3c

File tree

4 files changed

+217
-104
lines changed

4 files changed

+217
-104
lines changed

diff_drive_controller/diff_drive_plugin.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<library path="diff_drive_controller">
2-
<class name="diff_drive_controller/DiffDriveController" type="diff_drive_controller::DiffDriveController" base_class_type="controller_interface::ControllerInterface">
2+
<class name="diff_drive_controller/DiffDriveController" type="diff_drive_controller::DiffDriveController" base_class_type="controller_interface::ChainableControllerInterface">
33
<description>
44
The differential drive controller transforms linear and angular velocity messages into signals for each wheel(s) for a differential drive robot.
55
</description>

diff_drive_controller/include/diff_drive_controller/diff_drive_controller.hpp

+23-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
#include <string>
2727
#include <vector>
2828

29-
#include "controller_interface/controller_interface.hpp"
29+
#include "controller_interface/chainable_controller_interface.hpp"
3030
#include "diff_drive_controller/odometry.hpp"
3131
#include "diff_drive_controller/speed_limiter.hpp"
3232
#include "diff_drive_controller/visibility_control.h"
@@ -37,7 +37,6 @@
3737
#include "odometry.hpp"
3838
#include "rclcpp/rclcpp.hpp"
3939
#include "rclcpp_lifecycle/state.hpp"
40-
#include "realtime_tools/realtime_box.h"
4140
#include "realtime_tools/realtime_buffer.h"
4241
#include "realtime_tools/realtime_publisher.h"
4342
#include "tf2_msgs/msg/tf_message.hpp"
@@ -47,7 +46,7 @@
4746

4847
namespace diff_drive_controller
4948
{
50-
class DiffDriveController : public controller_interface::ControllerInterface
49+
class DiffDriveController : public controller_interface::ChainableControllerInterface
5150
{
5251
using Twist = geometry_msgs::msg::TwistStamped;
5352

@@ -61,10 +60,13 @@ class DiffDriveController : public controller_interface::ControllerInterface
6160
DIFF_DRIVE_CONTROLLER_PUBLIC
6261
controller_interface::InterfaceConfiguration state_interface_configuration() const override;
6362

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(
6665
const rclcpp::Time & time, const rclcpp::Duration & period) override;
6766

67+
DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::return_type
68+
update_and_write_commands(const rclcpp::Time & time, const rclcpp::Duration & period) override;
69+
6870
DIFF_DRIVE_CONTROLLER_PUBLIC
6971
controller_interface::CallbackReturn on_init() override;
7072

@@ -92,7 +94,15 @@ class DiffDriveController : public controller_interface::ControllerInterface
9294
controller_interface::CallbackReturn on_shutdown(
9395
const rclcpp_lifecycle::State & previous_state) override;
9496

97+
using ControllerTwistReferenceMsg = geometry_msgs::msg::TwistStamped;
98+
9599
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+
96106
struct WheelHandle
97107
{
98108
std::reference_wrapper<const hardware_interface::LoanedStateInterface> feedback;
@@ -114,7 +124,7 @@ class DiffDriveController : public controller_interface::ControllerInterface
114124
Odometry odometry_;
115125

116126
// 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);
118128

119129
std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> odometry_publisher_ = nullptr;
120130
std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>
@@ -130,7 +140,7 @@ class DiffDriveController : public controller_interface::ControllerInterface
130140
rclcpp::Subscription<geometry_msgs::msg::Twist>::SharedPtr
131141
velocity_command_unstamped_subscriber_ = nullptr;
132142

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};
134144

135145
std::queue<Twist> previous_commands_; // last two commands
136146

@@ -155,6 +165,12 @@ class DiffDriveController : public controller_interface::ControllerInterface
155165

156166
bool reset();
157167
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);
158174
};
159175
} // namespace diff_drive_controller
160176
#endif // DIFF_DRIVE_CONTROLLER__DIFF_DRIVE_CONTROLLER_HPP_

0 commit comments

Comments
 (0)