Matlab机器人工具箱使用3 模型展示、视图调整与正逆解计算

这一节主要讲如何展示模型、如何让模型动起来、如何调整一些世界参数、以及如何使用最简单的正逆解函数。

视频教程:【MATLAB机器人工具箱10.4 机械臂仿真教学】 https://www.bilibili.com/video/BV1q44y1x7WC/?p=4&share_source=copy_web&vd_source=2c56c6a2645587b49d62e5b12b253dca

【【Matlab机器人工具箱】- 运动学①---建立机器人模型--1、Link类    2、SerialLink类】 https://www.bilibili.com/video/BV1R54y1t7eH/?share_source=copy_web&vd_source=2c56c6a2645587b49d62e5b12b253dca

这两个视频都是来自很不错的UP做的,尤其是刘海涛,他在github也做了一套动手学机器人学的教程,但是并没有做完。

Link连杆类

机械臂都是由连杆和关节构成的,如何描述一个连杆,就是Link类负责的任务。
matlab也有类的定义,也可以创建实例对象,访问、修改其属性。

比如对于一个连杆,就具有以下属性:

SerialLink串联类

之前建模我们就用SerialLink建立了一个5DOF的机械臂,这个机械臂中就包含了L(1)-L(5)五个连杆对象,这些连杆构成的整体也可以定义为一个类,串联机械臂类SerialLink。

我们把L连杆集构成一个名为Five_dof的串联类。

L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);
L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);
L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42746^2),'alpha',0, 'offset', -atan(427.46 / 145));
L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset', atan(427.46/145));
L(5) = Link('revolute', 'd', 0.258, 'a', 0, 'alpha', 0);

Five_dof=SerialLink(L,'name','5-dof');

和连杆类一样,他也有自己的属性:

plot负责画图或生成gif动图,这个我们之后频繁用到。

display可以展示机械臂的相关参数

>> Five_dof.display;
 
Five_dof = 
 
5-dof:: 5 axis, RRRRR, stdDH, slowRNE                            
+---+-----------+-----------+-----------+-----------+-----------+
| j |     theta |         d |         a |     alpha |    offset |
+---+-----------+-----------+-----------+-----------+-----------+
|  1|         q1|      0.216|          0|     1.5708|          0|
|  2|         q2|          0|        0.5|          0|     1.5708|
|  3|         q3|          0|   0.451383|          0|   -1.24376|
|  4|         q4|          0|          0|     1.5708|    1.24376|
|  5|         q5|      0.258|          0|          0|          0|
+---+-----------+-----------+-----------+-----------+-----------+
base:    t = (0, 0, 0.28), RPY/xyz = (0, 0, 0) deg   

teach示教函数我们上一节已经接触过了

当然matlab还有各种类各种函数,不常用的也就不一一列出,那如果想用的话应该如何找到所有点函数、属性呢?

如何查询类定义?

在命令行输入下面内容即可。

doc SerialLink

含平移关节的建模

之前我们接触的都是仅含旋转关节的机械臂,如果包含平移关节怎么办呢?

和旋转关节一样!

%% 定义机械臂的连杆参数
L(1) = Link('revolute',  'd', 0,   'a', 0, 'alpha', 0,      'qlim', [-pi, pi], 'modified');
L(2) = Link('prismatic', 'theta', 0, 'a', 0, 'alpha', pi/2, 'qlim', [0, 10],    'modified');
L(3) = Link('revolute',  'd', 0.1, 'a', 0, 'alpha', 0,      'qlim', [-pi, pi], 'modified');

%% 创建 RPR 机器人对象
RPR_robot = SerialLink(L, 'name', 'RPR');

%% 启动交互式教学模式
RPR_robot.teach;

常用类函数

plot——调节位姿/视角/世界参数

创建一个关节变量数组q=[1关节,2关节...],运行后就会自动展示到达该位姿的样子。

创建一个张量q(mxn)=[[时序1的关节变量],[时序2的关节变量]]就能形成动画。

单帧展示:

L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);

L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);

L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42746^2),'alpha',0, 'offset', -atan(427.46/145));

L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset', atan(427.46/145));

L(5) = Link('revolute', 'd', 0.258, 'a', 0, 'alpha', 0);

Five_dof = SerialLink(L, 'name', '5-dof');

Five_dof.base = transl(0, 0, 0.28);

Five_dof.teach

q=[0.1,0.3,0.5,0.6,0.3]

Five_dof.plot(q);

连续展示:

如果学过轨迹规划,你甚至可以写一个同步插值动画

% 定义机械臂模型
L(1) = Link('revolute','d',0.216,'a',0,'alpha',pi/2);
L(2) = Link('revolute','d',0,'a',0.5,'alpha',0,'offset',pi/2);
L(3) = Link('revolute','d',0,'a',sqrt(0.145^2+0.42746^2),'alpha',0, 'offset', -atan(427.46/145));
L(4) = Link('revolute','d',0,'a',0,'alpha',pi/2,'offset', atan(427.46/145));
L(5) = Link('revolute', 'd', 0.258, 'a', 0, 'alpha', 0);

Five_dof = SerialLink(L, 'name', '5-dof');
Five_dof.base = transl(0, 0, 0.28);

% 初始和最终关节角度
q_start = [0.1, 0.3, 0.5, 0.6, 0.3]; % 起始位置
q_end = [pi/2, pi/4, -pi/2, pi/3, pi/6]; % 结束位置

% 插值数
n_points = 50;

% 线插
q_interpolated = zeros(n_points, length(q_start));
for i = 1:length(q_start)
    q_interpolated(:,i) = linspace(q_start(i), q_end(i), n_points);
end

% 创建图形并设置保持状态为 on,在同一窗口中更新
figure;
hold on;

% 初始位置
Five_dof.plot(q_start);

% 更新
for qi = 1:n_points
    clf; % 清除当前图形窗口内容
    Five_dof.plot(q_interpolated(qi,:)); % 更新为新的插值位置
    drawnow; % 刷新窗口
    pause(0.1); % 暂停观察
end

hold off;

世界参数调整

这次我们尝试一下直接在命令行输入

>> Five_dof.plot(q,'view', [90 0], 'workspace', [-1.5 1.5 -1.5 1.5 -1.5 2],'tilesize', 0.5, ...
'noshadow', 'noname', 'noshading', 'jointlen', 3, 'linkcolor', 'g', ...
'tile1color', [1 1 0],'tile2color', [0 1 1], 'basecolor', 'b');

不用记这些参数,需要调整问AI就好,不要把时间浪费在写这些参数上

plot3d——展示内置3D模型

记得先clear;一下,工作区就像堆栈一样,换模型对象了也要把对应的空间清理一下。

>> clear;
>> mdl_puma560;
>> p560.plot3d(qz);
Loading STL models from ARTE Robotics Toolbox for Education  by Arturo Gil (http://arvc.umh.es/arte).......
>> p560.plot3d(qz,'view',[0,0]);

fkine——正运动学求解

正运动学就是告诉你肩膀转a度、胳膊转b度、手腕转c度,你的手相对躯干基座跑哪里去了,手的位姿就是相对于躯干的变换矩阵_{B}^{T}\textrm{T}

设计一个关节变量数组qj=[pi/2,pi/2,0,0,0]
计算_{B}^{T}\textrm{T}——工具坐标系相对于基坐标系的变换矩阵

依然是先clear;一下,然后运行五自由度机械臂的脚本,看到栈区出现Five_dof这个对象之后再执行下面代码

>> q=[pi/2,pi/2,0,0,0]

>> T=Five_dof.fkine(q);
>> T
 

T = 
         0         1         0         0
        -1         0         0    -0.645
         0         0         1     1.181
         0         0         0         1

T就是_{B}^{T}\textrm{T}

ik组——逆运动学求解

1. ikcon - 带有关节限制的优化逆运动学

  • 功能:通过优化方法求解逆运动学问题,并考虑关节的角度限制。
  • 适用场景:当需要确保关节角度在物理可行范围内时使用。

2. ikine - 不带关节限制的优化逆运动学

  • 功能:通过优化方法求解逆运动学问题,不考虑关节的角度限制。
  • 适用场景:适用于不需要考虑关节限制的简单情况,或者作为其他方法的初始估计。

3. ikine3 - 无腕部的三轴机器人逆运动学

  • 功能:专门针对没有腕部的三轴机器人设计的逆运动学求解方法。
  • 适用场景:适用于特定结构的三轴机器人,如简单的机械臂或某些工业应用中的特定设备。

4. ikine6s - 六轴机器人的解析逆运动学

  • 功能:为六轴机器人提供解析解法,直接计算出满足末端位置和姿态要求的关节角度。
  • 适用场景:适用于标准的六轴机器人,能够快速得到精确解。

5. ikine_sym - 符号逆运动学

  • 功能:利用符号计算求解逆运动学问题,可以得到通用的解析表达式。
  • 适用场景:适用于需要理论分析和推导的情况,可以用于教学、研究和开发新的机器人结构。

6. ikinem - 通过最小化求解数值逆运动学

  • 功能:通过数值优化方法求解逆运动学问题,目标是最小化误差。
  • 适用场景:适用于复杂机器人结构或需要高精度控制的应用。

7. ikunc - 不带关节限制的优化逆操作器

  • 功能:通过优化方法求解逆运动学问题,不考虑关节的角度限制,特别适用于操纵器类机器人。

比如用刚刚正运动学的解出的变换矩阵T来进行逆解,看看能不能得到输入的q=[pi/2,pi/2,0,0,0]

这里的mask指掩模向量,意思是由于欠自由度,有个方向上的自由度不能计算,这个方向就置为0

>> q1=Five_dof.ikine(T,'mask',[1 1 1 1 1 0]);
>> q1

q1 =

    1.5708    1.5708   -0.0000    0.0000         0

显然q1=q,是正确的。

用ikunc函数,则不需要掩模向量

>> q2=Five_dof.ikunc(T);
>> q2

q2 =

    1.5708    1.5708    0.0000    0.0000   -0.0000

显然q2=q,也是正确的。

写在后面

至于如何实现正逆解,这是一个很有意思的问题,包括我们的书上,我推荐的还是课本,都不完全。比如几何解、解析解、数值解、三轴相交解、SRS解、牛顿拉夫逊迭代解(数值解最常用的)。由于matlab封装很好,我们基本不需要研究这些问题。但是如果你学mujoco,就要从零开始写逆解代码,也是一件很有(要)意思(命)的事。

关于牛顿-拉夫逊迭代法,我应该会单独出一期视频来讲,整个B站都没有找到,当时是星马的师兄一脉相承传授的(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值