From d4e03294512c4e2d405dc79352c6898a9285ad58 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Mon, 7 Jul 2025 16:08:55 +0200 Subject: [PATCH 1/3] Add messages for motion primitives These messages should reflect the motion primitives supported by most industrial robots.They are meant to being extended in the future in order to support a larger variety of motion implementations. The motivation is to support executing robot motions as they are traditionally programmed: A series of primitives such as `LIN`, `PTP`, `CIRC`. --- control_msgs/CMakeLists.txt | 6 +++++- .../ExecuteMotionPrimitiveSequence.action | 10 ++++++++++ control_msgs/msg/MotionArgument.msg | 2 ++ control_msgs/msg/MotionPrimitive.msg | 17 +++++++++++++++++ control_msgs/msg/MotionPrimitiveSequence.msg | 1 + 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 control_msgs/action/ExecuteMotionPrimitiveSequence.action create mode 100644 control_msgs/msg/MotionArgument.msg create mode 100644 control_msgs/msg/MotionPrimitive.msg create mode 100644 control_msgs/msg/MotionPrimitiveSequence.msg diff --git a/control_msgs/CMakeLists.txt b/control_msgs/CMakeLists.txt index 6207cc0..10a81fb 100644 --- a/control_msgs/CMakeLists.txt +++ b/control_msgs/CMakeLists.txt @@ -24,6 +24,9 @@ set(msg_files msg/JointTolerance.msg msg/JointTrajectoryControllerState.msg msg/MecanumDriveControllerState.msg + msg/MotionArgument.msg + msg/MotionPrimitive.msg + msg/MotionPrimitiveSequence.msg msg/MultiDOFCommand.msg msg/MultiDOFStateStamped.msg msg/PidState.msg @@ -35,10 +38,11 @@ set(msg_files ) set(action_files - action/ParallelGripperCommand.action + action/ExecuteMotionPrimitiveSequence.action action/FollowJointTrajectory.action action/GripperCommand.action action/JointTrajectory.action + action/ParallelGripperCommand.action action/PointHead.action action/SingleJointPosition.action ) diff --git a/control_msgs/action/ExecuteMotionPrimitiveSequence.action b/control_msgs/action/ExecuteMotionPrimitiveSequence.action new file mode 100644 index 0000000..4456182 --- /dev/null +++ b/control_msgs/action/ExecuteMotionPrimitiveSequence.action @@ -0,0 +1,10 @@ +MotionPrimitiveSequence trajectory +--- +int32 SUCCESSFUL = 0 +int32 INVALID_GOAL = -1 +int32 OLD_HEADER_TIMESTAMP = -3 + +int32 error_code +string error_string +--- +uint8 current_primitive_index # How far are we in the actual trajectory? diff --git a/control_msgs/msg/MotionArgument.msg b/control_msgs/msg/MotionArgument.msg new file mode 100644 index 0000000..20b8819 --- /dev/null +++ b/control_msgs/msg/MotionArgument.msg @@ -0,0 +1,2 @@ +string argument_name +float64 argument_value diff --git a/control_msgs/msg/MotionPrimitive.msg b/control_msgs/msg/MotionPrimitive.msg new file mode 100644 index 0000000..99114e4 --- /dev/null +++ b/control_msgs/msg/MotionPrimitive.msg @@ -0,0 +1,17 @@ +int8 UNKNOWN=-1 +int8 LINEAR_JOINT=0 # Often referred as PTP +int8 LINEAR_CARTESIAN=50 # Often referred as LIN +int8 CIRCULAR_CARTESIAN=51 # Often referred as CIRC +# potentially more, such as spline motion + +int8 type -1 # one of the above + +float64 blend_radius + +MotionArgument[] additional_arguments # (max) velocity, (max) acceleration, efficiency + +# Targets should be either specified through joint configurations or Cartesian poses. +# Depending on the motion type and implementation, there might be multiple poses allowed. +# For example, circular motions are often specified as via and target +geometry_msgs/PoseStamped[] poses +float64[] joint_positions diff --git a/control_msgs/msg/MotionPrimitiveSequence.msg b/control_msgs/msg/MotionPrimitiveSequence.msg new file mode 100644 index 0000000..46f7e9d --- /dev/null +++ b/control_msgs/msg/MotionPrimitiveSequence.msg @@ -0,0 +1 @@ +MotionPrimitive[] motions From 57cef38d722dd1df92d4fcff12600fada93f29dc Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Thu, 17 Jul 2025 14:13:41 +0200 Subject: [PATCH 2/3] Add more documentation to messages --- control_msgs/action/ExecuteMotionPrimitiveSequence.action | 5 ++++- control_msgs/msg/MotionArgument.msg | 2 ++ control_msgs/msg/MotionPrimitive.msg | 6 ++++++ 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/control_msgs/action/ExecuteMotionPrimitiveSequence.action b/control_msgs/action/ExecuteMotionPrimitiveSequence.action index 4456182..d5fc3e1 100644 --- a/control_msgs/action/ExecuteMotionPrimitiveSequence.action +++ b/control_msgs/action/ExecuteMotionPrimitiveSequence.action @@ -1,3 +1,5 @@ +# A list of MotionPrimitive messages that are executed in sequence. They don't have to be of the +# same type, as long as the robot supports executing them one after another. MotionPrimitiveSequence trajectory --- int32 SUCCESSFUL = 0 @@ -7,4 +9,5 @@ int32 OLD_HEADER_TIMESTAMP = -3 int32 error_code string error_string --- -uint8 current_primitive_index # How far are we in the actual trajectory? +# Index of the currently executed motion primitive in the sequence. +uint8 current_primitive_index diff --git a/control_msgs/msg/MotionArgument.msg b/control_msgs/msg/MotionArgument.msg index 20b8819..92f3575 100644 --- a/control_msgs/msg/MotionArgument.msg +++ b/control_msgs/msg/MotionArgument.msg @@ -1,2 +1,4 @@ +# Key Value pair to be used in MotionPrimitive messages + string argument_name float64 argument_value diff --git a/control_msgs/msg/MotionPrimitive.msg b/control_msgs/msg/MotionPrimitive.msg index 99114e4..78ab659 100644 --- a/control_msgs/msg/MotionPrimitive.msg +++ b/control_msgs/msg/MotionPrimitive.msg @@ -8,10 +8,16 @@ int8 type -1 # one of the above float64 blend_radius +# MotionArguments are meant to be used as vendor-specific or use-case-specific arguments to +# MotionPrimitive messages. This is to avoid bloating the MotionPrimitive message with all possible +# uses cases but rather add specific data using as a list of key-value pairs, which is what this +# message represents. MotionArgument[] additional_arguments # (max) velocity, (max) acceleration, efficiency # Targets should be either specified through joint configurations or Cartesian poses. # Depending on the motion type and implementation, there might be multiple poses allowed. # For example, circular motions are often specified as via and target +# Usually one of these is empty, in some edge cases even both can be empty, when all input is given +# in the more flexible MotionArgument[] field. geometry_msgs/PoseStamped[] poses float64[] joint_positions From 3b1ff6b361896754e6008de48871a3bc68a8c9f9 Mon Sep 17 00:00:00 2001 From: Felix Exner Date: Fri, 18 Jul 2025 10:23:56 +0200 Subject: [PATCH 3/3] Use shorter names in MotionArgument.msg Co-authored-by: Sai Kishor Kothakota --- control_msgs/msg/MotionArgument.msg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/control_msgs/msg/MotionArgument.msg b/control_msgs/msg/MotionArgument.msg index 92f3575..05c5899 100644 --- a/control_msgs/msg/MotionArgument.msg +++ b/control_msgs/msg/MotionArgument.msg @@ -1,4 +1,4 @@ # Key Value pair to be used in MotionPrimitive messages -string argument_name -float64 argument_value +string name +float64 value