Skip to content

Commit 26e4bf2

Browse files
committed
better computation of the position limits
1 parent c793b5c commit 26e4bf2

File tree

1 file changed

+9
-6
lines changed

1 file changed

+9
-6
lines changed

joint_limits/src/joint_range_limiter.cpp

+9-6
Original file line numberDiff line numberDiff line change
@@ -24,17 +24,20 @@
2424
bool is_limited(double value, double min, double max) { return value < min || value > max; }
2525

2626
std::pair<double, double> compute_position_limits(
27-
const joint_limits::JointLimits & limits, double prev_command_pos, double dt)
27+
const joint_limits::JointLimits & limits, const std::optional<double> & act_vel,
28+
const std::optional<double> & prev_command_pos, double dt)
2829
{
2930
std::pair<double, double> pos_limits({limits.min_position, limits.max_position});
3031
if (limits.has_velocity_limits)
3132
{
32-
const double delta_vel =
33-
limits.has_acceleration_limits ? limits.max_acceleration * dt : limits.max_velocity;
33+
const double act_vel_abs = act_vel.has_value() ? std::fabs(act_vel.value()) : 0.0;
34+
const double delta_vel = limits.has_acceleration_limits
35+
? act_vel_abs + (limits.max_acceleration * dt)
36+
: limits.max_velocity;
3437
const double max_vel = std::min(limits.max_velocity, delta_vel);
3538
const double delta_pos = max_vel * dt;
36-
pos_limits.first = std::max(prev_command_pos - delta_pos, pos_limits.first);
37-
pos_limits.second = std::min(prev_command_pos + delta_pos, pos_limits.second);
39+
pos_limits.first = std::max(prev_command_pos.value() - delta_pos, pos_limits.first);
40+
pos_limits.second = std::min(prev_command_pos.value() + delta_pos, pos_limits.second);
3841
}
3942
return pos_limits;
4043
}
@@ -222,7 +225,7 @@ bool JointSaturationLimiter<JointLimits, JointControlInterfacesData>::on_enforce
222225
if (desired.has_position())
223226
{
224227
const auto limits =
225-
compute_position_limits(joint_limits, prev_command_.position.value(), dt_seconds);
228+
compute_position_limits(joint_limits, actual.velocity, prev_command_.position, dt_seconds);
226229
limits_enforced = is_limited(desired.position.value(), limits.first, limits.second);
227230
desired.position = std::clamp(desired.position.value(), limits.first, limits.second);
228231
}

0 commit comments

Comments
 (0)