大家好,我是小鱼。今天分享一个自己写的开源程序,欢迎大家围观~
- 如果教程对你有帮助,可以start一下~
- 若需手眼标定小鱼付费-指导请添加微信:
AiIotRobot
- 本程序支持眼在手上和眼在手外两种标定方式
- 包含基础标定程序包,提供多组机器臂工具坐标和Marker坐标即可完成标定
- 本程序在
ros kinetic melodic noetic
平台测试通过
本程序包通过输入两组以上的机械臂姿态信息和相机所识别的标志物的姿态信息,经过程序计算可输出,机械臂末端和相机之间(或机械臂基座和相机)的坐标变换矩阵。
git clone https://gitee.com/ohhuo/handeye-calib.git
2.2编译
cd handeye-calib
catkin_make or catkin build
3.使用指南
按照数据来源分,本程序可分为以下两种使用方式
- 基础标定,从文件读取姿态信息进行计算
- 在线标定,实时从话题读取姿态信息进行计算
基础标定是方便大家从机械臂示教器直接读取机械臂的位姿进行标定。
3.1.1 使用前准备- 准备好多组机械臂位姿数据和相机标定版位姿数据
输入
-
机械臂位姿可以通过示教器或者SDK进行获取
-
相机中标定板位姿我们可以通过ArUco或者ArTookit等工具获得,可以参考这里
输出
-
(眼在手上)机械臂末端与相机之间的位姿关系
-
(眼在手外)机械臂基座与相机之间的位姿态关系
位姿描述:我们使用一般读到的(X,Y,Z,RX,RY,RZ)
六个数据表示,若不理解可以学习下小鱼的动手学机器人学课程。
使用小鱼提供好的数据,可以快速体验手眼标定。
参数配置找到程序中的src/handeye-calib/launch/base/base_hand_on_eye_calib.launch
文件,文件中有两个可配置参数
base_handeye_data
参数为从位姿文件所在的目录,默认config/base_hand_on_eye_test_data.csv
base_handeye_result
参数为结果存储文件目录,默认为config/result/base_hand_on_eye_result.txt
运行程序
source devel/setup.bash
roslaunch handeye-calib base_hand_on_eye_calib.launch
查看结果
程序会根据配置文件中的坐标进行计算,最终输出如下数据。数据包含不同算法下计算结果,以及计算结果的标准差和方差等数据。
眼在手上最终结果应取:end_link->marker
之间关系,
在线标定即实时从话题读取姿态信息进行计算
3.2.1 使用前准备- 准备好相机驱动(realsense和普通usb相机请参考4.1)
- 已完成相机标定(使用ROS标定程序请参考4.2)
- 安装完成了aruco程序并完成识别(使用aruco识别标定板请参考4.3)
输入
-
机械臂位姿,提供给从tf自动获取转成话题(配置好link,可以运行moveit直接运行即可)
-
相机中标定板位姿我们可以通过ArUco工具获得,可以参考这里(使用aruco识别标定板请参考4.3)
输出
-
(眼在手上)机械臂末端与相机之间的位姿关系
-
(眼在手外)机械臂基座与相机之间的位姿态关系
配置src/handeye-calib/launch/aruco/aruco_start_usb_cam.launch
文件
主要需修改参数文件如下
- 相机内参畸变文件,完成相机标定你可以得到一个相机内参配置的yaml文件,请将该文件位置作为参数传入
- 设备video地址,默认
/dev/video0
可根据你的个人情况修改 markerId
,你打印的id编号,在线打印地址可关注公众号鱼香ROS
,后台回复标定板
获取(打印时请选择origin类型)markerSize
,实际打印出来标定版的宽度,单位m
配置完成后即可运行该launch文件
source devel/setup.bash
roslaunch handeye-calib aruco_start_usb_cam.launch
3.2.4 配置机械臂话题数据
机械臂位置和姿态获取方式可通过两种方式,第一种从tf树中获取,第二种通过对应厂家机械臂的SDK获取。
因第二种方式不具备普适性,小鱼仅适配jaka
和aubo
两家机械臂,且目前已不再适配,若需要将本仓库log退至:7f15641
-
眼在手外修改
src/handeye-calib/launch/online/online_hand_to_eye_calib.launch
-
眼在手上修改
src/handeye-calib/launch/online/online_hand_on_eye_calib.launch
眼在手上和眼在手外参数一致,故以眼在手上为例子。
若使用的是tf方式获取机械臂位置和姿态,仅需要修改以下参数:
base_link
,机械臂基坐标系名称end_link
,机械臂末端坐标系名称
若非使用tf方式,直接从话题获取机械臂姿态,请修改
arm_pose__topic
, 机械臂位置和姿态所在话题数据,话题类型为:PoseStamped
完成上述修改后即可运行在线标定程序。
source devel/setup.bash
roslaunch handeye-calib online_hand_to_eye_calib.launch
3.2.6 开始标定
程序运行是会对话题数据进行检测,检测是否收到机械臂数据和标定版位姿数据,如果没有会一直等待。 当检测到已经接收到数据之后,就会出现命令提示,命令定义如下:
r rocord 记录一组手眼数据(当记录的数据大于程序计算所需的数据量之后会进行自动计算)
c calculate 计算当前数据
s save 保存数据
p print 打印当前数据到屏幕上(格式为 type,x,y,z,rx,ry,rz 角度制)
q quit 退出标定程序
[INFO] [1635233747.563774]: 手眼标定需要两个位置和姿态,一个是机械臂末端的位姿,将从话题/arm_pose中获取 ,另一个相机中标定版的位置姿态将从话题/aruco_single/pose获取,所以请确保两个话题有数据
[INFO] [1635233748.568178]: 等待机械臂位置和姿态话题到位 ...
[INFO] [1635233749.570482]: 等待机械臂位置和姿态话题到位 ...
指令: r 记录,c 计算,s 保存,q 退出:
拖拽机械臂或者用moveit移动机械臂,最终要保证相机中依然可以识别出标定板,输入r
记录一组手眼数据,记录三组以上即可打印位姿数据。
完成标定之后输入s
即可进行保存,将保存标定结果数据和计算所使用的数据。
如眼在手上可选择end_link->marker
某一算法输出结果为最终结果
algoritihms x y z rx ry rz distance
-------------------------- -------- -------- ----------- -------- -------- ------- ----------
end_link->marker:Tsai-Lenz 1.95609 0.592593 0.0368967 -5.43362 16.36 88.8982 2.04422
end_link->marker:Park 1.51555 0.460605 0.0220208 -3.97505 12.2275 89.3891 1.58415
end_link->marker:Horaud 1.51539 0.460554 0.0220166 -3.97621 12.2261 89.3891 1.58399
end_link->marker:Daniilidis 0.699832 0.212166 -0.00299391 -2.42947 7.28523 89.6328 0.731292
眼在手外
如眼在手外可选取结果中base_link->camera
数据的某一算法的平均值作为最终结果
Tsai-Lenz x y z rx ry rz 距离
------------------ ----------- ------------ ------------ ----------- ------------ ----------- -----------
base_link->camera0 1.07708 -0.255704 -0.282747 1.58671 -0.00409023 2.99378 1.14256
base_link->camera1 1.07462 -0.258693 -0.281246 1.59261 -0.0124258 2.99644 1.14054
base_link->camera2 1.07995 -0.254922 -0.2831 1.58326 0.0035099 2.99478 1.14517
mean 1.07722 -0.25644 -0.282364 1.58752 -0.00433537 2.995 1.14276
var 4.72969e-06 2.64052e-06 6.46241e-07 1.49208e-05 4.23543e-05 1.20167e-06 3.58829e-06
std 0.00217479 0.00162497 0.000803891 0.00386275 0.00650802 0.00109621 0.00189428
Park x y z rx ry rz 距离
标定结果正确与否的测试
观察数据计算结果的标准差大小。每次计算之后,程序都会输出不同算法下标定结果点的平均数、方差、标准差三项数值。
眼在手上标定结果验证:由于标定过程中标定板是没有发生移动的,所以我们通过机械臂的末端位置、标定结果(手眼矩阵)、标记物在相机中的位姿即可计算出标定板在机器人基坐标系下的位姿,如果标定结果准确该位姿应该是没有变化的。所以可以比较最终数据的波动情况来判定标定结果的好坏。