22
22
#include " rclcpp/rclcpp.hpp"
23
23
24
24
#include < ament_index_cpp/get_package_share_directory.hpp>
25
+ #include < autoware/trajectory_follower_base/control_horizon.hpp>
25
26
#include < autoware_planning_test_manager/autoware_planning_test_manager.hpp>
26
27
#include < autoware_test_utils/autoware_test_utils.hpp>
27
28
45
46
namespace autoware ::motion::control::mpc_lateral_controller
46
47
{
47
48
49
+ using autoware::motion::control::trajectory_follower::LateralHorizon;
48
50
using autoware_control_msgs::msg::Lateral;
49
51
using autoware_planning_msgs::msg::Trajectory;
50
52
using autoware_planning_msgs::msg::TrajectoryPoint;
@@ -258,10 +260,14 @@ TEST_F(MPCTest, InitializeAndCalculate)
258
260
Lateral ctrl_cmd;
259
261
Trajectory pred_traj;
260
262
Float32MultiArrayStamped diag;
263
+ LateralHorizon ctrl_cmd_horizon;
261
264
const auto odom = makeOdometry (pose_zero, default_velocity);
262
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
265
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
263
266
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
264
267
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
268
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
269
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
270
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
265
271
}
266
272
267
273
TEST_F (MPCTest, InitializeAndCalculateRightTurn)
@@ -292,10 +298,14 @@ TEST_F(MPCTest, InitializeAndCalculateRightTurn)
292
298
Lateral ctrl_cmd;
293
299
Trajectory pred_traj;
294
300
Float32MultiArrayStamped diag;
301
+ LateralHorizon ctrl_cmd_horizon;
295
302
const auto odom = makeOdometry (pose_zero, default_velocity);
296
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
303
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
297
304
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
298
305
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
306
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
307
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
308
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
299
309
}
300
310
301
311
TEST_F (MPCTest, OsqpCalculate)
@@ -321,10 +331,14 @@ TEST_F(MPCTest, OsqpCalculate)
321
331
Lateral ctrl_cmd;
322
332
Trajectory pred_traj;
323
333
Float32MultiArrayStamped diag;
334
+ LateralHorizon ctrl_cmd_horizon;
324
335
const auto odom = makeOdometry (pose_zero, default_velocity);
325
- EXPECT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
336
+ EXPECT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
326
337
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
327
338
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
339
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
340
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
341
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
328
342
}
329
343
330
344
TEST_F (MPCTest, OsqpCalculateRightTurn)
@@ -351,10 +365,14 @@ TEST_F(MPCTest, OsqpCalculateRightTurn)
351
365
Lateral ctrl_cmd;
352
366
Trajectory pred_traj;
353
367
Float32MultiArrayStamped diag;
368
+ LateralHorizon ctrl_cmd_horizon;
354
369
const auto odom = makeOdometry (pose_zero, default_velocity);
355
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
370
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
356
371
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
357
372
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
373
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
374
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
375
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
358
376
}
359
377
360
378
TEST_F (MPCTest, KinematicsNoDelayCalculate)
@@ -382,10 +400,14 @@ TEST_F(MPCTest, KinematicsNoDelayCalculate)
382
400
Lateral ctrl_cmd;
383
401
Trajectory pred_traj;
384
402
Float32MultiArrayStamped diag;
403
+ LateralHorizon ctrl_cmd_horizon;
385
404
const auto odom = makeOdometry (pose_zero, default_velocity);
386
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
405
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
387
406
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
388
407
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
408
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
409
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
410
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
389
411
}
390
412
391
413
TEST_F (MPCTest, KinematicsNoDelayCalculateRightTurn)
@@ -414,10 +436,14 @@ TEST_F(MPCTest, KinematicsNoDelayCalculateRightTurn)
414
436
Lateral ctrl_cmd;
415
437
Trajectory pred_traj;
416
438
Float32MultiArrayStamped diag;
439
+ LateralHorizon ctrl_cmd_horizon;
417
440
const auto odom = makeOdometry (pose_zero, default_velocity);
418
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
441
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
419
442
EXPECT_LT (ctrl_cmd.steering_tire_angle , 0 .0f );
420
443
EXPECT_LT (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
444
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
445
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
446
+ EXPECT_LT (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
421
447
}
422
448
423
449
TEST_F (MPCTest, DynamicCalculate)
@@ -441,10 +467,14 @@ TEST_F(MPCTest, DynamicCalculate)
441
467
Lateral ctrl_cmd;
442
468
Trajectory pred_traj;
443
469
Float32MultiArrayStamped diag;
470
+ LateralHorizon ctrl_cmd_horizon;
444
471
const auto odom = makeOdometry (pose_zero, default_velocity);
445
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
472
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
446
473
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
447
474
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
475
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
476
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
477
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
448
478
}
449
479
450
480
TEST_F (MPCTest, MultiSolveWithBuffer)
@@ -467,24 +497,37 @@ TEST_F(MPCTest, MultiSolveWithBuffer)
467
497
Lateral ctrl_cmd;
468
498
Trajectory pred_traj;
469
499
Float32MultiArrayStamped diag;
500
+ LateralHorizon ctrl_cmd_horizon;
470
501
const auto odom = makeOdometry (pose_zero, default_velocity);
471
502
472
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
503
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
473
504
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
474
505
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
475
506
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
476
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
507
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
508
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
509
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
510
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
477
511
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
478
512
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
479
513
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
480
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
514
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
515
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
516
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
517
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
481
518
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
482
519
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
483
520
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
484
- ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
521
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
522
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
523
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
524
+ ASSERT_TRUE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon));
485
525
EXPECT_EQ (ctrl_cmd.steering_tire_angle , 0 .0f );
486
526
EXPECT_EQ (ctrl_cmd.steering_tire_rotation_rate , 0 .0f );
487
527
EXPECT_EQ (mpc->m_input_buffer .size (), size_t (3 ));
528
+ EXPECT_EQ (ctrl_cmd_horizon.controls .size (), param.prediction_horizon );
529
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_angle , 0 .0f );
530
+ EXPECT_EQ (ctrl_cmd_horizon.controls .front ().steering_tire_rotation_rate , 0 .0f );
488
531
}
489
532
490
533
TEST_F (MPCTest, FailureCases)
@@ -508,11 +551,13 @@ TEST_F(MPCTest, FailureCases)
508
551
Lateral ctrl_cmd;
509
552
Trajectory pred_traj;
510
553
Float32MultiArrayStamped diag;
554
+ LateralHorizon ctrl_cmd_horizon;
511
555
const auto odom = makeOdometry (pose_far, default_velocity);
512
- EXPECT_FALSE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag));
556
+ EXPECT_FALSE (mpc->calculateMPC (neutral_steer, odom, ctrl_cmd, pred_traj, diag, ctrl_cmd_horizon ));
513
557
514
558
// Calculate MPC with a fast velocity to make the prediction go further than the reference path
515
559
EXPECT_FALSE (mpc->calculateMPC (
516
- neutral_steer, makeOdometry (pose_far, default_velocity + 10.0 ), ctrl_cmd, pred_traj, diag));
560
+ neutral_steer, makeOdometry (pose_far, default_velocity + 10.0 ), ctrl_cmd, pred_traj, diag,
561
+ ctrl_cmd_horizon));
517
562
}
518
563
} // namespace autoware::motion::control::mpc_lateral_controller
0 commit comments