Skip to content

Commit 0bf9844

Browse files
Reset trajectory at deactivation and test it
1 parent 62c8072 commit 0bf9844

File tree

3 files changed

+69
-34
lines changed

3 files changed

+69
-34
lines changed

joint_trajectory_controller/src/joint_trajectory_controller.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -987,6 +987,11 @@ controller_interface::CallbackReturn JointTrajectoryController::on_deactivate(
987987

988988
subscriber_is_active_ = false;
989989

990+
traj_point_active_ptr_ = nullptr;
991+
traj_external_point_ptr_.reset();
992+
traj_home_point_ptr_.reset();
993+
traj_msg_home_ptr_.reset();
994+
990995
return CallbackReturn::SUCCESS;
991996
}
992997

joint_trajectory_controller/test/test_trajectory_controller.cpp

Lines changed: 21 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -285,44 +285,38 @@ TEST_P(TrajectoryControllerTestParameterized, correct_initialization_using_param
285285
// first update
286286
traj_controller_->update(rclcpp::Time(0), rclcpp::Duration::from_seconds(0.1));
287287

288-
// wait so controller process the second point when deactivated
288+
// wait for reaching the first point
289+
// controller would process the second point when deactivated below
289290
traj_controller_->update(
290291
rclcpp::Time(static_cast<uint64_t>(0.25 * 1e9)), rclcpp::Duration::from_seconds(0.15));
291-
// deactivated
292-
state = traj_controller_->get_node()->deactivate();
293-
ASSERT_EQ(state.id(), State::PRIMARY_STATE_INACTIVE);
294-
295-
const auto allowed_delta = 0.05;
292+
EXPECT_TRUE(traj_controller_->has_active_traj());
296293
if (traj_controller_->has_position_command_interface())
297294
{
298-
EXPECT_NEAR(3.3, joint_pos_[0], allowed_delta);
299-
EXPECT_NEAR(4.4, joint_pos_[1], allowed_delta);
300-
EXPECT_NEAR(5.5, joint_pos_[2], allowed_delta);
301-
}
302-
303-
if (traj_controller_->has_velocity_command_interface())
304-
{
305-
EXPECT_LE(0.0, joint_vel_[0]);
306-
EXPECT_LE(0.0, joint_vel_[1]);
307-
EXPECT_LE(0.0, joint_vel_[2]);
295+
EXPECT_NEAR(points.at(0).at(0), joint_pos_[0], COMMON_THRESHOLD);
296+
EXPECT_NEAR(points.at(0).at(1), joint_pos_[1], COMMON_THRESHOLD);
297+
EXPECT_NEAR(points.at(0).at(2), joint_pos_[2], COMMON_THRESHOLD);
308298
}
309299

310-
if (traj_controller_->has_effort_command_interface())
311-
{
312-
EXPECT_LE(0.0, joint_eff_[0]);
313-
EXPECT_LE(0.0, joint_eff_[1]);
314-
EXPECT_LE(0.0, joint_eff_[2]);
315-
}
300+
// deactivate
301+
std::vector<double> deactivated_positions{joint_pos_[0], joint_pos_[1], joint_pos_[2]};
302+
state = traj_controller_->get_node()->deactivate();
303+
ASSERT_EQ(state.id(), State::PRIMARY_STATE_INACTIVE);
304+
// it should be holding the current point
305+
traj_controller_->update(rclcpp::Time(0), rclcpp::Duration::from_seconds(0.1));
306+
expectHoldingPointDeactivated(deactivated_positions);
316307

317-
// reactivated
318-
// wait so controller process the third point when reactivated
308+
// reactivate
309+
// wait so controller would have processed the third point when reactivated -> but it shouldn't
319310
std::this_thread::sleep_for(std::chrono::milliseconds(3000));
320-
ActivateTrajectoryController();
311+
312+
ActivateTrajectoryController(false, deactivated_positions);
321313
state = traj_controller_->get_state();
322314
ASSERT_EQ(state.id(), State::PRIMARY_STATE_ACTIVE);
323315

324-
// TODO(christophfroehlich) add test if there is no active trajectory after
325-
// reactivation once #558 or #609 got merged (needs methods for TestableJointTrajectoryController)
316+
// it should still be holding the position at time of deactivation
317+
// i.e., active but trivial trajectory (one point only)
318+
traj_controller_->update(rclcpp::Time(0), rclcpp::Duration::from_seconds(0.1));
319+
expectHoldingPoint(deactivated_positions);
326320

327321
executor.cancel();
328322
}

joint_trajectory_controller/test/test_trajectory_controller_utils.hpp

Lines changed: 43 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,9 @@ class TrajectoryControllerTest : public ::testing::Test
232232
ActivateTrajectoryController(separate_cmd_and_state_values);
233233
}
234234

235-
void ActivateTrajectoryController(bool separate_cmd_and_state_values = false)
235+
void ActivateTrajectoryController(
236+
bool separate_cmd_and_state_values = false,
237+
const std::vector<double> initial_pos_joints = INITIAL_POS_JOINTS)
236238
{
237239
std::vector<hardware_interface::LoanedCommandInterface> cmd_interfaces;
238240
std::vector<hardware_interface::LoanedStateInterface> state_interfaces;
@@ -266,14 +268,14 @@ class TrajectoryControllerTest : public ::testing::Test
266268

267269
// Add to export lists and set initial values
268270
cmd_interfaces.emplace_back(pos_cmd_interfaces_.back());
269-
cmd_interfaces.back().set_value(INITIAL_POS_JOINTS[i]);
271+
cmd_interfaces.back().set_value(initial_pos_joints[i]);
270272
cmd_interfaces.emplace_back(vel_cmd_interfaces_.back());
271273
cmd_interfaces.back().set_value(INITIAL_VEL_JOINTS[i]);
272274
cmd_interfaces.emplace_back(acc_cmd_interfaces_.back());
273275
cmd_interfaces.back().set_value(INITIAL_ACC_JOINTS[i]);
274276
cmd_interfaces.emplace_back(eff_cmd_interfaces_.back());
275277
cmd_interfaces.back().set_value(INITIAL_EFF_JOINTS[i]);
276-
joint_state_pos_[i] = INITIAL_POS_JOINTS[i];
278+
joint_state_pos_[i] = initial_pos_joints[i];
277279
joint_state_vel_[i] = INITIAL_VEL_JOINTS[i];
278280
joint_state_acc_[i] = INITIAL_ACC_JOINTS[i];
279281
state_interfaces.emplace_back(pos_state_interfaces_.back());
@@ -434,17 +436,51 @@ class TrajectoryControllerTest : public ::testing::Test
434436
return state_msg_;
435437
}
436438

437-
void expectHoldingPoint(std::vector<double> points)
439+
void expectHoldingPoint(std::vector<double> point)
438440
{
439441
// it should be holding the given point
440442
// i.e., active but trivial trajectory (one point only)
441443
EXPECT_TRUE(traj_controller_->has_trivial_traj());
442444

443445
if (traj_controller_->has_position_command_interface())
444446
{
445-
EXPECT_NEAR(points.at(0), joint_pos_[0], COMMON_THRESHOLD);
446-
EXPECT_NEAR(points.at(1), joint_pos_[1], COMMON_THRESHOLD);
447-
EXPECT_NEAR(points.at(2), joint_pos_[2], COMMON_THRESHOLD);
447+
EXPECT_NEAR(point.at(0), joint_pos_[0], COMMON_THRESHOLD);
448+
EXPECT_NEAR(point.at(1), joint_pos_[1], COMMON_THRESHOLD);
449+
EXPECT_NEAR(point.at(2), joint_pos_[2], COMMON_THRESHOLD);
450+
}
451+
452+
if (traj_controller_->has_velocity_command_interface())
453+
{
454+
EXPECT_EQ(0.0, joint_vel_[0]);
455+
EXPECT_EQ(0.0, joint_vel_[1]);
456+
EXPECT_EQ(0.0, joint_vel_[2]);
457+
}
458+
459+
if (traj_controller_->has_acceleration_command_interface())
460+
{
461+
EXPECT_EQ(0.0, joint_acc_[0]);
462+
EXPECT_EQ(0.0, joint_acc_[1]);
463+
EXPECT_EQ(0.0, joint_acc_[2]);
464+
}
465+
466+
if (traj_controller_->has_effort_command_interface())
467+
{
468+
EXPECT_EQ(0.0, joint_eff_[0]);
469+
EXPECT_EQ(0.0, joint_eff_[1]);
470+
EXPECT_EQ(0.0, joint_eff_[2]);
471+
}
472+
}
473+
474+
void expectHoldingPointDeactivated(std::vector<double> point)
475+
{
476+
// it should be holding the given point, but no active trajectory
477+
EXPECT_FALSE(traj_controller_->has_active_traj());
478+
479+
if (traj_controller_->has_position_command_interface())
480+
{
481+
EXPECT_NEAR(point.at(0), joint_pos_[0], COMMON_THRESHOLD);
482+
EXPECT_NEAR(point.at(1), joint_pos_[1], COMMON_THRESHOLD);
483+
EXPECT_NEAR(point.at(2), joint_pos_[2], COMMON_THRESHOLD);
448484
}
449485

450486
if (traj_controller_->has_velocity_command_interface())

0 commit comments

Comments
 (0)