使用matlab建立机器人雅克比矩阵

雅克比矩阵是联系末端操作空间速度与空间关节速度的枢扭,推导过程如下:
这里写图片描述
雅克比矩阵为m*n矩阵,其中m表示末端操作空间的自由度,一般为6个(即 x y z Wx Wy Wz),n为关节空间的关节数,本例中为6旋转关节机器人,史陶比尔TX90
雅克比矩阵中各个元素的推导如图
这里写图片描述

通过编写代码和机器人工具箱求解对比,发现结果一致,运行结果如下:

>> >> [J,T] = TX90_jacobian([0 0 0 0 0  0 ])//机器人工具箱的解

J =

  -50.0000  950.0000  525.0000         0  100.0000         0
   50.0000    0.0000         0         0         0         0
         0   -0.0000         0         0         0         0
         0         0         0         0         0         0
         0    1.0000    1.0000         0    1.0000         0
    1.0000    0.0000    0.0000    1.0000    0.0000    1.0000


T =

    1.0000         0         0   50.0000
         0    1.0000         0   50.0000
         0         0    1.0000  950.0000
         0         0         0    1.0000

>>  >> [ J ] = ykb( [0 0 0 0 0 0 ] )//自己写的求雅克比函数

J =

[ -50.0,        950.0,        525.0,   0,        100.0,   0]
[  50.0,            0,            0,   0,            0,   0]
[     0,            0,            0,   0,            0,   0]
[     0,            0,            0,   0,            0,   0]
[     0,          1.0,          1.0,   0,          1.0,   0]
[   1.0, 6.123234e-17, 6.123234e-17, 1.0, 6.123234e-17, 1.0]

>>>> [ T06  ] = tx90_ForwardKinematics( [0 0 0 0 0 0] )

T06 =

     1     0     0    50
     0     1     0    50
     0     0     1   950
     0     0     0     1
 %自己的正运动学变换矩阵和雅克比矩阵与机器人工具箱求解的一致  
 %工具箱输入角度为[90 45 0 90 0 45]的求解结果 

>> [J,T] = TX90_jacobian([90 45 0 90 0 45])

J =

 -721.7514         0         0         0 -100.0000         0
  -50.0000  671.7514  371.2311   -0.0000         0         0
   -0.0000 -671.7514 -371.2311    0.0000   -0.0000         0
    0.0000   -1.0000   -1.0000    0.0000   -0.0000    0.0000
   -0.0000    0.0000    0.0000    0.7071   -0.7071    0.7071
    1.0000   -0.0000   -0.0000    0.7071    0.7071    0.7071


T =

   -0.7071    0.7071    0.0000  -50.0000
   -0.5000   -0.5000    0.7071  721.7514
    0.5000    0.5000    0.7071  671.7514
         0         0         0    1.0000

 % 自己创建的函数输入角度为[90 45 0 90 0 45]的求解结果     
>> [ J ] = ykb( [90 45 0 90 0 45] )

J =

[ -721.75144, -4.1132913e-14, -2.2731346e-14,              0,         -100.0,              0]
[      -50.0,      671.75144,      371.23106,              0, -4.3297803e-15,              0]
[          0,     -671.75144,     -371.23106,              0,  1.7934537e-15,              0]
[          0,           -1.0,           -1.0, -1.7934537e-17,  4.3297803e-17, -1.7934537e-17]
[          0,              0,              0,     0.70710678,    -0.70710678,     0.70710678]
[        1.0,   6.123234e-17,   6.123234e-17,     0.70710678,     0.70710678,     0.70710678]

> [ T06  ] = tx90_ForwardKinematics( [90 45 0 90 0 45] )

T06 =

   -0.7071    0.7071         0  -50.0000
   -0.5000   -0.5000    0.7071  721.7514
    0.5000    0.5000    0.7071  671.7514
         0         0         0    1.0000

以上代码表明该雅克比矩阵建立方法与机器人工具箱函数算出的结果一致,
运行速度方面,机器人工具箱函数更快
以下为代码:

% 机器人工具箱的函数
function [J,T] = TX90_jacobian(theta)
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
%syms q1 q2 q3 q4 q5 q6
q1 = theta(1)/180*pi;
q2 = theta(2)/180*pi-pi/2;
q3 = theta(3)/180*pi+pi/2;
q4 = theta(4)/180*pi;
q5 = theta(5)/180*pi;
q6 = theta(6)/180*pi;
%             theta  d   a  alpha
L(1) = Link([q1,  0,  50,  -pi/2]);
L(2) = Link([q2,  0,  425,    0]);
L(3) = Link([q3,  50,  0,   pi/2]);
L(4) = Link([q4, 425, 0,  -pi/2]);
L(5) = Link([q5,  0,   0,  pi/2]);
L(6) = Link([q6, 100 ,0,     0]);
tx90 = SerialLink(L, 'name', '史陶比尔TX90');
J = tx90.jacob0([q1 q2 q3 q4 q5 q6]);
T = tx90.fkine([q1 q2 q3 q4 q5 q6]);

end

%自写函数
function [ T ] = Trans( alpha, a, theta, d ) % 变换矩阵
T =[ 
        cos(theta), -sin(theta)*cos(alpha), sin(theta)*sin(alpha), a*cos(theta);
        sin(theta), cos(theta)*cos(alpha), -cos(theta)*sin(alpha), a*sin(theta);
              0,          sin(alpha),              cos(alpha),            d;
              0,              0,                        0,                  1];
end


function [ JT ] = test( theta )
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
T01 =Trans( -pi/2, 50, theta(1), 0 );%[alpha a theta d ]  长度统一为mm单位,角度统一为度单位
T12 =Trans( 0, 425, theta(2)-pi/2, 0 );
T23 =Trans( pi/2, 0, theta(3)+pi/2, 50 );
T34 =Trans( -pi/2, 0, theta(4), 425 );
T45 =Trans( pi/2, 0, theta(5), 0 );
T56 =Trans( 0, 0, theta(6), 100 );
T02 = T01*T12;
T03 = T01*T12*T23;
T04 = T01*T12*T23*T34;
T05  =T01*T12*T23*T34*T45;
T06=T01*T12*T23*T34*T45*T56;

T00 = [1 0 0 0;0 1 0 0; 0 0 1 0; 0  0 0 1]; %因为这是标准dh参数建立的转换,设工具坐标系与T06重合,与教程中改进的DH参数确定角速度方法不同

ox = T06(1,4); oy = T06(2,4);oz = T06(3,4);
w1 = T00(1:3,3);w2 = T01(1:3,3);w3 = T02(1:3,3);w4 = T03(1:3,3);w5 = T04(1:3,3);w6 = T05(1:3,3);
%Jw = [w1,w2,w3,w4,w5,w6];
J11 = diff(ox,theta(1));J12 = diff(ox,theta(2));J13 = diff(ox,theta(3));J14 = diff(ox,theta(4));J15 = diff(ox,theta(5));J16 = diff(ox,theta(6));
J21 = diff(oy,theta(1));J22 = diff(oy,theta(2));J23 = diff(oy,theta(3));J24 = diff(oy,theta(4));J25 = diff(oy,theta(5));J26 = diff(oy,theta(6));
J31 = diff(oz,theta(1));J32 = diff(oz,theta(2));J33 = diff(oz,theta(3));J34 = diff(oz,theta(4));J35 = diff(oz,theta(5));J36 = diff(oz,theta(6));

JT = [J11,J12,J13,J14,J15,J16;
      J21,J22,J23,J24,J25,J26;
      J31,J32,J33,J34,J35,J36;
       w1, w2, w3, w4, w5, w6];

end


function [ J ] = ykb( jiao )
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
syms a1 a2 a3 a4 a5 a6;
theta =[a1 a2 a3 a4 a5 a6];
JT =test( theta );
q = jiao*pi/180;

JT1=subs(JT,a1,q(1));JT2=subs(JT1,a2,q(2));JT3=subs(JT2,a3,q(3));JT4=subs(JT3,a4,q(4));JT5=subs(JT4,a5,q(5));J=subs(JT5,a6,q(6));

old = digits;
digits(4)
J = vpa(J,8);

end

function [ T06  ] = tx90_ForwardKinematics( theta )
if nargin<2; end  
d6=100;

T1 =Trans( -90, 50, theta(1), 0 );%[alpha a theta d ]  
T2 =Trans( 0, 425, theta(2)-90, 0 );
T3 =Trans( 90, 0, theta(3)+90, 50 );
T4 =Trans( -90, 0, theta(4), 425 );
T5 =Trans( 90, 0, theta(5), 0 );
T6 =Trans( 0, 0, theta(6), d6 );
T06=T1*T2*T3*T4*T5*T6;



end

function [ T ] = Trans( alpha, a, theta, d ) 
T =[ 
        cosd(theta), -sind(theta)*cosd(alpha), sind(theta)*sind(alpha), a*cosd(theta);
        sind(theta), cosd(theta)*cosd(alpha), -cosd(theta)*sind(alpha), a*sind(theta);
              0,          sind(alpha),              cosd(alpha),            d;
              0,              0,                        0,                  1];
end

总结:
通过编写机器人雅克比矩阵函数,对matlab的掌握更进一步,使用函数时,必须在文件夹里打开,否则容易报错,掌握如何对符号函数进行化简,求偏导最后再代值运算,比较实用。
参考教程:http://mp.weixin.qq.com/s?__biz=MzI1MTA3MjA2Nw==&mid=400013659&idx=1&sn=68abc24fff30e4a16601316a0fe91a46&chksm=7bdb82774cac0b61e3f6cbfd3bfa92973e9c033c816912b5c7439f880254a8571f66897e9229&mpshare=1&scene=23&srcid=0824XXjKUPzVQ1UjlVkokGjl#rd

版权声明:本文为weixin_42355349原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42355349/article/details/82050451

智能推荐

基于Matlab Robotics工具箱的SCARA机器人模型建立和示教

本文采用Matlab版本为2016a,Robotics工具箱版本为9.0; SCARA机器人DH建模采用改进型DH法...

Cozmo机器人使用

原文链接: 目录 1. 入坑始末 2. 启动 Cozmo 3. 开始鼓捣 4. 开发环境搭建——Cozmo Explorer Tool 安装 4.1. 下载 4.2. 安装依赖 4.2.1. Cozmo SDK 安装 4.2.1.1. Python Installation 4.2.1.2. SDK Installation 4.2.1.3. SDK Upgrade 4.2...

MATLAB机器人可视化

1、前记:可能用Robotics Toolbox建立的机器人模型与实际机器人在外观上存在天壤之别吧,直接将CAD软件(UG、SolidWorks、CATIA、Proe等)做好的3D模型导入MATLAB中是一个很好的选择。      下面记录MATLAB官网上的如何显示具有可视几何图形的机器人建模。      1)导入具有.stl文件的机器...

基于Matlab Robotics工具箱的通用6轴机器人模型建立与仿真

本文采用Matlab版本为2016a,Robotics工具箱版本为9.0; 目前市场上的6轴机器人结构各样,但基本都是符合pieper法则, 即机器人的三个相邻关节轴交于一点或三轴线平行。 采用改进型的DH参数方法进行对机器人建模   从图像可以看到机器人模型的建立正确性。...

matlab机器人工具箱六轴机器人的DH模型和改进DH模型建立与区别

一.模型 以XINJE的六轴为例,我就直接放照片了,等以后有时间,我再画图。 DH模型: ii θiθi didi aiai αiαi 11 θ1θ1 00 0.1800.180 π2π2 22 θ2θ2 00 0.6000.600 00 33 θ3θ3 00 0.1...

猜你喜欢

Mybatis源码的下载,搭建以及阅读源码的姿势

源码下载 mybatis的源码是在github上开源的,所以直接从github上搜索下载即可。 如上图,第一个就是mybatis3的源码项目,下面几个也是项目中常用的依赖项目,分页插件pagehelper,SSM项目需要引入的依赖mybatis-spring,mybatis-plus项目等。 当前最新版本是v3.5.5,可以选择合适的版本下载。我本地选择的是v3.5.4版本,小版本之间没有太大差异...

spring cloud + redis RedisTemplate Api搭建简单Demo

简介 Redis是一种NoSQL数据库,即非关系型数据库。redis是一个key-value存储系统。它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,r...

c++在windows、linux下获取指定文件夹下所有文件名的方法

一般来说,获取指定文件夹下的所有文件名,用python是较为方便的,直接: import os files_name = os.listdir(“一个路径”) 但也有c++程序偶尔也有这个需求,下面就直接上c++在windows和linux去读取文件夹下文件名的方法,不同的系统代码上有一些差别 Windows(vs) vs的环境,主要是用到了头文件<io.h>,...

计算机图形学实验一绘制任意斜率的直线段

一、实验目的 (1)掌握任意斜率直线段的重点 Bresenham 扫描转换算法; (2)掌握 Cline 直线类的设计方法; (3)掌握状态栏编程方法。 二、实验步骤 (1)创建MFC应用程序 (2)定义CLine类   添加消息处理的处理程序   三、实验结果   四、实验体会 在本次实验中,通过不断的探索和实践,我学会了如何创建一个MFC应用程序,将理论运用于实践...

CSS盒模型

盒子模型 盒子模型是什么 CSS盒子模型就是在CSS技术所使用的一种思维模型。CSS假定所有的HTML文档元素都生成一个描述该元素在HTML文档布局中所占空间的矩形元素框,可以形象地将其看作是一个盒子。通过定义一系列与盒子相关的属性,可极大地丰富和促进各个盒子乃至整个HTML文档的表现效果和布局结构。CSS盒子模型由内容区、填充、边框和空白边四部分组成。内容区是盒子模型的中心,呈现盒子的主要信息内...