MoveIt2 Integration¶
Use MoveIt2 for motion planning and manipulation.
Launch MoveIt2¶
ros2 launch miniarm_moveit_config demo.launch.py
This starts:
MoveIt2 motion planning
RViz with MoveIt plugin
Planning scene
With real robot:
ros2 launch miniarm_moveit_config robot.launch.py
Interactive Planning¶
In RViz, use the interactive marker to:
Drag the end-effector to a goal pose
Click “Plan” to compute trajectory
Click “Execute” to run on robot
Python Interface¶
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
def main():
rclpy.init()
node = Node('miniarm_moveit_example')
moveit2 = MoveIt2(
node=node,
joint_names=[
'joint_1', 'joint_2', 'joint_3',
'joint_4', 'joint_5', 'joint_6'
],
base_link_name='base_link',
end_effector_name='tool0',
)
# Move to joint configuration
moveit2.move_to_configuration([0.0, -0.5, 1.0, 0.0, 0.5, 0.0])
# Move to pose
from geometry_msgs.msg import Pose
target_pose = Pose()
target_pose.position.x = 0.1
target_pose.position.y = 0.0
target_pose.position.z = 0.15
target_pose.orientation.w = 1.0
moveit2.move_to_pose(target_pose)
rclpy.shutdown()
if __name__ == '__main__':
main()
Planning Groups¶
The MoveIt config defines these planning groups:
arm - All 6 joints (main manipulator)
gripper - Gripper fingers
# Use specific planning group
moveit2.move_to_configuration(
[0.5, 0.5], # 2 values for gripper fingers
group_name='gripper'
)
Collision Objects¶
Add obstacles to the planning scene:
from moveit2 import PlanningScene
from geometry_msgs.msg import Pose
planning_scene = PlanningScene(node)
# Add a box obstacle
box_pose = Pose()
box_pose.position.x = 0.1
box_pose.position.y = 0.1
box_pose.position.z = 0.025
planning_scene.add_box(
id='obstacle',
pose=box_pose,
size=[0.05, 0.05, 0.05]
)
# Now motion planning will avoid this box
Grasp Planning¶
Basic pick and place:
# Pre-grasp position (above object)
moveit2.move_to_pose(pre_grasp_pose)
# Open gripper
moveit2.move_to_configuration([0.04, 0.04], group_name='gripper')
# Approach (Cartesian path)
moveit2.move_to_pose(grasp_pose, cartesian=True)
# Close gripper
moveit2.move_to_configuration([0.0, 0.0], group_name='gripper')
# Lift
moveit2.move_to_pose(lift_pose, cartesian=True)
# Move to place location
moveit2.move_to_pose(place_pose)
# Release
moveit2.move_to_configuration([0.04, 0.04], group_name='gripper')
Configuration Files¶
Key config files in miniarm_moveit_config/config/:
miniarm.srdf- Semantic robot descriptionjoint_limits.yaml- Velocity/acceleration limitskinematics.yaml- IK solver configurationompl_planning.yaml- OMPL planner settings
Example kinematics.yaml:
arm:
kinematics_solver: kdl_kinematics_plugin/KDLKinematicsPlugin
kinematics_solver_search_resolution: 0.005
kinematics_solver_timeout: 0.05
Example joint_limits.yaml:
joint_limits:
joint_1:
has_velocity_limits: true
max_velocity: 3.14 # rad/s
has_acceleration_limits: true
max_acceleration: 6.28 # rad/s^2
Next Steps¶
ROS2 Setup - ROS2 installation
RViz Visualization - RViz configuration