返回Guides

机器人臂的整合:一个实用指南

如何将机器人臂与ROS2和MoveIt2 <unk>URDF设置,ros2_control,运动规划和远程操作伺服模式集成.

T59)

通过使用ROS2 Humble和MoveIt2进行手臂集成的步骤简介,从URDF创作到现场卡特斯人伺服控制.

条件

本指南针对Ubuntu 22.04 LTSROS2 Humble Hawksbill (EOL 2027年5月), Python 3.10MoveIt2二进制版的Humble.

  • ROS2 简单桌面式: T1 包含rviz2,rqt和所有核心库.
  • 移动它2:** T2 拉进移动它_core,移动它_ros_planning,移动它_ros_move_group,所有规划器插件.
  • T3 对于硬件抽象必须.
  • Python包: T4用于教程片段中使用的动态工具.
  • T5用于构建定制包装.

检查您的环境: T6不应该显示错误. 如果您在单个机器上看到"网络配置"警告,则将 T7导出,以防止多播放问题.

建立URDF

统一机器人描述格式 (URDF) 是您的手臂动力学,动态和硬件界面的唯一来源.一个精确的URDF可以防止大多数计划失败.

关节限制是首先得到正确的.软界限 (MoveIt2用于规划) 应该在硬界限内5° (Firmware用于紧急停止).如果你的臂的J2硬件界限是-120°至120°,设置URDF T8T9 (T9 (射线120°),然后设置MoveIt2关节界限在T10为 ±117°.

** 动力子**通常是错误的,并导致模拟动态不稳定.对于一个大体 m 连接的圆柱体,大小为 r 和长度为 L,使用T11,T12,T13.离线线的术语为对称链接是零.错误的动力 (例如,全零或定位值) 将导致加兹波物理爆炸,并可以使MoveIt2的碰撞检查器表现得不可预测.

视觉对撞几何学: 视觉标签使用高聚合度网格 (DAE/OBJ) 和碰撞标签简化形网格.MoveIt2的FCL碰撞检查器在计划时间与碰撞几何学相比运行 过度详细的网格增加计划时间510×.使用T14生成形.

必须在 URDF 的 T15元素内出现 **ros2_control硬件界面标签.该标签声明对硬件驱动程序的控制界面类型和插件类:

  • 硬件插件: 设置在你的驱动器上,例如 [OpenArm]T60) 臂.
  • T17表示位置控制. 如果驾驶员支持它们,也表示T18T19.
  • 状态界面: 总是声明T20T21. 如果硬件提供扭矩反,则添加T22.
  • **param tag:**通过硬件元素内部的参数标签传递硬件特定参数 (例如串行端口,波特速率,机器人IP).

移动它2核心概念

了解这些四个概念,在写出单一行规划代码之前,

MoveGroup是高级规划界面.它包裹了规划管道,规划场景和执行经理.您通过T23 C++ 类或T24 Python 包裹来与它交互.一个 MoveGroup 是定义为您的SRDF中命名的组 (例如"臂","抓住") 并作为所有规划请求的入口点.

规划管道链接一个规划器插件与可选的前/后处理适配器. MoveIt2 发送三个规划器后台 根据您的任务选择:

Planner Best For Limitations
OMPL (default) General-purpose, cluttered environments, no dynamics needed Non-deterministic; replanning may give different paths
CHOMP Smooth, gradient-optimized trajectories Can get stuck in local minima; slow in tight spaces
PILZ Industrial Motion Planner Deterministic LIN/PTP/CIRC industrial moves No obstacle avoidance; requires clear workspace

规划场景是环境的3D现实表示.它从您的URDF开始,并随时更新,通过T25添加碰撞对象 (盒子,球体,网格).在规划之前,始终将您的表,固定物和已知障碍物添加到场景中.

限制规划: MoveIt2支持路径限制 (例如,在整个运动中保持终端效应器直立),关节限制,位置限制和导向限制.限制在T26中指定.OMPL的限制意识规划需要T27插件. 为了简单的方向维护 (例如,在移动时保持抓地器水平),在和滚轴周围的宽容度为 ±10°的方向限制可靠地工作.

运动规划教程

这四步的工作流程将你从一个新终端到执行一个碰撞检查的卡特斯路径.

步骤 1 启动演示: T28带来了rviz2与Panda演示臂. 换取启动文件为自己的手臂的MoveIt2配置包 (由MoveIt2设置助手生成).

步骤 2 设置规划场景:T30上发布一个 T29消息. 在正确的姿势上添加一个表表. 在继续之前,确认它显示在 rviz2 的"规划场景"显示器中.

**步骤3 规划卡特西亚路径:**使用T31,其中T32意味着每厘米的终效应物流的路径.1.0的返回值意味着路径的100%计算.0.9以下的值通常意味着路径中部碰撞或联合极限.

步骤 4 通过碰撞检查执行: 调用 T33,通过轨迹执行管理器传递轨迹.管理器在配置频率 (通常是250500Hz) 上传到ros2_control的联合命令.如果监控的规划场景检测到执行过程中发生碰撞 (需要更新T34场景流),MoveIt2将中止轨迹.

电话操作服务模式

moveit_servo可在不进行重新规划的情况下实时控制卡特西亚速度. 它在最高的 100 Hz 接受T35消息,并不断生成联合速度命令,追踪所需的终端效应器速度,但必须遵守联合限制和避免单一性.

为了启动手臂的伺服模式,请用伺服配置YAML添加伺服节点到启动文件中.

  • 移动_组_名称: 计划组到服务必须与您的SRDF组名称匹配.
  • T36. 在50100Hz下发布T37.
  • 输出 T38转发到ros2_control.
  • 如果在这个窗口内没有收到命令,伺服器将停止手臂,这是电话安全功能的关键功能.
  • **低_奇异性_门 /硬_stop_奇异性_门:**设置为17和30 (条件数门). 臂将放缓,然后随着接近奇异性而停止.

在 [电操作数据收集]T61中,发布从输入设备 (VR控制器,SpaceMouse或手套) 来得出的扭转命令,以一致的100Hz.命令频率中的射导致速度间断,从而降低了示范质量.

常见的问题和解决方案

  • **控制器时间/"轨迹点不严格增加":**确保硬件界面为位置控制的臂部实现T39 (而不是T40).速度界面需要精确的时间,基于USB的臂部无法保证.
  • 规划过程中违反联合限量: 设置T41T42T43,在T41中应用5° (0.0873rad) 的安全边缘. 这使规划器无法生成轨迹,从而使硬件的限量开关在执行中期.
  • **模拟中的动态不稳定:**错误的URDF惯性值是最常见的原因.用T44验证每个链接的惯性,并在rqt机器人描述观看器检查惯性.
  • MoveGroup无法连接: 检查移动_group节点运行 (T45) 和您的RMW (默认Cyclone DDS) 与其他节点相同的域名ID. 始终设置T46.
  • **Servo产生动:**确保你的伺服器命令循环以固定速度运行.使用ROS2计时器使用T47而不是T48.

关键包装参考

Package Purpose Install
moveit_servo Real-time Cartesian servo / teleop Included in ros-humble-moveit
moveit_planners_ompl OMPL sampling-based planners Included in ros-humble-moveit
moveit_visual_tools rviz2 debugging markers and trajectory visualization ros-humble-moveit-visual-tools
joint_state_broadcaster Broadcasts /joint_states from ros2_control ros-humble-ros2-controllers
robot_state_publisher Publishes TF tree from URDF + joint states ros-humble-robot-state-publisher
moveit_ros_perception OctoMap integration for 3D obstacle avoidance Included in ros-humble-moveit

开臂1移动It2配置

开臂1号号 (T62) 运载了预先构建的 MoveIt2配置,但了解结构有助于定制您的任务.

  • URDF/XACRO: T49定义了6个轮结 +1个结. 结合界限设置在硬件界限内5度.动力调器是基于CAD模型计算的.
  • SRDF: T50定义了"臂"计划组 (关节1-6) 和"抓"组 (抓"关节).两个命名姿势是"家" (所有零) 和"准备" (关节在 [0, -0.5,0.7,0,0.8,0] rad).
  • joint_limits.yaml: 电路操作时安全性设置速度限制为1.0rad/s. 加速限制为2.0rad/s^2.测试后调整这些速度以实现更快的自动运动.
  • 对于需要 IK 接近单一度的任务,切换到 T51: T52,并更新kinematics.yaml.

Python 移动组 界面示例

通过MoveIt2 Python API来规划和执行选定序列的完整Python示例:

#!/usr/bin/env python3
"""MoveIt2 pick-and-place example for OpenArm 1."""
import rclpy
from rclpy.node import Node
from moveit2 import MoveIt2
from geometry_msgs.msg import PoseStamped
import numpy as np

class PickPlace(Node):
    def __init__(self):
        super().__init__("pick_place")
        self.moveit2 = MoveIt2(
            node=self,
            joint_names=[f"joint_{i}" for i in range(1, 7)],
            base_link_name="base_link",
            end_effector_name="gripper_link",
            group_name="arm",
        )
        # Wait for MoveIt2 to be ready
        self.moveit2.wait_for_execution(timeout=10.0)

    def execute(self):
        # 1. Move to ready pose
        self.moveit2.move_to_configuration(
            [0.0, -0.5, 0.7, 0.0, 0.8, 0.0]
        )
        self.moveit2.wait_for_execution()

        # 2. Move to pick pose (Cartesian)
        pick_pose = PoseStamped()
        pick_pose.header.frame_id = "base_link"
        pick_pose.pose.position.x = 0.3
        pick_pose.pose.position.y = 0.0
        pick_pose.pose.position.z = 0.05
        pick_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(pick_pose)
        self.moveit2.wait_for_execution()

        # 3. Close gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.0],  # closed
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

        # 4. Move to place pose
        place_pose = PoseStamped()
        place_pose.header.frame_id = "base_link"
        place_pose.pose.position.x = 0.3
        place_pose.pose.position.y = -0.2
        place_pose.pose.position.z = 0.1
        place_pose.pose.orientation.w = 1.0
        self.moveit2.move_to_pose(place_pose)
        self.moveit2.wait_for_execution()

        # 5. Open gripper
        self.moveit2.move_to_configuration(
            joint_positions=[0.04],  # open
            joint_names=["gripper_joint"],
            group_name="gripper",
        )
        self.moveit2.wait_for_execution()

def main():
    rclpy.init()
    node = PickPlace()
    node.execute()
    rclpy.shutdown()

if __name__ == "__main__":
    main()

卡特西亚路径规划:详细的工作流程

卡特西亚路径对于要求最终效应器在3D空间中遵循特定轨迹 (擦除,绘制,插入) 的任务至关重要.

  • 路线点间隔: 设置T53 (1厘米间路线点) 进行平滑运动.较大的步骤 (5厘米) 在角落产生动.较小的步骤 (<5毫米) 增加了规划时间,而没有明显的改善.
  • 跳门: 设置T54 禁用跳门 (用于大多数任务).如果任何关节移动超过相邻路线之间的门,则非零门会停止计划,这会捕获IK中断,但也会拒绝在关节边界附近的有效路径.
  • ** T55返回一个分数 (0.0-1.0) 表示所需路径的可行程度. 如果分数 <0.95,路径可能会跨越联合极限或碰撞边界.调整接近方向或放松方向限制.
  • **卡特西运动中的方向限制:**用于倒或插入等任务,添加方向限制以保持抓住器水平. 设置方向容忍度在和滚轴周围为+/-10度,在中具有360度自由.

碰撞检查:将物体添加到规划场景

移动It2只能避免与已知对象发生碰撞.

  • 表面: 加入一个盒子原始,尺寸与表相匹配,位置在正确的高度.这是最常见的失踪碰撞对象,导致手臂表崩.
  • 相机挂机: 加入上部和侧部相机挂机的简单盒子形状.
  • 附带物体: 当抓住物体时,使用T56将其附加到终端效应链. 这可以防止规划器生成与环境相撞的路径.
  • **OctoMap (动态障碍):**对于具有移动障碍的环境,将深度摄像头的点云输入到MoveIt2的OctoMap集成.MoveIt2构建了一个3D占用地图并围绕它进行规划.使用T57和设置T58 (2厘米语音) 进行细节和规划速度的良好平衡.

相关指南

与RCSV合作

RCSV为我们销售和服务的所有手臂平台提供ROS2和MoveIt2集成支持.

  • OpenArm资源 -- 开源 URDF,MoveIt2配置,和Ros2_control驱动程序为OpenArm 1
  • 硬件商店 -- 购买OpenArm 1 (4,500美元) 与预配置的ROS2驱动程序
  • [维修和维护]T70) --ROS2集成服务,驾驶员开发和校准
  • 数据平台 --通过MoveIt2伺服模式收集的远程操作数据上传
  • [联系我们] T72) -- 要求为您的手臂平台提供ROS2集成支持

准备开始建造?

探索OpenArm 我们的开源机器人臂,设计为ROS2和MoveIt2集成,

现在,我们需要一个新的技术.