机器人臂的整合:一个实用指南
如何将机器人臂与ROS2和MoveIt2 <unk>URDF设置,ros2_control,运动规划和远程操作伺服模式集成.
通过使用ROS2 Humble和MoveIt2进行手臂集成的步骤简介,从URDF创作到现场卡特斯人伺服控制.
条件
本指南针对Ubuntu 22.04 LTS与ROS2 Humble Hawksbill (EOL 2027年5月), Python 3.10和MoveIt2二进制版的Humble.
- ROS2 简单桌面式:
T1 包含rviz2,rqt和所有核心库. - 移动它2:**
T2 拉进移动它_core,移动它_ros_planning,移动它_ros_move_group,所有规划器插件. T3 对于硬件抽象必须. - Python包:
T4 用于教程片段中使用的动态工具. T5 用于构建定制包装.
检查您的环境:
建立URDF
统一机器人描述格式 (URDF) 是您的手臂动力学,动态和硬件界面的唯一来源.一个精确的URDF可以防止大多数计划失败.
关节限制是首先得到正确的.软界限 (MoveIt2用于规划) 应该在硬界限内5° (Firmware用于紧急停止).如果你的臂的J2硬件界限是-120°至120°,设置URDF
** 动力
视觉对撞几何学: 视觉标签使用高聚合度网格 (DAE/OBJ) 和碰撞标签简化
必须在 URDF 的
- 硬件插件: 设置在你的驱动器上,例如 [OpenArm]
T60 ) 臂. T17 表示位置控制. 如果驾驶员支持它们,也表示 T18 和 T19 . - 状态界面: 总是声明
T20 和 T21 . 如果硬件提供扭矩反 ,则添加 T22 . - **param tag:**通过硬件元素内部的参数标签传递硬件特定参数 (例如串行端口,波特速率,机器人IP).
移动它2核心概念
了解这些四个概念,在写出单一行规划代码之前,
MoveGroup是高级规划界面.它包裹了规划管道,规划场景和执行经理.您通过
规划管道链接一个规划器插件与可选的前/后处理适配器. 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开始,并随时更新,通过
限制规划: MoveIt2支持路径限制 (例如,在整个运动中保持终端效应器直立),关节限制,位置限制和导向限制.限制在
运动规划教程
这四步的工作流程将你从一个新终端到执行一个碰撞检查的卡特斯路径.
步骤 1
步骤 2
**步骤3
步骤 4
电话操作服务模式
moveit_servo可在不进行重新规划的情况下实时控制卡特西亚速度. 它在最高的 100 Hz 接受
为了启动手臂的伺服模式,请用伺服配置YAML添加伺服节点到启动文件中.
- 移动_组_名称: 计划组到服务
必须与您的SRDF组名称匹配. T36 . 在50 100Hz下发布 T37 . - 输出
T38 转发到ros2_control. - 如果在这个窗口内没有收到命令,伺服器将停止手臂,这是电话安全功能的关键功能.
- **低_奇异性_门
/硬_stop_奇异性_门 :**设置为17和30 (条件数门 ). 臂将放缓,然后随着接近奇异性而停止.
在 [电操作数据收集]
常见的问题和解决方案
- **控制器时间/"轨迹点不严格增加":**确保硬件界面为位置控制的臂部实现
T39 (而不是 T40 ).速度界面需要精确的时间,基于USB的臂部无法保证. - 规划过程中违反联合限量: 设置
T41 内 T42 和 T43 ,在 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号号 (
- 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厘米语音) 进行细节和规划速度的良好平衡.
相关指南
- 机器人API集成指南 --将ROS2包装成REST/WebSocketAPI用于企业集成
- 力/扭矩传感器选择 --将F/T数据与MoveIt2阻力控制集成
- [如何设置远程操作实验室]
T65 ) -- 硬件设置连接到ROS2堆 - 双手机电话操作设置 -- ROS2 两个手机同步的主题
- 预防性维护 --维护后的校准验证程序
与RCSV合作
RCSV为我们销售和服务的所有手臂平台提供ROS2和MoveIt2集成支持.
- OpenArm资源 -- 开源 URDF,MoveIt2配置,和Ros2_control驱动程序为OpenArm 1
- 硬件商店 -- 购买OpenArm 1 (4,500美元) 与预配置的ROS2驱动程序
- [维修和维护]
T70 ) --ROS2集成服务,驾驶员开发和校准 - 数据平台 --通过MoveIt2伺服模式收集的远程操作数据上传
- [联系我们]
T72 ) -- 要求为您的手臂平台提供ROS2集成支持
准备开始建造?
探索OpenArm
现在,我们需要一个新的技术.







