机械臂手眼标定 eye to hand标定结果的个人见解

easy to hand 标定算法用的是鱼香ROS大佬的handeye-calib ROS 功能包,从安装到部署大佬已经给出详细的使用方法,这里针对标定输出结果的使用做下记录。

功能包标定输出截图:

功能包中采用了几种常用的标定算法进行标定,输出结果分别求取了平均值mean、方差var、标准差std。对于输出结果的选择,可以使用标准差std来确定,其中std越小,数据越稳定。

 标准差解释,摘自百度百科:

标准差(Standard Deviation) ,数学术语,是离均差平方的算术平均数(即:方差)的算术平方根,用σ表示。标准差也被称为标准偏差,或者实验标准差,在概率统计中最常使用作为统计分布程度上的测量依据。标准偏差越小,这些值偏离平均值就越少,反之亦然

标准差是方差的算术平方根。标准差能反映一个数据集的离散程度。平均数相同的两组数据,标准差未必相同。

算法功能包输出是 base_link-->camera的坐标转换,包括平移 [x, y, z],旋转[Rx, Ry, Rz], 意思是camera坐标系在base_link坐标系下的描述,其中旋转的输出是以欧拉角的形式输出,如果在ROS中使用TF发布base_link-->camera,需要将欧拉角转为四元数,对于欧拉角转四元数,可以使用python 中 transform3d库或者使用下面的在线网站进行转换。

3D Rotation Converter:https://www.andre-gaschler.com/rotationconverter/

 对于标定矩阵的单独使用,可以先看看关于矩阵的相关介绍:

齐次矩阵在python中操作方法:

import math
import numpy as np
import transform3d as tfs


def Homogeneous_generate(x,y,z,rx,ry,rz, degrees=0):
    """
    齐次矩阵生成,传入参数单位为 m, rad
    """
    if degrees == 1:
        rx = math.degrees(rx)
        ry = math.degrees(ry)
        rz = math.degrees(rz)
    R = tfs.euler.euler2mat(rx, ry, rz, "sxyz") #  R = Rz * Ry * Rz
    print(degrees)
    T = np.asarray([x, y, z])
    # 合成齐次矩阵
    homogeneous_matrix = tfs.affines.compose(T, R, [1,1,1])
    #print("homogeneous_matrix:\n", homogeneous_matrix)
    
    return homogeneous_matrix

if __name__ == "__main__":
    # 将标定的数据带入下面的函数中,即可得到camera坐标系到base_link坐标系转换的齐次矩阵
    T_C2B  = Homogeneous_generate( 0.104953, -0.38583, 0.525413, 0.0146642, -0.847495,  -1.20245)

 将相机识别到的位姿转换到机械臂本体base_link下的转换方法,可以看看下面示例:

 

如果不清楚矩阵为什么这样乘,可以依次从右往左列出转换关系(这也是自己一开始迷惑的地方),类比物体的一次次转换。这里的矩阵乘法用的都是左乘。

猜你喜欢

转载自blog.csdn.net/m0_46259216/article/details/126404177