50 list_controller_service_ = create_service<controller_manager_msgs::srv::ListControllers>(
51 "controller_manager/list_controllers",
52 [
this](
const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request>& request,
53 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response>& response) {
54 handleListControllersService(request, response);
56 switch_controller_service_ = create_service<controller_manager_msgs::srv::SwitchController>(
57 "controller_manager/switch_controller",
58 [
this](
const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request>& request,
59 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response>& response) {
60 handleSwitchControllerService(request, response);
64 controller_manager_msgs::srv::SwitchController::Request
last_request;
67 void handleListControllersService(
68 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Request>& ,
69 const std::shared_ptr<controller_manager_msgs::srv::ListControllers::Response>& response)
71 controller_manager_msgs::msg::ChainConnection chain_connection_a;
72 chain_connection_a.name =
"B";
73 chain_connection_a.reference_interfaces = {
"ref_1",
"ref_2",
"ref_3" };
74 controller_manager_msgs::msg::ControllerState controller_a;
75 controller_a.chain_connections.push_back(chain_connection_a);
76 controller_a.name =
"A";
77 controller_a.is_chained =
true;
78 controller_a.required_command_interfaces = {
"jnt_1",
"jnt_2",
"jnt_3" };
79 controller_a.type =
"joint_trajectory_controller/JointTrajectoryController";
80 controller_a.state = activate_set_.find(controller_a.name) != activate_set_.end() ?
"active" :
"inactive";
82 controller_manager_msgs::msg::ControllerState controller_b;
83 controller_b.name =
"B";
84 controller_b.required_command_interfaces = {
"jnt_4",
"jnt_5" };
85 controller_b.reference_interfaces = {
"ref_1",
"ref_2",
"ref_3" };
86 controller_b.type =
"joint_trajectory_controller/JointTrajectoryController";
87 controller_b.state = activate_set_.find(controller_b.name) != activate_set_.end() ?
"active" :
"inactive";
89 response->controller = { controller_a, controller_b };
92 void handleSwitchControllerService(
93 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Request>& request,
94 const std::shared_ptr<controller_manager_msgs::srv::SwitchController::Response>& response)
97 for (
const auto& deactivate : request->deactivate_controllers)
99 activate_set_.erase(deactivate);
101 for (
const auto& activate : request->activate_controllers)
103 activate_set_.insert(activate);
108 std::unordered_set<std::string> activate_set_;
109 rclcpp::Service<controller_manager_msgs::srv::ListControllers>::SharedPtr list_controller_service_;
110 rclcpp::Service<controller_manager_msgs::srv::SwitchController>::SharedPtr switch_controller_service_;
113TEST(ControllerManagerPlugin, SwitchControllers)
116 pluginlib::ClassLoader<moveit_controller_manager::MoveItControllerManager> loader(
117 "moveit_core",
"moveit_controller_manager::MoveItControllerManager");
121 auto instance = loader.createUniqueInstance(
"moveit_ros_control_interface/Ros2ControlManager");
123 const auto mock_service = std::make_shared<MockControllersManagerService>();
124 rclcpp::executors::SingleThreadedExecutor executor;
125 std::thread ros_thread([&executor, &mock_service]() {
126 executor.add_node(mock_service);
129 instance->initialize(mock_service);
132 instance->switchControllers({
"/A" }, {});
133 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"A",
"B" }));
134 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
136 instance->switchControllers({}, {
"/B" });
137 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({}));
138 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({
"A",
"B" }));
140 instance->switchControllers({
"/B" }, {});
141 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
142 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
144 instance->switchControllers({}, {
"/B" });
145 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({}));
146 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({
"B" }));
148 instance->switchControllers({
"/B",
"/B",
"/B",
"/B" }, {});
149 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
150 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));
151 instance->switchControllers({}, {
"/B" });
153 instance->switchControllers({
"/B",
"/A" }, {
"/A",
"/A",
"/A" });
154 EXPECT_EQ(mock_service->last_request.activate_controllers, std::vector<std::string>({
"B" }));
155 EXPECT_EQ(mock_service->last_request.deactivate_controllers, std::vector<std::string>({}));