这一节主要讲如何展示模型、如何让模型动起来、如何调整一些世界参数、以及如何使用最简单的正逆解函数。
视频教程:【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度,你的手相对躯干基座跑哪里去了,手的位姿就是相对于躯干的变换矩阵。
设计一个关节变量数组qj=[pi/2,pi/2,0,0,0]
计算——工具坐标系相对于基坐标系的变换矩阵
依然是先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就是。
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站都没有找到,当时是星马的师兄一脉相承传授的(