ABB机器人安装双目相机后实现相机手眼标定der步骤详记
1、手眼标定需要从ABB机器人获得的所有数据信息
1、如下图,abb机器人能够实时的读取到TCP点相对于工件坐标或者基坐标或者大地坐标(世界坐标)的空间坐标点(描述TCP点的平移向量)与四元数(描述TCP在该坐标系下姿态);手眼标定calibrateHandeye()函数需要使用这些数据;
2、上位机C#程序实时获取到TCP点坐标:
3、将四元数转换成我们需要的方向余弦矩阵~,abb机器人具体的姿态旋转顺序不清楚,没有看到相关描述,假定是先绕z轴旋转,再绕y轴旋转,再绕x轴旋转吧,即zyx的顺序,但是这个不是很重要,我觉得手眼标定暂时用不上这个,这个顺序影响如何把欧拉角转换成3 * 3方向余弦矩阵,以及四元数如何反算出物体的欧拉角,现在只是需要获取3 * 3旋转矩阵,而从四元数到3 * 3旋转矩阵的公式是固定死的,只有2个等效形式,任意一个公式都可以完成转换,如下图:(PS:截图自秦永元老师的《惯性导航》295页,推导过程略)
4、如果机器人无法直接读取描述TCP点姿态(orient)用的四元数的话,大概就是只能直接读取机械臂末端TCP点的欧拉角了(roll、yaw、pitch),这种情况下,必须清楚该机器人姿态绕XYZ轴的旋转顺序,zyx,xyz,yzx还是啥啥啥的,,下图截图自Learning OpenCV3,这时计算旋转矩阵(欧拉角描述的方向余弦矩阵/旋转矩阵)必须考虑绕轴转动顺序的影响,如果是x,y,z 依次旋转,则旋转矩阵R = Rx * Ry * Rz,,其他顺序依次类推。
PS : 旋转矩阵逆矩阵等于其转置~~~~
这位博主应该是只能获取TCP的欧拉角:https://blog.csdn.net/weixin_42203839/article/details/103882739
5、至此,手眼标定需要的ABB机器人数据收集处理完毕~
2、手眼标定在OpenCV中所有需要使用的函数
1、相机内参标定函数:calibrateCamera()
,在进行abb机器人手眼标定前必须已经完成了单个相机的内参标定(确定内参矩阵与畸变向量)
2、相机外参计算函数:solvePNP()
, 能够根据已有的相机内参计算出相机与标定板之间的外参数;
注:rvec与tvec是从世界坐标系(标定板坐标系)到摄像基坐标转换
3、手眼标定函数:calibrateHandEye()
,需要的数据根据前面的描述已经全部获得~~
3、ABB机器人安装双目相机后手眼标定的步骤描述
准备:
1、安装双目相机,固定到ABB机器人末端执行器上;
2、将打印好的标定板固定在一个较好的位置(方便双目相机采集图像);
采集:
3、ABB机器人示教器控制TCP运动到合适位置(双目都有完整标定板图像),此时,程序拍摄一幅图像(2张):
3.1. 注意,这里同时记录保存示教器上显示的TCP点坐标(trans)与位姿(orient) ;
3.2. 注意,程序这时必须调用solvePNP()计算此时相机与标定板的外参数,保存下来(注意,这里针对
左相机进行计算,双目相机的基准我取的以左相机为基准);
3.3. 至此,第一组数据收集完毕;
4、重复步骤3,依次采集记录10张以上图片数据(用于计算的图片越多越精确),至此,所有需要数据采集完毕;
5、将采集数据整理成calibrateHandEye()需要的类型,传入进去,进行计算,得到最终需要的手眼矩阵~~;
1、按照如上步骤即可完成双目相机的手眼标定的程序代码编写;
4、计算得到手眼矩阵后的后续
有了手眼矩阵、相机内参矩阵,相机畸变向量:
1、先使用OpenCV函数(如BM,SGBM算法)计算得到视差图(disparity,单位为像素),
反向投影得到图像中像素点在左摄像机坐标系下的位置坐标trans(此时反向投影后的单位依然是像素??);
2、左摄像机坐标系下点---(手眼矩阵转换到)--->TCP坐标系下(点的话只关注坐标,没有位姿)
3、TCP坐标系下点---(实时读取ABB机器人的示教器数据转换到)--->工件坐标系下(wobj)
4、转换到工件坐标系下即完成ABB机器人对空间点的视觉感知~~~
1、从摄像机坐标系下点到TCP,再到wobj的转换关系,还在思考具体的矩阵变换~,大概一个点从摄像机坐标系到工件坐标系的转换流程如下:参考OpenCV中关于calibrateHandEye()函数的描述,有具体的转换关系~
https://blog.csdn.net/u011906844/article/details/54604228
5、注
1、本文是在上一篇博客后的继续思考:
https://blog.csdn.net/hellohake/article/details/104808149