【从零开始进行高精度手眼标定 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.
相关推荐
AI小欧同学1 小时前
【AIGC-ChatGPT副业提示词指令】炼金术士的元素启示:在神秘中寻找生命的答案【限时免费阅读,一天之后自动进入进阶课程】
chatgpt·机器人·aigc
茶猫_4 小时前
力扣面试题 - 40 迷路的机器人 C语言解法
c语言·数据结构·算法·leetcode·机器人·深度优先
哔哥哔特商务网9 小时前
智元与汇川加码,机器人如何利好电机市场?
microsoft·机器人
敲代码敲到头发茂密12 小时前
基于 LangChain 实现数据库问答机器人
数据库·人工智能·语言模型·langchain·机器人
cnbestec13 小时前
Kinova在开源家庭服务机器人TidyBot++研究里大展身手
人工智能·科技·机器人
W Y16 小时前
【智能制造-50】雅可比矩阵在机器人中如何应用
矩阵·机器人·制造
速科德电机科技20 小时前
机器人加装电主轴【铣削、钻孔、打磨、去毛刺】更高效
机器人·电主轴
温轻舟1 天前
前端开发 -- 自动回复机器人【附完整源码】
前端·javascript·css·机器人·html·交互·温轻舟
开疆智能1 天前
ModbusTCP转Profinet:ABB机器人与PLC的高效连接
科技·机器人·自动化
bs_1011 天前
【保姆式】python调用api通过机器人发送文件到飞书指定群聊
python·机器人·飞书