大家好,我是小鱼,今天是周末,在家搞了一下机械臂+激光雷达的三维重建,本来想发一下演示视频,不过腾讯审核要时间,今天就不发了,先水一篇。

最近发的都是手眼标定相关的文章,昨天下午帮以为同学完成了手在眼外的程序标定,自我感觉之前写的代码不太友好,决定下周再更新一次,废话不多说,今天讲一讲如何使用jaka机械臂完成手眼标定。

关于jaka

   Jaka这家的机械臂让小鱼觉得比较好的是他们的示教器做的很人性化,这点需要点赞,但是也有不好的地方,想二次开发的时候SDK有点不太好用,都是血的教训。

本次所介绍的方式使用的是jaka的TCP通讯协议获取的机械臂末端的位姿,所以需要大家在程序中配置机械臂的ip地址。

本次文章默认大家已经学会使用aruco获取到标定板在机械臂中的位姿,如果有不清楚的可以后台回复手眼标定获取相关文章

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

开始标定

      jaka标定程序会自己订阅两个话题的数据,一个是机械臂的位姿话题和相机中标定物的位姿话题。

      机械臂的话题可以通过运行本仓库中的jaka_comuniate功能包中的jaka_comuniate.launch获得。

     相机中标记物的姿态数据,可以参考上一篇文章,或者后台回复手眼标定获取教程。

下载源码:

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

下载完成需要配置jaka_host参数为你的jaka机械臂所在的host,并确保你目前所使用的电脑能够ping通该ip。

运行该节点后将会发布jaka_pose话题并运行

使用的是jaka机械臂TCP通信,默认端口为10000,这里不用设置,如果有改变可以在程序中修改。

<launch>
    <arg  name="jaka_host"   default="192.168.1.103" />
    <node pkg="jaka_comuniate" type="jaka_comuniate" name="jaka_comuniate" output="screen" >
         <param name="jaka_host" value="$(arg jaka_host)" />
    </node>
</launch>

运行JAKA节点

source devel/setup.bash
roslaunch jaka_comuniate jaka_comuniate.launch 

运行标定板识别程序

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

配置标定所需话题信息

主要配置参数有jaka_pose_topiccamera_pose_topic。分别代表jaka机械臂的通信地址和,相机中标记物的位姿话题。

通过这两个话题我们就可以拿到机械臂和标志物在相机中的位姿信息.

<launch>
  
  <arg   name="jaka_pose_topic"   default="/jaka_pose" />
  
  <arg   name="camera_pose_topic"   default="/aruco_single/pose" />

  <node pkg="handeye-calib" type="jaka_hand_on_eye_calib.py" name="jaka_hand_on_eye_calib" output="screen" >
       <param name="jaka_pose_topic" value="$(arg jaka_pose_topic)" />
       <param name="camera_pose_topic" value="$(arg camera_pose_topic)" />
</node>
</launch>

运行标定程序

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

开始标定

程序运行是会对话题数据进行检测,先检测是否收到机械臂数据,如果没有会一直等待。
当检测到已经接收到数据之后,就会出现,命令提示。
命令定义如下:

r  rocord    记录一组手眼数据(当记录的数据大于程序计算所需的数据量之后会进行自动计算)
c  calculate 计算当前数据
s  save      保存数据
p  print     打印当前数据到屏幕上(格式为 type,x,y,z,rx,ry,rz 角度制)
q  quit      退出标定程序
[INFO] [1612856654.307437]: Get topic from param server: jaka_pose_topic:/jaka_pose camera_pose_topic:/aruco_single/pose
[INFO] [1612856655.311045]: Waiting jaka pose topic data ...
[INFO] [1612856656.313039]: Waiting jaka pose topic data ...
[INFO] [1612856657.314364]: Waiting jaka pose topic data ...
input:  r     record,c    calculate,s     save,q    quit:

拖拽机械臂或者用示校器移动机械臂,但要保证相机视野中依然可以看到标定板。
输入r记录一组手眼数据。

生成参数

完成标定之后输入s即可进行保存,将保存标定结果数据和计算所使用的数据。

标定结果误差分析

观察数据计算结果的标准差大小。

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

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

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

比如:

标定板在机械臂基坐标系的位置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

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

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

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

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