首页 > 编程语言 >matlab练习程序(机械臂DH模型)

matlab练习程序(机械臂DH模型)

时间:2022-09-25 15:13:21浏览次数:77  
标签:par 关节 DH 练习 matlab alpha theta pi endPos

之前有写过二维机械臂正逆运动学运算,不过一般机械臂都是三维的,通常可以用DH模型来表示。

DH模型其坐标系和参数定义如下图:

坐标系定义:

X:当前关节指向下一个关节的方向。

Z:当前关节绕动轴的方向。

Y:垂直于XZ平面的方向。

每个关节都由四个参数[a,d,alpha,theta]定义:

a:上一个关节和当前关节延X方向的距离。

d:上一个关节和当前关节延Z方向的距离。

alpha:延X方向上一个关节和当前关节Z轴间夹角。

theta:绕Z轴当前关节的旋转角度。

最后可以根据四个参数写出转移矩阵:

根据转移矩阵即可得到机械臂的正向坐标变换和最终位置,即机械臂正向运动学。

根据正向变换和最终位置即可计算得到旋转参数,即机械臂逆向运动学。

有robot工具箱可以用工具箱求解,没有工具箱可以用最优化方法求解,当然也可以直接计算,这里用最优化方式求解。

matlab代码如下:

clear all;close all;clc;
warning off;

%建立机器人模型PUMA560
%       theta    d          a       alpha     offset
% SL1=Link([0    0          0      -pi/2      0  ],'standard');
% SL2=Link([0    0          0.432   0         0  ],'standard');
% SL3=Link([0    0.149      0.02    pi/2      0  ],'standard');
% SL4=Link([0    0.433      0      -pi/2      0  ],'standard');
% SL5=Link([0    0          0       pi/2      0  ],'standard');
% SL6=Link([0    0          0       0         0  ],'standard');
% p560=SerialLink([SL1 SL2 SL3 SL4 SL5 SL6],'name','puma560');

T=eye(4);
T(1,4) = 0.5;
T(2,4) = -0.2;
T(3,4) = -0.4;

% q = p560.ikine(T);         %robot工具箱逆运动学求解
% p560.plot(q);
% endPos = p560.fkine(q);    %robot工具箱正运动学求解 

options.Algorithm = 'levenberg-marquardt';
par = zeros(1,6);
f = @(par) func(par,T);
par= lsqnonlin(f,par,[],[],options);        %执行优化
% figure;
% p560.plot(par);
endPos = model(par)

%DH模型
function endPos = model(q)
%           d      a      alpha    theta
DHTable = [ 0      0      -pi/2    q(1);
            0      0.432   0       q(2);
            0.149  0.02    pi/2    q(3);
            0.433  0      -pi/2    q(4);
            0      0       pi/2    q(5);
            0      0       0       q(6)];

endPos = eye(4);
for i = 1:size(DHTable,1)
    theta = DHTable(i,4);
    alpha = DHTable(i,3);
    d = DHTable(i,1);
    a = DHTable(i,2);
    
    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];
    
    endPos = endPos * T;
end
end

function re = func(par,T)
endPos = model(par);
re = T - endPos;
end

 结果如下:

标签:par,关节,DH,练习,matlab,alpha,theta,pi,endPos
From: https://www.cnblogs.com/tiandsp/p/16704749.html

相关文章

  • 第一个网页练习
    步骤一、观察设计稿 设计稿大致分为两部分:body背景、article包含header二、创建工程,index.html+index.css+reset(样式重置)1.创建工程2.链接css  <linkrel......
  • 刻意练习可以用来改变性格
    刻意练习很适合用来改变性格1.性格可以看成是无数个习惯组成的系统,2.习惯可以通过刻意练习来改变3.所以刻意练习可以改变性格,也许是是唯一的方法,......
  • 练习-集合元素处理传统方式和Stream方式
    练习-集合元素处理(传统方式)练习:集合元素处理(传统方式)现在有两个ArrayList集合存储队伍当中的多个成员姓名,要求使用传统的for循环(或增强for循环)依次进行以下......
  • matlab_
    一、安装工具包SVM:由于libsvm版本较高,如以下需要三个参数了,要添加上dec_value,不然结果为空[predict_class,accuracy]=libsvmpredict(output_test,input1_test,model);......
  • 流程控制练习
    流程控制练习打印三角形五行for(inti=1;i<=5;i++){  for(intj=5;j>=i;j--){    System.out.print("*"); }  for(intj=1;j......
  • DC-9靶场练习
    Vulnhub靶场-DC-9准备工作kali和靶机都选择NAT模式(kali与靶机同网段)下载链接:https://download.vulnhub.com/dc/DC-9.zip一、主机发现nmap扫描内网主机查看ip4命令:ip......
  • SQL堂上练习二
    显示某个表所有的内容select*fromdepartments;输出如下DEPARTMENT_IDDEPARTMENT_NAMEMANAGER_IDLOCATION_ID-......
  • go-冒泡排序-练习
    packagemainimport"fmt"funcmain(){ nums:=[]int{1,5,4,3,2,9,8,7,6,0}/* //第一轮 fori:=0;i<len(nums)-1;i++{ ifnums[i]>nums[i+1]{ nums[i],nums......
  • 算法练习-第三天【链表】
    链表203.移除链表元素参考:代码随想录203.移除链表元素看完题目的第一想法一道基本的链表题目,遍历链表如果当前节点的下一个节点值等于val,那么就将当前节点的Next指......
  • day2-doc指令的练习
    常用的dos指令 #盘符切换 #查看当前目录下的文件dir #切换目录cdchangedirectory  cd/d跨盘切换  cd..切换上级目录 #cls清理屏幕clearscreen ......