手眼标定Tsai方法的Matlab仿真分析

手眼标定Tsai方法的Matlab仿真分析手眼标定方程推导手眼标定求解:Tsai方法

大家好,又见面了,我是你们的朋友全栈君。

手眼标定方程推导
手眼标定求解:Tsai方法
基于上面两篇手眼标定的博文,相信有很多朋友在实验过程中发现精度不是那么的如意,毕业工作第一年就开始接触手眼标定,刚开始也是标定效果不好不知道问题出在哪里,后来从最基础的理论知识入手进行一些实验,记得刚开始做实验用的是UR5机械臂,根据手眼标定结果进行物体抓取,抓取效果还是很准确的,后来公司开发自己的机械臂进行同样的实验(机械臂连杆是3D打打印件,精度必定是比较差的),标定效果却是非常不理想。使用Tsai方法求解标定方程文章中根据作者论文对误差影响做了一些分析,下面使用Tsai求解方法进行一些Matlab仿真分析。

  1. 构造仿真数据
    若读者手上没有实体机械臂也可以进行算法分析,方法是假设已知手眼转换矩阵,手眼方程为AX=XB,X就是已知的手眼矩阵,假设我们给定A,那我们就可以得到 B = inv( X ) * A* X,A就是每组运动中机械臂末端姿态变换矩阵,根据A和B使用Tsai方法再求解手眼转换矩阵X1,然后比较X和X1间的误差,然后我们在A矩阵中加入一些噪声,再求解手眼矩阵X2,然后比较X2与X间的误差。现在我们构造一些用于仿真分析的数据,矩阵A我们使用欧拉角转换而来,这样我们可以想象一下机械臂进行一次运动的运动轨迹,构造数据Matalb代码如下:

根据欧拉角计算旋转矩阵:

function M = EulerTomatrix(roll, pich, yaw)
%zyx
    m1 = [ 1.0,    0.0,            0.0;
               0.0,    cos(roll),    -sin(roll);
               0.0,    sin(roll),     cos(roll)];

    m2 = [ cos(pich),   0.0,   sin(pich);
               0.0,            1.0,      0.0;
              -sin(pich),     0.0,    cos(pich);];

    m3 = [ cos(yaw),   -sin(yaw),     0.0;
               sin(yaw),    cos(yaw),     0.0;
               0.0,                 0.0,         1.0];
    M = m3*m2*m1;
end

Skew.m

function S = Skew( P )
    S = zeros(3,3);
    S(1,2) = -P(3);
    S(1,3) = P(2);
    
    S(2,1) = P(3);
    S(2,3) = -P(1);
    
     S(3,1) = -P(2);
    S(3,2) = P(1);
end

产生4组用于标定的数据 LoadData.m:

clear all
close all

%假设已知的手眼转换矩阵为Hx
Hx = eye(4,4);
Hx(1:3, 1:3) = EulerTomatrix(pi/2, 0.3, 0.5);
Hx(1:3, 4) = [0.01, 0.02, 0.03]'

HA = zeros(4,4, 4); %构造4组用于标定的A矩阵
EHA = zeros(4,4, 4);%在A矩阵中加入噪声的矩阵

for i = 1:size(HA,3)
    HA(:, :, i) = eye(4,4);
end

%第一组:机械臂绕x轴旋转0.8*pi,平移量为[0.0, 0.01, 0.01]
HA(1:3, 1:3, 1) = EulerTomatrix(0.8*pi, 0.0, 0.0);
HA(1:3, 4, 1) = [0.0, 0.01, 0.01]';

%在第一组矩阵A中旋转角度加入0.02rad的噪声,下面的EHA同理
EHA(1:3, 1:3, 1) = EulerTomatrix(0.8*pi+0.02, 0.0, 0.0);
EHA(1:3, 4, 1) = [0.0, 0.01+0.001, 0.01]';

%第二组:机械臂绕y轴旋转0.5*pi,平移量为[0.01, 0.0, 0.0]
HA(1:3, 1:3, 2) = EulerTomatrix(0.0, 0.5*pi, 0.0);
HA(1:3, 4, 2) = [0.01, 0.0, 0.0]';

EHA(1:3, 1:3, 2) = EulerTomatrix(0.0, 0.5*pi+ 0.05, 0.0);
EHA(1:3, 4, 2) = [0.01+0.001, 0.0, 0.0]';

%第三组:机械臂绕z轴旋转0.7*pi,平移量为[0.0, 0.0, 0.02]
HA(1:3, 1:3, 3) = EulerTomatrix(0.0, 0.0, 0.7*pi);
HA(1:3, 4, 3) = [0.0, 0.0, 0.02]';

EHA(1:3, 1:3, 3) = EulerTomatrix(0.0, 0.0, 0.7*pi+0.01);
EHA(1:3, 4, 3) = [0.0, 0.0, 0.02+0.001]';

%第四组:机械臂绕x轴旋转pi/2,绕y轴旋转0.3,平移量为[0.1, 0.0001, 0.25]
HA(1:3, 1:3, 4) = EulerTomatrix(pi/2, 0.3, 0.0);
HA(1:3, 4, 4) = [0.1, 0.0001, 0.25]';

EHA(1:3, 1:3, 4) = EulerTomatrix(pi/2+0.06, 0.3+0.05, 0.0);
EHA(1:3, 4, 4) = [0.1, 0.0001, 0.25]';

%根据无噪声的矩阵A和已知的手眼矩阵计算矩阵B,然后就得到了用于仿真的数据
%敢兴趣的朋友根据类似的方法生产更多的数据
HB = zeros( size(HA) );
for i = 1:size(HA,3)
    HB(:, :, i) = inv(Hx)*  HA(:, :, i) * Hx;
end
  1. Tsai手眼标定方法Matlab实现
function Hx = HandEyeTsai(HA, HB, num)
%num为使用输入数据中多少组数据进行标定

%Hx用于返回手眼标定结果
Hx = eye(4,4);

%根据Tsai方法生成最小二乘法求解的方程Ax = B,求解手眼矩阵的旋转矩阵
A = zeros(num*3, 3);
B = zeros(num*3, 1);

for i = 1:num
   %使用罗德里格斯计算旋转矩阵对应的旋转轴
    rgij = rodrigues( HA(1:3, 1:3, i) );        
    rcij = rodrigues( HB(1:3, 1:3, i) ); 
    
    theta_gij = norm(rgij);
    theta_cij = norm(rcij);                        
    rngij = rgij/theta_gij;
    rncij = rcij/theta_cij;
    
    %Tsai方法里定义的旋转轴
    Pgij = 2*sin(theta_gij/2)*rngij;
    Pcij = 2*sin(theta_cij/2)*rncij; 

   %构造求解手眼旋转矩阵对应旋转轴的求解方程
    S = Skew( Pgij + Pcij );
    b = Pcij - Pgij;
    
    A(3*i-2 : 3*i, 1:3) = S;
    B(3*i-2 : 3*i, 1) = b;
end
 
 %最小二乘法求解旋转矩阵对应的旋转轴,然后根据Tsai的定义计算旋转矩阵
  Pce1 = inv(A'*A)*A'*B;
  Pce   =  2*Pce1/sqrt( 1 + norm(Pce1) * norm(Pce1) ) ;
  I = eye(3,3);
  np2 = norm(Pce) * norm(Pce);
  %得到手眼关系的旋转矩阵
  Rx = ( 1 - np2*0.5 )*I + 0.5*( Pce*Pce' + sqrt(4 - np2)* Skew(Pce) );
  
  %构造求解手眼关系平移量的方程Ax = B
A = zeros(num*3, 3);
B = zeros(num*3, 1);
  for i = 1:num
   RA =  HA(1:3, 1:3, i);
   TA =  HA(1:3, 4, i);
   
   TB =  HB(1:3, 4,i);
   
   A(3*i-2 : 3*i, 1:3) = RA - I;
   B(3*i-2 : 3*i, 1) = Rx * TB - TA;
  end
  %最小二乘法求解手眼关系的平移量
Tx = inv(A'*A)*A'*B;
Hx(1:3,1:3) = Rx;
Hx(1:3, 4) = Tx;
  1. 简单实验分析
close all
clear all

%构造数据
LoadData

%使用无噪声的数据求解手眼矩阵
Hce = HandEyeTsai(HA, HB,4)

%使用有噪声的数据求解手眼矩阵
Hce2 = HandEyeTsai(EHA, HB,4)

%以下是我计算得到的数据

%假设已知的手眼关系
Hx =

    0.8384    0.2593    0.4794    0.0100
    0.4580    0.1417   -0.8776    0.0200
   -0.2955    0.9553    0.0000    0.0300
         0         0         0    1.0000

%无噪声的数据求解得到的手眼矩阵
Hce =

    0.8384    0.2593    0.4794    0.0100
    0.4580    0.1417   -0.8776    0.0200
   -0.2955    0.9553   -0.0000    0.0300
         0         0         0    1.0000

%添加噪声的数据求解得到的手眼矩阵
Hce2 =

    0.8339    0.2661    0.4834    0.0098
    0.4612    0.1450   -0.8754    0.0203
   -0.3031    0.9530   -0.0018    0.0291
         0         0         0    1.0000

从以上计算结果可以看到,使用无噪声的数据求解得到的手眼矩阵与给定的手眼矩阵之间是无误差的,当在矩阵A中添加一定的噪声的时候可以看到有噪声的数据得到的手眼矩阵与给定的手眼矩阵之间是有一定误差的,矩阵A中添加的噪声就相当于机械臂末端位姿存在误差然后对手眼标定结果的影响,篇幅有限,感兴趣的读者可以根据类似的方法进行更多的分析。
rodrigues.m

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136265.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • EL表达式总结_el表达式循环

    EL表达式总结_el表达式循环一、EL表达式简介EL全名为ExpressionLanguage。EL主要作用:  1、获取数据    EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域中检索java对象、获取数据。(某个web域中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)  2、执行运算    利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻…

    2022年7月28日
  • 提升效率的秘密,仅需这一篇吃透负载均衡

    提升效率的秘密,仅需这一篇吃透负载均衡写在前面写本文的目的: 对负载均衡的理解零零散散,不成体系。 阅读这篇文章需要的条件: 对OSI模型有些许了解 有耐心。本文涉及大量的知识点,且只能用文字才能讲清楚,所以文字比较多。 收获: 读完此篇文章,从宏观的角度理解了负载均衡的原理以及实现机制。加深对分布式架构的了解 主要内容: 本文首先从概念开始,讲解什么是负载均衡,以及负载均衡在分布式系统中所承担的角色以及提供的功能。 讲解负载均衡的分类。分别从软硬件角度、地域范围角度以及…

    2022年7月19日
  • 5G时代,与IMSI安全的梗概「建议收藏」

    5G时代,与IMSI安全的梗概「建议收藏」5G时代,IMSI是如何应对加密的?

    2022年11月2日
  • 安装drupal

    安装drupal1.把汉化文件拷贝到profiles/standard/translations/可以中文安装2.改变一个文件夹属性,cp一个文件。3.建立数据库4.开始安装,导入翻译中进度条卡死,硬盘不响了,刷新一下继续。5.设置网站名称信箱,管理员帐号信箱。6.安装开始,完毕,注意参阅install.txt文件。7.安装必须模块:Administrationmenu;a…

    2022年7月20日
  • 利用python、tensorflow、opencv实现人脸识别(包会)!「建议收藏」

    利用python、tensorflow、opencv实现人脸识别(包会)!「建议收藏」 一,前言本人是机械专业在读硕士,在完成暑假实践的时候接触到了人脸识别,对这一实现很感兴趣,所以花了大概十天时间做出了自己的人脸识别。这篇文章应该是很详细的了所以帮你实现人脸识别应该没什么问题。先说本博文的最终要达到的效果:通过一系列操作,在摄像头的视频流中识别特定人的人脸,并且予以标记。本人通过网上资料的查询发现这类人脸识别,大多参考了一位日本程序员小哥的文章。链接:http…

    2022年10月25日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号