写在前面

学习代码都记录在个人github上,欢迎关注~

动力学问题,简单来看,主要由两个问题组成:

准备知识:

运动学 机器人学回炉重造(1):正运动学、标准D-H法与改进D-H法的区别与应用(附ABB机械臂运动学建模matlab代码)

雅克比矩阵 机器人学回炉重造(2):雅克比矩阵(附matlab实现)

下面先搬上笔记,最后面是平面三连杆动力学仿真代码(已通过函数验证)以及六自由度机械臂动力学仿真代码(未验证)(2019.11.29已通过函数验证)。

动力学

另外,在高自由度的情况下,牛顿-欧拉算法更容易通过编程实现,核心如下:

平面三连杆机械臂瞬态运动的牛顿-欧拉递归逆动力学求解Matlab

问题描述

自写Matlab实现代码

% 三连杆机械臂瞬态运动的牛顿-欧拉递归逆动力学求解:
% 参数:(运动指令)各关节运动角度, 关节速度, 关节加速度(3*1矩阵)
% 返回值:各关节力矩(3*1矩阵)
function tau = three_dof_dynamics(theta, theta_d, theta_dd)
% 改进D-H参数
th(1) = theta(1)*pi/180; d(1) = 0; a(1) = 0; alp(1) = 0;
th(2) = theta(2)*pi/180; d(2) = 0; a(2) = 4; alp(2) = 0;
th(3) = theta(3)*pi/180; d(3) = 0; a(3) = 3; alp(3) = 0;
% base_link的各项初始值
w00 = [0; 0; 0]; v00 = [0; 0; 0]; w00d = [0; 0; 0]; v00d = [0; 9.8; 0];
% 各关节p及各link质心pc的距离(假设质心在几何中心)
p10 = [0; 0; 0]; p21 = [4; 0; 0];
p32 = [3; 0; 0]; p43 = [2; 0; 0];
pc11 = [2; 0; 0]; pc22 = [1.5; 0; 0];
pc33 = [1; 0; 0];
z = [0; 0; 1];
% 各连杆质量
m1 = 20; m2 = 15; m3 = 10;
% 惯性张量
I1 = [0 0 0; 0 0 0; 0 0 0.5]; I2 = [0 0 0; 0 0 0; 0 0 0.2]; I3 = [0 0 0; 0 0 0; 0 0 0.1];
% 各齐次矩阵function T = MDHTrans(alpha, a, d, theta)
% 旋转矩阵
T01 = MDHTrans(alp(1), a(1), d(1), th(1));
T12 = MDHTrans(alp(2), a(2), d(2), th(2));
T23 = MDHTrans(alp(3), a(3), d(3), th(3));
R01 = T01(1:3, 1:3); R12 = T12(1:3, 1:3); R23 = T23(1:3, 1:3);
R10 = R01'; R21 = R12'; R32 = R23';
R34 = [1 0 0; 0 1 0; 0 0 1];
%% Outward iterations: i: 0->2
% i = 0 连杆1
w11 = R10*w00 + theta_d(1)*z;
w11d = R10*w00d + cross(R10*w00, z*theta_d(1)) + theta_dd(1)*z;
v11d = R10*(cross(w00d, p10) + cross(w00, cross(w00, p10)) + v00d);
vc11d = cross(w11d, pc11) + cross(w11, cross(w11, pc11)) + v11d;
F11 = m1*vc11d;
N11 = I1*w11d + cross(w11, I1*w11);
% i = 1 连杆2
w22 = R21*w11 + theta_d(2)*z;
w22d = R21*w11d + cross(R21*w11, z*theta_d(2)) + theta_dd(2)*z;
v22d = R21*(cross(w11d, p21) + cross(w11, cross(w11, p21)) + v11d);
vc22d = cross(w22d, pc22) + cross(w22, cross(w22, pc22)) + v22d;
F22 = m2*vc22d;
N22 = I2*w22d + cross(w22, I2*w22);
% i = 2 连杆3
w33 = R32*w22 + theta_d(3)*z;
w33d = R32*w22d + cross(R32*w22, z*theta_d(3)) + theta_dd(3)*z;
v33d = R32*(cross(w22d, p32) + cross(w22, cross(w22, p32)) + v22d);
vc33d = cross(w33d, pc33) + cross(w33, cross(w33, pc33)) + v33d;
F33 = m3*vc33d;
N33 = I3*w33d + cross(w33, I3*w33);%% Inward iterations: i: 3->1
f44 = [0; 0; 0]; n44 = [0; 0; 0];
% i = 3
f33 = R34*f44 + F33;
n33 = N33 + R34*n44 + cross(pc33, F33) + cross(p43, R34*f44);
tau(3) = n33'*z;
% i = 2
f22 = R23*f33 + F22;
n22 = N22 + R23*n33 + cross(pc22, F22) + cross(p32, R23*f33);
tau(2) = n22'*z;
% i =1
f11 = R12*f22 + F11;
n11 = N11 + R12*n22 + cross(pc11, F11) + cross(p21, R12*f22);
tau(1) = n11'*z;end

运行结果:

验证代码

clear;
clc;
% 改进D-H
th(1) = 0; d(1) = 0; a(1) = 0; alp(1) = 0;
th(2) = 0; d(2) = 0; a(2) = 4; alp(2) = 0;
th(3) = 0; d(3) = 0; a(3) = 3; alp(3) = 0;% DH parameters  th     d    a    alpha
L1 = Link([th(1), d(1), a(1), alp(1)], 'modified');
L2 = Link([th(2), d(2), a(2), alp(2)], 'modified');
L3 = Link([th(3), d(3), a(3), alp(3)], 'modified');L1.m = 20; L2.m = 15; L3.m = 10;% 连杆质量
% 连杆质心位置
L1.r = [2 0 0];
L2.r = [1.5 0 0];
L3.r = [1 0 0];
% 连杆惯性张量
L1.I = [0 0 0; 0 0 0; 0 0 0.5];
L2.I = [0 0 0; 0 0 0; 0 0 0.2];
L3.I = [0 0 0; 0 0 0; 0 0 0.1];
robot = SerialLink([L1, L2, L3]);
robot.name = 'Plan3R';
robot.comment = 'xuuyann';
robot.display()
% Forward Pose Kinematics
theta=[10, 20, 30]*pi/180;
robot.teach()
robot.plot(theta);
t0=robot.fkine(theta)    %末端执行器位姿
% TAU = R.rne(Q, QD, QDD, GRAV)
tau = robot.rne(theta, [1, 2, 3], [0.5, 1, 1.5], [0 9.8 0])

运算结果:

验证完毕。

六自由度机械臂瞬态运动的牛顿-欧拉递归逆动力学求解Matlab(未验证)(2019.11.29已通过函数验证)

前情提要: 机器人学回炉重造(1):正运动学、标准D-H法与改进D-H法的区别与应用(附ABB机械臂运动学建模matlab代码)

自写代码

% 六自由度机械臂瞬态运动的牛顿-欧拉递归逆动力学求解:
% 参数:(运动指令)各关节运动角度, 关节速度, 关节加速度(6*1矩阵)
% 返回值:各关节力矩(6*1矩阵)
% 由于我不清楚机械臂实际质量参数,因此下面的惯性张量及质心位置均为假设杜撰
function tau = myNewtonEuler(theta, theta_d, theta_dd)
%% 初始化
% 改进D-H参数
th(1) = theta(1)*pi/180; d(1) = 0; a(1) = 0; alp(1) = 0;
th(2) = theta(2)*pi/180; d(2) = 0; a(2) = 0.320; alp(2) = pi/2;
th(3) = theta(3)*pi/180; d(3) = 0; a(3) = 0.975; alp(3) = 0;
th(4) = theta(4)*pi/180; d(4) = 0.887; a(4) = 0.2; alp(4) = pi/2;
th(5) = theta(5)*pi/180; d(5) = 0; a(5) = 0; alp(5) = -pi/2;
th(6) = theta(6)*pi/180; d(6) = 0; a(6) = 0; alp(6) = pi/2;
w00 = [0; 0; 0]; v00 = [0; 0; 0]; w00d = [0; 0; 0]; v00d = [0; 0; 9.8];%base_link的各项初始值z = [0; 0; 1];
% 各连杆质量L1.m = 7.36; L2.m = 36.26; L3.m = 12.44;
% L4.m = 1.21; L5.m = 1.21; L6.m = 1;
m1 = 7.36; m2 = 36.26; m3 = 12.44; m4 = 1.21; m5 = 1.21; m6 = 1;
% 惯性张量
I1 = [0 0 0; 0 0 0; 0 0 0.6]; I2 = [0 0 0; 0 0 0; 0 0 0.5]; I3 = [0 0 0; 0 0 0; 0 0 0.4];
I4 = [0 0 0; 0 0 0; 0 0 0.3]; I5 = [0 0 0; 0 0 0; 0 0 0.2]; I6 = [0 0 0; 0 0 0; 0 0 0.1];% 各齐次矩阵function T = MDHTrans(alpha, a, d, theta)
T01 = MDHTrans(alp(1), a(1), d(1), th(1));
T12 = MDHTrans(alp(2), a(2), d(2), th(2));
T23 = MDHTrans(alp(3), a(3), d(3), th(3));
T34 = MDHTrans(alp(4), a(4), d(4), th(4));
T45 = MDHTrans(alp(5), a(5), d(5), th(5));
T56 = MDHTrans(alp(6), a(6), d(6), th(6));% 各关节p及各link质心pc的距离(假设质心在几何中心)
p10 = T01(1: 3, 4); p21 = T12(1: 3, 4); p32 = T23(1: 3, 4);
p43 = T34(1: 3, 4); p54 = T45(1: 3, 4); p65 = T56(1: 3, 4); p76 = [0, 0, 0]';
pc11 = 0.5 * p21; pc22 = 0.5 * p32; pc33 = 0.5 * p43;
pc44 = 0.5 * p54; pc55 = 0.5 * p65; pc66 = 0.5 * p76;% 旋转矩阵
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);
R10 = R01'; R21 = R12'; R32 = R23';
R43 = R34'; R54 = R45'; R65 = R56';
R67 = [1 0 0; 0 1 0; 0 0 1]; R76 = R67';%% Outward iterations: i: 0->5
% 连杆1到连杆6向外迭代
% i = 0
w11 = R10*w00 + theta_d(1)*z;
w11d = R10*w00d + cross(R10*w00, z*theta_d(1)) + theta_dd(1)*z;
v11d = R10*(cross(w00d, p10) + cross(w00, cross(w00, p10)) + v00d);
vc11d = cross(w11d, pc11) + cross(w11, cross(w11, pc11)) + v11d;
F11 = m1*vc11d;
N11 = I1*w11d + cross(w11, I1*w11);
% i = 1
w22 = R21*w11 + theta_d(2)*z;
w22d = R21*w11d + cross(R21*w11, z*theta_d(2)) + theta_dd(2)*z;
v22d = R21*(cross(w11d, p21) + cross(w11, cross(w11, p21)) + v11d);
vc22d = cross(w22d, pc22) + cross(w22, cross(w22, pc22)) + v22d;
F22 = m2*vc22d;
N22 = I2*w22d + cross(w22, I2*w22);
% i = 2
w33 = R32*w22 + theta_d(3)*z;
w33d = R32*w22d + cross(R32*w22, z*theta_d(3)) + theta_dd(3)*z;
v33d = R32*(cross(w22d, p32) + cross(w22, cross(w22, p32)) + v22d);
vc33d = cross(w33d, pc33) + cross(w33, cross(w33, pc33)) + v33d;
F33 = m3*vc33d;
N33 = I3*w33d + cross(w33, I3*w33);
% i= 3
w44 = R43*w33 + theta_d(4)*z;
w44d = R43*w33d + cross(R43*w33, z*theta_d(4)) + theta_dd(4)*z;
v44d = R43*(cross(w33d, p43) + cross(w33, cross(w33, p43)) + v33d);
vc44d = cross(w44d, pc44) + cross(w44, cross(w44, pc44)) + v44d;
F44 = m4*vc44d;
N44 = I4*w44d + cross(w44, I4*w44);
% i = 4
w55 = R54*w44 + theta_d(5)*z;
w55d = R54*w44d + cross(R54*w44, z*theta_d(5)) + theta_dd(5)*z;
v55d = R54*(cross(w44d, p54) + cross(w44, cross(w44, p54)) + v44d);
vc55d = cross(w55d, pc55) + cross(w55, cross(w55, pc55)) + v55d;
F55 = m5*vc55d;
N55 = I5*w55d + cross(w55, I5*w55);
% i = 5
w66 = R65*w55 + theta_d(6)*z;
w66d = R65*w55d + cross(R65*w55, z*theta_d(6)) + theta_dd(6)*z;
v66d = R65*(cross(w55d, p65) + cross(w55, cross(w55, p65)) + v55d);
vc66d = cross(w66d, pc66) + cross(w66, cross(w66, pc66)) + v66d;
F66 = m6*vc66d;
N66 = I6*w66d + cross(w66, I6*w66);%% Inward iterations: i: 6->1
% 连杆6到连杆1向内迭代
f77 = [0; 0; 0]; n77 = [0; 0; 0];
% i = 6
f66 = R67*f77 + F66;
n66 = N66 + R67*n77 + cross(pc66, F66) + cross(p76, R67*f77);
tau(6) = n66'*z;
% i = 5
f55 = R56*f66 + F55;
n55 = N55 + R56*n66 + cross(pc55, F55) + cross(p65, R56*f66);
tau(5) = n55'*z;
% i = 4
f44 = R45*f55 + F44;
n44 = N44 + R45*n55 + cross(pc44, F44) + cross(p54, R45*f55);
tau(4) = n44'*z;
% i = 3
f33 = R34*f44 + F33;
n33 = N33 + R34*n44 + cross(pc33, F33) + cross(p43, R34*f44);
tau(3) = n33'*z;
% i = 2
f22 = R23*f33 + F22;
n22 = N22 + R23*n33 + cross(pc22, F22) + cross(p32, R23*f33);
tau(2) = n22'*z;
% i =1
f11 = R12*f22 + F11;
n11 = N11 + R12*n22 + cross(pc11, F11) + cross(p21, R12*f22);
tau(1) = n11'*z;end

运行结果:



验证代码:

% Modified DH
% ABB robot
clear;
clc;
th(1) = 0; d(1) = 0; a(1) = 0; alp(1) = 0;
th(2) = 0; d(2) = 0; a(2) = 0.320; alp(2) = pi/2;
th(3) = 0; d(3) = 0; a(3) = 0.975; alp(3) = 0;
th(4) = 0; d(4) = 0.887; a(4) = 0.2; alp(4) = pi/2;
th(5) = 0; d(5) = 0; a(5) = 0; alp(5) = -pi/2;
th(6) = 0; d(6) = 0; a(6) = 0; alp(6) = pi/2;
% DH parameters  th     d    a    alpha  sigma
L1 = Link([th(1), d(1), a(1), alp(1), 0], 'modified');
L2 = Link([th(2), d(2), a(2), alp(2), 0], 'modified');
L3 = Link([th(3), d(3), a(3), alp(3), 0], 'modified');
L4 = Link([th(4), d(4), a(4), alp(4), 0], 'modified');
L5 = Link([th(5), d(5), a(5), alp(5), 0], 'modified');
L6 = Link([th(6), d(6), a(6), alp(6), 0], 'modified');L1.m = 7.36; L2.m = 36.26; L3.m = 12.44;
L4.m = 1.21; L5.m = 1.21; L6.m = 1;
% L1.r =
L1.I = [0 0 0; 0 0 0; 0 0 0.6];
L2.I = [0 0 0; 0 0 0; 0 0 0.5];
L3.I = [0 0 0; 0 0 0; 0 0 0.4];
L4.I = [0 0 0; 0 0 0; 0 0 0.3];
L5.I = [0 0 0; 0 0 0; 0 0 0.2];
L6.I = [0 0 0; 0 0 0; 0 0 0.1];T01 = MDHTrans(alp(1), a(1), d(1), th(1));
T12 = MDHTrans(alp(2), a(2), d(2), th(2));
T23 = MDHTrans(alp(3), a(3), d(3), th(3));
T34 = MDHTrans(alp(4), a(4), d(4), th(4));
T45 = MDHTrans(alp(5), a(5), d(5), th(5));
T56 = MDHTrans(alp(6), a(6), d(6), th(6));
% 各关节p及各link质心pc的距离(假设质心在几何中心)
p10 = T01(1: 3, 4); p21 = T12(1: 3, 4); p32 = T23(1: 3, 4);
p43 = T34(1: 3, 4); p54 = T45(1: 3, 4); p65 = T56(1: 3, 4); p76 = [0, 0, 0]';
pc11 = 0.5 * p21
pc22 = 0.5 * p32
pc33 = 0.5 * p43
pc44 = 0.5 * p54
pc55 = 0.5 * p65
pc66 = 0.5 * p76
% 连杆质心位置
L1.r = pc11; L2.r = pc22; L3.r = pc33;
L4.r = pc44; L5.r = pc55; L6.r = pc66;robot = SerialLink([L1, L2, L3, L4, L5, L6]);
robot.name='ABBRobot-6-dof';
robot.display() theta = [-20, 120, -15, 30, 20, 10]*pi/180;
robot.teach();
robot.plot(theta);
% t = robot.fkine(theta)    %末端执行器位姿
% [~, T] = My_Forward_Kinematics_MDH(theta, d, a, alp)
qd = [6 5 4 3 2 1]; qdd = [6 5 4 3 2 1];
tau = robot.rne(theta, qd, qdd, [0, 0, 9.8])
TAU = myNewtonEuler(theta*180/pi, qd', qdd')

运行结果:


qd=[1 1 1 1 1 1]’; qdd = [6 5 4 3 2 1]’;

qd=[1 1 1 1 1 1]’; qdd=[1 1 1 1 1 1]’;


2019.11.29
感谢vaultboy2020指出的错误,正文程序已改正并得到正确的验证结果


2021.7.30
原文程序是基于9.10工具箱运行的,10.3.1以上版本的工具箱运行则会出现如下错误:
解决该错误的办法:
在建立机器人模型后,加上电机惯量,例如
L1.Jm = 0; L2.Jm = 0; L3.Jm = 0; L4.Jm = 0; L5.Jm = 0; L6.Jm = 0; % 新版的rne需要加电机惯量
即可运行成功。

机器人学回炉重造(4):动力学仿真(附牛顿-欧拉递归逆动力学算法matlab代码)相关推荐

  1. 机器人学回炉重造(1-2):各种典型机械臂的正运动学建模(标准D-H法)

    文章目录 写在前面 三连杆平面机械臂 平行四边形操作臂 闭链结构 例:平行四边形操作臂 球形臂 拟人臂 球腕 斯坦福机械臂 带球形手腕的拟人化机械臂 DLR机械臂 参考文献 写在前面 本文所有机械臂均 ...

  2. 机器人学回炉重造(2-2):雅可比矩阵的求法——矢量积法、微分变换法、Manipulator Jacobian(Jacobian for short)

    文章目录 写在前面 矢量积法--改进D-H法 微分变换法--改进D-H法 Manipulator for Jacobian(Jacobian for short)--标准D-H法 微分变换法--标准D ...

  3. 机器人学回炉重造(5-2):关节空间规划方法——梯形加减速(与抛物线拟合的线性函数)、S型曲线规划

    文章目录 写在前面 学习代码都记录在[个人github](https://github.com/xuuyann/RobotLearningCode)上,欢迎关注~ 梯形加减速(与抛物线拟合的线性函数) ...

  4. 机器人学回炉重造(2-4):运动学奇异位型分析

    文章目录 什么是运动学奇异位型? 例子:平面二连杆机械手的奇异位型 奇异位型解耦 腕部奇异位型 手臂奇异位型 转载:6轴串联关节机器人的奇异点 参考文献 什么是运动学奇异位型? 在初步系统地了解了机器 ...

  5. 机器人学回炉重造(2-3):基本雅可比矩阵与其他雅可比矩阵

    文章目录 基本雅可比矩阵 定义 求法 其他雅可比矩阵 定义 求法 补充:几何雅可比与解析雅可比 基本雅可比矩阵 定义 用笛卡尔坐标描述线速度(linear velocity)和角速度(angular ...

  6. 5. 机器人动力学---串联机构牛顿欧拉方程

    1. 引言 这篇文章主要介绍了串联机构牛顿欧拉方程的基本原理,文章提到了惯性系平权性,速度叠加原理等对于理解机器人动力学十分关键的问题.具体内容请参考古月居

  7. 机械臂动力学建模(3)- Newton Euler牛顿欧拉算法

    Newton Euler算法 参考 思路(参考丁教授第二讲ppt) 矢量在不同坐标系下的转换关系 速度的递推 重心处的力和力矩 力的递推 完整公式 代码 参考 北航丁希仑教授的机器人动力学课件: 检出 ...

  8. 【机器人学】牛顿-欧拉动力学方程迭代形式

    1 牛顿方程和欧拉方程 作者推导了牛顿欧拉动力学方程的迭代形式和矩阵,本文重点描述动力学方程的迭代形式,动力学方程的矩阵形式见博文. 假定机械臂的连杆均为刚体,若连杆质心的位置和惯性张量已知,那么它的 ...

  9. Vue回炉重造之封装防刷新考试倒计时组件

    你好,我是Vam的金豆之路,可以叫我豆哥.2019年年度博客之星.技术领域博客专家.主要领域:前端开发.我的微信是 maomin9761,有什么疑问可以加我哦,自己创建了一个微信技术交流群,可以加我邀 ...

  10. 《回炉重造 Java 基础》——集合(容器)

    整体框架 绿色代表接口/抽象类:蓝色代表类. 主要由两大接口组成,一个是「Collection」接口,另一个是「Map」接口. 前言 以前刚开始学习「集合」的时候,由于没有好好预习,也没有学好基础知识 ...

最新文章

  1. 在idea中移除子模块Moudle后重新导入
  2. 桌面应用程序 azure_Azure Logic应用程序用例–黑色星期五
  3. 单片机断电后不保存程序_51单片机运行过程
  4. Generating RSA keys in PKCS#1 format in Java--转
  5. OPA 5 - CreateButtonTest creates CreateButtonSteps
  6. ipython版本_1. Python版本的选择与安装
  7. 敢问北极熊,路在何方?
  8. mysql数据排序问题
  9. Python基础语法-print
  10. centos linux引导修复_CentOs7 修复 引导启动
  11. http://www.spiceworks.com
  12. 借用 AWS 服务 CodePipeling + ECS 实现蓝绿发布 (awscli)
  13. python2.7 一个莫名其妙的错误
  14. 70K的QQ——MiniQQ
  15. Linux云计算架构-设置计划任务与管理日志
  16. 将svg图片转换icon
  17. css3 烟 蚊香_如何用纯 CSS 创作一盘传统蚊香
  18. ERP 数据流脚本框架 Samsara v2.0 脚本规范 (修订稿)
  19. 认识32位浮点数(分别输出符号,阶码,尾数)
  20. C语言用if判断大小,学习C语言之用if语句比较三个数的大小[大全5篇]

热门文章

  1. 还原文件打开方式为未知应用程序
  2. koa2 mysql sequelize_[转]使用nodejs-koa2-mysql-sequelize-jwt 实现项目api接口
  3. c++控制台游戏-小镇物语正式版 V1.7.2 [可存档!!!]
  4. java计算机毕业设计体检系统源码+系统+数据库+lw文档
  5. Python之(scikit-learn)机器学习
  6. java设置图片_JAVA 设置背景图片
  7. 计算机的网关地址是什么,什么是网关 网关地址是什么
  8. html刮刮乐百分比,jQuery+html5实现彩票刮刮乐效果
  9. 介词 at on about
  10. elasticsearch搜索推荐系列(二)之 java实现中文转化为拼音与简称