机器人基础之动力学

机器人基础之动力学

  • Newton-Euler动力学方法
    • 外推计算速度和加速度
    • 内推计算力和力矩
  • MATLAB实现

Newton-Euler动力学方法

Newton-Euler动力学方法是研究机器人动力学问题的一种重要方法。
如果一直机器人关节的位置、速度和加速度以及机器人的运动学和质量分布信息,可以采用Newton-Euler动力学求出关节需要提供的驱动力和驱动力矩。
Newton-Euler动力学方法主要包括速度和加速度的递推计算以及力和力矩的递推计算两个步骤。

外推计算速度和加速度

从连杆1到连杆n递推计算各连杆的速度和加速度,并由此计算各连杆所受的惯性力和惯性力矩,公式如下: i + 1 ω i + 1 = i i + 1 R i ω i + θ ˙ i + 1 i + 1 Z i + 1 {^{i+1}}\omega_{i+1} = {^{i+1}_i}R{^i}\omega_i+\dot\theta_{i+1}{^{i+1}}Z_{i+1} i+1ωi+1=ii+1Riωi+θ˙i+1i+1Zi+1 i + 1 ω ˙ i + 1 = i i + 1 R i ω ˙ i + i i + 1 R i ω i × θ ˙ i + 1 i + 1 Z i + 1 + θ ¨ i + 1 i + 1 Z i + 1 {^{i+1}}\dot\omega_{i+1} = {^{i+1}_i}R{^i}\dot\omega_i + {^{i+1}_i}R{^i}\omega_i \times \dot\theta_{i+1}{^{i+1}}Z_{i+1}+ \ddot\theta_{i+1}{^{i+1}}Z_{i+1} i+1ω˙i+1=ii+1Riω˙i+ii+1Riωi×θ˙i+1i+1Zi+1+θ¨i+1i+1Zi+1 i + 1 v i + 1 = i i + 1 R ( i v i + i ω i × i p i + 1 ) {^{i+1}}v_{i+1} = {^{i+1}_i}R({^i}v_i+{^i}\omega_i \times {^i}p_{i+1}) i+1vi+1=ii+1R(ivi+iωi×ipi+1) i + 1 v ˙ i + 1 = i i + 1 R [ i v ˙ i + i ω ˙ i × i p i + 1 + i ω i × ( i ω i × i p i + 1 ) ] {^{i+1}}\dot v_{i+1} = {^{i+1}_i}R [ {^i}\dot v_i+{^i}\dot\omega_i \times {^i}p_{i+1} + {^i}\omega_i \times ({^i}\omega_i \times {^i}p_{i+1})] i+1v˙i+1=ii+1R[iv˙i+iω˙i×ipi+1+iωi×(iωi×ipi+1)] i + 1 v ˙ C i + 1 = i + 1 v ˙ i + 1 + i + 1 ω ˙ i + 1 × i + 1 P C i + 1 + i + 1 ω i + 1 × ( i + 1 ω i + 1 × i + 1 P C i + 1 ) {^{i+1}}\dot v_{Ci+1} = {^{i+1}}\dot v_{i+1} + {^{i+1}}\dot\omega_{i+1} \times {^{i+1}}P_{Ci+1} + {^{i+1}}\omega_{i+1} \times ({^{i+1}}\omega_{i+1} \times {^{i+1}}P_{Ci+1}) i+1v˙Ci+1=i+1v˙i+1+i+1ω˙i+1×i+1PCi+1+i+1ωi+1×(i+1ωi+1×i+1PCi+1) i + 1 F c i + 1 = m i + 1 i + 1 v ˙ c i + 1 {^{i+1}}F_{ci+1} = m_{i+1} {^{i+1}}\dot v_{ci+1} i+1Fci+1=mi+1i+1v˙ci+1 i + 1 N c i + 1 = c i + 1 I i + 1 i + 1 ω ˙ i + 1 + i + 1 ω i + 1 × ( c i + 1 I i + 1 i + 1 ω i + 1 ) {^{i+1}}N_{ci+1} = {^{ci+1}} I_{i+1}{^{i+1}}\dot\omega_{i+1} + {^{i+1}}\omega_{i+1} \times ({^{ci+1}} I_{i+1}{^{i+1}}\omega_{i+1}) i+1Nci+1=ci+1Ii+1i+1ω˙i+1+i+1ωi+1×(ci+1Ii+1i+1ωi+1)

内推计算力和力矩

从连杆n到连杆1计算各连杆内部相互作用的力和力矩,以及关节驱动力和力矩。公式如下: i f i = i + 1 i R i + 1 f i + 1 + i F c i {^i}f_i = {^i_{i+1}}R {^{i+1}}f_{i+1} + {^i}F_{ci} ifi=i+1iRi+1fi+1+iFci i n i = i N c i + i + 1 i R i + 1 n i + 1 + i P c i × i F c i + i P i + 1 × i + 1 i R i + 1 f i + 1 {^i}n_i = {^i}N_{ci} + {^i_{i+1}}R {^{i+1}}n_{i+1} + {^i}P_{ci} \times{^i}F_{ci} + {^i}P_{i+1} \times {^i_{i+1}}R {^{i+1}}f_{i+1} ini=iNci+i+1iRi+1ni+1+iPci×iFci+iPi+1×i+1iRi+1fi+1

MATLAB实现

function [Inertial_Force_Matrix, Drive_Force_Matrix] = NewtonEuler(DH_parameter, Pc_Matrix, Mass_Vector, Inertial_Matrix, Force_Vector, dTheta, ddTheta)
% Newton-Euler动力学方法
% DH_parameter:DH参数表;
% Pc_Matrix:各连杆质心在对应坐标系中的位置矩阵,大小为3*自由度;
% Mass_Vector:各连杆的质量;
% Inertial_Matrix:各连杆的惯性张量矩阵,大小为3*(3*自由度);
% Force_Vector:机器人末端所受力和力矩,为6为列向量;

[dim_row, dim_col] = size(DH_parameter);

angVel = [0; 0; 0);
vel = [0; 0; 0];
angAccel = [0; 0; 0];
accel = [0; 0; 0];

Inertial_Force_Matrix = (zeros(6, dim_row));
Drive_Force_Matrix = (zeros(6, dim_row));

f = Force_Vector(1:3, 1);
n = Force_Vector(4:6, 1);

% 外推计算速度和加速度 
for i = 1 : dim_row
    T_Matrix = calT(DH_parameter, i - 1, i);
    P = T_Matrix(1:3, 4);
    T_inv = calTInv(T_Matrix);
    R = T_inv(1:3, 1:3);
    I = Inertial_Matrix(:, (3*i-2) : (3*i));

    cal_angVel = angVelTrans(R, angVel, dTheta(i));
    cal_vel = linVelTrans(R, vel, angVel, P);
    cal_angAccel = angAccelTrans(R, angAccel, angVel, dTheta(i), ddTheta(i));
    cal_accel = linAccelTrans(R, accel, angAccel, angVel, P);
    cAccel = cal_accel + cross(cal_angAccel, Pc_Matrix(:, i)) + cross(cal_angVel, cross(cal_angVel, Pc_Matrix(:, i)));
    
    F = Mass_Vector(i) * cAccel;
    N = I * cal_angAccel + cross(cal_angVel, I * cal_angVel);
    Inertial_Force_Matrix(1:3, i) = F;
    Inertial_Force_Matrix(4:6, i) = N;
    
    angVel = cal_angVel;
    vel = cal_vel;
    angAccel = cal_angAccel;
    accel = cal_accel;
end

Drive_Force_Matrix(1:3, dim_row) = f;
Drive_Force_Matrix(4:6, dim_row) = n;
    
% 内推计算力和力矩
for i = (dim_row - 1) : -1 : 1
    % 计算i+1相对于i的齐次变换矩阵
    T = calT(DH_parameter, i - 1, i);
    [R, P] = getRP(T);
    
    % 代入运动学外推得到的惯性力fi和惯性力矩ni
    fi = Inertial_Force_Matrix(1:3, i);
    ni = Inertial_Force_Matrix(4:6, i);
    
    pc = Pc_Matrix(:, i); % 质心在i中的位置
    F = R * f + fi; % f为关节所受的力, n为关节所受的力矩
    N = ni + R * n + cross(pc, fi) + cross(P, R * f);
    
    Drive_Force_Matrix(1:3, i) = F;
    Drive_Force_Matrix(4:6, i) = N;
    f = F;
    n = N; 
end

你可能感兴趣的:(机器人基础之动力学)