基于修正MD-H模型对机器人进行运行学建模,存在几何参数有a,α,d,θ和β。当这些参数存在微小误差时,机器人的实际相邻连杆之间的变换关系和理论相邻连杆之间变换关系会存在一定的偏差,导致最后实际和理论的末端位姿坐标也存在误差,分别用 Δa、Δα、 Δd,、 Δθ;和 Δβ;来表示MD-H模型中的五个几何参数误差。利用微分变换原理将机器人各个连杆机构之间的微小原始偏差合成积累到末端位姿的误差视为各个连杆机构进行微分变换综合作用导致的结果,基于MD-H运动学模型建立误差模型,由于各个连杆机构都存在几何参数的误差,机器人的相邻连杆之间的变换矩阵也存在着微小偏差,根据微分运动变换原理,连杆之间的实际变换矩阵和理论变换矩阵存在一定关系。 帮我用MATLAB实现结合我做建立的机器人模型和DH参数,建立误差模型。并且举例我输入关节角的值能够得到误差值。clear all; clc; du = pi/180; a = [0+0.001, 185+0.0079, 0+0.005, 120+0.12]; alpha = [pi/2+0.003, 0+0.001, pi/2+0.005, pi/2]; d = [0+0.001, 0+0.0079, 90+0.005, 0+0.12]; theta = [90du+0.02, 0, 0.023, 0.08]; beta = zeros(1, 4)+0; L1(1) = Link('d', d(1), 'a', a(1), 'alpha', alpha(1), 'qlim', [180du, 365du], 'modified'); L1(2) = Link('d', d(2), 'a', a(2), 'alpha', alpha(2), 'qlim', [3du, 63du], 'modified'); L1(3) = Link('d', d(3), 'a', a(3), 'alpha', alpha(3), 'qlim', [60du, 120du], 'modified'); L1(4) = Link('d', d(4), 'a', a(4), 'alpha', alpha(4), 'qlim', [230du, 326*du], 'modified'); Needle = SerialLink(L1, 'name', 'Needle'); T1 = DH(1, a(1), alpha(1), d(1), theta(1)+beta(1)); T2 = DH(2, a(2), alpha(2), d(2), theta(2)+beta(2)); T3 = DH(3, a(3), alpha(3), d(3), theta(3)+beta(3)); T4 = DH(4, a(4), alpha(4), d(4), theta(4)+beta(4)); T = T1 * T2 * T3 * T4; delta_a = 0.001; delta_T = zeros(4, 4);帮我续写编写代码保证能够正确运行
时间: 2024-01-05 10:02:31 浏览: 151
在机器人模型的基础上,我们可以通过以下步骤来建立误差模型:
Step 1:计算理论相邻连杆之间的变换矩阵
我们已经通过DH参数计算得到了机器人的运动学模型,可以利用运动学正解来计算机器人的理论末端位姿T0,即机器人的末端执行器在坐标系O0下的位姿:
```
T0 = Needle.fkine(theta);
```
Step 2:利用微分变换原理计算机器人各个连杆机构之间的微小原始偏差
我们可以通过对DH参数进行微小偏差,计算出相邻连杆之间的微小偏差,从而计算出机器人各个连杆机构之间的微小原始偏差。这里我们以a参数的微小偏差为例:
```
delta_a = 0.001; % a参数的微小偏差
delta_T1 = DH(1, a(1)+delta_a, alpha(1), d(1), theta(1)+beta(1)) - T1;
delta_T2 = DH(2, a(2)+delta_a, alpha(2), d(2), theta(2)+beta(2)) - T2;
delta_T3 = DH(3, a(3)+delta_a, alpha(3), d(3), theta(3)+beta(3)) - T3;
delta_T4 = DH(4, a(4)+delta_a, alpha(4), d(4), theta(4)+beta(4)) - T4;
```
Step 3:计算误差矩阵
通过将所有微小偏差累加起来,就可以得到机器人末端位姿的误差矩阵delta_T:
```
delta_T = delta_T1 * delta_T2 * delta_T3 * delta_T4;
```
Step 4:将误差矩阵转化为误差值
最后,我们可以将误差矩阵delta_T转化为误差值,以关节角为例:
```
delta_theta = delta_T * [0; 0; 0; 1]; % 误差值
```
完整代码如下所示:
```
clear all;
clc;
du = pi/180;
a = [0+0.001, 185+0.0079, 0+0.005, 120+0.12];
alpha = [pi/2+0.003, 0+0.001, pi/2+0.005, pi/2];
d = [0+0.001, 0+0.0079, 90+0.005, 0+0.12];
theta = [90du+0.02, 0, 0.023, 0.08];
beta = zeros(1, 4)+0;
L1(1) = Link('d', d(1), 'a', a(1), 'alpha', alpha(1), 'qlim', [180du, 365du], 'modified');
L1(2) = Link('d', d(2), 'a', a(2), 'alpha', alpha(2), 'qlim', [3du, 63du], 'modified');
L1(3) = Link('d', d(3), 'a', a(3), 'alpha', alpha(3), 'qlim', [60du, 120du], 'modified');
L1(4) = Link('d', d(4), 'a', a(4), 'alpha', alpha(4), 'qlim', [230du, 326*du], 'modified');
Needle = SerialLink(L1, 'name', 'Needle');
T1 = DH(1, a(1), alpha(1), d(1), theta(1)+beta(1));
T2 = DH(2, a(2), alpha(2), d(2), theta(2)+beta(2));
T3 = DH(3, a(3), alpha(3), d(3), theta(3)+beta(3));
T4 = DH(4, a(4), alpha(4), d(4), theta(4)+beta(4));
T = T1 * T2 * T3 * T4;
% Step 2:利用微分变换原理计算机器人各个连杆机构之间的微小原始偏差
delta_a = 0.001; % a参数的微小偏差
delta_T1 = DH(1, a(1)+delta_a, alpha(1), d(1), theta(1)+beta(1)) - T1;
delta_T2 = DH(2, a(2)+delta_a, alpha(2), d(2), theta(2)+beta(2)) - T2;
delta_T3 = DH(3, a(3)+delta_a, alpha(3), d(3), theta(3)+beta(3)) - T3;
delta_T4 = DH(4, a(4)+delta_a, alpha(4), d(4), theta(4)+beta(4)) - T4;
% Step 3:计算误差矩阵
delta_T = delta_T1 * delta_T2 * delta_T3 * delta_T4;
% Step 4:将误差矩阵转化为误差值
delta_theta = delta_T * [0; 0; 0; 1]; % 误差值
```
阅读全文