Skip to content

Commit 52ddce0

Browse files
committed
Merge pull request #17 from clearpathrobotics/deceleration_limits
Separate acceleration and deceleration limits.
2 parents 3abfbcc + a482337 commit 52ddce0

File tree

3 files changed

+57
-7
lines changed

3 files changed

+57
-7
lines changed

diff_drive_controller/include/diff_drive_controller/speed_limiter.h

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ namespace diff_drive_controller
5656
* \param [in] max_acceleration Maximum acceleration [m/s^2], usually >= 0
5757
* \param [in] min_jerk Minimum jerk [m/s^3], usually <= 0
5858
* \param [in] max_jerk Maximum jerk [m/s^3], usually >= 0
59+
* \param [in] min_deceleration Minimum deceleration [m/s^2], usually <= 0
60+
* \param [in] max_deceleration Maximum deceleration [m/s^2], usually >= 0
5961
*/
6062
SpeedLimiter(
6163
bool has_velocity_limits = false,
@@ -66,7 +68,9 @@ namespace diff_drive_controller
6668
double min_acceleration = 0.0,
6769
double max_acceleration = 0.0,
6870
double min_jerk = 0.0,
69-
double max_jerk = 0.0);
71+
double max_jerk = 0.0,
72+
double min_deceleration = 0.0,
73+
double max_deceleration = 0.0);
7074

7175
/**
7276
* \brief Limit the velocity and acceleration
@@ -122,6 +126,10 @@ namespace diff_drive_controller
122126
// Jerk limits:
123127
double min_jerk;
124128
double max_jerk;
129+
130+
// Deceleration limits
131+
double min_deceleration; // Minimum acceleration used to slow down vehicle to zero velocity.
132+
double max_deceleration; // Maximum acceleration used to slow down vehicle to zero velocity.
125133
};
126134

127135
} // namespace diff_drive_controller

diff_drive_controller/src/diff_drive_controller.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ namespace diff_drive_controller
261261
controller_nh.param("linear/x/min_velocity" , limiter_lin_.min_velocity , -limiter_lin_.max_velocity );
262262
controller_nh.param("linear/x/max_acceleration" , limiter_lin_.max_acceleration , limiter_lin_.max_acceleration );
263263
controller_nh.param("linear/x/min_acceleration" , limiter_lin_.min_acceleration , -limiter_lin_.max_acceleration );
264+
controller_nh.param("linear/x/max_deceleration" , limiter_lin_.max_deceleration , limiter_lin_.max_acceleration );
265+
controller_nh.param("linear/x/min_deceleration" , limiter_lin_.min_deceleration , limiter_lin_.min_acceleration );
264266
controller_nh.param("linear/x/max_jerk" , limiter_lin_.max_jerk , limiter_lin_.max_jerk );
265267
controller_nh.param("linear/x/min_jerk" , limiter_lin_.min_jerk , -limiter_lin_.max_jerk );
266268

@@ -271,6 +273,8 @@ namespace diff_drive_controller
271273
controller_nh.param("angular/z/min_velocity" , limiter_ang_.min_velocity , -limiter_ang_.max_velocity );
272274
controller_nh.param("angular/z/max_acceleration" , limiter_ang_.max_acceleration , limiter_ang_.max_acceleration );
273275
controller_nh.param("angular/z/min_acceleration" , limiter_ang_.min_acceleration , -limiter_ang_.max_acceleration );
276+
controller_nh.param("angular/z/max_deceleration" , limiter_ang_.max_deceleration , limiter_ang_.max_acceleration );
277+
controller_nh.param("angular/z/min_deceleration" , limiter_ang_.min_deceleration , limiter_ang_.min_acceleration );
274278
controller_nh.param("angular/z/max_jerk" , limiter_ang_.max_jerk , limiter_ang_.max_jerk );
275279
controller_nh.param("angular/z/min_jerk" , limiter_ang_.min_jerk , -limiter_ang_.max_jerk );
276280

diff_drive_controller/src/speed_limiter.cpp

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ namespace diff_drive_controller
5858
double min_acceleration,
5959
double max_acceleration,
6060
double min_jerk,
61-
double max_jerk
61+
double max_jerk,
62+
double min_deceleration,
63+
double max_deceleration
6264
)
6365
: has_velocity_limits(has_velocity_limits)
6466
, has_acceleration_limits(has_acceleration_limits)
@@ -69,6 +71,8 @@ namespace diff_drive_controller
6971
, max_acceleration(max_acceleration)
7072
, min_jerk(min_jerk)
7173
, max_jerk(max_jerk)
74+
, min_deceleration(min_deceleration)
75+
, max_deceleration(max_deceleration)
7276
{
7377
}
7478

@@ -101,11 +105,45 @@ namespace diff_drive_controller
101105

102106
if (has_acceleration_limits)
103107
{
104-
const double dv_min = min_acceleration * dt;
105-
const double dv_max = max_acceleration * dt;
106-
107-
const double dv = clamp(v - v0, dv_min, dv_max);
108-
108+
double dv_min, dv_max, dv;
109+
110+
if (v0 >= 0.0 && v >= 0.0)
111+
{
112+
// Moving in positive direction
113+
dv_min = min_deceleration * dt;
114+
dv_max = max_acceleration * dt;
115+
}
116+
else if (v0 <= 0.0 && v <= 0.0)
117+
{
118+
// Moving in the negative direction
119+
dv_min = min_acceleration * dt;
120+
dv_max = max_deceleration * dt;
121+
}
122+
else
123+
{
124+
// Transitioning from positive to negative velocity
125+
if (v0 > 0)
126+
{
127+
dv_max = v0;
128+
dv_min = min_deceleration * dt;
129+
if (v0 + dv < 0)
130+
{
131+
dv_min = min_acceleration * (dt - v0 / min_deceleration);
132+
}
133+
}
134+
// Transitioning from negative to positive velocity
135+
else if (v0 < 0)
136+
{
137+
dv_min = v0;
138+
dv_max = max_deceleration * dt;
139+
if (v0 + dv > 0)
140+
{
141+
dv_max = max_acceleration * (dt - v0 / max_deceleration);
142+
}
143+
}
144+
}
145+
146+
dv = clamp(v - v0, dv_min, dv_max);
109147
v = v0 + dv;
110148
}
111149

0 commit comments

Comments
 (0)