三轴机械臂建模及运动学仿真
在开始具体的机械结构及驱动结构设计之前,有必要对机械臂进行运动学仿真来得到其运动学正解、运动学逆解和工作空间情况。
刚刚结束的小学期里我们对一台货真价实的六轴机械臂进行了拆解和运动学仿真,然后水完了项目报告,本以为这次的仿真在暑期的代码上稍加更改就可以了,然而——终究是我错付了。
各仿真项目的个人理解
开始之前我需要从应用的角度来谈谈对仿真的几大块内容:正逆解求解、工作空间分析、轨迹规划的理解。首先要明确机械臂设计的总目标,即设计出一款可以按指定方案到达指定位姿的装置。
上述理解中指定方案和指位姿这两个要求对设计和轨迹规划的过程提出了要求,运动学建模和仿真也要考虑这些要求。
- 运动学正逆解:正逆解的求解在两部分会使用到,分别是最初确定DH阵列表相关参数时和轨迹规划求解时。确定DH参数的过程就是一遍遍更改参数验求解正逆解并判断当前参数能否满足可以到达指定位姿这一要求;在轨迹规划这一过程中正逆解的使用主要是逆解,即求解终点和中间点的关节角来达到不同的轨迹规划效果。
- 轨迹规划:轨迹规划的过程即实现指定运动方案的过程,作用不言自明故不在赘诉。
- 工作空间:工作空间的分析是我比较不理解,之前学习过程中以为他只是单纯画出了机器可达与不可达的分界线,用以划分工作禁入区以保护工人。直到我开始通过正逆解求解调整臂长。
我发现了可以通过筛选工作空间中
三轴机械臂(欠驱动)分析难点
三维空间具有六个自由度,分别是三个移动自由度和三个旋转自由度。六自由度以下的机械臂被称为欠驱动机械臂(我没查,但应该是)
如果机器人具有较少的自由度,则不能够随意指定任何位置和姿态,只能移动到期望的位置和较少关节所限定的姿态。即欠驱动机器人的工作空间中任意可达点较少,尤其是三自由度机器人,很多工作点个位姿只有一个,即一个位置的姿态只有一个。
而MATLAB所具有的RTB工具箱的逆解求解又需要输入目标点的T矩阵(同时包含位置和姿态),而我们实际需要中并不对姿态做约束也无法做到,故RTB的逆解求解程序不太可行。为找到合适的逆解求解方法我做了如下尝试:
更改RTB中逆解求解源码
小学期的分析本来应该是分析一下逆解求解代码的,但因为种种原因主要是懒,并没有进行,最后兜兜转转还是回到了原点,总之先上源码:
- 第一段中mask变量为一个一行六列的矩阵,可根据实际机械臂自由度来在求解前定义前几个数字为1,其余的数字为0;
assert(numel(opt.mask) == 6, 'RTB:ikine:badarg', 'Mask matrix should have 6 elements');
assert(n >= numel(find(opt.mask)), 'RTB:ikine:badarg', 'Number of robot DOF must be >= the number of 1s in the mask matrix');
W = diag(opt.mask);
- 第二段代码定义了求解时时如何把当前值与目标值比较来接近目标值的,核心代码是第一行的tr2delta函数。该函数也是RTB工具箱的一部分用以求解当前值到目标值的微分运动矩阵,并通过计算该矩阵的范数来衡量误差大小。当小于定义的结束误差opt.tol时结束计算;
e = tr2delta(robot.fkine(q), T);
% are we there yet
if norm(W*e) < opt.tol
break;
- 第三段代码是迭代计算的过程,是真正的核心。代码采用了课本上讲过的雅克比矩阵迭代的方法,相关理解有人已经讲过了,具体见此处:
【机器人学】机器人开源项目KDL源码学习:(2)牛顿拉普森迭代法求机器人的数值解
while true
% 计算误差
Tq = robot.fkine(q');
e(1:3) = transl(T - Tq);
Rq = t2r(Tq);
[th,n] = tr2angvec(Rq'*t2r(T));
e(4:6) = th*n;
J = jacob0(robot, q); % 计算雅克比
% 根据末端误差求取关节变化
if opt.pinv % 雅克比伪逆法
dq = opt.alpha * pinv( J(m,:) ) * e(m);
else % 雅克比转置法
dq =