matlab 七自由度牛顿欧拉动力学方程(数值版)

%七自由度牛顿欧拉动力学(数值版)
number_of_links=7 
% for i=1:number_of_links; 

% end
%% 调用
q=[0   0   0   0   0   0   0];
qd=[0.1  0.1  0.1   0.1   0.1   0.1   0.1];
qdd=[0.1  0.1  0.1   0.1   0.1   0.1   0.1];
torque=NewtonEuler(q,qd,qdd,1)

%%

function tau = NewtonEuler(q,qd,qdd,G)
%% 输入参数:
% q:广义关节坐标,此处为关节转角,1×7矩阵,每一行向量对应一组关节转角,单位:rad;
% qd: 广义关节坐标一阶导数,此处为关节角速度,1×7矩阵,每一行向量对应一组关节角速度,单位:rad/s;
% qdd: 广义关节坐标二阶导数,此处为关节角加速度,1×7矩阵,每一行向量对应一组关节角加速度,单位:rad/s^2;
% G:重力项,当G = 1,有重力影响,当G = 0,无重力影响;
% note::三个输入参数的长度需保持一致。

%%
alpha=[0   0   0   0   0   0   0];
a=[0   0   0   0   0   0   0];
thetaoffset=[0   0   0   0   0   0   0];
theta=q+thetaoffset;
d=[0   0   0   0   0   0   0];
%%

T(:,:,1)=MDH(alpha(1),a(1),theta(1),d(1));%alpha,a,q,d 
T(:,:,2)=MDH(alpha(2),a(2),theta(2),d(2));%alpha,a,q,d 
T(:,:,3)=MDH(alpha(3),a(3),theta(3),d(3));%alpha,a,q,d 
T(:,:,4)=MDH(alpha(4),a(4),theta(4),d(4));%alpha,a,q,d 
T(:,:,5)=MDH(alpha(5),a(5),theta(5),d(5));%alpha,a,q,d 
T(:,:,6)=MDH(alpha(6),a(6),theta(6),d(6));%alpha,a,q,d 
T(:,:,7)=MDH(alpha(7),a(7),theta(7),d(7));%alpha,a,q,d 
%% 惯性张量inertia tensor
% inertia_tensor_list:连杆关于质心坐标系的惯性张量inertia tensor,质心坐标系与连杆坐标系方位一致,7个3×3矩阵,单位kg*m^2
%         I                =      Ixx            -Ixy           -Ixz
%                                 -Ixy           Iyy            -Iyz
%                                 -Iyz           -Iyz           Izz

inertia_tensor_list(:,:,1) = [17085955.96       29.13           520.90;
                              29.13             16299848.40     3041655.32;
                              520.90            3041655.32      6028717.92]/1e9;
                          
inertia_tensor_list(:,:,2) = [17049081.74       -379.65         -251.02;
                              -379.65           6095392.93      2836636.56;
                              -251.02           2836636.56      16245722.28]/1e9;
                          
inertia_tensor_list(:,:,3) = [25077403.67       1373.03         4792.34;
                              1373.03           23806776.16     -4872887.52;
                              4792.34           -4872887.52      7607337.29]/1e9;
                          
inertia_tensor_list(:,:,4) = [17049008.27       -2836.83        605.34;
                              -2836.83           6095457.66      2836684.49;
                              605.34            2836684.49      16245750.37]/1e9; 
                          
inertia_tensor_list(:,:,5) = [10079214.34       -74.51          17.98;
                              -74.51             8702598.01      3090329.67;
                              17.98             3090329.67      4469563.66]/1e9;
                          
inertia_tensor_list(:,:,6) = [5094485.23        -96.90           -67.21;
                              -96.90            3542620.51      -249580.52;
                              -67.21            -249580.52      4899002.53]/1e9;
                          
inertia_tensor_list(:,:,7) = [198764.02         0.88            -27.71;
                              0.88              195312.12       0.20;
                              -27.71            0.20            322516.91]/1e9;
%%  mass_center_list:                      
% mass_center_list:连杆质心在连杆坐标系下的位置,3×7矩阵,单位:m                             
%                   x         y           z
mass_center_list = [0        -34.73       -69.48;
                    0        -67.33       34.41;
                    -0.03    29.56        -89.00;
                    0.03     -67.33       -34.41;
                    0        -21.39       -140.03;
                    0        -2.12        0.29;
                    0.01      0           -25.22]/1000;   %注意坐标相对于哪个坐标系来说                     
 % mass_list: 连杆的质量,1×7矩阵,单位:kg       
mass_list = [2702.4 2725.8 3175.01 2725.80 1693.85 1836.74 269.17]/1000; 
m1 =mass_list(1,1); m2 = mass_list(1,2); m3 = mass_list(1,3); m4 = mass_list(1,4); m5 = mass_list(1,5); m6 = mass_list(1,6);m7 = mass_list(1,7);

z = [0,0,1]';  % 关节轴
if G == 1
    g = 9.81;     % 重力加速度,单位m/s^2
else
    g = 0;
end
%% 提取旋转矩阵并求逆/ 旋转矩阵是正定矩阵RR'=E ,R'=inv(R)
T01=T(:,:,1);T12=T(:,:,2);T23=T(:,:,3);T34=T(:,:,4);
T45=T(:,:,5);T56=T(:,:,6);T67=T(:,:,7);

R01=T01(1:3,1:3); R12=T12(1:3,1:3);  R23=T23(1:3,1:3);R34=T34(1:3,1:3);
R45=T45(1:3,1:3); R56=T56(1:3,1:3); R67=T67(1:3,1:3); R78=[1 0 0; 0 1 0; 0 0 1];%R87=[1 0 0; 0 1 0; 0 0 1];代表平移姿态没变

R10=inv(T01(1:3,1:3)); R21=inv(T12(1:3,1:3));  R32=inv(T23(1:3,1:3));R43=inv(T34(1:3,1:3));
R54=inv(T45(1:3,1:3)); R65=inv(T56(1:3,1:3)); R76=inv(T67(1:3,1:3)); R87=[1 0 0; 0 1 0; 0 0 1];%R87=[1 0 0; 0 1 0; 0 0 1];代表平移姿态没变


%% 各关节p及各link质心pc的距离(假设质心在几何中心)
p01 = T01(1: 3, 4); p12 = T12(1: 3, 4); p23 = T23(1: 3, 4);
p34 = T34(1: 3, 4); p45 = T45(1: 3, 4); p56 = T56(1: 3, 4); p67 =T67(1: 3, 4);p78 = [0, 0, 0]';%p78=代表平移7杆长度;

%(假设质心在几何中心)
% pc11 = 0.5 * p12; pc22 = 0.5 * p23; pc33 = 0.5 * p34;
% pc44 = 0.5 * p45; pc55 = 0.5 * p56; pc66 = 0.5 * p67; pc77=0.5*p78;

%% Outward iterations: i: 0->6
% 连杆1到连杆7向外迭代
% i = 0   %1杆
w00 = [0; 0; 0]; v00 = [0; 0; 0]; w00d = [0; 0; 0]; v00d = [0; 0; 9.8];%base_link的各项初始值
w11 = R10*w00 + qd(1)*z;
w11d=R10*w00d+cross(R10*w00,qd(1)*z)+qdd(1)*z;
v11d=R10*(cross(w00d,p01)+cross(w00, cross(w00, p01))+v00d)
vc11d=cross(w11d,mass_center_list(1,1:3)')+cross(w11, cross(w11, mass_center_list(1,1:3)')) + v11d;
%vc11d=cross(w11d, pc11) + cross(w11, cross(w11, pc11)) + v11d; %或者使用pc11
F11 = m1*vc11d;
N11=inertia_tensor_list(:,:,1)*w11d+cross(w11,inertia_tensor_list(:,:,1)*w11); % N11 = I1*w11d + cross(w11, I1*w11);

% i = 1 %2杆
w22 = R21*w11 + qd(2)*z;
w22d=R21*w11d+cross(R21*w11,qd(2)*z)+qdd(2)*z;
v22d=R21*(cross(w11d,p12)+cross(w11, cross(w11, p12))+v11d)
vc22d=cross(w22d,mass_center_list(2,1:3)')+cross(w22, cross(w22, mass_center_list(2,1:3)')) + v22d;
F22 = m2*vc22d;
N22=inertia_tensor_list(:,:,2)*w22d+cross(w22,inertia_tensor_list(:,:,2)*w22); % N22 = I2*w22d + cross(w22, I2*w22);

% i = 2   %3杆
w33 = R32*w22 + qd(3)*z;
w33d=R32*w22d+cross(R32*w22,qd(3)*z)+qdd(3)*z;
v33d=R32*(cross(w22d,p23)+cross(w22, cross(w22, p23))+v22d)
vc33d=cross(w33d,mass_center_list(3,1:3)')+cross(w33, cross(w33, mass_center_list(3,1:3)')) + v33d;
F33 = m3*vc33d;
N33=inertia_tensor_list(:,:,3)*w33d+cross(w33,inertia_tensor_list(:,:,3)*w33); % N33 = I3*w33d + cross(w33, I3*w33);

% i = 3  %4杆
w44 = R43*w33 + qd(4)*z;
w44d=R43*w33d+cross(R43*w33,qd(4)*z)+qdd(4)*z;
v44d=R43*(cross(w33d,p34)+cross(w33, cross(w33, p34))+v33d)
vc44d=cross(w44d,mass_center_list(4,1:3)')+cross(w44, cross(w44, mass_center_list(4,1:3)')) + v44d;
F44 = m4*vc44d;
N44=inertia_tensor_list(:,:,4)*w44d+cross(w44,inertia_tensor_list(:,:,4)*w44); % N44 = I4*w44d + cross(w44, I4*w44);

% i = 4  %5杆
w55 = R54*w44 + qd(5)*z;
w55d=R54*w44d+cross(R54*w44,qd(5)*z)+qdd(5)*z;
v55d=R54*(cross(w44d,p45)+cross(w44, cross(w44, p45))+v44d)
vc55d=cross(w55d,mass_center_list(5,1:3)')+cross(w55, cross(w55, mass_center_list(5,1:3)')) + v55d;
F55 = m5*vc55d;
N55=inertia_tensor_list(:,:,5)*w55d+cross(w55,inertia_tensor_list(:,:,5)*w55); % N55 = I5*w55d + cross(w55, I5*w55);

% i = 5  %6杆
w66 = R65*w55 + qd(6)*z;
w66d=R65*w55d+cross(R65*w55,qd(6)*z)+qdd(6)*z;
v66d=R65*(cross(w55d,p56)+cross(w55, cross(w55, p56))+v55d)
vc66d=cross(w66d,mass_center_list(6,1:3)')+cross(w66, cross(w66, mass_center_list(6,1:3)')) + v66d;
F66 = m6*vc66d;
N66=inertia_tensor_list(:,:,6)*w66d+cross(w66,inertia_tensor_list(:,:,6)*w66); % N66 = I6*w66d + cross(w66, I6*w66);

% i = 6  %7杆
w77 = R76*w66 + qd(7)*z;
w77d=R76*w66d+cross(R76*w66,qd(7)*z)+qdd(7)*z;
v77d=R76*(cross(w66d,p67)+cross(w66, cross(w66, p67))+v66d);
vc77d=cross(w77d,mass_center_list(7,1:3)')+cross(w77, cross(w77, mass_center_list(7,1:3)')) + v77d;
F77 = m7*vc77d;
N77=inertia_tensor_list(:,:,7)*w77d+cross(w77,inertia_tensor_list(:,:,7)*w77); % N77 = I7*w77d + cross(w77, I7*w77);


%% Inward iterations: i: 7->1
f88=[0;0;0];n88=[0;0;0]; %没有八杆,也没有外力,因此为零
%i=7 %7杆
f77=R78*f88+F77;
n77= N77+R78*n88+cross(mass_center_list(7,1:3)',F77)+cross(p78,R78*f88);
tau(7)=n77'*z;

%i=6  %6杆
f66=R67*f77+F66;
n66= N66+R67*n77+cross(mass_center_list(6,1:3)',F66)+cross(p67,R67*f77);
tau(6)=n66'*z;

%i=5  %5杆
f55=R56*f66+F55;
n55= N55+R56*n66+cross(mass_center_list(5,1:3)',F55)+cross(p56,R56*f66);
tau(5)=n55'*z;

%i=4  %4杆
f44=R45*f55+F44;
n44= N44+R45*n55+cross(mass_center_list(4,1:3)',F44)+cross(p45,R45*f55);
tau(4)=n44'*z;

%i=3  %3杆
f33=R34*f44+F33;
n33= N33+R34*n44+cross(mass_center_list(3,1:3)',F33)+cross(p34,R34*f44);
tau(3)=n33'*z;

%i=2  %2杆
f22=R23*f33+F22;
n22= N22+R23*n33+cross(mass_center_list(2,1:3)',F22)+cross(p23,R23*f33);
tau(2)=n22'*z;

%i=1  %1杆
f11=R12*f22+F11;
n11= N11+R12*n22+cross(mass_center_list(1,1:3)',F11)+cross(p12,R12*f22);
tau(1)=n11'*z;

%disp('over')

end
 %%                        
function T = MDH(alpha,a,theta,d)
    T(1,1) = cos(theta);
    T(1,2) = -sin(theta);
    T(1,3) = 0;
    T(1,4) = a;
    T(2,1) = sin(theta)*cos(alpha);
    T(2,2) = cos(theta)*cos(alpha);
    T(2,3) = -sin(alpha);
    T(2,4) = -d*sin(alpha);
    T(3,1) = sin(theta)*sin(alpha);
    T(3,2) = cos(theta)*sin(alpha);
    T(3,3) = cos(alpha);
    T(3,4) = d*cos(alpha);
    T(4,1) = 0;
    T(4,2) = 0;
    T(4,3) = 0;
    T(4,4) = 1;
end

  • 22
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值