51 list_controller_service_ = create_service<controller_manager_msgs::srv::ListControllers>(
52 "controller_manager/list_controllers",
53 [
this](
const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request>& request,
54 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response>& response) {
55 handleListControllersService(request, response);
57 switch_controller_service_ = create_service<controller_manager_msgs::srv::SwitchController>(
58 "controller_manager/switch_controller",
59 [
this](
const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request>& request,
60 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response>& response) {
61 handleSwitchControllerService(request, response);
65 controller_manager_msgs::srv::SwitchController::Request
last_request;
68 void handleListControllersService(
69 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request>& ,
70 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response>& response)
72 controller_manager_msgs::msg::ChainConnection chain_connection_a;
73 chain_connection_a.name =
"B";
74 chain_connection_a.reference_interfaces = {
"ref_1",
"ref_2",
"ref_3" };
75 controller_manager_msgs::msg::ControllerState controller_a;
76 controller_a.chain_connections.push_back(chain_connection_a);
77 controller_a.name =
"A";
78 controller_a.is_chained =
true;
79 controller_a.required_command_interfaces = {
"jnt_1",
"jnt_2",
"jnt_3" };
80 controller_a.type =
"joint_trajectory_controller/JointTrajectoryController";
81 controller_a.state = activate_set_.find(controller_a.name) != activate_set_.end() ?
"active" :
"inactive";
83 controller_manager_msgs::msg::ControllerState controller_b;
84 controller_b.name =
"B";
85 controller_b.required_command_interfaces = {
"jnt_4",
"jnt_5" };
86 controller_b.reference_interfaces = {
"ref_1",
"ref_2",
"ref_3" };
87 controller_b.type =
"joint_trajectory_controller/JointTrajectoryController";
88 controller_b.state = activate_set_.find(controller_b.name) != activate_set_.end() ?
"active" :
"inactive";
90 response->controller = { controller_a, controller_b };
93 void handleSwitchControllerService(
94 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request>& request,
95 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response>& response)
98 for (
const auto& deactivate : request->deactivate_controllers)
100 activate_set_.erase(deactivate);
102 for (
const auto& activate : request->activate_controllers)
104 activate_set_.insert(activate);
109 std::unordered_set<std::string> activate_set_;
110 rclcpp::Service<controller_manager_msgs::srv::ListControllers>::SharedPtr list_controller_service_;
111 rclcpp::Service<controller_manager_msgs::srv::SwitchController>::SharedPtr switch_controller_service_;
114TEST(ControllerManagerPlugin, SwitchControllers)
117 pluginlib::ClassLoader<moveit_controller_manager::MoveItControllerManager> loader(
118 "moveit_core",
"moveit_controller_manager::MoveItControllerManager");
122 auto instance = loader.createUniqueInstance(
"moveit_ros_control_interface/Ros2ControlManager");
124 const auto mock_service = std::make_shared<MockControllersManagerService>();
125 rclcpp::executors::SingleThreadedExecutor executor;
126 std::thread ros_thread([&executor, &mock_service]() {
127 executor.add_node(mock_service);
130 instance->initialize(mock_service);
133 instance->switchControllers({
"/A" }, {});
134 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"A",
"B" }));
135 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
137 instance->switchControllers({}, {
"/B" });
138 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({}));
139 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({
"A",
"B" }));
141 instance->switchControllers({
"/B" }, {});
142 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
143 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
145 instance->switchControllers({}, {
"/B" });
146 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({}));
147 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({
"B" }));
149 instance->switchControllers({
"/B",
"/B",
"/B",
"/B" }, {});
150 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
151 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
152 instance->switchControllers({}, {
"/B" });
154 instance->switchControllers({
"/B",
"/A" }, {
"/A",
"/A",
"/A" });
155 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
156 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));