1、拉格朗日法

拉格朗日法是一种基于能量的动力学方法,从拉格朗日函数L(系统动能和势能的差值)出发来建立机器人动力学方程:

Lagrange 方程

应用于机器人动力学模型推导(详细过程可参考霍伟编写的《机器人动力学与控制》),最终可得出如下的形式:

式中各项H,C,G的求解算法如下,本文将该算法用Matlab实现。

各项的求解算法

2、Matlab代码

function [H,C,G] = LagrangianDynamics(dh_list, mass_list, mass_center_list, inertia_tensor_list)

[rows, columns] = size(dh_list);

number_of_links = rows;

if columns ~= 4

error('wrong DH parameters!')

end

for i = 1:rows

% 定义关节位置,速度,加速度符号

eval(['syms ','q',num2str(i),' real;']);

eval(['syms ','dq',num2str(i),' real;']);

eval(['syms ','ddq',num2str(i),' real;']);

eval(['q(i)=','q',num2str(i),';']);

eval(['dq(i)=','dq',num2str(i),';']);

eval(['ddq(i)=','ddq',num2str(i),';']);

end

A = sym([]);

for i = 1:number_of_links

dh = dh_list(i,:);

alpha(i) = dh(1);

a(i) = dh(2);

d(i) = dh(3);

q(i) = dh(4);

A(:,:,i) = [cos(q(i)), -sin(q(i))*cos(alpha(i)), sin(alpha(i))*sin(q(i)), a(i)*cos(q(i));

sin(q(i)), cos(q(i))*cos(alpha(i)), -sin(alpha(i))*cos(q(i)), a(i)*sin(q(i));

0, sin(alpha(i)), cos(alpha(i)), d(i);

0, 0, 0, 1];

end

A = simplify(A);

% 计算每个连杆坐标系在{0}系下的表达

A0 = sym([]);

for i = 1:number_of_links

A0(:,:,i) = eye(4,4);

for j = 1:i

A0(:,:,i) = A0(:,:,i)*A(:,:,j);

end

end

A0 = simplify(A0);

J = sym([]);

for i = 1:number_of_links

J(:,:,i) = JMatrix(mass_list(i),mass_center_list(1,:),inertia_tensor_list(:,:,i));

end

% 计算H(q),由H(q)对称性,只需计算上三角部分

syms tr

for i = 1:number_of_links

for j = i:number_of_links

tr = 0;

for k = j:number_of_links

tr = tr + trace(eval(['diff(A0(:,:,k),q',num2str(i),')'])*J(:,:,k)*...

eval(['diff(transpose(A0(:,:,k)),q',num2str(j),')']));

end

H(i,j) = simplify(tr);

H(j,i) = H(i,j);

end

end

% 计算C(q)

for i = 1:number_of_links

for j = 1:number_of_links

c = 0;

for k = 1:number_of_links

c = c + 1/2*(eval(['diff(H(i,j),q',num2str(k),')'])...

+ eval(['diff(H(i,k),q',num2str(j),')'])...

- eval(['diff(H(j,k),q',num2str(i),')']))*eval(['dq',num2str(k)]);

end

C(i,j) = simplify(c);

end

end

syms gc

g = [0,0,-gc,0]';

% 计算G(q)

for i = 1:number_of_links

gi = 0;

for j = 1:number_of_links

gi = gi - mass_list(j)*g'...

*eval(['diff(A0(:,:,j),q',num2str(i),')'])...

*[mass_center_list(j,:),1]';

end

G(i) = simplify(gi);

end

G = G';

end

代码中的齐次矩阵A(:,:,i)计算对应的是标准DH模型,如果杆件坐标系是用修改的DH模型建立,则只需修改A(:,:,i)的计算即可。下面的用例可测试编写的代码:

% 拉格朗日动力学方程求解测试

clc;

clear;

syms q1 q2 q3 m1 m2 m3 d2 real

syms Ix1 Iy1 Iz1 Ixy1 Iyz1 Ixz1 real

syms Ix2 Iy2 Iz2 Ixy2 Iyz2 Ixz2 real

syms Ix3 Iy3 Iz3 Ixy3 Iyz3 Ixz3 real

syms xc1 yc1 zc1 xc2 yc2 zc2 xc3 yc3 zc3 real

dh_params = [-pi/2, 0, 0, q1;

pi/2, 0, d2, q2;

0, 0, 0, q3];

mass_center = [xc1, yc1, zc1;

xc2, yc2, zc2;

xc3, yc3, zc3];

mass = [m1,m2,m3];

inertia_1 = [Ix1, Ixy1, Ixz1;

Ixy1, Iy1, Iyz1;

Ixz1, Iyz1, Iz1];

inertia_2 = [Ix2, Ixy2, Ixz2;

Ixy2, Iy2, Iyz2;

Ixz2, Iyz2, Iz2];

inertia_3 = [Ix3, Ixy3, Ixz3;

Ixy3, Iy3, Iyz3;

Ixz3, Iyz3, Iz3];

inertia_tensor(:,:,1) = inertia_1;

inertia_tensor(:,:,2) = inertia_2;

inertia_tensor(:,:,3) = inertia_3;

[h,c,g] = LagrangianDynamics(dh_params, mass, mass_center, inertia_tensor)

上面的程序基于编写的LagrangianDynamics函数求解书中的算例2-1:

算例

代码运行后输出动力学方程中的各个系数矩阵:

h =

[ Ix2 + Iy1 + Iy3 + d2^2*m2 + d2^2*m3 - Ix2*cos(q2)^2 + Ix3*cos(q3)^2 - Iy3*cos(q2)^2 - Iy3*cos(q3)^2 + Iz2*cos(q2)^2 + Iz3*cos(q2)^2 + Ixy3*sin(2*q3) + Ixz2*sin(2*q2) - Ix3*cos(q2)^2*cos(q3)^2 + Iy3*cos(q2)^2*cos(q3)^2 + 2*d2*m2*yc1 + 2*Ixz3*cos(q2)*cos(q3)*sin(q2) - 2*Iyz3*cos(q2)*sin(q2)*sin(q3) + 2*d2*m3*yc1*cos(q3) + 2*d2*m3*xc1*sin(q3) - 2*Ixy3*cos(q2)^2*cos(q3)*sin(q3), Ixy2*sin(q2) - Iyz2*cos(q2) - Ixy3*sin(q2) - Iyz3*cos(q2)*cos(q3) - Ixz3*cos(q2)*sin(q3) + 2*Ixy3*cos(q3)^2*sin(q2) - Ix3*cos(q3)*sin(q2)*sin(q3) + Iy3*cos(q3)*sin(q2)*sin(q3) - d2*m2*zc1*cos(q2) - d2*m3*zc1*cos(q2) + d2*m2*xc1*sin(q2) + d2*m3*xc1*cos(q3)*sin(q2) - d2*m3*yc1*sin(q2)*sin(q3), Iz3*cos(q2) + Ixz3*cos(q3)*sin(q2) - Iyz3*sin(q2)*sin(q3) + d2*m3*yc1*cos(q2)*cos(q3) + d2*m3*xc1*cos(q2)*sin(q3)]

[ Ixy2*sin(q2) - Iyz2*cos(q2) - Ixy3*sin(q2) - Iyz3*cos(q2)*cos(q3) - Ixz3*cos(q2)*sin(q3) + 2*Ixy3*cos(q3)^2*sin(q2) - Ix3*cos(q3)*sin(q2)*sin(q3) + Iy3*cos(q3)*sin(q2)*sin(q3) - d2*m2*zc1*cos(q2) - d2*m3*zc1*cos(q2) + d2*m2*xc1*sin(q2) + d2*m3*xc1*cos(q3)*sin(q2) - d2*m3*yc1*sin(q2)*sin(q3), Ix3/2 + Iy2 + Iy3/2 - (Ix3*cos(2*q3))/2 + (Iy3*cos(2*q3))/2 - Ixy3*sin(2*q3), - Iyz3*cos(q3) - Ixz3*sin(q3)]

[ Iz3*cos(q2) + Ixz3*cos(q3)*sin(q2) - Iyz3*sin(q2)*sin(q3) + d2*m3*yc1*cos(q2)*cos(q3) + d2*m3*xc1*cos(q2)*sin(q3), - Iyz3*cos(q3) - Ixz3*sin(q3), Iz3]

c =

[ dq2*(Iyz3*sin(q3) - Ixz3*cos(q3) - Ixz2 + 2*Ixz2*cos(q2)^2 + (Ix2*sin(2*q2))/2 + (Iy3*sin(2*q2))/2 - (Iz2*sin(2*q2))/2 - (Iz3*sin(2*q2))/2 + 2*Ixz3*cos(q2)^2*cos(q3) - 2*Iyz3*cos(q2)^2*sin(q3) + Ix3*cos(q2)*cos(q3)^2*sin(q2) - Iy3*cos(q2)*cos(q3)^2*sin(q2) + 2*Ixy3*cos(q2)*cos(q3)*sin(q2)*sin(q3)) - dq3*(Ixy3 - Ixy3*cos(q2)^2 - 2*Ixy3*cos(q3)^2 + (Ix3*sin(2*q3))/2 - (Iy3*sin(2*q3))/2 + 2*Ixy3*cos(q2)^2*cos(q3)^2 + Iyz3*cos(q2)*cos(q3)*sin(q2) + Ixz3*cos(q2)*sin(q2)*sin(q3) - d2*m3*xc1*cos(q3) + d2*m3*yc1*sin(q3) - Ix3*cos(q2)^2*cos(q3)*sin(q3) + Iy3*cos(q2)^2*cos(q3)*sin(q3)), dq1*(Iyz3*sin(q3) - Ixz3*cos(q3) - Ixz2 + 2*Ixz2*cos(q2)^2 + (Ix2*sin(2*q2))/2 + (Iy3*sin(2*q2))/2 - (Iz2*sin(2*q2))/2 - (Iz3*sin(2*q2))/2 + 2*Ixz3*cos(q2)^2*cos(q3) - 2*Iyz3*cos(q2)^2*sin(q3) + Ix3*cos(q2)*cos(q3)^2*sin(q2) - Iy3*cos(q2)*cos(q3)^2*sin(q2) + 2*Ixy3*cos(q2)*cos(q3)*sin(q2)*sin(q3)) + dq2*(Ixy2*cos(q2) - Ixy3*cos(q2) + Iyz2*sin(q2) + Iyz3*cos(q3)*sin(q2) + Ixz3*sin(q2)*sin(q3) + 2*Ixy3*cos(q2)*cos(q3)^2 - Ix3*cos(q2)*cos(q3)*sin(q3) + Iy3*cos(q2)*cos(q3)*sin(q3) + d2*m2*xc1*cos(q2) + d2*m2*zc1*sin(q2) + d2*m3*zc1*sin(q2) + d2*m3*xc1*cos(q2)*cos(q3) - d2*m3*yc1*cos(q2)*sin(q3)) - (dq3*sin(q2)*(Iz3 + Ix3*(2*cos(q3)^2 - 1) - Iy3*(2*cos(q3)^2 - 1) + 4*Ixy3*cos(q3)*sin(q3) + 2*d2*m3*yc1*cos(q3) + 2*d2*m3*xc1*sin(q3)))/2, - dq3*(Iyz3*cos(q3)*sin(q2) + Ixz3*sin(q2)*sin(q3) - d2*m3*xc1*cos(q2)*cos(q3) + d2*m3*yc1*cos(q2)*sin(q3)) - dq1*(Ixy3 - Ixy3*cos(q2)^2 - 2*Ixy3*cos(q3)^2 + (Ix3*sin(2*q3))/2 - (Iy3*sin(2*q3))/2 + 2*Ixy3*cos(q2)^2*cos(q3)^2 + Iyz3*cos(q2)*cos(q3)*sin(q2) + Ixz3*cos(q2)*sin(q2)*sin(q3) - d2*m3*xc1*cos(q3) + d2*m3*yc1*sin(q3) - Ix3*cos(q2)^2*cos(q3)*sin(q3) + Iy3*cos(q2)^2*cos(q3)*sin(q3)) - (dq2*sin(q2)*(Iz3 + Ix3*(2*cos(q3)^2 - 1) - Iy3*(2*cos(q3)^2 - 1) + 4*Ixy3*cos(q3)*sin(q3) + 2*d2*m3*yc1*cos(q3) + 2*d2*m3*xc1*sin(q3)))/2]

[ dq3*((Ix3*sin(q2))/2 - (Iy3*sin(q2))/2 + (Iz3*sin(q2))/2 - Ixz3*cos(q2)*cos(q3) + Iyz3*cos(q2)*sin(q3) - Ix3*cos(q3)^2*sin(q2) + Iy3*cos(q3)^2*sin(q2) - 2*Ixy3*cos(q3)*sin(q2)*sin(q3)) - dq1*(Iyz3*sin(q3) - Ixz3*cos(q3) - Ixz2 + 2*Ixz2*cos(q2)^2 + (Ix2*sin(2*q2))/2 + (Iy3*sin(2*q2))/2 - (Iz2*sin(2*q2))/2 - (Iz3*sin(2*q2))/2 + 2*Ixz3*cos(q2)^2*cos(q3) - 2*Iyz3*cos(q2)^2*sin(q3) + Ix3*cos(q2)*cos(q3)^2*sin(q2) - Iy3*cos(q2)*cos(q3)^2*sin(q2) + 2*Ixy3*cos(q2)*cos(q3)*sin(q2)*sin(q3)), -dq3*(Ixy3*cos(2*q3) - (Ix3*sin(2*q3))/2 + (Iy3*sin(2*q3))/2), Ixy3*dq2 - 2*Ixy3*dq2*cos(q3)^2 + (Ix3*dq2*sin(2*q3))/2 - (Iy3*dq2*sin(2*q3))/2 - Ixz3*dq3*cos(q3) + (Ix3*dq1*sin(q2))/2 - (Iy3*dq1*sin(q2))/2 + Iyz3*dq3*sin(q3) + (Iz3*dq1*sin(q2))/2 - Ix3*dq1*cos(q3)^2*sin(q2) + Iy3*dq1*cos(q3)^2*sin(q2) - Ixz3*dq1*cos(q2)*cos(q3) + Iyz3*dq1*cos(q2)*sin(q3) - 2*Ixy3*dq1*cos(q3)*sin(q2)*sin(q3)]

[ dq1*(Ixy3 - Ixy3*cos(q2)^2 - 2*Ixy3*cos(q3)^2 + (Ix3*sin(2*q3))/2 - (Iy3*sin(2*q3))/2 + 2*Ixy3*cos(q2)^2*cos(q3)^2 + Iyz3*cos(q2)*cos(q3)*sin(q2) + Ixz3*cos(q2)*sin(q2)*sin(q3) - d2*m3*xc1*cos(q3) + d2*m3*yc1*sin(q3) - Ix3*cos(q2)^2*cos(q3)*sin(q3) + Iy3*cos(q2)^2*cos(q3)*sin(q3)) - dq2*((Ix3*sin(q2))/2 - (Iy3*sin(q2))/2 + (Iz3*sin(q2))/2 - Ixz3*cos(q2)*cos(q3) + Iyz3*cos(q2)*sin(q3) - Ix3*cos(q3)^2*sin(q2) + Iy3*cos(q3)^2*sin(q2) - 2*Ixy3*cos(q3)*sin(q2)*sin(q3)), dq2*(Ixy3*(2*cos(q3)^2 - 1) - Ix3*cos(q3)*sin(q3) + Iy3*cos(q3)*sin(q3)) - dq1*((Ix3*sin(q2))/2 - (Iy3*sin(q2))/2 + (Iz3*sin(q2))/2 - Ixz3*cos(q2)*cos(q3) + Iyz3*cos(q2)*sin(q3) - Ix3*cos(q3)^2*sin(q2) + Iy3*cos(q3)^2*sin(q2) - 2*Ixy3*cos(q3)*sin(q2)*sin(q3)), 0]

g =

0

-gc*(m2*xc2*cos(q2) + m2*zc2*sin(q2) + m3*zc3*sin(q2) + m3*xc3*cos(q2)*cos(q3) - m3*yc3*cos(q2)*sin(q3))

gc*m3*sin(q2)*(yc3*cos(q3) + xc3*sin(q3))

对比书中给出的结果,经过适当变形,可以看出是一致的,代入到文章开头的运动方程,即可获得该机械臂显式的动力学方程。

1

2

3

4

matlab动力学方程,机器人动力学方程(二):拉格朗日法相关推荐

  1. matlab二次二阶距,用Matlab改进一次二阶矩法程序.doc

    用Matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法) 题目:编制改进一次二阶矩法计算可靠指标的程序,并给出算例,要求提供源程序 选取的算例为:z=g(x,y)=x*y-1140,其中x ...

  2. matlab写的单纯形法二阶段法 大m法,线性规划中的单纯形法与内点法(原理、步骤以及matlab实现)(二)...

    在线性规划中的单纯形法与内点法(原理.步骤以及matlab实现)(一)中,我们讨论了单纯形法的原理和普通单纯形法的应用,本文接着讨论大M法.两阶段法和对偶单纯形法 2.2 Big M Method ( ...

  3. 机器人学基础(3)-动力学分析和力-拉格朗日力学、机器人动力学方程建立、多自由度机器人的动力学方程建立

    机器人学基础(3)-动力学分析和力-拉格朗日力学.机器人动力学方程建立.多自由度机器人的动力学方程建立 本章节主要包括拉格朗日力学.拉格朗日函数及建立求解.多自由度机器人的动力学方程.机器人的静力分析 ...

  4. 机器人动力学方程的四种形式

    来源 | 睿慕课 机器人动力学研究最基础的是建立完整的动力学方程,这其中最关键的是建立多连杆机构的动力学方程.笔者以经典的PUMA560机器人构型为例,阐述四种不同的机器人动力学形式及函数文件.计算环 ...

  5. 机器人动力学方程的性质

    一个nn连杆的机器人的动力学方程含有很多项,特别是全部是转动关节的机械臂,让人看着害怕.但是,机器人动力学方程含有一些有助于开发控制算法的重要性质,其中最重要的是反对称性.无源性.有界性和参数的线性性 ...

  6. matlab插值龙格实验,实验二 拉格朗日插值龙格现象.doc

    实验二 拉格朗日插值龙格现象 汕 头 大 学 实 验 报 告 学院: 工学院 系: 计算机系 专业: 计算机科学与技术 年级: 2010 姓名: 林金正 学号: 2010101032 完成实验时间: ...

  7. matlab 计算变异系数,[转载]用Matlab编的计算结构可靠指标的改进一次二阶矩法程序(验算点法)...

    题目:编制改进一次二阶矩法计算可靠指标的程序,并给出算例,要求提供源程序,算法语言不限. 选取的算例为:z=g(x,y)=x*y-1140,其中x,y服从正态分布,μx=38,Vx=0.1, μy=3 ...

  8. 凸优化学习-(二十九)有约束优化算法——增广拉格朗日法、交替方向乘子法(ADMM)

    凸优化学习 我们前面说过,拉格朗日法在实际中应用不大.为什么呢?因为 α \alpha α的取值很难取,这就导致拉格朗日法鲁棒性很低,收敛很慢,解很不稳定.于是就有了今天的增广拉格朗日法和ADMM. ...

  9. matlab一次二阶矩法正态分布,一次二阶矩法.ppt

    设计验算点法求可靠指标评述 验算点法对极限状态方程中服从正态分布的随机变量计算结果尚可,而非正态分布误差较大. JC法求可靠指标 问题的提出:验算点法对极限状态方程中服从正态分布的随机变量计算结果尚可 ...

最新文章

  1. opencv函数copyto的用法
  2. SAP SD 以PDF格式显示BILLING的输出格式
  3. phpredis5.6在win10下的安装
  4. 一步一步识别验证码(切分和识别)
  5. 51单片机复习:DS1302
  6. kayui进行添加_关于layui 实现点击按钮添加一行(方法渲染创建的table)
  7. oracle 数据库查询多条数据的一列值
  8. 自适应宽度元素单行文本省略用法探究
  9. 实验楼linux指令,Linux操作命令(二)
  10. SimpleDateFormat的parse与format的用法区别
  11. 如何理解“安全的本质是信任问题”
  12. iOS切换根控制器动画!
  13. Siege(开源Web压力测试工具)——多线程编程最佳实例
  14. 独家 | 那些令人细思恐极的AI技术,哪一个戳中你的命门?
  15. 群体Polymorphism information content(PIC)、 Nei diversity index (Nei s) 和 Shannon index (I)计算方法
  16. protect your eyes - 豆绿色
  17. 2022年“研究生科研素养提升”系列公益讲座在线测评【2】
  18. 准备离开:致消散的梦想
  19. python bins分箱,划分数值区间
  20. 黑客新工具,可窃取Gmail、雅虎、Outlook等电子邮件

热门文章

  1. MPB:中科院城环所杨军组-​​水体浮游植物采集与鉴定
  2. QIIME 2教程. 26为QIIME 2开发新插件DevelopingPlugin(2020.11)
  3. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(分组箱体框颜色配置)实战
  4. python使用fpdf2包和pdfrw包在已有的PDF页面上添加新的页
  5. R语言White’s检验实战:检验回归模型中是否存在异方差性(heteroscedasticity)、发生了异常差(heteroscedasticity)问题如何解决
  6. R语言sub函数和gsub函数替换(replace)匹配的字符串实战
  7. 句法分析语料:哈尔滨工业大学SemEval、清华大学树库
  8. R假设检验之k-s检验(KOLMOGOROV AND SMIRNOV TEST)
  9. python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame
  10. 机器学习、超参数、最优超参数、网格搜索、随机搜索、贝叶斯优化、Google Vizier、Adviser