|
24 | 24 | bool is_limited(double value, double min, double max) { return value < min || value > max; }
|
25 | 25 |
|
26 | 26 | 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) |
28 | 29 | {
|
29 | 30 | std::pair<double, double> pos_limits({limits.min_position, limits.max_position});
|
30 | 31 | if (limits.has_velocity_limits)
|
31 | 32 | {
|
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; |
34 | 37 | const double max_vel = std::min(limits.max_velocity, delta_vel);
|
35 | 38 | 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); |
38 | 41 | }
|
39 | 42 | return pos_limits;
|
40 | 43 | }
|
@@ -222,7 +225,7 @@ bool JointSaturationLimiter<JointLimits, JointControlInterfacesData>::on_enforce
|
222 | 225 | if (desired.has_position())
|
223 | 226 | {
|
224 | 227 | 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); |
226 | 229 | limits_enforced = is_limited(desired.position.value(), limits.first, limits.second);
|
227 | 230 | desired.position = std::clamp(desired.position.value(), limits.first, limits.second);
|
228 | 231 | }
|
|
0 commit comments