终于结束了自己的毕设设计,这半年的时间一直在和刚体动力学仿真硬磕,关于这方面的网络资源不太多,因此在这里将自己不断摸索学到的方法做一个概括阐述,希望能够为同样饱受困扰的读者提供一些帮助。

文章目录

  • 〇、问题阐述
  • 一、方法 ①:ODE 求解器
  • 二、~~方法 ②:Simulink 初级使用 —— 基础模块~~
  • 三、方法 ③:Simulink 进阶使用 —— S-function 模块
  • 四、方法 ④:Simulink 高阶使用 —— Simscape Multibody 工具箱
  • 五、注意事项

程序开源地址:刚体动力学仿真示例程序

〇、问题阐述

 一般情况下,刚体系统具备这样形式的动力学方程:
D ( q ) q ¨ + C ( q , q ˙ ) q ˙ + G ( q ) = U D(q)\ddot{q}+C(q,\dot{q})\dot{q}+G(q)= U D(q)q¨​+C(q,q˙​)q˙​+G(q)=U
 其中, q q q 为系统广义坐标, D ( q ) D(q) D(q) 为惯性矩阵, C ( q , q ˙ ) C(q,\dot{q}) C(q,q˙​) 为离心力及科里奥利力项, G ( q ) G(q) G(q) 为重力项, U U U 为广义力项。
 为方便阐述,这里以 一阶旋转倒立摆 这一简单多刚体系统为研究对象,探讨该系统的动力学仿真问题。参考文献1,在不考虑系统摩擦等不确定因素干扰情况下,给出各项具体形式为:
D ( q ) = [ J 0 + m 1 ( L 0 2 + l 1 2 sin ⁡ 2 θ 1 ) m 1 l 1 L 0 cos ⁡ θ 1 m 1 l 1 L 0 cos ⁡ θ 1 J 1 + m 1 l 1 2 ] C ( q , q ˙ ) = [ 1 2 m 1 l 1 2 sin ⁡ ( 2 θ 1 ) θ ˙ 1 − m 1 l 1 L 0 sin ⁡ θ 1 θ ˙ 1 + 1 2 m 1 l 1 2 sin ⁡ ( 2 θ 1 ) θ ˙ 0 − 1 2 m 1 l 1 2 sin ⁡ ( 2 θ 1 ) θ ˙ 0 0 ] G ( q ) = [ 0 − m 1 g l 1 sin ⁡ θ 1 ] U ( q ) = [ τ 0 ] \begin{array}{l} D(q)=\left[\begin{array}{ccc} J_{0}+m_{1}\left(L_{0}^{2}+l_{1}^{2} \sin ^{2} \theta_{1}\right) & m_{1} l_{1} L_{0} \cos \theta_{1} \\ m_{1} l_{1} L_{0} \cos \theta_{1} & J_{1}+m_{1} l_{1}^{2} \end{array}\right] \\ C(q, \dot{q})=\left[\begin{array}{c} \frac{1}{2}m_1l_{1}^{2}\sin({2\theta_1})\dot{\theta}_{1} & -m_1l_1L_{0}\sin{\theta_{1}}\dot{\theta}_{1}+\frac{1}{2}m_1l_1^2\sin({2\theta_1})\dot{\theta}_{0} \\ -\frac{1}{2}m_1l_1^2\sin({2\theta_1})\dot{\theta}_{0} & 0 \end{array}\right] \\ G(q)=\left[\begin{array}{cc} 0 \\ -m_{1} g l_{1} \sin \theta_{1} \end{array}\right] \quad \quad U(q)=\left[\begin{array}{c} \tau \\ 0 \end{array}\right] \end{array} D(q)=[J0​+m1​(L02​+l12​sin2θ1​)m1​l1​L0​cosθ1​​m1​l1​L0​cosθ1​J1​+m1​l12​​]C(q,q˙​)=[21​m1​l12​sin(2θ1​)θ˙1​−21​m1​l12​sin(2θ1​)θ˙0​​−m1​l1​L0​sinθ1​θ˙1​+21​m1​l12​sin(2θ1​)θ˙0​0​]G(q)=[0−m1​gl1​sinθ1​​]U(q)=[τ0​]​
 其中,广义坐标 q = [ θ 0 , θ 1 ] T q = [\theta_0,\theta_1]^T q=[θ0​,θ1​]T, J 0 J_0 J0​ 为旋臂绕电机转轴的转动惯量, L 0 L_0 L0​ 为旋臂总长, m 1 m_1 m1​ 为摆杆质量, l 1 l_1 l1​ 为摆臂从其质心到与旋臂转动关节间的长度, J 1 J_1 J1​ 为摆杆绕其质心的转动惯量, θ 0 \theta_0 θ0​ 为旋臂转动角度, θ 1 \theta_1 θ1​ 为摆杆作顺时针运动时与垂直线间的夹角大小, τ \tau τ 为输入力矩。

 本质上该系统的这一仿真问题就是其动力学方程(常微分方程)的求解问题。借由 MATLAB 可以有如下几种解决思路:

  • (1)ODE 求解器

    • 纯文本编程,方便快速开发,十分适用于与其他算法(参数寻优、复杂控制算法)结合使用;
    • 在一些奇异点会出现难以求解的情况,诸如一阶旋转倒立摆系统在直立位置 [ θ 0 , θ 1 ] T = [ 0 ° , 0 ° ] T [\theta_0,\theta_1]^T = [0°,0°]^T [θ0​,θ1​]T=[0°,0°]T;
    • 未找到支持求解过程进行中断的功能,因此针对以系统状态变量作派生的函数诸如系统能量、李雅普诺夫函数等,需要在求解过程完全结束后二次计算,不够优美;
  • (2)Simulink 初级使用 —— 基础模块
    • 利用 Simulink 中诸如矩阵单元、微积分单元、加减乘除单元等基础单元进行动力学方程的表述
    • 工程量很大,不符合快速开发这一重要前提
  • (3)Simulink 进阶使用 —— S-function 模块
    • 文本编程与图形化编程结合,功能实现支持 m语言、C语言等常见编程语言,以模块形式在 Simulink 中被调用;
    • 灵活度不够高,基本上是按照固定模板进行程序编写,对于一些内部参数(诸如物理参数、系统能量等)没办法直接传递到模块外(只能传递选定的系统状态变量);
    • 当结合硬件在环技术(例如 QUARC)时编译工作很麻烦;
  • (4)Simulink 高阶使用 —— Simscape Multibody 工具箱
    • 三维仿真,完成实体、关节及变换坐标系之后,系统能自行进行动力学求解,省去了动力学方程的直接表述工作;
    • 基于物理模型的动力学建模,为与物理系统保持尽量一致的运动特性,往往需要精确的三维模型参数(长度、质量、惯性系数等);
    • 没有碰撞箱
    • 手动装配比较麻烦,特别是各个坐标系之间的转换很繁琐;安装相应插件后支持从SolidWorks 导出的装配体模型直接导入Simscape Multibody中,并自动生成相应的模型文件,但是生成算法不够智能,对于复杂模型会存在一些怪异的装配方式。

一、方法 ①:ODE 求解器

 ODE 求解器实际是 MATLAB 提供的一系列常微分方程(Ordinary Differential Equation)的求解函数集合,根据不同求解场景,有 ode45、ode23、ode113等8种基本求解器(详见 选择 ODE 求解器 – MathWorks 中国)。对于多刚体系统,一般选择以基于显式 Runge-Kutta (4,5) 公式的 ode45 求解器即可。该求解器的基本函数形式及各参数解释为:

[t,x] = ode45(odefun,tspan,x0,options)

odefun:待积分函数的句柄。亦即描述微分方程 x ˙ = f ( t , x ) \dot{x} = f(t,x) x˙=f(t,x) 的函数的句柄,函数基本形式为 dx = odefun(t,x),其中 odefun 亦即 f f f;
tspan:积分区间。亦即待求解问题的总时间跨度;
y0:变量初始状态。亦即待求解状态变量的初始值;
options:一些额外的求解条件构成的结构体,包含求解精度、求解方法等。

 对于一阶旋转倒立摆系统,可选取系统状态变量 x = [ θ 0 , θ ˙ 0 , θ 1 , θ ˙ 1 ] T x = [\theta_0,\dot{\theta}_0,\theta_1,\dot{\theta}_1]^T x=[θ0​,θ˙0​,θ1​,θ˙1​]T,而 odefun要求返回值 x ˙ = [ θ ˙ 0 , θ ¨ 0 , θ ˙ 1 , θ ¨ 1 ] T \dot{x} =[\dot{\theta}_0,\ddot{\theta}_0,\dot{\theta}_1,\ddot{\theta}_1]^T x˙=[θ˙0​,θ¨0​,θ˙1​,θ¨1​]T,必须借助系统动力学方程作为转换手段,亦即 q ¨ = [ θ ¨ 0 , θ ¨ 1 ] T = D − 1 ( U − C ⋅ q ˙ − G ) \ddot{q}=[\ddot{\theta}_0,\ddot{\theta}_1]^T = D^{-1}(U-C·\dot{q}-G) q¨​=[θ¨0​,θ¨1​]T=D−1(U−C⋅q˙​−G),因此整个求解流程可总结伪代码为:

function main:① 定义初始条件(包含求解时长,系统初始状态,额外求解条件等)② [t,x] = ode45(odefun,tspan,x0,options);
endfunction dx = odefun(t,x):① 物理参数初始化(质量、长度、惯性系数等)② 各系数矩阵定义(D、C、G、U)③ dq = [x(2);x(4)]④ ddq = inv(D)*(U-C*dq-G) % 动力学方程⑤ dx = [dq(1);ddq(1);dq(2);ddq(2)]
end

 针对一阶旋转倒立摆系统在摆杆处于水平位置 [ θ 0 , θ ˙ 0 , θ 1 , θ ˙ 1 ] T = [ 0 ° , 0 , 90 ° , 0 ] [\theta_0,\dot{\theta}_0,\theta_1,\dot{\theta}_1]^T=[0°,0,90°,0] [θ0​,θ˙0​,θ1​,θ˙1​]T=[0°,0,90°,0]的零输入响应过程,仿照上述伪代码可撰写核心程序如下:

%% ode 初始化
T_stop=10;% 仿真时长 s
T_sample = 0.002;% 采样周期 s
x0 = [0;0;1/2*pi;0];% 初始状态 [q0;dq0;q1;dq1]; 期望状态 x_f = [0;0;0;0];
options=odeset('RelTol',1.0e-6,'AbsTol',1.0e-6,'BDF','on');%设置仿真精度,Backward Differentiation Formulas (BDFs) instead of the default Numerical Differentiation Formulas (NDFs).%% ode 求解
[t,x]=ode45(@(t,x) RIP_Sysm(t,x),[0:T_sample:T_stop],x0,options); % ode45解常微分方程%% 绘图
figure(1)
plot(t,x(:,1));title('时间-旋臂角度');
xlabel('t[s]');ylabel('\theta_0[rad]')
figure(2)
plot(t,x(:,3));title('时间-摆杆角度');
xlabel('t[s]');ylabel('\theta_1[rad]')%% 待积分函数
function dx = RIP_Sysm(t,x) %% Constants L_0 = 0.2159; %Total lenth of the arml_1 = 0.1556; % Distance from pivot to center of pendulum's massm_1 = 0.1270; % Mass of pendulumJ_0 = 0.0020; % Inertia of the arm about the rotation axisJ_1 = 0.0012; % Pendulum moment of intertia about center of massg = 9.80;     % Acc of the gravity%% D(q) 正定惯性矩阵D_11 = J_0 + m_1*(L_0^2+l_1^2*sin(x(3))^2);  D_12 = m_1*l_1*L_0*cos(x(3));D_21 = D_12;D_22 = J_1 + m_1*l_1^2;D=[D_11,D_12;D_21,D_22];D_inv =inv(D);% C(q,dq) 离心力和哥氏力C_11 = 1/2*m_1*l_1^2*sin(2*x(3))*x(4);C_12 = -m_1*l_1*L_0*sin(x(3))*x(4)+1/2*m_1*l_1^2*sin(2*x(3))*x(2);C_21 = -1/2*m_1*l_1^2*sin(2*x(3))*x(2);C_22 = 0;C = [C_11,C_12;C_21,C_22];% G(q) 重力G = [0; -m_1*g*l_1*sin(x(3))];U = [0;0];%零输入响应dq=[x(2);x(4)];    % 角度 x1的导数,x2的导数ddq= D_inv*(U - C*dq - G );  % 动力学方程反解角加速度:D(q)*ddq + C*dq + G = Udx = [dq(1);ddq(1);dq(2);ddq(2)];end

 旋臂及摆杆运动曲线结果如下,由于未引入摩擦阻尼等因素,因此系统作近似正弦运动(不完全是,摆杆一部分势能转换为旋臂动能)。

二、方法 ②:Simulink 初级使用 —— 基础模块

三、方法 ③:Simulink 进阶使用 —— S-function 模块

 S-Function 是 Simulink 中一个很好的连接图形化及文本编程的模块工具,它能够按仿真时间序列,依赖各项回调函数完成系统初始化、系统状态求导及系统状态输出等工作2 ,整个过程由该模块自迭代完成。
 具体说来,为满足描述刚体动力学方程的需求,S-Function 需要定义:

主入口函数:用于根据仿真时间序列进行 S-Function 的状态分流(类似于状态机)。形如 rip_plant(t,x,u,flag),其中 t 为仿真时间,x 为状态变量,u 为控制输入,flag 即为仿真环境自动提供的当前运行状态标志;
初始化函数:用于对被描述系统的各变量进行初始化表述,包含连续(离散)状态变量个数、输入量个数、输出量个数、采样方式(连续 or 离散)及周期(定周期 or 变周期)等;
状态求导函数:用于完成系统状态变量的求导工作,即执行 q ¨ = [ θ ¨ 0 , θ ¨ 1 ] T = D − 1 ( U − C ⋅ q ˙ − G ) \ddot{q}=[\ddot{\theta}_0,\ddot{\theta}_1]^T = D^{-1}(U-C·\dot{q}-G) q¨​=[θ¨0​,θ¨1​]T=D−1(U−C⋅q˙​−G) 算式;
输出函数:用于输出系统状态变量。

 特别注意,针对一阶旋转倒立摆系统,为与 方法 ①:ODE 求解器 结果保持一致,需要设置求解器为定步长且补偿为 0.002s(变步长时,有时步长过大容易产生漂移)。

 运行仿真模型,其结果与方法 ① 的结果一致:

四、方法 ④:Simulink 高阶使用 —— Simscape Multibody 工具箱

  Simscape Multibody 提供了适用于诸如机器人、汽车悬架、建筑设备等的 3D 机械系统多体仿真环境。借助表示刚体、关节、约束、力元件和传感器的模块,可以实现对多体系统的三维建模。Simscape Multibody 会根据使用者所创建的机械模型自动建立起整个机械系统的运动方程并进行求解。对于一些复杂的机械系统,借助一些插件工具可将完整的 CAD 装配件(包括质量、惯性、关节、约束和 3D 几何结构)导入到仿真模型中·,极大地简化了复杂模型的装配工作。

  • 工具箱直接在 MATLAB 视窗主页菜单栏的“附加功能”搜索安装即可
  • 关于将 SolidWorks 的装配件直接导入到 Simscape Multibody 的方法可参考:
    Matlab模型可视化仿真:SimMechanics Link的安装与使用-知乎-作者:llllq

  对于一阶旋转倒立摆系统,由于整个系统机械结构比较简单,因此直接利用该工具箱中的 Solid 模块、Joint 模块以及 Tuansfiorm 模块等简单模块作手动装配即可表述其三维结构。

  通过运行该仿真模型,可以在 MATLAB 的 Mechanics Explorer 视窗观察到系统作自由响应的三维动画,关节角度及角速度可由示波器 Scope 进行观察:

五、注意事项

  • (1)关于 ode45 如何设置定步长问题(求解非刚性微分方程 - 中阶方法 - MathWorks)
  • 答:一般来说 ode45 函数的变步长调用方式为[t,x] = ode45(odefun,tspan = [0,Tf],x0,options),注意到此时 tspan = [0,Ts],返回值 [t,x]为变步长求解时刻及对应时刻的系统状态变量组成的集合;从原理上来说,ode45 本身求解过程是变步长这一事实不能更改,但是该函数提供了一种插值的方式以使得使用者可以获取到指定时刻的系统状态,此时该函数的调用方式为[t,x] = ode45(odefun,tspan = [0:Ts:Tf],x0,options),注意到此时 tspan = [0:Ts:Tf]Ts即为采样周期。
  • (2)程序开源地址:

刚体动力学仿真示例程序


  1. Fantoni I, Lozano R. Non-linear Control for Underactuated Mechanical Systems[M]. Springer, London:2002.42-47. ↩︎

  2. 刘金琨. 机器人控制系统的设计与 MATLAB 仿真[M]. 清华大学出版社, 2008: 4-4. ↩︎

从刚体动力学方程到 MATLAB 多种方法仿真验证相关推荐

  1. matlab 天线设计 泰勒加权_微带天线设计尺寸MATLAB编程及其仿真验证

    龙源期刊网 http://www.qikan.com.cn 微带天线设计尺寸 MATLAB 编程及其仿真 验证 作者:杨小敏 母玉泽 严月 郭小康 马波 张栋 莫骄弟 来源:<中国科技博览> ...

  2. MATLAB多种方法计算圆周率(pai)

    目录 一.利用无穷级数展开式求π的近似值 (1)方法一 (2)方法二:优化 二.利用定积分的近似值求π的近似值 求定积分的三种方法:矩形法,梯形法,simpson法 三.利用蒙特卡洛法求π的近似值 一 ...

  3. matlab怎么求三次微分,matlab课设三阶微分方程多种方法求解.doc

    matlab课设三阶微分方程多种方法求解 目录 一.课程设计题目及意义 -------- 1 页 二.课程设计任务及要求 --------2 页 三.课程设计详细过程及结果 --------3至10页 ...

  4. Matlab应变片仿真,一种基于Matlab/Adams联合仿真的真实路谱再现系统和方法与流程...

    本发明属于汽车系统动力学仿真技术领域,特别是一种基于Matlab/Adams联合仿真的真实路谱再现系统和方法. 背景技术: 汽车系统动力学仿真技术是汽车设计制造中一项不可或缺的技术,尤其是在汽车操纵稳 ...

  5. ip iq 谐波检测matlab仿真,基于Matlab的低压电力系统谐波检测方法仿真研究

    基于Matlab的低压电力系统谐波检测方法仿真研究 1 前言 随着科学技术的发展,随着工业生产水平和人民生活水平的提高,非线性用电设备在电网中大量投运,造成了电网的谐波分量占的比重越来越大.它不仅增加 ...

  6. c语言电流检测模块程序,C语言和MATLAB程序设计在电力谐波电流检测方法仿真中的应用...

    前言第1章 绪论1.1 计算机仿真的基本概念1.2 C语言简介1.3 MATLAB概述1.4 电力谐波电流检测方法的研究现状1.4.1 有源电力滤波器的丁作原理1.4.2 电力谐波电流检测方法的研究现 ...

  7. Matlab/Admas联合仿真提示 输入位移曲线 输出速度曲线为0的解决方法

    Matlab/Admas联合仿真 输入位移时输出速度为0的解决方法 解决方法:将Adams Solver type(求解器类型)由C++改为Fortran就可以解决. 建立一个小球,添加一个与地面连接 ...

  8. matlab绘制等间距同心圆,CDR绘制等距离同心圆的多种方法

    原标题:CDR绘制等距离同心圆的多种方法 是一款功能强大的矢量图形制作与排版软件,对于矢量图形的绘制自然不在话下.今天,小编分享如何用CDR做出等距离的同心圆,希望对大家有所帮助. 方法一:调和图形 ...

  9. MATLAB 数据分析方法(第2版)1.2 MATLAB基础概述

    1.2 MATLAB基础概述 1.2.1 MATLAB的影响 MATLAB源于Matrix Laboratory,即矩阵实验室,是由美国Mathworks公司发布的主要面对科学计算.数据可视化.系统仿 ...

最新文章

  1. python内置模块re_Python常用内建模块-re模块(正则表达式)
  2. 让ASP程序在服务器中自动运行
  3. (67)多核同步,lock 总线锁 ,自己实现临界区
  4. 机器学习---评价指标:Accuracy、Precision、Recall、F-Measure
  5. 用VIPER构建iOS应用
  6. 设计模式的功力长了!
  7. 在JS/jQuery中,怎么触发input的keypress/keydown/keyup事件?
  8. 理解Visual Studio 解决方案文件格式(.sln)
  9. 3S基础知识:MapInfo MapX中如何保存专题地图
  10. PuTTY/PuttyGen创建密钥及利用密钥登录服务器
  11. 别总写代码,这120多个网站比涨工资都重要
  12. 网页设计下拉菜单栏css代码,HTML+CSS实现导航条下拉菜单的示例代码
  13. 【测试】软件测试报告应该包含哪些内容
  14. 功能强大的安卓刷机软件-刷机精灵提供下载
  15. 集合论中关系矩阵的布尔乘法运算与优化
  16. [FAQ20527] 如何关闭OTG功能
  17. python中自定义标识符_python标识符
  18. destoon php 循环语句,destoon二次开发模板及调用语法汇总_PHP
  19. Python AngryBirds完整代码+讲解
  20. (MATLAB)错误使用 xlsread (line 260) 无法激活 Excel 工作表

热门文章

  1. Java匿名内部类的用法(简单教学)
  2. html div peidui,AirPods怎么删除配对过的设备 airpods可以和电脑连接的。
  3. 愚公移山和加特林打僵尸(递归)
  4. 使用css实现渐变色背景
  5. 【智能算法】基于双隐含层BP神经网络的预测
  6. 《IOG:Interactive Object Segmentation with Inside-Outside Guidance》论文笔记
  7. java 累加器_Spark累加器(Accumulator)
  8. opencv学习【绘图】多边形polylinesfillPoly
  9. Tomcat高级配置(应用场景总结及示例)
  10. 实战:战狼2票房数据分析——(1)数据获取及解析