ROS下UR5、usb_cam单目外参标定(使用easy_handeye、眼在手上eye-in-hand)

近期借助easy_handeye标定包完成了基于usb摄像头和UR5机械臂的外参标定,采用眼在手上(eye-in-hand)的标定方式。现在对整个标定过程做一个总结,以供大家参考和交流。

一、软件环境配置

硬件平台:PC、UR5、USB摄像头
软件平台:Ubuntu16.04、ROS kinetic

依赖包的安装(注意对应的ROS版本号)

  1. usb_cam驱动包安装
sudo apt-get install ros-indigo-usb-cam
  1. aruco_ros安装
$cd ~/catkin_ws/src/
$git clone https://github.com/pal-robotics/aruco_ros.git
$cd ..
$catkin_make install

  1. easy_handeye安装

visp安装

cd ~/catkin_ws/src
git clone -b kinetic-devel https://github.com/lagadic/vision_visp.git
cd ..
catkin_make --pkg visp_hand2eye_calibration

easy_handeye安装

cd ~/catkin_ws/src
git clone https://github.com/IFL-CAMP/easy_handeye
cd ..
catkin_make

二、修改标定launch文件

针对官方给出的标定launch文件进行修改,ubuntu下的文件路径 …/easy_handeye/docs/example_launch/ur5_kinect_calibration.launch
这个launch文件能够启动

<launch>
    <arg name="namespace_prefix" default="ur5_kinect_handeyecalibration" />

    <arg name="robot_ip" doc="The IP address of the UR5 robot" />

    <!--arg name="marker_size" doc="Size of the ArUco marker used, in meters" /-->
    <!--arg name="marker_id" doc="The ID of the ArUco marker used" /-->

    <!-- from aruco pkg -->
    <arg name="marker_id"        default="582"/>
    <arg name="marker_size"      default="0.036"/> 

    <!-- start the usb_cam-->
    <include file="$(find usb_cam)/launch/usb_cam-test.launch" />

    <!-- start ArUco -->
    <node name="aruco_tracker" pkg="aruco_ros" type="single">
        <remap from="/camera_info" to="/usb_cam/camera_info" />        //换成usb-cam包对应的话题
        <remap from
<think>我们正在处理用户关于delta机械臂手标定的查询。用户希望了解相关方法或教程。根据引用内容,我们知道:-引用[1]提到用户尝试考了B站UP主的视频(针对UR5机械臂),但delta机械臂结构差异大,直接应用困难。-引用[2]解释了手标定的目的:获得相机与机械臂基座的映射关系,分为相机标定和手标定两部分。-引用[3]详细介绍了使用easy_handeye工具进行手标定的步骤(包括下载、安装、配置等)。由于delta机械臂是并联结构,其运动学与传统串联机械臂(如UR5)不同,因此标定方法需要调整。以下我们将针对delta机械臂的特点,结合手标定的一般原理,提供指导。###手标定基础手标定主要解决相机坐标系与机械臂基座坐标系之间的变换关系。根据相机安装位置分为两类:1.**手上Eye-in-Hand)**:相机固定在机械臂末端,随机械臂移动。2.**在手Eye-to-Hand)**:相机固定在环境中,独立于机械臂。标定方程均为:$$AX=XB$$其中:-$A$是机械臂末端从位置1移动到位置2时,末端坐标系在基座坐标系中的变换矩阵。-$B$是相机在位置1和位置2观测同一目标时,相机坐标系的变换矩阵。-$X$是待求的相机坐标系到机械臂基座坐标系的变换矩阵(在手)或相机坐标系到末端坐标系的变换矩阵(手上)。###Delta机械臂的特殊性Delta机械臂是并联机构,其运动学求解与传统串联机械臂不同:-正运动学:通过三个主动臂的角度计算末端位置(较复杂)。-反运动学:由末端位置计算三个主动臂的角度(相对简单)。因此,在标定过程中获取末端位姿时,需注意:1.**位姿获取方式**:通常通过读取电机编码器角度,利用反运动学计算末端位置(但姿态固定,因为Delta机械臂末端通常只能平移,不能旋转)。2.**标定板放置**:由于Delta机械臂工作空间有限,标定板应放在其工作空间内。###使用easy_handeye进行标定的调整建议虽然引用[3]提供了easy_handeye的安装和使用流程,但该工具默认假设机械臂提供标准的关节状态和末端位姿(如通过MoveIt!控制)。对于Delta机械臂,需做以下调整:####步骤1:配置机械臂驱动确保ROS中已有Delta机械臂的驱动包,能发布:-关节状态(`/joint_states`话题,类型为`sensor_msgs/JointState`)。-末端位姿(可通过正运动学计算发布,类型为`geometry_msgs/PoseStamped`)。####步骤2:修改标定启动文件考引用[3],创建`my_cali.launch`文件。关键配置如下:```xml<launch><!--选择标定类型(eye_on_base或eye_in_hand--><argname="eye_on_hand"value="false"/><!--在手设为false,手上设为true--><!--相机话题配置--><argname="tracking_base_frame"value="camera_base"/><argname="tracking_marker_frame"value="camera_marker"/><argname="robot_base_frame"value="delta_base"/><argname="robot_effector_frame"value="delta_ee"/><!--相机标定--><argname="camera_namespace"value="/d435i"/><argname="aruco_marker_size"value="0.05"/><!--标定板尺寸--><!--启动easy_handeye--><includefile="$(findeasy_handeye)/launch/calibrate.launch"><argname="eye_on_hand"value="$(argeye_on_hand)"/><argname="tracking_base_frame"value="$(argtracking_base_frame)"/><argname="tracking_marker_frame"value="$(argtracking_marker_frame)"/><argname="robot_base_frame"value="$(argrobot_base_frame)"/><argname="robot_effector_frame"value="$(argrobot_effector_frame)"/><argname="camera_namespace"value="$(argcamera_namespace)"/><argname="aruco_marker_size"value="$(argaruco_marker_size)"/></include></launch>```####步骤3:适配Delta机械臂的位姿获取-**问题**:easy_handeye默认订阅`tf`话题或通过MoveIt!获取末端位姿。但Delta机械臂可能未提供标准末端位姿话题。-**解决方案**:编写一个节点,读取关节角度,通过正运动学计算末端位姿,并发布到`/robot_pose`话题(或修改启动文件中的末端坐标系名称)。###标定流程1.**相机内标定**:使用`camera_calibration`包获取相机内和畸变系数。2.**安装标定板**:将ArUco标定板固定在工作空间内(在手)或末端(手上)。3.**数据采集**:-控制机械臂末端移动到多个不同位姿(覆盖工作空间)。-在每个位姿,相机拍摄标定板并计算相机与标定板的相对位姿(由`aruco`包实现)。-同时记录机械臂末端在基座坐标系中的位姿。4.**求解变换矩阵**:easy_handeye自动收集足够样本后,点击计算即可得到标定结果。###注意事项-**并联机构位姿表示**:Delta机械臂末端通常只有平移,无旋转。因此标定中姿态矩阵可近似为单位矩阵。-**标定精度验证**:标定后,用手变换矩阵将目标点在相机坐标系中的坐标转换到机械臂基座坐标系,控制机械臂抓取验证。###替代方案若easy_handeye适配困难,可手动实现标定:1.使用OpenCV的`calibrateHandEye`函数[^4]。2.自行收集多组$(A,B)$数据(即机械臂运动变换$A$和相机观测变换$B$)。3.调用函数求解$X$。示例代码片段:```pythonimportcv2#A_list:机械臂运动变换矩阵的列表(4x4,从位姿i到位姿j)#B_list:相机观测变换矩阵的列表(4x4,从位姿i到位姿j)X,_=cv2.calibrateHandEye(R_gripper2base,t_gripper2base,R_target2cam,t_target2cam,method=cv2.CALIB_HAND_EYE_TSAI)```§§相关问题§§1.Delta机械臂的正运动学如何计算?2.如何为并联机械臂选择合适的标定板?3.手标定中需要多少组数据才能保证精度?4.如何验证手标定结果的准确性?</think>### Delta机械臂手标定方法指南 Delta机械臂作为并联机构,其手标定与传统串联机械臂(如UR系列)存在显著差异。以下是针对Delta机械臂的标定方法要点: #### 核心步骤 1. **相机标定(先决条件)** 使用`camera_calibration`包获取相机内矩阵$K$和畸变系数$D$: $$ K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} $$ 确保标定精度,这对后续手标定至关重要[^2]。 2. **标定板选择与安装** - 推荐使用ArUco或棋盘格标定- **手上**:标定板固定在工作台 - **在手**:标定板安装在机械臂末端 - Delta机构工作空间较小,标定板尺寸需匹配工作范围 3. **手标定实施(关键调整)** ```xml <!-- 修改easy_handeye启动文件示例 --> <param name="robot_base_frame" value="delta_base_link" /> <param name="robot_effector_frame" value="delta_ee_link" /> <param name="tracking_base_frame" value="camera_color_optical_frame" /> ``` - **Delta特有调整**: - 并联机构运动学不同,需重写正逆运动学接口 - 末端姿态通常固定(仅3DOF平移),姿态数可简化 - 标定数据采集时需避开奇异位形 4. **数据采集策略** - 在机械臂工作空间内取15-20个采样点 - 每个点保持稳定后采集数据 - 移动时避免振动(Delta机构加速度敏感) 5. **标定结果验证** - 使用标定结果控制机械臂抓取已知位置物体 - 计算实际位置与理论位置误差: $$ \epsilon = \sqrt{(x_{act}-x_{est})^2 + (y_{act}-y_{est})^2} $$ - 重复精度应<1mm(典型Delta机构精度) #### Delta特有挑战与解决方案 | 挑战 | 解决方案 | |------|----------| | 并联机构运动学复杂 | 使用解析法求逆运动学代替数值解 | | 工作空间受限 | 采用微型标定板(如2x2 ArUco) | | 末端无旋转自由度 | 在标定方程中固定旋转矩阵$R=I$ | | 振动影响精度 | 增加采样延时(建议500ms) | #### 推荐工具链 1. **ROS包**: - `easy_handeye`(需修改运动学接口) - `visp_hand2eye_calibration` 2. **标定板生成**: ```bash rosrun aruco_ros create_marker -id 42 -s 0.05 marker.png ``` 3. **验证工具**: - `rviz`可视化工具 - 自定义Python精度评估脚本 > **注意事项**:Delta机构的闭环运动学决定了其标定数据必须包含工作空间边界点,否则会因推导致精度下降[^1]。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值