由于近期一个项目需要做机器人相机手眼标定,找到一些基于c++ / opencv的demo代码,见(OpenCV手眼标定(calibrateHandeye()))但是输入项目测量的数据后怎么都不对,为了验证到底是demo代码问题,还是实际测量数据问题,只得先产生一组随机仿真数据,用来验证。这组随机数据的产生过程和结果贡献给大家。
一 图示
二 生成数据的思路
-
base和target在世界坐标固定,且关系已知, 即生成 R_target2base, T_target2base
-
gripper和cam可以移动,但互相之间关系已知且固定,即生成 R_cam2gripper, T_cam2gripper
-
每次移动gripper到一个随机位置,该位置相对base已知,即生成R_gripper2base, T_gripper2base
- 由已知关系,计算出cam相对base的关系,即计算R_cam2base, T_cam2base
-
因为target到base已知,cam到base已知,计算出每次移动gripper时,target到cam的关系(target在相机中的位姿读数),即计算出R_target2cam, T_target2cam
- 重复上述3-5步骤,计算出一组对应数据,则最终得到一组已知的,{base}, {gripper}, {cam}, {target},四个坐标系之间的所有关系。
三 具体生成的过程和方法,利用matlab
1. 生成一个简单直观的base和target关系假设两个坐标系z轴均向上,x y轴共面,target相对于base只是沿着z轴(右手)旋转了90°(如图2所示),假设target原点位移相对于base在y轴正向距离1m,则有T_target2base = [0, 1, 0],那么轴角表示 pi/2 * [0, 0, 1], 或者乘进去用旋转向量表示[0 , 0, 1.5708]
换成四元数表示 (q0, q1, q2,q3)
2. 生成gripper和cam关系,这里可以稍微随机一点,表示一般性。
假设随机生成轴角的轴为 [0.1817, 0.6198, -0.7634] (已经验证为单位向量)
假设轴角的角为30°,即pi/6
该图表示旋转矩阵,轴角,四元数三种表示均已知
假设位移为 T_cam2gripper = [0.1, 0.2, 0.3]
3. 生成随机的gripper位姿(方法同1) 2))
位姿1: 轴角: pi/5 * [0.5394, 0.1994, -0.8181]
随机T_gripper2base = [0.15, 0.32, 0.88]
位姿2:
随机T_gripper2base = [0.27, 0.56, 0.76]
位姿3
随机T_gripper2base = [0.11, 0.24, 1.2]
位姿4
T_gripper2base = [0.26, 0.65, 0.89]
4. 根据上步生成的4组gripper在base中的读数,利用已知的target2base和cam2gripper这2组固定关系,可以计算出对应的target在cam中的读数,关系如下(见图2,蓝色路线等于黄色路线)
Homo_target2base = Homo_gripper2base x Homo_cam2gripper x Homo_target2cam
式中除了 Homo_target2cam待求,其他均已知,则有
Homo_target2cam = Homo_cam2gripper -1 x Homo_gripper2base -1 x Homo_target2base
对应位姿1
由此得到第一个位置对应的Homo_target2cam
由此类推计算出其他三组如下
对应位姿2
对应位姿3
对应位姿4
至此所有4组仿真的测量数据已得,下面我们通过第4组数据验算一下是否正确。验算思路为(图2的蓝色和黄色路线是否相等)
已知 Homo_target2base关系且恒定不变(蓝色路线)
现在通过黄色路线计算
Homo_gripper2base x Homo_cam2gripper x Homo_target2cam
完美匹配,验证通过。说明制造的仿真数据是正确的。可以用来做测试用。