MoveIt 2 configuration¶
smartmanipulator_x_moveit_config is the only ROS 2 package of the Operator PC. It holds
the semantic description, the kinematics, the planning limits, the controller mapping, the
launch file and the RViz2 layout. The robot description itself (URDF/Xacro, meshes) comes
from the Robot PC repository.
The configuration is loaded with MoveItConfigsBuilder in launch/operator.launch.py:
| Builder call | File |
|---|---|
robot_description |
smartmanipulator_x_description/urdf/smartmanipulator_x.urdf.xacro (Robot PC) |
robot_description_semantic |
config/smartmanipulator_x.srdf |
robot_description_kinematics |
config/kinematics.yaml |
joint_limits |
config/joint_limits.yaml |
trajectory_execution |
config/moveit_controllers.yaml |
planning_pipelines |
ompl only, default ompl (MoveIt's default OMPL settings) |
planning_scene_monitor |
publishes the robot description, the semantic description, the planning scene, geometry, state and transform updates |
Semantic description (SRDF)¶
config/smartmanipulator_x.srdf. Link and joint names come from
smartmanipulator_x_description.
Planning groups¶
| Group | Definition | Joints |
|---|---|---|
arm |
chain base_link → tool_link |
j1_base, j2_shoulder, j3_elbow, j4_forearm_roll, j5_wrist |
gripper |
joint gripper |
gripper (the other gripper joints mimic it) |
The end effector gripper is attached to link5, with arm as parent group.
Named states¶
| Group | State | j1_base |
j2_shoulder |
j3_elbow |
j4_forearm_roll |
j5_wrist |
|---|---|---|---|---|---|---|
arm |
home |
0 | 0 | 0 | 0 | 0 |
arm |
ready |
0 | 0.5 | 0.8 | 0 | 0.6 |
arm |
cad_pose |
0 | 0.7416 | 0.4674 | 0.1426 | 0.9151 |
| Group | State | gripper |
|---|---|---|
gripper |
open |
0.0 |
gripper |
closed |
1.4 |
Values in rad. cad_pose is the pose of the BCN3D CAD assembly from which the robot
description was generated.
Collision matrix¶
The SRDF disables collision checking only where contact is part of the design:
- Adjacent links:
base_link–link1,link1–link2,link2–link3,link3–link4,link4–link5, andlink5against every gripper part. - Gripper parts against each other (
servo_gear,idler_gear,pivot_left,pivot_right,finger_left,finger_right): gears, pivot arms and fingers touch by design.
All other pairs are checked. The convex-hull collision meshes of the description overlap
nowhere else at the zero, ready and CAD assembly poses (checked with
tools/cad/collide.py in the Robot PC repository). Re-check after the description
changes, and add a pair only with its reason.
Kinematics¶
config/kinematics.yaml — pick_ik for the arm group:
| Parameter | Value | Meaning |
|---|---|---|
kinematics_solver |
pick_ik/PickIkPlugin |
|
kinematics_solver_timeout |
0.05 s | Per IK call |
kinematics_solver_attempts |
3 | |
mode |
global |
Global search (finds solutions far from the seed) |
position_scale |
1.0 | The tool position counts fully |
rotation_scale |
0.0 | The tool orientation is ignored |
position_threshold |
0.001 m | A solution must be within 1 mm |
orientation_threshold |
0.01 rad | Not relevant with rotation_scale 0 |
cost_threshold |
0.001 | |
minimal_displacement_weight |
0.0 | No preference for small joint motions |
gd_step_size |
0.0001 | Gradient descent step |
Why position-only: the Moveo has five arm joints, so it cannot reach an arbitrary 6-D
pose. With a full pose goal, most marker positions in RViz2 would have no solution. With
rotation_scale: 0.0 the marker always solves for the tool position. For a best-effort
orientation, raise rotation_scale (for example to 0.5): pick_ik then trades position and
orientation error, and the result may miss the position by more than 1 mm.
Joint limits¶
The position and velocity limits come from the robot description (all arm joints and
the gripper: 1.0 rad/s). config/joint_limits.yaml adds what the URDF cannot express:
| Setting | Value |
|---|---|
default_velocity_scaling_factor |
0.3 |
default_acceleration_scaling_factor |
0.3 |
max_velocity (every joint) |
1.0 rad/s |
max_acceleration (every joint) |
1.0 rad/s² |
The default scaling factors apply to requests that do not set their own scaling, for example from scripts. The RViz2 MotionPlanning panel always sends its own Velocity Scaling and Accel. Scaling, which start at 0.10 (see Planning in RViz2).
| Joint | Position limits in the description (rad) |
|---|---|
j1_base |
−π … π |
j2_shoulder |
−π/2 … π/2 |
j3_elbow |
−π/2 … π/2 |
j4_forearm_roll |
−π … π |
j5_wrist |
−π/2 … π/2 |
gripper |
0 … 1.45 |
Placeholders
All limits are placeholders until the Moveo axes are measured on the real arm. Update the position and velocity limits in the robot description (Robot PC repository) and the accelerations here, then rebuild both images.
Controllers¶
config/moveit_controllers.yaml maps the planning groups to the action servers of the
Robot PC. The names must match controllers.yaml of the Robot PC repository.
| MoveIt controller | Type | Action | Joints |
|---|---|---|---|
arm_controller |
FollowJointTrajectory |
arm_controller/follow_joint_trajectory |
j1_base … j5_wrist |
gripper_controller |
FollowJointTrajectory |
gripper_controller/follow_joint_trajectory |
gripper |
Both are default: true. The controller manager is MoveItSimpleControllerManager: it
only needs the action servers, no access to the Robot PC's controller manager.
| Execution setting | Value | Effect |
|---|---|---|
allowed_execution_duration_scaling |
1.5 | Execution may take 1.5 × the planned duration… |
allowed_goal_duration_margin |
1.0 s | …plus 1 s, then MoveIt cancels it |
allowed_start_tolerance |
0.02 rad | The arm must start within this of the plan's first point |
On the Robot PC side, arm_controller and gripper_controller are
joint_trajectory_controller/JointTrajectoryController with a position command
interface and position + velocity state interfaces, at 100 Hz.
Launch file¶
launch/operator.launch.py starts two nodes:
| Node | Parameters | Condition |
|---|---|---|
move_group (moveit_ros_move_group) |
the complete MoveIt configuration | always |
rviz2 |
-d rviz/moveit.rviz; robot description, semantic description, kinematics, planning pipelines, joint limits |
rviz:=true (default) |
ros2 launch smartmanipulator_x_moveit_config operator.launch.py # move_group + RViz2
ros2 launch smartmanipulator_x_moveit_config operator.launch.py rviz:=false # move_group only
Changing the configuration¶
- Edit the files under
ros2_ws/src/smartmanipulator_x_moveit_config/. - Rebuild and restart:
docker compose -f docker/docker-compose.yml up --build operator_pc(the package is built into the image). - If joint names, groups or controllers change, change the Robot PC (
controllers.yaml, the description) in the same step, and rebuild both images.