Skip to content

Commit 99fadce

Browse files
[JTC] Invalidate empty trajectory messages (#902)
1 parent 021ccab commit 99fadce

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

joint_trajectory_controller/src/joint_trajectory_controller.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1363,6 +1363,12 @@ bool JointTrajectoryController::validate_trajectory_msg(
13631363
}
13641364
}
13651365

1366+
if (trajectory.points.empty())
1367+
{
1368+
RCLCPP_ERROR(get_node()->get_logger(), "Empty trajectory received.");
1369+
return false;
1370+
}
1371+
13661372
if (!params_.allow_nonzero_velocity_at_trajectory_end)
13671373
{
13681374
for (size_t i = 0; i < trajectory.points.back().velocities.size(); ++i)

joint_trajectory_controller/test/test_trajectory_controller.cpp

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,6 +1366,11 @@ TEST_P(TrajectoryControllerTestParameterized, invalid_message)
13661366
traj_msg.joint_names = {"bad_name"};
13671367
EXPECT_FALSE(traj_controller_->validate_trajectory_msg(traj_msg));
13681368

1369+
// empty message
1370+
traj_msg = good_traj_msg;
1371+
traj_msg.points.clear();
1372+
EXPECT_FALSE(traj_controller_->validate_trajectory_msg(traj_msg));
1373+
13691374
// No position data
13701375
traj_msg = good_traj_msg;
13711376
traj_msg.points[0].positions.clear();
@@ -1402,8 +1407,41 @@ TEST_P(TrajectoryControllerTestParameterized, invalid_message)
14021407
EXPECT_FALSE(traj_controller_->validate_trajectory_msg(traj_msg));
14031408
}
14041409

1405-
/// With allow_integration_in_goal_trajectories parameter trajectory missing position or
1406-
/// velocities are accepted
1410+
/**
1411+
* @brief Test invalid velocity at trajectory end with parameter set to false
1412+
*/
1413+
TEST_P(
1414+
TrajectoryControllerTestParameterized,
1415+
expect_invalid_when_message_with_nonzero_end_velocity_and_when_param_false)
1416+
{
1417+
rclcpp::Parameter nonzero_vel_parameters("allow_nonzero_velocity_at_trajectory_end", false);
1418+
rclcpp::executors::SingleThreadedExecutor executor;
1419+
SetUpAndActivateTrajectoryController(executor, {nonzero_vel_parameters});
1420+
1421+
trajectory_msgs::msg::JointTrajectory traj_msg;
1422+
traj_msg.joint_names = joint_names_;
1423+
traj_msg.header.stamp = rclcpp::Time(0);
1424+
1425+
// empty message (no throw!)
1426+
ASSERT_NO_THROW(traj_controller_->validate_trajectory_msg(traj_msg));
1427+
EXPECT_FALSE(traj_controller_->validate_trajectory_msg(traj_msg));
1428+
1429+
// Nonzero velocity at trajectory end!
1430+
traj_msg.points.resize(1);
1431+
traj_msg.points[0].time_from_start = rclcpp::Duration::from_seconds(0.25);
1432+
traj_msg.points[0].positions.resize(1);
1433+
traj_msg.points[0].positions = {1.0, 2.0, 3.0};
1434+
traj_msg.points[0].velocities.resize(1);
1435+
traj_msg.points[0].velocities = {-1.0, -2.0, -3.0};
1436+
EXPECT_FALSE(traj_controller_->validate_trajectory_msg(traj_msg));
1437+
}
1438+
1439+
/**
1440+
* @brief missing_positions_message_accepted Test mismatched joint and reference vector sizes
1441+
*
1442+
* @note With allow_integration_in_goal_trajectories parameter trajectory missing position or
1443+
* velocities are accepted
1444+
*/
14071445
TEST_P(TrajectoryControllerTestParameterized, missing_positions_message_accepted)
14081446
{
14091447
rclcpp::Parameter allow_integration_parameters("allow_integration_in_goal_trajectories", true);

0 commit comments

Comments
 (0)