MoveIt 2 中实现手眼标定
MoveIt 2 中实现手眼标定,最简单高效的方法是使用官方推荐的moveit2_calibration包。这个包提供了完整的标定工具链,支持 ArUco 和 ChArUco 标定板,并带有图形化界面(RViz 插件),可以让你直观地完成标定数据的采集与计算。
核心实现方案对比
MoveIt 2 手眼标定的核心是建立相机与机械臂末端之间的精确变换关系。目前主要有两种实现方案:
| 方案 | 说明 | 适用场景 |
|---|---|---|
moveit2_calibration(官方推荐) | MoveIt 官方提供的手眼标定包,集成度高,支持多种标定板,提供 RViz 图形界面。 | 大部分 MoveIt 2 用户,追求规范化和可视化流程。 |
easy_handeye等第三方包(ROS1) | 经典的 ROS1 手眼标定工具,有成熟的社区支持。 | 仍在使用 ROS1 或从 ROS1 迁移过来的项目。 |
注意:目前 MoveIt 2 的
moveit2_calibration包仍在积极开发中,功能正在逐步完善。如果你的项目对稳定性要求极高,也可以考虑 ROS1 的成熟方案。
详细步骤:使用moveit2_calibration包
以下流程以“眼在手上 (Eye-in-Hand)”配置为例,这也是最常见的传感器安装方式。
第一步:环境准备
安装依赖:确保你已经安装了 ROS 2(如 Humble, Jazzy)和 MoveIt 2。
准备标定板:下载并打印一个 ChArUco 标定板。ChArUco 标定板比传统棋盘格精度更高。将其平整地贴在刚性的平板(如亚克力板或铝板)上,并固定在工作空间中的一个位置。
确认 TF 树:确保你的机器人 URDF 中已正确定义了机械臂的基座 (
base_link)、末端执行器 (tool0或ee_link) 等关键坐标系。
第二步:下载与编译
创建一个新的工作空间并克隆代码:
bash
mkdir -p ~/moveit2_calibration_ws/src cd ~/moveit2_calibration_ws/src git clone https://github.com/AndrejOrsula/moveit2_calibration.git
这个
moveit2_calibration是一个社区维护的、为 ROS 2 移植的版本,是目前可用的选择之一。安装依赖并编译:
bash
cd ~/moveit2_calibration_ws rosdep install -r --from-paths src --ignore-src --rosdistro $ROS_DISTRO -y colcon build --symlink-install --cmake-args -DCMAKE_BUILD_TYPE=Release source install/setup.bash
第三步:运行标定程序
以“眼在手上”为例,启动标定程序。这通常是一个 launch 文件,它会启动机器人驱动、MoveIt、RViz 和标定插件。
bash
# 注意:具体 launch 文件名请以你下载的仓库说明为准,类似如下格式 ros2 launch moveit_calibration_demos gz_eye_in_hand_charuco.launch.py
第四步:采集标定数据(在 RViz 中操作)
launch 文件启动后,RViz 界面会出现一个标定面板,按照提示操作:
规划运动:通过 MoveIt 的交互式标记,将机械臂移动到第一个位置,确保标定板清晰地出现在相机视野中。
检测标定板:点击标定面板中的 "Take Sample" 或类似按钮。系统会:
通过相机识别标定板,获取标定板在相机坐标系下的位姿。
读取此时机械臂的关节角度,通过 MoveIt 计算出末端执行器在机器人基座坐标系下的位姿。
改变姿态:将机械臂移动到另一个完全不同的位置和角度(建议姿态差异要大,但标定板要始终在视野内),再次点击 "Take Sample"。
重复采样:重复步骤 2-3,采集 15-25 组数据。重投影误差(Reprojection Error)是衡量数据质量的关键指标,当误差值趋于稳定时,说明数据量足够。
第五步:计算并保存结果
采集足够的数据后,点击 "Calibrate" 按钮。系统会求解出相机到机械臂末端的变换矩阵(即camera_link到ee_link的变换),并显示在界面上。最后,将标定结果保存为一个 YAML 文件。
第六步:集成到 MoveIt 配置
将上一步生成的 YAML 文件内容,集成到你机器人的 URDF 或一个单独的.launch.py文件中,通过robot_state_publisher发布camera_link到ee_link的静态变换 (static_transform_publisher)。
重启 MoveIt,此时你的 TF 树应该完整了,相机看到的物体才能被准确变换到机械臂的规划坐标系中。
常见问题与避坑指南
虚拟机内存不足:如果你在虚拟机中进行编译,建议分配4GB 以上内存,否则编译
moveit_calibration时可能因内存耗尽而失败。ROS 版本兼容性:注意检查你使用的
moveit2_calibration分支是否与你的 ROS 2 发行版(如 Humble, Jazzy)兼容moveit2_calibration包在 ROS 2 下仍在快速发展,不同分支可能存在 API 差异。标定数据质量:采样的机械臂姿态差异性越大,标定结果越精确。避免在同一小片区域采集多组相似数据。
TF 树完整性:标定前,确保机械臂的 URDF 中没有
camera_link到ee_link的变换,否则会和标定结果冲突,导致 TF 树报错。标定板刚性固定:标定板必须用刚性方式(如夹具、胶带)固定,不能有丝毫晃动。人手扶着的轻微抖动会严重影响标定精度。
验证与闭环
标定完成后,必须进行实际验证。一个简单有效的方法是:
在相机视野内放置一个已知位置的物体(如一个固定的 ArUco 码)。
让 MoveIt 规划机械臂末端去触碰该物体。
观察末端执行器与实际物体的位置偏差。如果偏差在 1-2 厘米以内,通常是一个可接受的结果。如果偏差很大(如超过 5 厘米),则需要重新检查标定流程或优化采样数据。
