21
21
#include " gtest/gtest.h"
22
22
#include " rclcpp/rclcpp.hpp"
23
23
24
+ #include < autoware/trajectory_follower_base/control_horizon.hpp>
25
+
24
26
#include " autoware_control_msgs/msg/lateral.hpp"
25
27
#include " autoware_planning_msgs/msg/trajectory.hpp"
26
28
#include " autoware_planning_msgs/msg/trajectory_point.hpp"
41
43
namespace autoware ::motion::control::mpc_lateral_controller
42
44
{
43
45
46
+ using autoware::motion::control::trajectory_follower::LateralHorizon;
44
47
using autoware_control_msgs::msg::Lateral;
45
48
using autoware_planning_msgs::msg::Trajectory;
46
49
using autoware_planning_msgs::msg::TrajectoryPoint;
@@ -209,10 +212,14 @@ TEST_F(MPCTest, InitializeAndCalculate)
209
212
Lateral ctrl_cmd;
210
213
Trajectory pred_traj;
211
214
Float32MultiArrayStamped diag;
215
+ LateralHorizon ctrl_cmd_horizon;
212
216
const auto odom = makeOdometry (pose_zero, default_velocity);
213
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
217
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
214
218
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
215
219
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
220
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
221
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
222
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
216
223
}
217
224
218
225
TEST_F (MPCTest, InitializeAndCalculateRightTurn)
@@ -241,10 +248,14 @@ TEST_F(MPCTest, InitializeAndCalculateRightTurn)
241
248
Lateral ctrl_cmd;
242
249
Trajectory pred_traj;
243
250
Float32MultiArrayStamped diag;
251
+ LateralHorizon ctrl_cmd_horizon;
244
252
const auto odom = makeOdometry (pose_zero, default_velocity);
245
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
253
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
246
254
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
247
255
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
256
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
257
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
258
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
248
259
}
249
260
250
261
TEST_F (MPCTest, OsqpCalculate)
@@ -268,10 +279,14 @@ TEST_F(MPCTest, OsqpCalculate)
268
279
Lateral ctrl_cmd;
269
280
Trajectory pred_traj;
270
281
Float32MultiArrayStamped diag;
282
+ LateralHorizon ctrl_cmd_horizon;
271
283
const auto odom = makeOdometry (pose_zero, default_velocity);
272
- EXPECT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
284
+ EXPECT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
273
285
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
274
286
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
287
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
288
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
289
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
275
290
}
276
291
277
292
TEST_F (MPCTest, OsqpCalculateRightTurn)
@@ -296,10 +311,14 @@ TEST_F(MPCTest, OsqpCalculateRightTurn)
296
311
Lateral ctrl_cmd;
297
312
Trajectory pred_traj;
298
313
Float32MultiArrayStamped diag;
314
+ LateralHorizon ctrl_cmd_horizon;
299
315
const auto odom = makeOdometry (pose_zero, default_velocity);
300
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
316
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
301
317
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
302
318
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
319
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
320
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
321
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
303
322
}
304
323
305
324
TEST_F (MPCTest, KinematicsNoDelayCalculate)
@@ -326,10 +345,14 @@ TEST_F(MPCTest, KinematicsNoDelayCalculate)
326
345
Lateral ctrl_cmd;
327
346
Trajectory pred_traj;
328
347
Float32MultiArrayStamped diag;
348
+ LateralHorizon ctrl_cmd_horizon;
329
349
const auto odom = makeOdometry (pose_zero, default_velocity);
330
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
350
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
331
351
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
332
352
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
353
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
354
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
355
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
333
356
}
334
357
335
358
TEST_F (MPCTest, KinematicsNoDelayCalculateRightTurn)
@@ -357,10 +380,14 @@ TEST_F(MPCTest, KinematicsNoDelayCalculateRightTurn)
357
380
Lateral ctrl_cmd;
358
381
Trajectory pred_traj;
359
382
Float32MultiArrayStamped diag;
383
+ LateralHorizon ctrl_cmd_horizon;
360
384
const auto odom = makeOdometry (pose_zero, default_velocity);
361
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
385
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
362
386
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
363
387
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
388
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
389
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
390
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
364
391
}
365
392
366
393
TEST_F (MPCTest, DynamicCalculate)
@@ -382,10 +409,14 @@ TEST_F(MPCTest, DynamicCalculate)
382
409
Lateral ctrl_cmd;
383
410
Trajectory pred_traj;
384
411
Float32MultiArrayStamped diag;
412
+ LateralHorizon ctrl_cmd_horizon;
385
413
const auto odom = makeOdometry (pose_zero, default_velocity);
386
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
414
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
387
415
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
388
416
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
417
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
418
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
419
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
389
420
}
390
421
391
422
TEST_F (MPCTest, MultiSolveWithBuffer)
@@ -406,24 +437,37 @@ TEST_F(MPCTest, MultiSolveWithBuffer)
406
437
Lateral ctrl_cmd;
407
438
Trajectory pred_traj;
408
439
Float32MultiArrayStamped diag;
440
+ LateralHorizon ctrl_cmd_horizon;
409
441
const auto odom = makeOdometry (pose_zero, default_velocity);
410
442
411
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
443
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
412
444
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
413
445
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
414
446
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
415
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
447
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
448
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
449
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
450
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
416
451
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
417
452
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
418
453
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
419
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
454
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
455
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
456
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
457
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
420
458
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
421
459
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
422
460
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
423
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
461
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
462
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
463
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
464
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
424
465
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
425
466
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
426
467
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
468
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
469
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
470
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
427
471
}
428
472
429
473
TEST_F (MPCTest, FailureCases)
@@ -446,11 +490,13 @@ TEST_F(MPCTest, FailureCases)
446
490
Lateral ctrl_cmd;
447
491
Trajectory pred_traj;
448
492
Float32MultiArrayStamped diag;
493
+ LateralHorizon ctrl_cmd_horizon;
449
494
const auto odom = makeOdometry (pose_far, default_velocity);
450
- EXPECT_FALSE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
495
+ EXPECT_FALSE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
451
496
452
497
// Calculate MPC with a fast velocity to make the prediction go further than the reference path
453
498
EXPECT_FALSE (mpc->calculateMPC (
454
- neutral_steer, makeOdometry (pose_far, default_velocity + 10.0 ), ctrl_cmd, pred_traj, diag));
499
+ neutral_steer, makeOdometry (pose_far, default_velocity + 10.0 ), ctrl_cmd, pred_traj, diag,
500
+ ctrl_cmd_horizon));
455
501
}
456
502
} // namespace autoware::motion::control::mpc_lateral_controller
0 commit comments