|
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