ros2_control - rolling
diff_drive_controller.hpp
1 // Copyright 2020 PAL Robotics S.L.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14 
15 /*
16  * Author: Bence Magyar, Enrique Fernández, Manuel Meraz
17  */
18 
19 #ifndef DIFF_DRIVE_CONTROLLER__DIFF_DRIVE_CONTROLLER_HPP_
20 #define DIFF_DRIVE_CONTROLLER__DIFF_DRIVE_CONTROLLER_HPP_
21 
22 #include <chrono>
23 #include <cmath>
24 #include <memory>
25 #include <queue>
26 #include <string>
27 #include <vector>
28 
29 #include "controller_interface/controller_interface.hpp"
30 #include "diff_drive_controller/odometry.hpp"
31 #include "diff_drive_controller/speed_limiter.hpp"
32 #include "diff_drive_controller/visibility_control.h"
33 #include "geometry_msgs/msg/twist_stamped.hpp"
34 #include "nav_msgs/msg/odometry.hpp"
35 #include "odometry.hpp"
36 #include "rclcpp_lifecycle/state.hpp"
37 #include "realtime_tools/realtime_box.h"
38 #include "realtime_tools/realtime_publisher.h"
39 #include "tf2_msgs/msg/tf_message.hpp"
40 
41 // auto-generated by generate_parameter_library
42 #include "diff_drive_controller_parameters.hpp"
43 
44 namespace diff_drive_controller
45 {
47 {
48  using Twist = geometry_msgs::msg::TwistStamped;
49 
50 public:
51  DIFF_DRIVE_CONTROLLER_PUBLIC
53 
54  DIFF_DRIVE_CONTROLLER_PUBLIC
56 
57  DIFF_DRIVE_CONTROLLER_PUBLIC
59 
60  DIFF_DRIVE_CONTROLLER_PUBLIC
61  controller_interface::return_type update(
62  const rclcpp::Time & time, const rclcpp::Duration & period) override;
63 
64  DIFF_DRIVE_CONTROLLER_PUBLIC
65  controller_interface::CallbackReturn on_init() override;
66 
67  DIFF_DRIVE_CONTROLLER_PUBLIC
68  controller_interface::CallbackReturn on_configure(
69  const rclcpp_lifecycle::State & previous_state) override;
70 
71  DIFF_DRIVE_CONTROLLER_PUBLIC
72  controller_interface::CallbackReturn on_activate(
73  const rclcpp_lifecycle::State & previous_state) override;
74 
75  DIFF_DRIVE_CONTROLLER_PUBLIC
76  controller_interface::CallbackReturn on_deactivate(
77  const rclcpp_lifecycle::State & previous_state) override;
78 
79  DIFF_DRIVE_CONTROLLER_PUBLIC
80  controller_interface::CallbackReturn on_cleanup(
81  const rclcpp_lifecycle::State & previous_state) override;
82 
83  DIFF_DRIVE_CONTROLLER_PUBLIC
84  controller_interface::CallbackReturn on_error(
85  const rclcpp_lifecycle::State & previous_state) override;
86 
87  DIFF_DRIVE_CONTROLLER_PUBLIC
88  controller_interface::CallbackReturn on_shutdown(
89  const rclcpp_lifecycle::State & previous_state) override;
90 
91 protected:
92  struct WheelHandle
93  {
94  std::reference_wrapper<const hardware_interface::LoanedStateInterface> feedback;
95  std::reference_wrapper<hardware_interface::LoanedCommandInterface> velocity;
96  };
97 
98  const char * feedback_type() const;
99  controller_interface::CallbackReturn configure_side(
100  const std::string & side, const std::vector<std::string> & wheel_names,
101  std::vector<WheelHandle> & registered_handles);
102 
103  std::vector<WheelHandle> registered_left_wheel_handles_;
104  std::vector<WheelHandle> registered_right_wheel_handles_;
105 
106  // Parameters from ROS for diff_drive_controller
107  std::shared_ptr<ParamListener> param_listener_;
108  Params params_;
109  /* Number of wheels on each side of the robot. This is important to take the wheels slip into
110  * account when multiple wheels on each side are present. If there are more wheels then control
111  * signals for each side, you should enter number for control signals. For example, Husky has two
112  * wheels on each side, but they use one control signal, in this case '1' is the correct value of
113  * the parameter. */
114  int wheels_per_side_;
115 
116  Odometry odometry_;
117 
118  // Timeout to consider cmd_vel commands old
119  std::chrono::milliseconds cmd_vel_timeout_{500};
120 
121  std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> odometry_publisher_ = nullptr;
122  std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>
123  realtime_odometry_publisher_ = nullptr;
124 
125  std::shared_ptr<rclcpp::Publisher<tf2_msgs::msg::TFMessage>> odometry_transform_publisher_ =
126  nullptr;
127  std::shared_ptr<realtime_tools::RealtimePublisher<tf2_msgs::msg::TFMessage>>
128  realtime_odometry_transform_publisher_ = nullptr;
129 
130  bool subscriber_is_active_ = false;
131  rclcpp::Subscription<Twist>::SharedPtr velocity_command_subscriber_ = nullptr;
132 
133  realtime_tools::RealtimeBox<std::shared_ptr<Twist>> received_velocity_msg_ptr_{nullptr};
134 
135  std::queue<Twist> previous_commands_; // last two commands
136 
137  // speed limiters
138  SpeedLimiter limiter_linear_;
139  SpeedLimiter limiter_angular_;
140 
141  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_ =
144  nullptr;
145 
146  rclcpp::Time previous_update_timestamp_{0};
147 
148  // publish rate limiter
149  double publish_rate_ = 50.0;
150  rclcpp::Duration publish_period_ = rclcpp::Duration::from_nanoseconds(0);
151  rclcpp::Time previous_publish_timestamp_{0, 0, RCL_CLOCK_UNINITIALIZED};
152 
153  bool is_halted = false;
154 
155  bool reset();
156  void halt();
157 };
158 } // namespace diff_drive_controller
159 #endif // DIFF_DRIVE_CONTROLLER__DIFF_DRIVE_CONTROLLER_HPP_
Definition: controller_interface.hpp:28
Definition: diff_drive_controller.hpp:47
DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::return_type update(const rclcpp::Time &time, const rclcpp::Duration &period) override
Definition: diff_drive_controller.cpp:100
DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::InterfaceConfiguration state_interface_configuration() const override
Get configuration for controller's required state interfaces.
Definition: diff_drive_controller.cpp:86
DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::CallbackReturn on_init() override
Extending interface with initialization method which is individual for each controller.
Definition: diff_drive_controller.cpp:55
DIFF_DRIVE_CONTROLLER_PUBLIC controller_interface::InterfaceConfiguration command_interface_configuration() const override
Get configuration for controller's required command interfaces.
Definition: diff_drive_controller.cpp:72
Definition: odometry.hpp:38
Definition: realtime_box.h:47
Configuring what command/state interfaces to claim.
Definition: controller_interface_base.hpp:56
Definition: diff_drive_controller.hpp:93