大家好,我是小鱼,最近折腾了一段时间的机械臂的手眼标定,相关资料挺多的,但使用起来都比较复杂,新手一般比较难搞懂。于是想做一个比较简单易懂易用的手眼标定程序。

项目开源地址:https://gitee.com/ohhuo/handeye-calib

原理介绍

本程序包目前仅针对眼在手上的标定,通过输入两组以上的机械臂姿态信息(x,y,z,rx,ry,rz)和装在机械手上的相机所识别的标志物的姿态信息,经过程序计算可输出,机械臂末端和相机之间的坐标变换矩阵。

使用指南

1、基础使用

基础使用是在得到多组机械臂位姿与机械臂末端相机位姿之后直接使用本程序进行计算机械臂末端与相机之间的位姿关系。

  • 机械臂位姿可以通过示教器或者SDK进行获取

  • 相机中标定板位姿我们可以通过ArUco或者ArTookit等工具获得

我们使用一般读到的(X,Y,Z,RX,RY,RZ)六个数据表示

2、安装测试

1.下载编译

git clone https://gitee.com/ohhuo/handeye-calib.git
cd handeye-calib
catkin_make or catkin build

2.修改base_hand_on_eye_calib.launch文件中,base_handeye_data参数为从机械臂位姿和标定板位姿所在的配置文件所在的绝对目录,可以使用launch文件的find

<launch>
  <!-- <arg   name="base_handeye_data"   default="The file path of handeye data." /> -->
  <arg   name="base_handeye_data"   default="$(find handeye-calib)/config/base_hand_on_eye_test_data.csv" />
  <node pkg="handeye-calib" type="base_hand_on_eye_calib.py" name="base_hand_on_eye_calib" output="screen" >
      <param name="base_handeye_data" value="$(arg base_handeye_data)" />
  </node>
</launch>

3.运行程序

source devel/setup.bash
roslaunch handeye-calib base_hand_on_eye_calib.launch

4.查看结果
程序会根据配置文件中的坐标进行计算,最终输出如下数据(单位毫米,弧度制):数据包含不同算法下计算结果,以及计算结果的标准差和方差等数据。

algoritihms            x            y           z         rx          ry       rz    distance
-------------  ---------  -----------  ----------  ---------  ----------  -------  ----------
Daniilidis     0.0254407  -0.00388589  0.00626286  -1.34278   -0.0699976  91.0318   0.0264868
Horaud         0.035229   -0.0151477   0.0185151    1.65751    0.943546   89.7013   0.0425833
Park           0.0352315  -0.0151497   0.0185238    1.65744    0.944041   89.6995   0.04259
Tsai-Lenz      0.0514184  -0.0291956   0.0236991    0.958984   1.89297    89.4352   0.0637015
name              x             y            z       rx        ry         rz     distance
------  -----------  ------------  -----------  -------  --------  ---------  -----------
mean    0.0368299    -0.0158447    0.0167502    0.73279  0.927639  89.9669    0.0438404
var     8.69144e-05   8.05572e-05  4.11328e-05  1.51731  0.481914   0.389663  0.000174689
std     0.00932279    0.00897536   0.00641349   1.23179  0.6942     0.62423   0.013217

Tsai-Lenz              x             y            z           rx            ry           rz     distance
-----------  -----------  ------------  -----------  -----------  ------------  -----------  -----------
point0       1.08118      -0.26596      -0.329331    1.5432        0.00335281   3.05875      1.1611
point1       1.07916      -0.25742      -0.334988    1.52213      -0.00593988   3.05615      1.15891
point2       1.08686      -0.260925     -0.335914    1.52765      -0.00494656   3.05948      1.16712
point3       1.08833      -0.256919     -0.339045    1.52961      -0.0118364    3.05914      1.16851
point4       1.07685      -0.254707     -0.324463    1.53139       0.00852579   3.05335      1.15315
mean         1.08247      -0.259186     -0.332748    1.5308       -0.00216884   3.05737      1.16176
var          1.95647e-05   1.54478e-05   2.7001e-05  4.81123e-05   5.20523e-05  5.42287e-06  3.14201e-05
std          0.0044232     0.00393036    0.00519625  0.0069363     0.00721473   0.0023287    0.00560536

3.标定结果误差测试

观察数据计算结果的标准差大小。
每次计算之后,程序都会输出不同算法下标定结果点的平均数、方差、标准差三项数值。

由于标定过程中标定板是没有发生移动的,所以我们通过机械臂的末端位置、标定结果(手眼矩阵)、标记物在相机中的位姿即可计算出标定板在机器人基坐标系下的位姿,如果标定结果准确该位姿应该是没有变化的。

可以比较最终数据的波动情况来判定标定结果的好坏。比如:

标定板在机械臂基坐标系的位置1:

Tsai-Lenz               x            y             z            rx            ry           rz     distance
-----------  ------------  -----------  ------------  ------------  ------------  -----------  -----------
point0       -0.45432      0.0488783     0.000316595   0.0420852    -0.0245641    1.52064      0.456941
point1       -0.457722     0.054523      0.0121959    -0.0266793     0.0050922    1.53391      0.461119
point2       -0.457198     0.0535639     0.00246136    0.0252805    -0.0329136    1.51927      0.460331
point3       -0.453302     0.0618366     0.00165179    0.0405718    -0.0472311    1.53318      0.457503
point4       -0.455802     0.0589413     0.000377679   0.0222521    -0.0360589    1.51963      0.459598
point5       -0.455392     0.0615103     0.00584822    0.0365886    -0.033448     1.50684      0.459565
point6       -0.451144     0.0571198     0.00498852    0.0618337    -0.0170326    1.52463      0.454773
point7       -0.452829     0.0588266    -0.000827528   0.0324858    -0.0292652    1.52268      0.456635
point8       -0.454238     0.063634      0.00488078    0.0411648    -0.0373725    1.51611      0.458699
point9       -0.453579     0.0631788     0.00390939    0.0339742    -0.0645821    1.53168      0.457974
point10      -0.454952     0.066057     -0.00144969    0.0399135     0.0029201    1.5053       0.459725
point11      -0.459518     0.0553877    -0.00209946    0.0450864    -0.0147387    1.50702      0.462848
point12      -0.454928     0.0590754    -0.0045181     0.0297534    -0.0296122    1.52043      0.45877
point13      -0.455234     0.0527075    -0.00389213    0.0358822    -0.0260668    1.51244      0.458292
mean         -0.455011     0.0582314     0.0017031     0.0328709    -0.027491     1.51955      0.45877
var           4.21677e-06  2.16484e-05   1.84365e-05   0.000357231   0.000305579  8.29112e-05  3.79771e-06
std           0.00205348   0.00465279    0.00429378    0.0189005     0.0174808    0.00910556   0.00194877

标定板在机械臂基坐标系的位置2:

Tsai-Lenz              x            y            z           rx            ry           rz     distance
-----------  -----------  -----------  -----------  -----------  ------------  -----------  -----------
point0       -0.428394    0.052448     0.0353171    0.0259549    -0.0541487    1.57929      0.433035
point1       -0.427841    0.0448442    0.0345359    0.0454481    -0.0371304    1.55639      0.431569
point2       -0.424889    0.0486165    0.0278942    0.0455775    -0.0438353    1.57073      0.42857
point3       -0.421985    0.0485442    0.0311218    0.0138094    -0.0307286    1.55606      0.425906
point4       -0.428353    0.0454091    0.0326252    0.039192     -0.0492181    1.59177      0.431987
point5       -0.432111    0.0458869    0.0359774    0.04632      -0.0383476    1.55942      0.436028
mean         -0.427262    0.0476248    0.0329119    0.0360503    -0.0422348    1.56894      0.431183
var           9.9672e-06  6.79218e-06  7.71397e-06  0.000148499   6.11379e-05  0.000174299  1.03945e-05
std           0.00315709  0.00260618   0.0027774    0.012186      0.00781908   0.0132022    0.00322405

我们可以观察两次标定结果的距离的标准差,第一次的标准差小于的第二次的标准差,这表示第一次的标定结果好于第二次。

标准差越小,数据越聚集。

后台回复棋盘格、棋盘格文件即可获取标定用的棋盘格。

如果有不明白和有错误的地方可以留言。最后欢迎大家关注、点赞、分享~

下一讲给大将讲一下如何将开源库使用在JAKA机械臂上,欢迎持续关注~