手眼标定calibrateHandEye()
void cv::calibrateHandEye ( InputArrayOfArrays R_gripper2base,
InputArrayOfArrays t_gripper2base,
InputArrayOfArrays R_target2cam,
InputArrayOfArrays t_target2cam,
OutputArray R_cam2gripper,
OutputArray t_cam2gripper,
HandEyeCalibrationMethod method = CALIB_HAND_EYE_TSAI
)
https://docs.opencv.org/4.5.3/d9/d0c/group__calib3d.html#gaebfc1c9f7434196a374c382abf43439b
R_gripper2base:齐次矩阵中的旋转矩阵部分;齐次矩阵为将在末端执行器坐标系中描述的点转换到机器人基坐标系的描述。这是一个vector (vector) ,包含了从末端坐标系到机器人基坐标系的全部变换,包含了旋转、3x3的旋转矩阵 or 3x1的旋转向量。 同理 t_gripper2base
向量(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)
跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
二、容器特性
1.顺序序列
顺序容器中的元素按照严格的线性顺序排序。可以通过元素在序列中的位置访问对应的元素。
2.动态数组
支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作。
3.能够感知内存分配器的(Allocator-aware)
容器使用一个内存分配器对象来动态地处理它的存储需求。
R_target2cam:一个齐次矩阵的旋转部分;将标定板坐标系中的点转换到相机坐标系。t_target2cam同理。
函数的输出为 R_cam2gripper 和 t_cam2gripper :分别估计一个3x3的旋转矩阵和3x1的平移向量,描述相机坐标系中的一个点转换到机器人末端坐标系。
method:One of the implemented Hand-Eye calibration method, see cv::HandEyeCalibrationMethod.
enum cv::HandEyeCalibrationMethod 手眼标定方法的枚举类
R. Tsai, R. Lenz A New Technique for Fully Autonomous and Efficient 3D Robotics Hand/EyeCalibration [249]
F. Park, B. Martin Robot Sensor Calibration: Solving AX = XB on the Euclidean Group [190]
R. Horaud, F. Dornaika Hand-Eye Calibration [112]
The following picture describes the Hand-Eye calibration problem where the transformation between a camera (“eye”) mounted on a robot gripper (“hand”) has to be estimated. This configuration is called eye-in-hand.
标定步骤如下:
1.静态的校准模式被用于估计标定板坐标系与相机坐标系的变换。
2.机器人末端执行器移动来获得几个不同的位姿。
3.对于每一个位姿状态下,末端坐标系与机器人基坐标系之间的齐次变换被记录下来,例如用于机器人运动学。通常用机器人的示教器获得。
4.对于每一个位姿状态下,标定板坐标系与相机坐标系之间的齐次变换被记录下来,用于位姿估计方法(PnP)从 2D-3D point 。通过Opencv中PNP的求解函数。
bool cv::solvePnP ( InputArray objectPoints,
InputArray imagePoints,
InputArray cameraMatrix,
InputArray distCoeffs,
OutputArray rvec,
OutputArray tvec,
bool useExtrinsicGuess = false,
int flags = SOLVEPNP_ITERATIVE
)
Parameters:
objectPoints - 世界坐标系下的控制点的坐标,vector<Point3f>的数据类型在这里可以使用
imagePoints - 在图像坐标系下对应的控制点的坐标。vector<Point2f>在这里可以使用
cameraMatrix - 相机的内参矩阵
distCoeffs - 相机的畸变系数
rvec - 输出的旋转向量。使坐标点从世界坐标系旋转到相机坐标系
tvec - 输出的平移向量。使坐标点从世界坐标系平移到相机坐标系
flags - 默认使用CV_ITERATIV迭代法
The Hand-Eye calibration procedure returns the following homogeneous transformation
确定手眼变换至少需要2个非平行旋转轴的运动。因此,至少需要3种不同的位姿,强烈建议使用更多的位姿。