@@ -214,6 +214,11 @@ TEST_F(JointSoftLimiterTest, check_desired_position_only_cases)
214
214
desired_state_.position = 2.0 ;
215
215
ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
216
216
EXPECT_NEAR (desired_state_.position .value (), 1.0 , COMMON_THRESHOLD);
217
+ actual_state_.position = 0.95 ;
218
+ desired_state_.position = 2.0 ;
219
+ ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
220
+ EXPECT_NEAR (desired_state_.position .value (), 1.95 , COMMON_THRESHOLD);
221
+ actual_state_.position = 1.5 ;
217
222
desired_state_.position = 2.0 ;
218
223
ASSERT_FALSE (joint_limiter_->enforce (actual_state_, desired_state_, period));
219
224
EXPECT_NEAR (desired_state_.position .value (), 2.0 , COMMON_THRESHOLD);
@@ -228,34 +233,58 @@ TEST_F(JointSoftLimiterTest, check_desired_position_only_cases)
228
233
desired_state_.position = 2.0 ;
229
234
ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
230
235
EXPECT_NEAR (desired_state_.position .value (), 1.0 , COMMON_THRESHOLD);
236
+ actual_state_.position = 0.45 ;
237
+ desired_state_.position = 2.0 ;
238
+ ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
239
+ EXPECT_NEAR (desired_state_.position .value (), 1.45 , COMMON_THRESHOLD);
240
+ actual_state_.position = 0.95 ;
231
241
desired_state_.position = 2.0 ;
232
242
ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
233
243
EXPECT_NEAR (desired_state_.position .value (), 1.5 , COMMON_THRESHOLD);
234
244
235
- soft_limits.k_position = 2.0 ;
245
+ // The case of no actual position feedback
246
+ soft_limits.k_position = 0.5 ;
236
247
soft_limits.max_position = 1.5 ;
237
248
soft_limits.min_position = -1.5 ;
238
249
ASSERT_TRUE (Init (limits, soft_limits));
239
- desired_state_.position = 2.0 ;
240
- ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
241
- EXPECT_NEAR (desired_state_.position .value (), 1.0 , COMMON_THRESHOLD);
250
+ actual_state_.position = std::nullopt;
251
+ desired_state_.position = 0.2 ;
252
+ ASSERT_FALSE (joint_limiter_->enforce (actual_state_, desired_state_, period));
253
+ EXPECT_NEAR (desired_state_.position .value (), 0.2 , COMMON_THRESHOLD);
254
+ auto prev_command_state = desired_state_;
255
+ while (desired_state_.position .value () < (soft_limits.max_position - COMMON_THRESHOLD))
256
+ {
257
+ desired_state_.position = 2.0 ;
258
+ double expected_pos =
259
+ prev_command_state.position .value () +
260
+ (soft_limits.max_position - prev_command_state.position .value ()) * soft_limits.k_position ;
261
+ ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
262
+ EXPECT_NEAR (desired_state_.position .value (), expected_pos, COMMON_THRESHOLD);
263
+ prev_command_state = desired_state_;
264
+ }
242
265
desired_state_.position = 2.0 ;
243
266
ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
244
267
EXPECT_NEAR (desired_state_.position .value (), 1.5 , COMMON_THRESHOLD);
245
268
269
+ // More generic test case
246
270
soft_limits.k_position = 0.5 ;
247
271
soft_limits.max_position = 2.0 ;
248
272
soft_limits.min_position = -2.0 ;
249
273
ASSERT_TRUE (Init (limits, soft_limits));
250
274
desired_state_.position = 2.0 ;
251
275
ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
252
276
EXPECT_NEAR (desired_state_.position .value (), 1.0 , COMMON_THRESHOLD);
253
- desired_state_.position = 2.0 ;
254
- ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
255
- EXPECT_NEAR (desired_state_.position .value (), 1.5 , COMMON_THRESHOLD);
256
- desired_state_.position = 2.0 ;
257
- ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
258
- EXPECT_NEAR (desired_state_.position .value (), 1.75 , COMMON_THRESHOLD);
277
+ actual_state_.position = 0.2 ;
278
+ while (actual_state_.position .value () < (desired_state_.position .value () - COMMON_THRESHOLD))
279
+ {
280
+ desired_state_.position = 2.0 ;
281
+ double expected_pos =
282
+ actual_state_.position .value () +
283
+ (soft_limits.max_position - actual_state_.position .value ()) * soft_limits.k_position ;
284
+ ASSERT_TRUE (joint_limiter_->enforce (actual_state_, desired_state_, period));
285
+ EXPECT_NEAR (desired_state_.position .value (), expected_pos, COMMON_THRESHOLD);
286
+ actual_state_.position = expected_pos;
287
+ }
259
288
260
289
// Now test when there are no position limits and soft limits, then the desired position is not
261
290
// saturated
0 commit comments