首页/文章/ 详情

Ansys Motion 与 Simulink 联合仿真:从零打通一阶倒立摆PID和LQR控制流程

6月前浏览1742

写在前面....

常言道,万丈高楼平地起。在探索“机械多体动力学+控制系统”联合仿真的道路上,一阶倒立摆无疑是那块最稳的基石。无论是时下火热的平衡车、轮足机器人,还是高度复杂的四足狗与人形机器人,其底层的平衡稳定逻辑几乎都源于此。因此,在挑战复杂机构之前,倒立摆是每一位开发者绕不开的“练手神作”。

去年年中,我曾分享过 Ansys Motion 与 Simulink 的接口配置流程,解决了“如何连通”的问题。而今天,我们更进一步,打通了从高保真物理建模控制算法闭环的全流程。虽然我并非控制专业出身,很多算法也是现学现卖,但通过这次倒立摆案例的成功实践,我确信这条技术路径是精准且稳健的。

对于长期使用 Ansys 软件的朋友们来说,这无疑是一个积极的信号:Motion 与 Simulink 的深度协同不再是“黑盒”。如果大家对这类“机械+控制”的数字孪生案例感兴趣,后续我会整理更多关于轮足及四足机器人的进阶实战。

值此佳节,预祝大家新年快乐,马年大吉,技术精进!


  1. 打破理想与现实的墙——为何选择 Ansys Motion + Simulink 联合仿真

在控制算法的开发过程中,工程师常被戏称为“活在理想国的人”。

传统的控制仿真往往高度依赖于 MATLAB/Simulink 的纯数学模型。然而,当我们将各类仿生机器狗或机器人系统简化为几行理想的微分方程时,很多直接影响稳定性的物理细节被无情地抹去了:

  • 非线性摩擦:轴承在不同转速下的非线性阻力特性。

  • 多体约束与柔性:摆杆在高频振动下的微小形变对传感器的干扰。

  • 数值稳定性:在奇异点附近的控制力矩突变。

Ansys Motion 作为新一代多体动力学(MBD)工具,其核心价值在于提供了一个高保真物理环境。通过 FMU (Functional Mock-up Unit) 接口实现的联合仿真(Co-Simulation),让控制算法(Simulink)与真实的物理实体(Motion)实时握手。

核心意义:联合仿真不仅仅是为了在电脑里看动画,而是为了在实机调试前,让算法经历一次“最接近现实”的数字孪生测试,从而保护昂贵的硬件免受控制失效带来的损毁。


2.从倒立摆到人形机器人:控制理论的“原点”

如果说 Hello World 是程序员的起点,那么一阶倒立摆(Inverted Pendulum)就是控制工程师的“耶路撒冷”。

一阶倒立摆系统不仅是一个典型的非线性、强耦合、易发散系统,它更深刻地揭示了现代机器人学中两个最核心的问题:欠驱动(Underactuated)不稳定性(Unstable)

  1.  为什么它是所有高级机器人的基础?


    • 平衡类机器人:两轮平衡车、两轮机器狗本质上都是倒立摆的变体。通过调节车轮力矩,在动态中寻求静态平衡。

    • 人形机器人:人类的行走可以简化为“线性倒立摆模型”(LIPM)。通过控制质心(CoM)围绕支撑点(SoP)的摆动,才能实现优雅的步态。

    • 航天与工业:火箭垂直起降的推力矢量控制、起重机的防晃控制,其底层数学逻辑都能回溯到倒立摆的稳定控制中。

  2. 控制算法的对决:PID 的本能 vs LQR 的灵魂

    在本次仿真中,我分别实现了经典的 PID 与现代控制理论中的 LQR。这两种方法在处理同一个物理模型时,展现出了完全不同的性格:

  • PID(比例-积分-微分)

    • 特点:无需精确模型,结构简单。

    • 实战感悟:在倒立摆这种强耦合系统中,PID 通常需要多环嵌套(位置环+角度环)。调节时往往会陷入“拆东墙补西墙”的困境——为了让摆杆不抖,小车可能跑得太远;为了让小车停准,摆杆又会失去平衡。

  • LQR(线性二次调节器)

    • 特点:基于状态空间方程的全局最优控制。

    • 实战感悟:它将系统状态 X = [x, x_dot, theta,theta_dot]^T 视为一个整体。通过调节权重矩阵 Q 和 R,LQR 能自动解耦各变量,计算出理论最优增益 K。在处理轮足机器,平衡车,或者人形机器人这样的大惯性系统时,LQR 展现出了极佳的预判性,让机器狗的动作呈现出一种“丝滑的机械感”。

特性PID 控制LQR 控制
控制维度单变量反馈全状态反馈
耦合处理弱(环路间互相干扰)强(全局自动解耦)
参数调节凭经验调PID调权重矩阵 Q/R(数学意义明确)
动态表现易在重载下过冲针对大惯性负载表现极稳


下面是倒立摆在受到外部冲击力时,通过PID控制倾角和位移项使倒立摆恢复平衡的位移/速度/角度/角速度曲线图。

下面是倒立摆在受到外部冲击力时,通过LQR状态向量控制,使倒立摆快速恢复平衡的位移/速度/角度/角速度曲线图。

很明显LQR的控制更加稳定和迅速,实际上只要解析得到系统的A,B状态方程,使用LQR会更加的方便;


3.Ansys Motion+simulink具体联合仿真操作流程

之前公 众号他有发过motion和simulink联合仿真的视频教程,当时是使用独立版的motion pre进行动力学建模,和导出FMU文件,本次我们将使用大家使用频率更高的Workbench 版motion前处理来进行动力学建模和导出FMU文件;

总体流程如下, 大家也可以参考之前推文

Ansys Motion联合仿真设置教程(Simulink/Twin builder)-视频教程



1)Workbench motion倒立摆动力学建模

模型简化为2个部件,一个是cart移动的车体,另一个是和车体铰接的摆杆


倒立摆连接关系设置:

车体cart沿地面沿X轴移动(定义平移副)

车体cart与摆杆pendulum铰接(定义旋转副)


输入输出信号定义:

S-input:

force(小车水平驱动力)

S-output:

X(小车位移)

X_dot(小车速度)

theta(摆杆倾角)

theta_dot(摆杆旋转角速度)

在工具栏motion-cosimulation-分别添加S-input和S-output,为了便于识别,命名输入输出对应名称和单位;


s-input

s-output四个对象:


X(小车位移):

X_dot(小车速度):

theta(摆杆倾角)


theta_dot(摆杆旋转角速度)

在输入输出信号里面定义时候还需关联对应的函数表达式,所以还需要定义5个函数表达式如下:

force函数表达式用于输入信号,函数表达式这里用SINPUT(p1),这里p1参
数关联之前定义的input_force输入信号,
X位移测量函数DX,用于测量小车实际位移数据,类似传感器检测,后续用于在simulink里面控制输出使用。这里注意函数表达式后面有除1000,用于单位转换将mm转换为m,因为simulink里面长度单位使用的是m,而motion这里单位是mm。

同样,用VX(p1,p2)测量小车移动速度,依然注意单位转换:

用AZ(p1,p2)测量摆杆的倾角,这里单位是弧度,和simulink相同,可以不用转换;

用WZ(p1,p2)测量摆杆的倾角的角速度,这里单位是弧度/秒,和simulink相同,可以不用转换;

定义好输入输出信号和函数表达式之后,还有一点别漏了, 输出信号是测量系统的相关变量,而输入的force这里还需要在motion这里定义给小车,所以我们还需要添加一个Joint Load ,如下我们添加要给Joint Load Properties选择移动副,选择force函数表达式:


接下来别忘了,添加重力加速度,选好重力方向:

最后,在motion工具栏,插入Co-Simulator模块,选定s-input和s-output对象,然后导出用于和simulink联合仿真的FMU文件;interface time step设为0.001s,用于和simulink数据交换的采样时间步长;其他默认设置


下面依次定义singal input和singal output


导出FMU文件,右击co-simulator-export files;选择保存目录文件位置;


会生成mbd.m文件,这是在simulink里面使用的包含了motion动力学系统信息的文件,同时也生成motion求解器文件,motion post后处理相关文件,后面再simulink里面完整求解后,可以在motion post里面打开这个.dfr文件查看仿真动画。


到这里,我们完成了在ansys motion里面的动力学模型搭建,定义用于控制的输入输出信号,导出了FMU文件,下一步我们将在simulink里面搭建控制流程,将FMU文件关联起来。


4.simulink控制流程设置

在matlab中加载上一步导出的mbd.m文件,点击运行加载motion 动力学控制模型,下面命令行窗口显示相关信息,提示成功加载。

在命令行输入:mbdlib,自动打开simulink模块, 并自动加载motion FMU模块。

simulink中的motino mbd模块,

打开mbd block,显示详细连接流程,这里输出端口的顺序和我们在co-simulator导出输出信号时顺序对应X,X_dot,theta,theta_dot。

下面就是pid和lqr流程搭建了;

a) PID控制流程搭建

Simulink、基础操作大家可自行学习,这里贴出我搭建好的pid控制流程图,采用双闭环pid控制,内环用摆杆倾角反馈进行pid控制,保持摆杆稳定不倾倒,外环可以用位移反馈将倒立摆稳定在所设置的位置,下面流程图进进行了倾角和位移的控制,如何想让倒立摆以指定的速度运动,可以在加一个速度反馈进行控制。

这里需要提醒下,关于力与位移的方向,这个和我们在motion定义运动副时候的方向如果,方向相反,可以加一个-1的gain增益。如果你想用角度制进行设置, 可以在theata后面加一个弧度转角度的gain增益。

下面是在脉冲干扰力作用下,倒立摆稳定的动画,

下面是设置一个稳定后的目标位置的控制后的效果。

a) LQR控制流程搭建

在进行LQR控制流程搭建之前,我们需要将求出倒立摆系统的AB状态矩阵,和倒立摆的通过LQR函数,通过调节权重矩阵Q和R,求出最有的增益矩阵,用于控制倒立摆系统的稳定。由于motion导出的倒立摆FMU系统是一个强非线性系统,所以我们这里选择采用解析法来求系统的A,B状况空间矩阵,这部分的公式是很成熟的,网上也有很多的教程和介绍,这里我直接贴出我编写的LQR控制器m文件,供大家参考,如果搭建自己搭建倒立摆模型, 只需要修改里面的,摆杆,小车质量,摆杆重心到旋转副的距离也就是力臂等参数,即可求解,剩下的就是调整Q和R参数,来得到倒立摆比较合适的K增益矩阵。

这里求解到K增益之后,我们开始在simulink里面搭建LAR的控制流程,如下:

这里,gain增益这里填K变量,直接调用上一步求得的K矩阵,类型下面选择,矩阵(k*u)
下面是通过LQR控制算法得到的倒立摆在外部激励干扰下达到平衡的效果:

如果我们想倒立摆停到指定的位置并平衡,直接在目标参考向量那里填写相应的值即可;


    如果想要倒立摆以指定的速度运动,需要设置速度目标值,位移这里采用ramp模块设置一个和速度相同的斜率。


    4.进阶篇:起摆控制 (Swing-up) —— 让倒立摆“起死回生”

    在上面内容,我们讨论了如何让倒立摆在竖直位置保持平衡。但在实际工程(如轮足机器人摔倒后站立)中,我们首先要面对的是如何将摆杆从能量最低点(自然下垂)“甩”到能量最高点(竖直向上)。

    1). 为什么 LQR 无法直接起摆?

    LQR 是一种基于线性化模型的最优控制,它只在平衡点附近的“小邻域”内有效。当摆杆下垂时(误差接近 180°),线性化模型完全失效。因此,我们需要一套非线性控制策略——能量成形控制 (Energy Shaping Control)

    2). 起摆核心算法:能量成形法

    起摆的本质是给系统注入能量。我们定义系统的总能量 $E$ 为摆杆的动能与势能之和:

    • 目标状态:当摆杆恰好到达竖直点且速度为 0 时,目标能量 $E_{up} = mgl$

    • 控制律:我们通过控制小车的加速度 $a$ 来增加能量。一个经典的控制律是:

    这个公式的直观解释是:根据当前能量与目标能量的差值,配合摆杆的角度和速度方向,在合适的时机推拉小车,像荡秋千一样通过往复运动积累能量。

    3). 关键环节:控制权的“无缝交接” (Switching Logic)

    当摆杆通过起摆算法进入竖直点附近的“控制窗”时,我们需要关闭起摆算法,瞬间激活 LQR 进行平衡。

    • 切换条件:通常设定一个阈值(例如 θ < 15°且 且θ_dot较小)

    • 实现方式在 Simulink 中使用 Switch 模块或 Stateflow

    4. Ansys Motion + Simulink 实现细节

    simulink里面搭建起摆+LQR控制流程,在之前LQR控制基础上,增加一个起摆的MATLAB FUNCTION

    SWING UP起摆部分的代码如下,供参考。

    下面是倒立摆的起摆+LQR控制的动画,实现倒立摆在自然下垂状态,到起摆,到竖直向上稳定的过程。


    以上是本次分析的全部内容。
    创作不易,编写这些内容还是蛮花时间的,欢迎大家点赞和转发。


    来源:Ansys Motion学习营
    ACTTwin BuilderWorkbench振动非线性航天MATLABUM多体动力学理论机器人仿生数字孪生控制
    著作权归作者所有,欢迎分享,未经许可,不得转载
    首次发布时间:2026-02-26
    最近编辑:6月前
    kenny
    研究生 详情请关注"Ansys Motion学习营"
    获赞 51粉丝 103文章 49课程 0
    点赞
    收藏
    作者推荐

    Ansys Motion2025 R2新功能介绍

    AnsysMotion2025R2新功能如下,供大家参考,大家看原版,我这里就不翻译了;有两个大家比较关注的新功能在这里提一下:1.新版增加了cable单元preload功能,大家可以通过设置cable自由长度和预载荷方式来添加预紧力。2.wb版motionR2开始,可以通过导出HDF5格式的文件,实现motion与ncode联合仿真。来源:AnsysMotion学习营

    未登录
    还没有评论
    课程
    培训
    服务
    行家
    VIP会员 学习计划 福利任务
    下载APP
    联系我们
    帮助与反馈