Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |
Launch files
Messages
Services
Plugins
Recent questions tagged motion_primitives_controllers at Robotics Stack Exchange
Package Summary
| Version | 5.8.0 |
| License | Apache License 2.0 |
| Build type | AMENT_CMAKE |
| Use | RECOMMENDED |
Repository Summary
| Checkout URI | https://github.com/ros-controls/ros2_controllers.git |
| VCS Type | git |
| VCS Version | master |
| Last Updated | 2025-10-17 |
| Dev Status | DEVELOPED |
| Released | RELEASED |
| Contributing |
Help Wanted (-)
Good First Issues (-) Pull Requests to Review (-) |
Package Description
Additional Links
Maintainers
- Bence Magyar
- Denis Štogl
- Christoph Froehlich
- Sai Kishor Kothakota
Authors
- Mathias Fuhrer
motion_primitive_controllers
Package to control robots using motion primitives like LINEAR_JOINT (PTP/ MOVEJ), LINEAR_CARTESIAN (LIN/ MOVEL) and CIRCULAR_CARTESIAN (CIRC/ MOVEC)
Description
This project provides an interface for sending motion primitives to an industrial robot controller using the ExecuteMotionPrimitiveSequence.action action from control_msgs. The controller receives the primitives via the action interface and forwards them through command interfaces to the robot-specific hardware interface. Currently, hardware interfaces for Universal Robots and KUKA Robots are implemented.
- Supported motion primitives:
LINEAR_JOINTLINEAR_CARTESIANCIRCULAR_CARTESIAN
If multiple motion primitives are passed to the controller via the action, the controller forwards them to the hardware interface as a sequence. To do this, it first sends MOTION_SEQUENCE_START, followed by each individual primitive, and finally MOTION_SEQUENCE_END. All primitives between these two markers will be executed as a single, continuous sequence. This allows seamless transitions (blending) between primitives.
The action interface also allows stopping the current execution of motion primitives. When a stop request is received, the controller sends STOP_MOTION to the hardware interface, which then halts the robot’s movement. Once the controller receives confirmation that the robot has stopped, it sends RESET_STOP to the hardware interface. After that, new commands can be sent.

This can be done, for example, via a Python script as demonstrated in the example python script in the Universal_Robots_ROS2_Driver package.
Command and State Interfaces
To transmit the motion primitives, the following command and state interfaces are required. All interfaces use the naming scheme tf_prefix_ + "motion_primitive/<interface name>" where the tf_prefix is provided to the controller as a parameter.
Command Interfaces
These interfaces are used to send motion primitive data to the hardware interface:
-
motion_type: Type of motion primitive (LINEAR_JOINT, LINEAR_CARTESIAN, CIRCULAR_CARTESIAN) -
q1–q6: Target joint positions for joint-based motion -
pos_x,pos_y,pos_z: Target Cartesian position -
pos_qx,pos_qy,pos_qz,pos_qw: Orientation quaternion of the target pose -
pos_via_x,pos_via_y,pos_via_z: Intermediate via-point position for circular motion -
pos_via_qx,pos_via_qy,pos_via_qz,pos_via_qw: Orientation quaternion of via-point -
blend_radius: Blending radius for smooth transitions -
velocity: Desired motion velocity -
acceleration: Desired motion acceleration -
move_time: Optional duration for time-based execution (For LINEAR_JOINT and LINEAR_CARTESIAN. If move_time > 0, velocity and acceleration are ignored)
State Interfaces
These interfaces are used to communicate the internal status of the hardware interface back to the motion_primitives_forward_controller.
-
execution_status: Indicates the current execution state of the primitive. Possible values are:-
IDLE: No motion in progress -
EXECUTING: Currently executing a primitive -
SUCCESS: Last command finished successfully -
ERROR: An error occurred during execution -
STOPPING: The hardware interface has received theSTOP_MOTIONcommand, but the robot has not yet come to a stop. -
STOPPED: The robot was stopped using theSTOP_MOTIONcommand and must be reset with theRESET_STOPcommand before executing new commands.
-
-
ready_for_new_primitive: Boolean flag indicating whether the interface is ready to receive a new motion primitive
Architecture Overview
Architecture for a UR robot with Universal_Robots_ROS2_Driver in motion primitives mode.

Architecture for a KUKA robot with kuka_eki_motion_primitives_hw_interface.

Demo-Video with UR10e
Demo-Video with KR3
Changelog for package motion_primitives_controllers
5.8.0 (2025-10-02)
- Remove deprecated methods from ros2_control (#1936)
- Update broken links on motion_primitives_controllers readme (#1919)
- Contributors: Christoph Fröhlich, Junius Santoso
5.7.0 (2025-09-12)
- Fix docs for motion_primitive_controllers (#1877)
- Contributors: Christoph Fröhlich
5.6.1 (2025-08-30)
- Add cmake package dependency to moprim controller (#1876)
- Contributors: Christoph Fröhlich
5.6.0 (2025-08-29)
- Refactoring to motion_primitives_base_controller (#1857)
- Contributors: Mathias Fuhrer
Package Dependencies
System Dependencies
Dependant Packages
| Name | Deps |
|---|---|
| ros2_controllers |