MoveIt2 使用方式与典型场景
四、使用方式与典型场景
示例一:启动 move_group
import os
from launch import LaunchDescription
from launch_ros.actions import Node
from moveit_configs_utils import MoveItConfigsBuilder
def generate_launch_description():
moveit_config = (
MoveItConfigsBuilder("my_arm", package_name="my_arm_moveit_config")
.to_moveit_configs()
)
move_group = Node(
package="moveit_ros_move_group",
executable="move_group",
output="screen",
parameters=[moveit_config.to_dict(), {"use_sim_time": False}],
)
return LaunchDescription([move_group])
这个启动文件把 URDF、SRDF、运动学配置、规划器配置、控制器配置一起喂给 move_group。配置包由配置助手生成,通常不需要手写。
示例二:用 Python 接口规划并执行
import rclpy
from moveit.planning import MoveItPy
rclpy.init()
moveit = MoveItPy(node_name="moveit_py_demo")
arm = moveit.get_planning_component("arm")
arm.set_start_state_to_current_state()
# 方式一:按预设位姿规划
arm.set_goal_state(configuration_name="home")
result = arm.plan()
if result:
moveit.execute(result.trajectory, controllers=[])
# 方式二:按笛卡尔目标位姿规划
from geometry_msgs.msg import PoseStamped
target = PoseStamped()
target.header.frame_id = "base_link"
target.pose.position.x = 0.45
target.pose.position.y = 0.0
target.pose.position.z = 0.30
target.pose.orientation.w = 1.0
arm.set_goal_state(pose_stamped_msg=target, pose_link="tool0")
result = arm.plan()
if result:
moveit.execute(result.trajectory, controllers=[])
rclpy.shutdown()
Python 接口在不同发行版之间有调整,导入路径与类名以所装版本的官方示例为准。工程上更稳的做法是先用预设位姿做粗定位,再用笛卡尔目标做精定位。
示例三:往规划场景里加障碍
from moveit_msgs.msg import CollisionObject
from shape_msgs.msg import SolidPrimitive
from geometry_msgs.msg import Pose
obj = CollisionObject()
obj.header.frame_id = "base_link"
obj.id = "workbench"
box = SolidPrimitive()
box.type = SolidPrimitive.BOX
box.dimensions = [0.8, 1.2, 0.05]
pose = Pose()
pose.position.x = 0.5
pose.position.z = 0.0
pose.orientation.w = 1.0
obj.primitives.append(box)
obj.primitive_poses.append(pose)
obj.operation = CollisionObject.ADD
把障碍加进规划场景,规划器才会绕开它。工作台、料框、相机支架这些固定设施都应该加进去。注意坐标系:障碍的位姿是相对 frame_id 的,坐标系选错会让障碍出现在完全错误的位置,而且不会报错。
适合与不适合
- 适合:固定基座机械臂的抓取与上下料、需要避障的动作序列、需要在同一套代码里切换不同规划策略、需要与视觉系统联动的场景。
- 不适合:需要力控装配(要靠
ros2_control的力控插件或专门的柔顺控制)、高速动态抓取(规划耗时跟不上)、移动操作(需要额外的移动基座规划)、毫秒级硬实时的轨迹生成(规划本身不是实时算法)。
