【从零开始进行高精度手眼标定 eye in hand(小白向)3 非线性高精度标定法编程实现】

从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导

传送门:
1.【从零开始进行高精度手眼标定 eye in hand(小白向)1 原理推导】
2.【从零开始进行高精度手眼标定 eye in hand(小白向)2 Tsai轴角法与四元数法编程实现】

3.【从零开始进行高精度手眼标定 eye in hand(小白向)3 非线性高精度标定法编程实现】

前言

最近由于组内的相关工作需求,需要进行机器人的高精度标定。原始的标定精度在6mm左右,虽然听起来是非常微小的偏差,但是由于研究方向手术机器人对精度要求极高。且在运动过程中,深度信息误差、畸变误差、机械误差、坐标系转换等一系列误差累积环节,将导致误差放大,因此远不能达到要求。

在经过了为其两周的研究和编程探索,最后成功将标定精度提升到0.5mm,达到了任务要求。

使用规划和智能算法对相机进行标定具有比较强的优势在于,不管是非线性规划的方法还是粒子群/遗传等智能方法的计算目标函数可以将旋转矩阵与位移矩阵一起进行计算,这种计算方法也被称之为一步法,对比传统的Tsai手眼标定的两步法可以有效避免旋转矩阵和位移矩阵计算的误差积累。当然缺点是非常不好进行编程实现,且一旦编程出现错误极有可能误差巨大,而且数学要求较高,需要一定的数学基础。

本系列的重点有三个:

  1. 原理中A,B矩阵的推导和代码计算
  2. Tsai轴角方法和四元数等二步计算方法的实现
  3. 基于非线性优化的高精度手眼标定方法的原理与代码实现

原理推导

算法框图

MATLAB编程计算

相关优化工具箱的安装(不安装会报错)

主要需要的相关工具箱进行优化求解:

不知道matlab怎么安装工具箱的同学也可以走传送门:

优秀的同学就可以直接自己往下看

数据读取

matlab 复制代码
%% RobotEffectorPose;      %机器人末端位姿导入
img_num = 10;
x = load("E:\研究生学习\手眼标定\IMG_20230516_5\pos.txt");  
pos = zeros(4,4,img_num);
% 各个点机械臂位姿变化矩阵
for i=1:1:img_num
    pos(:,:,i) = x(((4*(i-1)+1):4*i),:);
end
% 相邻机械臂位姿变化增量 
for i=1:1:img_num-1
    A_add(:,:,i)= pos(:,:,i)\pos(:,:,i+1);
end
% 矩阵拼接
A = [];
for i=1:1:img_num-1
    A(:,:,i) =  A_add(:,:,i);
end
B = [];
%% 相机标定数据导入
load('calibrationSession0516_5.mat')
for i=1:1:img_num-1
    Rr1 = calibrationSession.CameraParameters.RotationMatrices(:,:,i);
    Rr2 = calibrationSession.CameraParameters.RotationMatrices(:,:,i+1);
    Tr1 = calibrationSession.CameraParameters.TranslationVectors(i,:);
    Tr2 = calibrationSession.CameraParameters.TranslationVectors(i+1,:);
    B_add = [Rr1' (Tr1/1000)';0,0,0,1]/[Rr2' (Tr2/1000)';0,0,0,1];
    B(:,:,i) = B_add;
end

中需要注意的两点是数据的输入格式

其中矩阵A的输入为:

matlab 复制代码
x = load("E:\研究生学习\手眼标定\IMG_20230516_3\pos.txt");  

pos.tx文件中储存的是机械臂各个位姿点,由机器人基座标系到末端坐标系的变换矩阵

矩阵B的输入为:

maltab 复制代码
load('calibrationSession0516_3.mat')

其中calibrationSession0516_3.mat是通过相机标定工具箱保存在代码同一文件夹下的标定参数

目标函数计算

matlab 复制代码
X=[q0^2+q1^2-q2^2-q3^2  2*(q1*q2-q0*q3)  2*(q1*q3-q0*q2)  t1
   2*(q1*q2-q0*q3)  q0^2-q1^2+q2^2-q3^2  2*(q2*q3-q0*q1)  t2
   2*(q1*q3-q0*q2)   2*(q2*q3-q0*q1)  q0^2-q1^2-q2^2-q3^2 t3
   0  0  0  1];
%% 根据几何误差创建关于X的目标函数
fx_sum = 0;
for i = 1:img_num-1
    fx = A(:,:,i)*X-X*B(:,:,i);
    fx_transpose = transpose(fx);  % 计算矩阵的转置
    fx_norm_2 = trace(fx * fx_transpose);  % 计算矩阵的二范数平方
%     fx_norm_2 = sqrt(sigma_max);  % 计算二范数(最大奇异值的平方根)
%     fx_norm_2 = norm(fx, 'fro')^2;  % 计算矩阵A的二范数
    fx_sum = fx_sum + fx_norm_2;
end
Fx = fx_sum /(img_num-1);

完整代码

代码目前由于还涉及项目问题不准备完全公开,可能晚一些时间等项目结束会更新博客内容。感谢理解。

我会上传部分关键代码在资源,有能力的同学可以尝试根据博客内容补齐:
基于非线性优化的高精度手眼标定关键部分代码

完整代码和答疑真正需要的同学可以私信联系我,请私信表明来意和代码用途

实验验证

经过实验测量以y轴精度进行验证,整机验证进行六次采集,平均精度误差为0.361mm

在本次中参考论文:
[1]LI, W., LYU, N., DONG, M., & LOU, X. (2017). Robot hand-eye calibration by convex relaxation global optimization. Journal of Computer Applications, 37(5), 1451.
[2]李巍, 吕乃光, 董明利, & 娄小平. (2017). 凸松弛全局优化机器人手眼标定. 计算机应用, 37(5), 1451-1455.
相关推荐
北京搜维尔科技有限公司26 分钟前
搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作
科技·机器人
King's King27 分钟前
6年前倒闭的机器人独角兽,再次杀入AGV市场
机器人
孔武3 小时前
SG-SLAM下载部署安装运行记录
机器人·自动驾驶
云卓科技9 小时前
无人机之控制距离篇
科技·安全·机器人·无人机·制造
云卓科技9 小时前
无人机之飞行高度篇
科技·安全·机器人·无人机·制造
Java追光着1 天前
扣子智能体实战-汽车客服对话机器人(核心知识:知识库和卡片)
人工智能·机器人·汽车·智能体
夜幕龙1 天前
robomimic基础教程(三)——自带算法
人工智能·python·算法·机器人
v_JULY_v1 天前
ReKep——李飞飞团队提出的新一代机器人操作方法:基于视觉语言模型和关键点约束
机器人·具身智能·视觉语言大模型·rekep·关键点约束
Java追光着2 天前
基于扣子(Coze)打造第一个智能体——个性化对话机器人
人工智能·机器人·扣子
shuxianshrng2 天前
鹰眼降尘模型
大数据·服务器·人工智能·经验分享·机器人