Skip to content

Commit 82f8da8

Browse files
rafal-goreckiKmakD
andauthored
Unify parameters with diff_drive (#13)
* update mecanum controller * Add similar changes asi in the official ros2 control diff_drive * Update parameters and add deprecated info * Fix build * Apply suggestions from code review Co-authored-by: Dawid Kmak <[email protected]> * Apply Dawid suggestions --------- Co-authored-by: kmakd <[email protected]> Co-authored-by: Dawid Kmak <[email protected]>
1 parent ff2b156 commit 82f8da8

File tree

8 files changed

+338
-289
lines changed

8 files changed

+338
-289
lines changed

mecanum_drive_controller/CMakeLists.txt

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,11 @@ if(NOT CMAKE_CXX_STANDARD)
1111
endif()
1212

1313
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
14-
add_compile_options(-Wall -Wextra)
14+
add_compile_options(-Wall -Wextra -Wpedantic -Wshadow -Wold-style-cast)
1515
endif()
1616

1717
set(THIS_PACKAGE_INCLUDE_DEPENDS
18+
control_toolbox
1819
controller_interface
1920
generate_parameter_library
2021
geometry_msgs
@@ -33,24 +34,25 @@ foreach(Dependency IN ITEMS ${THIS_PACKAGE_INCLUDE_DEPENDS})
3334
find_package(${Dependency} REQUIRED)
3435
endforeach()
3536

36-
generate_parameter_library(mecanum_drive_controller_parameters
37-
src/mecanum_drive_controller_parameter.yaml)
37+
# get include dirs from control_toolbox for the custom validators
38+
get_target_property(TB_INCLUDE_DIRS control_toolbox::rate_limiter_parameters
39+
INTERFACE_INCLUDE_DIRECTORIES)
40+
generate_parameter_library(
41+
mecanum_drive_controller_parameters
42+
src/mecanum_drive_controller_parameter.yaml
43+
${TB_INCLUDE_DIRS}/control_toolbox/custom_validators.hpp)
3844

39-
add_library(
40-
mecanum_drive_controller SHARED src/mecanum_drive_controller.cpp
41-
src/odometry.cpp src/speed_limiter.cpp)
45+
add_library(mecanum_drive_controller SHARED src/mecanum_drive_controller.cpp
46+
src/odometry.cpp)
4247
target_include_directories(
4348
mecanum_drive_controller
44-
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/include>
49+
PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>
4550
$<INSTALL_INTERFACE:include/mecanum_drive_controller>)
46-
target_link_libraries(mecanum_drive_controller
47-
PUBLIC mecanum_drive_controller_parameters)
51+
target_link_libraries(
52+
mecanum_drive_controller PUBLIC mecanum_drive_controller_parameters
53+
control_toolbox::rate_limiter_parameters)
4854
ament_target_dependencies(mecanum_drive_controller PUBLIC
4955
${THIS_PACKAGE_INCLUDE_DEPENDS})
50-
# Causes the visibility macros to use dllexport rather than dllimport, which is
51-
# appropriate when building the dll but not consuming it.
52-
target_compile_definitions(mecanum_drive_controller
53-
PRIVATE "MECANUM_DRIVE_CONTROLLER_BUILDING_DLL")
5456
pluginlib_export_plugin_description_file(controller_interface
5557
mecanum_drive_plugin.xml)
5658

mecanum_drive_controller/include/mecanum_drive_controller/mecanum_drive_controller.hpp

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
#include "mecanum_drive_controller/mecanum_drive_controller_parameters.hpp"
4848
#include "mecanum_drive_controller/odometry.hpp"
4949
#include "mecanum_drive_controller/speed_limiter.hpp"
50-
#include "mecanum_drive_controller/visibility_control.h"
5150
#include "odometry.hpp"
5251

5352
namespace mecanum_drive_controller
@@ -57,46 +56,32 @@ class MecanumDriveController : public controller_interface::ControllerInterface
5756
using TwistStamped = geometry_msgs::msg::TwistStamped;
5857

5958
public:
60-
MECANUM_DRIVE_CONTROLLER_PUBLIC
6159
MecanumDriveController();
6260

63-
MECANUM_DRIVE_CONTROLLER_PUBLIC
6461
controller_interface::InterfaceConfiguration command_interface_configuration() const override;
6562

66-
MECANUM_DRIVE_CONTROLLER_PUBLIC
6763
controller_interface::InterfaceConfiguration state_interface_configuration() const override;
6864

69-
MECANUM_DRIVE_CONTROLLER_PUBLIC
7065
controller_interface::return_type update(
7166
const rclcpp::Time & time, const rclcpp::Duration & period) override;
7267

73-
MECANUM_DRIVE_CONTROLLER_PUBLIC
7468
controller_interface::CallbackReturn on_init() override;
7569

76-
MECANUM_DRIVE_CONTROLLER_PUBLIC
7770
controller_interface::CallbackReturn on_configure(
7871
const rclcpp_lifecycle::State & previous_state) override;
7972

80-
MECANUM_DRIVE_CONTROLLER_PUBLIC
8173
controller_interface::CallbackReturn on_activate(
8274
const rclcpp_lifecycle::State & previous_state) override;
8375

84-
MECANUM_DRIVE_CONTROLLER_PUBLIC
8576
controller_interface::CallbackReturn on_deactivate(
8677
const rclcpp_lifecycle::State & previous_state) override;
8778

88-
MECANUM_DRIVE_CONTROLLER_PUBLIC
8979
controller_interface::CallbackReturn on_cleanup(
9080
const rclcpp_lifecycle::State & previous_state) override;
9181

92-
MECANUM_DRIVE_CONTROLLER_PUBLIC
9382
controller_interface::CallbackReturn on_error(
9483
const rclcpp_lifecycle::State & previous_state) override;
9584

96-
MECANUM_DRIVE_CONTROLLER_PUBLIC
97-
controller_interface::CallbackReturn on_shutdown(
98-
const rclcpp_lifecycle::State & previous_state) override;
99-
10085
protected:
10186
struct WheelHandle
10287
{
@@ -124,6 +109,9 @@ class MecanumDriveController : public controller_interface::ControllerInterface
124109

125110
Odometry odometry_;
126111

112+
// Timeout to consider cmd_vel commands old
113+
rclcpp::Duration cmd_vel_timeout_ = rclcpp::Duration::from_seconds(0.5);
114+
127115
std::shared_ptr<rclcpp::Publisher<nav_msgs::msg::Odometry>> odometry_publisher_ = nullptr;
128116
std::shared_ptr<realtime_tools::RealtimePublisher<nav_msgs::msg::Odometry>>
129117
realtime_odometry_publisher_ = nullptr;
@@ -132,10 +120,6 @@ class MecanumDriveController : public controller_interface::ControllerInterface
132120
nullptr;
133121
std::shared_ptr<realtime_tools::RealtimePublisher<tf2_msgs::msg::TFMessage>>
134122
realtime_odometry_transform_publisher_ = nullptr;
135-
136-
// Timeout to consider cmd_vel commands old
137-
std::chrono::milliseconds cmd_vel_timeout_{500};
138-
139123
bool subscriber_is_active_ = false;
140124
rclcpp::Subscription<TwistStamped>::SharedPtr velocity_command_subscriber_ = nullptr;
141125

@@ -144,9 +128,9 @@ class MecanumDriveController : public controller_interface::ControllerInterface
144128
std::queue<TwistStamped> previous_commands_; // last two commands
145129

146130
// speed limiters
147-
SpeedLimiter limiter_linear_x_;
148-
SpeedLimiter limiter_linear_y_;
149-
SpeedLimiter limiter_angular_;
131+
std::unique_ptr<SpeedLimiter> limiter_linear_x_;
132+
std::unique_ptr<SpeedLimiter> limiter_linear_y_;
133+
std::unique_ptr<SpeedLimiter> limiter_angular_;
150134

151135
bool publish_limited_velocity_ = false;
152136
std::shared_ptr<rclcpp::Publisher<TwistStamped>> limited_velocity_publisher_ = nullptr;

mecanum_drive_controller/include/mecanum_drive_controller/speed_limiter.hpp

Lines changed: 69 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@
2323
#ifndef MECANUM_DRIVE_CONTROLLER__SPEED_LIMITER_HPP_
2424
#define MECANUM_DRIVE_CONTROLLER__SPEED_LIMITER_HPP_
2525

26-
#include <cmath>
26+
#include <limits>
27+
28+
#include "control_toolbox/rate_limiter.hpp"
2729

2830
namespace mecanum_drive_controller
2931
{
@@ -37,16 +39,62 @@ class SpeedLimiter
3739
* \param [in] has_jerk_limits if true, applies jerk limits
3840
* \param [in] min_velocity Minimum velocity [m/s], usually <= 0
3941
* \param [in] max_velocity Maximum velocity [m/s], usually >= 0
40-
* \param [in] min_acceleration Minimum acceleration [m/s^2], usually <= 0
42+
* \param [in] max_deceleration Maximum deceleration [m/s^2], usually <= 0
4143
* \param [in] max_acceleration Maximum acceleration [m/s^2], usually >= 0
4244
* \param [in] min_jerk Minimum jerk [m/s^3], usually <= 0
4345
* \param [in] max_jerk Maximum jerk [m/s^3], usually >= 0
4446
*/
45-
SpeedLimiter(
46-
bool has_velocity_limits = false, bool has_acceleration_limits = false,
47-
bool has_jerk_limits = false, double min_velocity = NAN, double max_velocity = NAN,
48-
double min_acceleration = NAN, double max_acceleration = NAN, double min_jerk = NAN,
49-
double max_jerk = NAN);
47+
[[deprecated]] explicit SpeedLimiter(
48+
bool has_velocity_limits = true, bool has_acceleration_limits = true,
49+
bool has_jerk_limits = true, double min_velocity = std::numeric_limits<double>::quiet_NaN(),
50+
double max_velocity = std::numeric_limits<double>::quiet_NaN(),
51+
double max_deceleration = std::numeric_limits<double>::quiet_NaN(),
52+
double max_acceleration = std::numeric_limits<double>::quiet_NaN(),
53+
double min_jerk = std::numeric_limits<double>::quiet_NaN(),
54+
double max_jerk = std::numeric_limits<double>::quiet_NaN())
55+
{
56+
if (!has_velocity_limits) {
57+
min_velocity = max_velocity = std::numeric_limits<double>::quiet_NaN();
58+
}
59+
if (!has_acceleration_limits) {
60+
max_deceleration = max_acceleration = std::numeric_limits<double>::quiet_NaN();
61+
}
62+
if (!has_jerk_limits) {
63+
min_jerk = max_jerk = std::numeric_limits<double>::quiet_NaN();
64+
}
65+
speed_limiter_ = control_toolbox::RateLimiter<double>(
66+
min_velocity, max_velocity, max_deceleration, max_acceleration,
67+
std::numeric_limits<double>::quiet_NaN(), std::numeric_limits<double>::quiet_NaN(), min_jerk,
68+
max_jerk);
69+
}
70+
71+
/**
72+
* \brief Constructor
73+
* \param [in] min_velocity Minimum velocity [m/s], usually <= 0
74+
* \param [in] max_velocity Maximum velocity [m/s], usually >= 0
75+
* \param [in] max_acceleration_reverse Maximum acceleration in reverse direction [m/s^2], usually
76+
* <= 0
77+
* \param [in] max_acceleration Maximum acceleration [m/s^2], usually >= 0
78+
* \param [in] max_deceleration Maximum deceleration [m/s^2], usually <= 0
79+
* \param [in] max_deceleration_reverse Maximum deceleration in reverse direction [m/s^2], usually
80+
* >= 0
81+
* \param [in] min_jerk Minimum jerk [m/s^3], usually <= 0
82+
* \param [in] max_jerk Maximum jerk [m/s^3], usually >= 0
83+
*
84+
* \note
85+
* If max_* values are NAN, the respective limit is deactivated
86+
* If min_* values are NAN (unspecified), defaults to -max
87+
* If min_first_derivative_pos/max_first_derivative_neg values are NAN, symmetric limits are used
88+
*/
89+
explicit SpeedLimiter(
90+
double min_velocity, double max_velocity, double max_acceleration_reverse,
91+
double max_acceleration, double max_deceleration, double max_deceleration_reverse,
92+
double min_jerk, double max_jerk)
93+
{
94+
speed_limiter_ = control_toolbox::RateLimiter<double>(
95+
min_velocity, max_velocity, max_acceleration_reverse, max_acceleration, max_deceleration,
96+
max_deceleration_reverse, min_jerk, max_jerk);
97+
}
5098

5199
/**
52100
* \brief Limit the velocity and acceleration
@@ -56,14 +104,17 @@ class SpeedLimiter
56104
* \param [in] dt Time step [s]
57105
* \return Limiting factor (1.0 if none)
58106
*/
59-
double limit(double & v, double v0, double v1, double dt);
107+
double limit(double & v, double v0, double v1, double dt)
108+
{
109+
return speed_limiter_.limit(v, v0, v1, dt);
110+
}
60111

61112
/**
62113
* \brief Limit the velocity
63114
* \param [in, out] v Velocity [m/s]
64115
* \return Limiting factor (1.0 if none)
65116
*/
66-
double limit_velocity(double & v);
117+
double limit_velocity(double & v) { return speed_limiter_.limit_value(v); }
67118

68119
/**
69120
* \brief Limit the acceleration
@@ -72,7 +123,10 @@ class SpeedLimiter
72123
* \param [in] dt Time step [s]
73124
* \return Limiting factor (1.0 if none)
74125
*/
75-
double limit_acceleration(double & v, double v0, double dt);
126+
double limit_acceleration(double & v, double v0, double dt)
127+
{
128+
return speed_limiter_.limit_first_derivative(v, v0, dt);
129+
}
76130

77131
/**
78132
* \brief Limit the jerk
@@ -83,25 +137,13 @@ class SpeedLimiter
83137
* \return Limiting factor (1.0 if none)
84138
* \see http://en.wikipedia.org/wiki/Jerk_%28physics%29#Motion_control
85139
*/
86-
double limit_jerk(double & v, double v0, double v1, double dt);
140+
double limit_jerk(double & v, double v0, double v1, double dt)
141+
{
142+
return speed_limiter_.limit_second_derivative(v, v0, v1, dt);
143+
}
87144

88145
private:
89-
// Enable/Disable velocity/acceleration/jerk limits:
90-
bool has_velocity_limits_;
91-
bool has_acceleration_limits_;
92-
bool has_jerk_limits_;
93-
94-
// Velocity limits:
95-
double min_velocity_;
96-
double max_velocity_;
97-
98-
// Acceleration limits:
99-
double min_acceleration_;
100-
double max_acceleration_;
101-
102-
// Jerk limits:
103-
double min_jerk_;
104-
double max_jerk_;
146+
control_toolbox::RateLimiter<double> speed_limiter_; // Instance of the new RateLimiter
105147
};
106148

107149
} // namespace mecanum_drive_controller

mecanum_drive_controller/include/mecanum_drive_controller/visibility_control.h

Lines changed: 0 additions & 58 deletions
This file was deleted.

mecanum_drive_controller/package.xml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,32 +3,38 @@
33
<package format="3">
44
<name>mecanum_drive_controller</name>
55
<version>1.0.0</version>
6-
76
<description>Controller for a mecanum drive mobile base.</description>
7+
<maintainer email="[email protected]">Husarion</maintainer>
88
<license>Apache License 2.0</license>
99

10+
<url type="website">https://husarion.com/</url>
11+
<url type="repository">https://github.com/husarion/husarion_controllers</url>
12+
<url type="bugtracker">https://github.com/husarion/husarion_controllers/issues</url>
13+
1014
<author email="[email protected]">Jakub Delicat</author>
15+
<author email="[email protected]">Rafał Górecki</author>
16+
<author email="[email protected]">Dawid Kmak</author>
1117
<author email="[email protected]">Maciej Stępień</author>
1218
<author email="[email protected]">Bence Magyar</author>
1319
<author email="[email protected]">Jordan Palacios</author>
1420

15-
<maintainer email="[email protected]">Husarion</maintainer>
16-
1721
<buildtool_depend>ament_cmake</buildtool_depend>
1822

23+
<build_depend>generate_parameter_library</build_depend>
24+
25+
<depend>control_toolbox</depend>
1926
<depend>controller_interface</depend>
2027
<depend>geometry_msgs</depend>
2128
<depend>hardware_interface</depend>
2229
<depend>nav_msgs</depend>
30+
<depend>pluginlib</depend>
2331
<depend>rclcpp</depend>
2432
<depend>rclcpp_lifecycle</depend>
2533
<depend>rcpputils</depend>
2634
<depend>realtime_tools</depend>
2735
<depend>tf2</depend>
2836
<depend>tf2_msgs</depend>
2937

30-
<build_depend>pluginlib</build_depend>
31-
3238
<export>
3339
<build_type>ament_cmake</build_type>
3440
</export>

0 commit comments

Comments
 (0)