diff --git a/moveit_setup_assistant/moveit_setup_controllers/src/moveit_controllers_config.cpp b/moveit_setup_assistant/moveit_setup_controllers/src/moveit_controllers_config.cpp index 3b89ec6112..ac25e70443 100644 --- a/moveit_setup_assistant/moveit_setup_controllers/src/moveit_controllers_config.cpp +++ b/moveit_setup_assistant/moveit_setup_controllers/src/moveit_controllers_config.cpp @@ -188,6 +188,18 @@ bool MoveItControllersConfig::GeneratedControllersConfig::writeYaml(YAML::Emitte { emitter << YAML::Key << "type" << YAML::Value << controller.type_; + if (controller.type_ == "FollowJointTrajectory") + { + if (controller.parameters_.find("action_ns") == controller.parameters_.end()) + { + emitter << YAML::Key << "action_ns" << YAML::Value << "follow_joint_trajectory"; + } + if (controller.parameters_.find("default") == controller.parameters_.end()) + { + emitter << YAML::Key << "default" << YAML::Value << "true"; + } + } + // Write joints emitter << YAML::Key << "joints"; emitter << YAML::Value; @@ -202,6 +214,10 @@ bool MoveItControllersConfig::GeneratedControllersConfig::writeYaml(YAML::Emitte for (const auto& pair : controller.parameters_) { + if (pair.second.empty() && pair.first != "action_ns") + { + continue; + } emitter << YAML::Key << pair.first; emitter << YAML::Value << pair.second; } diff --git a/moveit_setup_assistant/moveit_setup_controllers/test/test_controllers.cpp b/moveit_setup_assistant/moveit_setup_controllers/test/test_controllers.cpp index 64b6e114ff..f75974508c 100644 --- a/moveit_setup_assistant/moveit_setup_controllers/test/test_controllers.cpp +++ b/moveit_setup_assistant/moveit_setup_controllers/test/test_controllers.cpp @@ -175,6 +175,48 @@ TEST_F(ControllersTest, AddDefaultControllers) EXPECT_EQ(ros2_controllers_config->getControllers().size(), group_count); } +TEST_F(ControllersTest, OutputMoveItControllersFix3314) +{ + config_data_->preloadWithFullConfig("moveit_resources_fanuc_moveit_config"); + auto moveit_controllers = config_data_->get("moveit_controllers"); + + std::vector& mcontrollers = moveit_controllers->getControllers(); + ASSERT_EQ(1u, mcontrollers.size()); + + // Erase parameters to simulate them being absent + mcontrollers[0].parameters_.erase("action_ns"); + mcontrollers[0].parameters_.erase("default"); + + generateFiles("moveit_controllers"); + + YAML::Node generated = YAML::LoadFile(output_dir_ / "config/moveit_controllers.yaml"); + const YAML::Node& c_node = generated["moveit_simple_controller_manager"]["fanuc_controller"]; + ASSERT_TRUE(c_node["action_ns"]) << "action_ns missing"; + EXPECT_EQ(c_node["action_ns"].as(), "follow_joint_trajectory"); + ASSERT_TRUE(c_node["default"]) << "default missing"; + EXPECT_EQ(c_node["default"].as(), "true"); + + // Also check empty parameters: default should be omitted, action_ns should be kept as empty string + mcontrollers[0].parameters_["action_ns"] = ""; + mcontrollers[0].parameters_["default"] = ""; + generateFiles("moveit_controllers"); + YAML::Node generated_empty = YAML::LoadFile(output_dir_ / "config/moveit_controllers.yaml"); + const YAML::Node& c_node_empty = generated_empty["moveit_simple_controller_manager"]["fanuc_controller"]; + EXPECT_EQ(c_node_empty["action_ns"].as(), ""); + EXPECT_FALSE(c_node_empty["default"]); + + // Now try with specific value to ensure no duplication/overwriting with default + mcontrollers[0].parameters_["action_ns"] = "custom_ns"; + mcontrollers[0].parameters_["default"] = "false"; + generateFiles("moveit_controllers"); + YAML::Node generated2 = YAML::LoadFile(output_dir_ / "config/moveit_controllers.yaml"); + const YAML::Node& c_node2 = generated2["moveit_simple_controller_manager"]["fanuc_controller"]; + ASSERT_TRUE(c_node2["action_ns"]); + EXPECT_EQ(c_node2["action_ns"].as(), "custom_ns"); + ASSERT_TRUE(c_node2["default"]); + EXPECT_EQ(c_node2["default"].as(), "false"); +} + int main(int argc, char** argv) { testing::InitGoogleTest(&argc, argv);