Description
** Description**
When using the MoveIt Setup Assistant's "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" button (the bulk auto-generate option), the generated moveit_controllers.yaml is missing the action_ns parameter. At runtime, moveit_simple_controller_manager treats action_ns as required and silently skips the controller if it's absent (logging an easy-to-miss ERROR), which results in "Unable to identify any set of controllers that can actuate the specified joints" whenever you try to execute a trajectory — with no indication at config-generation time that anything is wrong.
Root cause
Two different code paths create a ControllerInfo and they're inconsistent:
-
The manual "Add Controller" dialog (controller_edit_widget.cpp) correctly pre-fills additional fields (like action_ns) via getAdditionalControllerFields() / getDefaultValue().
-
The bulk auto-add path, Controllers::addDefaultControllers() (controllers.cpp), does not — it only sets name_, type_, and joints_:
https://github.com/moveit/moveit2/blob/2.12.4/moveit_setup_assistant/moveit_setup_controllers/src/controllers.cpp#L46-L69
bool ret = controllers_config_->addController(group_name + "_controller",
getDefaultType(), joint_names);
This 3-argument overload never touches parameters_, so action_ns (and any other additional field, e.g. default) is never set, even though MoveItControllers::ActionNamespaceField::getDefaultValue() already defines a correct default ("follow_joint_trajectory") that just never gets used on this path.
Suggested fix
Have addDefaultControllers() populate parameters_ from getAdditionalControllerFields() the same way the manual dialog does, e.g.:
ControllerInfo controller;
controller.name_ = group_name + "controller";
controller.type = default_type;
controller.joints_ = joint_names;
for (const auto& field : additional_fields)
{
controller.parameters_[field->parameter_name_] =
field->getDefaultValue(default_type);
}
bool ret = controllers_config_->addController(controller);
I've implemented and tested this fix locally.
ROS Distro
Jazzy
OS and version
Ubuntu 24.04
Source or binary build?
Binary
If binary, which release version?
version 2.12.4
If source, which branch?
No response
Which RMW are you using?
CycloneDDS
Steps to Reproduce
- Run the Setup Assistant, load a URDF, define a planning group.
- In the Controllers step, click "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" (rather than adding one manually via "+").
- Generate the package and inspect config/moveit_controllers.yaml — no action_ns key is present for the generated controller.
- Launch the generated demo; trajectory execution fails with "Unable to identify any set of controller that can actuate the specified joints", even though the controller loads fine in ros2_control.
Expected behavior
Clicking "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" should generate a moveit_controllers.yaml that works out of the box — i.e. it should include whatever parameters moveit_simple_controller_manager requires (action_ns), the same way the manual "Add Controller" dialog already fills them in by default. The generated controller should be recognized and usable for trajectory execution without any manual editing of the generated config.
Actual behavior
The generated moveit_controllers.yaml omits action_ns entirely. At runtime, moveit_simple_controller_manager silently drops the controller (logs an easy-to-miss ERROR) and reports 0 known controllers, so MoveIt fails to execute any trajectory with "Unable to identify any set of controllers that can actuate the specified joints" — even though the underlying ros2_control controller loaded and activated correctly.
Backtrace or Console output
[move_group]: No action namespace specified for controller arm_controller
through parameter moveit_simple_controller_manager.arm_controller.action_ns
[move_group.moveit.moveit.plugins.simple_controller_manager]: Returned 0
controllers in list
[move_group.moveit.moveit.ros.trajectory_execution_manager]: Unable to
identify any set of controllers that can actuate the specified joints: [
joint1 joint2 joint3 joint4 joint5 joint6 ]
[move_group.moveit.moveit.ros.trajectory_execution_manager]: Known controllers
and their joints:
[move_group.moveit.moveit.ros.plan_execution]: Apparently trajectory
initialization failed
[move_group.moveit.moveit.ros.move_group.move_action]: CONTROL_FAILED
Description
** Description**
When using the MoveIt Setup Assistant's "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" button (the bulk auto-generate option), the generated
moveit_controllers.yamlis missing theaction_nsparameter. At runtime,moveit_simple_controller_managertreatsaction_nsas required and silently skips the controller if it's absent (logging an easy-to-miss ERROR), which results in "Unable to identify any set of controllers that can actuate the specified joints" whenever you try to execute a trajectory — with no indication at config-generation time that anything is wrong.Root cause
Two different code paths create a
ControllerInfoand they're inconsistent:The manual "Add Controller" dialog (
controller_edit_widget.cpp) correctly pre-fills additional fields (likeaction_ns) viagetAdditionalControllerFields()/getDefaultValue().The bulk auto-add path,
Controllers::addDefaultControllers()(controllers.cpp), does not — it only setsname_,type_, andjoints_:https://github.com/moveit/moveit2/blob/2.12.4/moveit_setup_assistant/moveit_setup_controllers/src/controllers.cpp#L46-L69
bool ret = controllers_config_->addController(group_name + "_controller",
getDefaultType(), joint_names);
This 3-argument overload never touches parameters_, so action_ns (and any other additional field, e.g. default) is never set, even though MoveItControllers::ActionNamespaceField::getDefaultValue() already defines a correct default ("follow_joint_trajectory") that just never gets used on this path.
Suggested fix
Have addDefaultControllers() populate parameters_ from getAdditionalControllerFields() the same way the manual dialog does, e.g.:
ControllerInfo controller;
controller.name_ = group_name + "controller";
controller.type = default_type;
controller.joints_ = joint_names;
for (const auto& field : additional_fields)
{
controller.parameters_[field->parameter_name_] =
field->getDefaultValue(default_type);
}
bool ret = controllers_config_->addController(controller);
I've implemented and tested this fix locally.
ROS Distro
Jazzy
OS and version
Ubuntu 24.04
Source or binary build?
Binary
If binary, which release version?
version 2.12.4
If source, which branch?
No response
Which RMW are you using?
CycloneDDS
Steps to Reproduce
Expected behavior
Clicking "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" should generate a moveit_controllers.yaml that works out of the box — i.e. it should include whatever parameters moveit_simple_controller_manager requires (action_ns), the same way the manual "Add Controller" dialog already fills them in by default. The generated controller should be recognized and usable for trajectory execution without any manual editing of the generated config.
Actual behavior
The generated moveit_controllers.yaml omits action_ns entirely. At runtime, moveit_simple_controller_manager silently drops the controller (logs an easy-to-miss ERROR) and reports 0 known controllers, so MoveIt fails to execute any trajectory with "Unable to identify any set of controllers that can actuate the specified joints" — even though the underlying ros2_control controller loaded and activated correctly.
Backtrace or Console output
[move_group]: No action namespace specified for controller
arm_controllerthrough parameter
moveit_simple_controller_manager.arm_controller.action_ns[move_group.moveit.moveit.plugins.simple_controller_manager]: Returned 0
controllers in list
[move_group.moveit.moveit.ros.trajectory_execution_manager]: Unable to
identify any set of controllers that can actuate the specified joints: [
joint1 joint2 joint3 joint4 joint5 joint6 ]
[move_group.moveit.moveit.ros.trajectory_execution_manager]: Known controllers
and their joints:
[move_group.moveit.moveit.ros.plan_execution]: Apparently trajectory
initialization failed
[move_group.moveit.moveit.ros.move_group.move_action]: CONTROL_FAILED