Skip to content

Setup Assistant "Auto Add" controllers button omits required action_ns parameter #3796

Description

@OrionNiklaus

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

  1. Run the Setup Assistant, load a URDF, define a planning group.
  2. In the Controllers step, click "Auto Add FollowJointsTrajectory Controllers For Each Planning Group" (rather than adding one manually via "+").
  3. Generate the package and inspect config/moveit_controllers.yaml — no action_ns key is present for the generated controller.
  4. 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions