☰
Adams与Matlab/Simulink联合仿真入门:从弹簧质量阻尼系统到工程实践
2026/10/3 9:41:33 网站建设 项目流程

1. 为什么要做Adams与Matlab联合仿真

1.1 单一仿真工具的局限

搞机械系统仿真的人迟早会碰到同一个问题:Adams擅长多体动力学,Matlab/Simulink擅长控制系统设计,但很多真实工程问题恰恰横跨这两个领域。比如你要设计一个主动悬架,机械部分有杆件、弹簧、阻尼器、轮胎,控制部分有传感器、PID控制器、执行器。如果你只用Adams,控制器只能用简单的函数表达式代替,精度和灵活性都受限;如果你只用Matlab,机械部分就必须简化成微分方程或传递函数,但复杂的几何约束、接触碰撞、大位移运动根本没法用解析式准确描述。

联合仿真就是把这个矛盾拆掉的做法:Adams负责算"机械系统怎么动",Simulink负责算"控制信号怎么给",两边在每一个仿真步长交换数据,各干各最擅长的事。

我第一次接触联合仿真是在做一个并联机器人平台的控制验证。当时先在Adams里搭了完整的六自由度平台模型,关节、球铰、液压缸全都有,然后在Simulink里写了运动学反解和PID闭环。如果不用联合仿真,我只能在Adams里硬写控制函数,调试一次要等很久,而且逻辑复杂到根本没法维护。换成联合仿真之后,控制算法改起来方便多了,很多参数直接在Matlab里调,图形化界面比看一大堆表达式直观得多。

1.2 什么人需要学这个

如果你属于下面任何一类,联合仿真就是你需要掌握的东西:

  • 做机械结构设计,但产品里带电机、液压系统或主动控制,比如工业机械臂、车辆悬架、航天机构
  • 做控制算法开发,但被控对象不是简单的电机模型,而是有复杂多体动力学特性的机械系统
  • 做研究生课题或工程项目,需要"机械+控制"联合验证,写论文或报告时需要一个可信的仿真闭环

这个入门教程会用一个最简单的弹簧-质量-阻尼单自由度系统做例子。别看它简单,联合仿真的完整流程——建模、定义接口、导出、联调、排错——每一步都会走到,这套方法和流程可以直接迁移到任何复杂的工程模型上。搭完这个例子,你就知道Adams和Matlab之间到底是怎么通信的,遇到问题该从哪儿排查。

2. 环境准备:先把工具链跑通

2.1 软件版本与接口方式

做联合仿真,版本匹配是第一道坎,90%的初学问题都出在这里。

Adams和Matlab/Simulink之间的接口不是随便装的,Adams通过一个叫"Adams Controls"的模块导出模型,生成一个可以在Simulink里直接调用的S-Function或Adams Plant模块。这个接口对Matlab版本有明确要求,不同版本的Adams官方支持列表不同。

以我常用的版本组合为例:Adams 2019搭配Matlab R2019b、R2020a都没问题;Adams 2021搭配Matlab R2020b到R2022a也基本稳定。但如果你用Adams 2016搭配Matlab R2023b,大概率会出现编译错误或接口加载失败。

注意:安装完Adams和Matlab之后,一定要检查环境变量。Adams安装程序通常会自动配置ADAMS_CONTROLS相关的环境变量,但有时候杀毒软件或自定义安装路径会把这个配置搞丢。最直接的检查方式是:在Adams的命令窗口输入adams2021启动时,看控制台有没有ADAMS Controls module loaded类似的提示。

这里补充一个很关键的操作:Adams和Matlab通信时,中间会通过一个MEX文件(Matlab可执行文件)和动态链接库来做数据交换。Windows系统下,这个链接库是adams_plant.dll;Linux系统下是libadams_plant.so。如果这个文件没被Matlab找到,联合仿真一定会报Failed to load Adams DLL之类的错误。

2.2 环境变量与路径配置

先说最简单的检查方法,在Matlab里运行:

>> !echo %PATH%

看输出路径里有没有包含Adams的win64或common目录。如果没有,就手动把下面这样的路径加进去(具体路径根据你的安装位置调整):

C:\MSC.Software\Adams\2021\win64 C:\MSC.Software\Adams\2021\common

另外还要检查一个系统环境变量:ADAMS_CONTROLS,它应该指向Adams安装目录下的controls或mechatronics文件夹。这个变量一般安装时自动设置,如果缺失,需要在系统属性里手动新建。

我说一个踩过的坑:之前在一台新电脑上装Adams 2020和Matlab R2021a,所有路径都配好了,但联合仿真时总是提示Unable to locate ADAMS。查了半天发现是Matlab的当前工作目录不对——Adams导出的模型文件、adams_plant相关的mex文件必须要放在Matlab的当前工作目录或者加到路径里。你把Adams安装目录里的matlab子文件夹用addpath加进去,问题就解决了。

还有一点要特别提醒:Matlab的位数必须和Adams一致。现在主流都是64位,但如果你的机器上装了32位的老版本Adams,就必须配32位Matlab。这个不匹配的话,接口一定是加载不起来的。

3. 在Adams里搭建你的第一个动力学模型

3.1 弹簧-质量-阻尼系统的建模过程

联合仿真的核心对象是一个"被控的机械系统"。我们从最经典的弹簧-质量-阻尼单自由度系统开始。

打开Adams View,新建一个模型,单位选择MKS(米-千克-秒),重力可以关掉,因为单自由度系统在水平方向运动时不需要考虑重力,减少不必要的干扰项。

建模步骤:

  1. 创建两个Part:一个Ground(地面),一个Mass块(质量块)。在Adams里,Ground是默认存在的,所以只需要创建一个Part。
  2. 给Mass块定义质量属性。右击Part -> Modify -> Mass Properties,输入质量m = 1.0 kg。
  3. 创建平动副(Translational Joint),连接Mass和Ground,限制质量块只能沿X轴平移。
  4. 创建弹簧(Spring-Damper),在Force库中选择Spring-Damper,连接Ground上的固定点和Mass上的参考点。刚度设为k = 100 N/m,阻尼设为c = 5 N·s/m。
  5. 创建力(Force),作为外部激励或控制输入。在Force库中选择Single Component Force,作用在Mass上,方向沿X轴。

这里有一个建模的细节要注意:平动副的方向一定要和弹簧作用线一致。很多新手在Adams里建模时,平动副默认方向是沿Z轴的,然后弹簧沿X轴拉,结果一仿真就报错或者结果明显不对。建完模型后,用Verify Model功能检查一下自由度和连接关系,Adams会告诉你模型是否合理。

3.2 定义输入输出变量

联合仿真里,Adams模型和Matlab之间交换数据靠的是"变量"。

  • 输入变量(Input Variable):从Simulink传入Adams的量,比如控制力、驱动位移。
  • 输出变量(Output Variable):从Adams传回Simulink的量,比如位移、速度、加速度。

这个例子里,输入变量是作用在质量块上的力F_control,输出变量是质量块的位移x_mass和速度v_mass。

在Adams里,创建变量的路径是:Build -> System Elements -> State Variable -> New。

创建输入变量:

  • Name:.model_1.F_control
  • Definition:Run-Time Expression
  • F(time, ...) =0(初始值为0,实际值由Simulink写入)

创建输出变量:

  • Name:.model_1.x_mass
  • Definition:Run-Time Expression
  • F(time, ...) =DX(MASS_1.cm, GROUND_1.ground_part, GROUND_1.ground_part)这是获取质量块质心相对Ground的X向位移。
  • 同理创建v_mass,用VX(MASS_1.cm, GROUND_1.ground_part, GROUND_1.ground_part)获取X向速度。

关键点是:输出变量的表达式一定要用Adams的函数语法,而且要注意参考坐标系。我第一次写DX函数时没指定参考Part,结果输出的一直是全局坐标下的绝对位移,后面接入控制闭环时发现数据对不上。后来养成习惯,所有位移、速度、力的表达式都显式写清楚参考对象,就不再出这种问题了。

3.3 用Adams Controls导出联合仿真模块

变量定义好之后,导出联合仿真模块的路径是:Plugins -> Adams Controls -> Plant Export。

在弹出的对话框里填写:

  • File Prefix:给它起个名字,比如spring_mass_damper,这个就是生成的模型文件前缀
  • Input Signal(s):F_control
  • Output Signal(s):x_mass, v_mass
  • Target Software:选择MATLAB
  • Analysis Type:选择non_linear(Adams会帮你生成S-Function)
  • Adams/Solver Choice:Adams/Solver Fortran和Adams/Solver C++都可以选,一般选C++,兼容性和性能都更好。
  • Plant Input Format:选m-function(需要较新版本支持)或者S-Function,这是两种生成模型的方式,S-Function兼容性最好,推荐作为入门选择。

点击OK之后,Adams会在当前工作目录生成一批文件。关键文件有:

  • spring_mass_damper.m:Matlab脚本,用来加载模型参数
  • spring_mass_damper_adams_sub.c/.mexw64:S-Function的C源文件和编译后的MEX文件
  • spring_mass_damper.adm/.acf:Adams模型文件和控制文件
  • aview_spring_mass_damper.m:辅助加载脚本

这个过程是联合仿真的核心枢纽。Adams把多体动力学模型封装成一个"黑盒",这个黑盒能接收外力输入、输出位移和速度,但内部的动力学求解仍然由Adams/Solver完成,精度和稳定性都有保障。

4. Matlab/Simulink端配置与联调

4.1 加载Adams模型到Simulink

打开Matlab,先把工作目录切换到Adams导出文件所在的位置。然后直接运行生成的.m文件:

>> spring_mass_damper

运行之后,Matlab工作区会出现一个名为adams_sys的结构体或参数集,同时Simulink库浏览器里会出现一个叫做adams_sub的模块。

如果你用的是S-Function方式,在Simulink模型里直接拖一个S-Function模块,然后在模块参数里填:

  • S-Function name:spring_mass_damper_adams_sub
  • S-Function parameters: 按生成的spring_mass_damper.m里的变量名填,比如adams_sys或具体参数结构体

如果你用的版本支持adams_plant库,那么更简单的方式是:在Matlab命令行输入adams_sys,Simulink会自动打开一个包含adams_sub子系统的模板模型,把那个adams_sub复制到你自己搭建的控制模型里就行。

提示:在Simulink模型里,双击adams_sub模块,能看到一个ADAMS Plant界面,里面可以设置通信间隔(Communication Interval)和动画输出选项。通信间隔决定了Adams求解器和Simulink求解器之间多久交换一次数据,这个参数很关键,后面会专门讲。

4.2 搭建最小闭环控制系统

这个环节是把整个联合仿真跑起来的关键。我们搭一个最简单的闭环系统:让质量块跟踪一个目标位移信号,控制器用PID。

Simulink模型结构:

  1. 目标位移生成:用Step模块生成阶跃信号,阶跃时间设为0.1秒,终值设为0.05米。
  2. 位移反馈:来自adams_sub模块的输出x_mass。
  3. 误差计算:目标位移减去实际位移,用一个Sum模块。
  4. PID控制器:用PID Controller模块,先随便设一组参数,比如P=200, I=10, D=5,后续再整定。
  5. 控制力输出:PID输出接到adams_sub模块的输入端口F_control。

连线时要注意端口的顺序:adams_sub模块的输出端口顺序应该和你在Adams里定义的输出变量顺序一致,即第一个输出是x_mass,第二个输出是v_mass。如果不是这个顺序,反馈信号就接错了,仿真结果会非常奇怪。

还有一个重要设置:adams_sub模块需要从工作区读取参数,所以Simulink模型的名字最好保持为adams_sys或者在模块参数里正确引用工作区变量。如果改了模型名,可能会出现Undefined function or variable 'adams_sys'的错误。

4.3 仿真参数设置与初跑

仿真参数设置在Simulink中是关键的坑,很多人第一次跑联合仿真就在这里翻车。

核心设置如下:

  • 求解器类型:固定步长(Fixed-step)
  • 求解器:ode4(四阶龙格-库塔)是最稳妥的选择,不要用变步长求解器
  • 固定步长:设成0.001秒
  • 仿真时长:先设5秒
  • Adams的通信间隔:在adams_sub模块中设置,也是0.001秒

为什么要固定步长?因为Adams/Solver和Simulink的联合仿真机制要求数据交换在离散时间点进行。如果用变步长求解器,Simulink会频繁调整步长,而Adams那边可能跟不上节奏,导致通信错误或仿真崩溃。

设置完成后,直接点运行。如果一切顺利,你会看到Simulink的仿真进度条正常前进,同时在Adams界面里可能弹出一个动画窗口,质量块在力的作用下移动。

仿真结束后,用Scope模块查看位移曲线。正常情况下,质量块的位移应该从0开始,然后逐渐趋近0.05米的目标值,有一定的超调和振荡,最后稳定。

我第一次跑通这个闭环的时候,看到位移曲线终于贴到阶跃目标上,那种感觉确实不一样。虽然模型很简单,但机械和控制真正联动的闭环验证做通了。

5. 联合仿真性能调优与关键参数选择

5.1 通信间隔对仿真精度和速度的影响

Adams与Matlab联合仿真中,通信间隔(Communication Interval)是最容易被忽视又影响最大的参数。

简单理解通信间隔的原理:在联合仿真中,Simulink把某个时刻的控制力发给Adams,Adams用这个力驱动机械模型,持续计算一个步长后,再把新的位移和速度返回给Simulink。这个"计算一个步长"的时间就是通信间隔。

  • 如果通信间隔太大,比如0.01秒,而你的控制系统响应很快,那么在两次通信之间,Adams只用了同一个力值算了很久,结果的精度会很差,甚至出现明显的时间延迟,导致控制系统误判。
  • 如果通信间隔太小,比如0.0001秒,每次数据交换的开销很大,仿真速度会变得非常慢。

实践经验是:通信间隔一般设为控制系统带宽的十分之一到二十分之一。比如你的系统响应频率大约在1Hz,那么通信间隔设为0.005到0.01秒通常够用;如果控制系统有高频动态,比如电机电流环,那就需要更小的间隔。

在联合仿真中,Simulink的求解步长应等于或小于通信间隔。如果Simulink步长大于通信间隔,会导致数据非均匀采样;如果小于,则会在两个通信点之间做额外计算,虽然可以但会降低效率。最简单的做法就是两者设成相同值。

5.2 PID参数整定与系统稳定性

联合仿真的闭环控制效果,很大程度上取决于PID参数是否合适。在单自由度弹簧-质量-阻尼系统中,有一定的理论参考。

系统传递函数形式为:

G(s) = 1 / (m*s^2 + c*s + k)

这相当于一个典型的二阶系统。如果PID控制器直接作用在力上,那么带PID的闭环系统会形成三阶或更高阶系统,参数整定需要小心。

我在实际调试中用的方法是:

  1. 先只加P:从小到大调P值,观察响应曲线。当P增大到系统开始持续振荡时,记下临界增益Kc和振荡周期Tc。
  2. 再加I:将P设为临界增益的40%到50%,然后缓慢增加I,消除稳态误差。
  3. 最后加D:D用于抑制超调,从0开始慢慢增加,找到一个平衡点。

对上述1kg质量、刚度100N/m的系统,我推荐的起始参数是P=100, I=5, D=5,然后根据响应微调。这套方法虽然有一点经验成分,但比盲调效率高得多。

5.3 大变形与非线性问题的稳定性

入门模型是线性的,但真实工程模型往往有接触、摩擦、大变形等非线性因素。这些因素在联合仿真中可能导致求解不收敛。

如果遇到Adams求解报错或仿真速度急剧下降,优先检查三件事:

  • 通信间隔是否太小:非线性系统中,过小的通信间隔会频繁触发Adams内部重新求解接触状态。
  • Adams求解器设置:Adams默认的求解器是GSTIFF,在强非线性场景下建议尝试solver_type = HASTIP或Newmark。GSTIFF在经历剧烈冲击时容易出现数值刚性,换HASTIP往往能改善稳定性。
  • 模型中的接触参数:接触刚度、阻尼、穿透深度设置不合理时,Adams会在接触瞬间产生很大的瞬态力,导致Simulink侧控制力突变,系统发散。此时把接触刚度适量降低、阻尼适当增加,通常能稳定下来。

6. 常见问题与排查技巧实录

6.1 接口加载失败类问题

联合仿真最常见的就是接口报错。我把典型问题列成一张速查表,方便大家直接比对:

错误现象可能原因排查与解决办法
Failed to load Adams DLLAdams的dll路径没加入系统PATH把Adams的win64目录加入PATH,重启Matlab
Undefined function or variable 'adams_sys'生成的.m文件没运行,或工作区变量丢失重新运行spring_mass_damper,确认工作区有变量
Unable to find mex fileMEX文件不在Matlab路径中addpath到Adams导出目录,或用rehash toolboxcache刷新
Version not supportedAdams版本和Matlab版本不兼容查官方兼容性表,更换其中一个版本
Error compiling S-Function缺少C编译器安装MinGW-w64或MSVC,Matlab里运行mex -setup配置编译器

有一个很隐蔽的问题:当你的Matlab工作目录有多个版本生成的同名.m文件时,可能会加载错模型。所以每次做联合仿真,最好单独建一个子文件夹,隔离不同模型文件。

6.2 仿真结果异常类问题

仿真能跑起来,但结果不对,这类问题比报错更让人抓狂。我的排查经验是按顺序来:

先看量值有没有"飞"。如果位移、速度直接变成NaN或者10的N次方,大概率是模型本身发散,不是通信问题。此时先断开闭环,给Adams一个恒定力(直接把PID模块拆掉,输入一个常量),看Adams单独仿真是否稳定。如果单独仿真也发散,说明Adams模型有问题,比如弹簧阻尼设置错误、约束冲突、质量属性异常。

再看闭环反馈极性是否正确。联合仿真中很容易出现正反馈的情况:你以为是负反馈,实际上反馈回路增益是正的,导致系统越来越震荡直到发散。解决方法是:在Simulink的Sum模块里确认减号接的是反馈信号,或者临时把PID增益设为0,手动给一个小扰动力,观察位移是否朝预期方向变化。

还要检查单位制。Adams里如果用的是MMKS单位(毫米-千克-秒),生成的位移量级是毫米,而Simulink里你可能按米来思考PID目标值。单位不匹配会导致反馈系数差1000倍,系统行为完全错乱。建议建模之前统一单位制,MKS最直观。

6.3 仿真速度过慢的优化方法

联合仿真比单工具仿真慢是正常的,但慢到令人崩溃就需要优化了。

第一个优化方向是减少Adams输出数据的频率。Adams的.acf文件里可以设置输出步长,如果把输出步长设得比通信间隔更细,会额外消耗大量IO资源。通常让输出步长等于通信间隔就够了。

第二个方向是关闭动画和可视化。Adams View在联合仿真时弹出的动画窗口非常消耗资源,特别是模型复杂时。可以在Adams的求解设置里关闭动画,或者最小化Adams窗口。

第三个方向是用Adams/Solver C++模式替代Fortran模式。某些模型下C++求解器速度更快,占用内存也更小。

还有一招:如果只是调控制参数,可以先用线性化模型在Matlab里做大量快速迭代,最后再用联合仿真验证。在Adams里可以用Linearization功能把模型在某个工作点线性化,导出状态空间矩阵,在Matlab里用ss和bode快速分析系统特性,能省下大量调试时间。

7. 从简单模型走向工程应用

7.1 模型复杂度升级的路线图

你把弹簧-质量-阻尼系统跑通之后,就拿到了一个可复用的框架。往后的升级路线大概是这样的:

第一阶段:增加自由度。把单自由度变成二自由度或更多,比如车辆1/4悬架模型(簧上质量+簧下质量+轮胎刚度)。多自由度模型在Adams里建起来并不复杂,就是多几个Part、多几个Joint、多几个弹簧。输出变量也从2个变成4个、6个,Simulink端的MIMO控制系统也就自然而然地搭起来了。

第二阶段:加入非线性环节。在Adams里加入接触、摩擦、间隙、柔性体。比如用Impact函数定义撞击,或把某个关键杆件设为柔性体。这时的联合仿真才真正发挥价值,因为这些非线性是Matlab很难精确表达的。

第三阶段:加入复杂控制算法。当机械模型传过来的信号够真实,你可以把PID换成模糊控制、滑模控制、模型预测控制,甚至训练好的神经网络控制器。控制算法迭代的时候完全不用动Adams模型,在Simulink里改就行。

第四阶段:硬件在环测试。这是联合仿真非常高级的用法。把Adams模型编译成实时运行的程序,部署到实时仿真机里,外部接真实的控制器硬件。这样在物理样机做出来之前,就能验证控制器的真实运行效果。Adams提供了Adams Real-Time模块,可以配合Simulink Real-Time或第三方实时环境使用。

7.2 与其他联合仿真方案的对比

除了Adams和Matlab的组合,工程界常用的多体动力学软件还有Simpack、CarSim、Amesim,它们也都能和Matlab联合仿真。做方案选型时,可以参考这个对比:

方案优势典型应用场景
Adams + Simulink多体动力学功能全面,柔性体、接触、机构分析强机械臂、车辆底盘、航天机构、通用多体系统
Simpack + Simulink铁路车辆和风电领域有专门模块,求解速度快高铁动力学、风力发电机组传动链
CarSim + Simulink整车动力学模型高度封装,参数标定好,适合快速搭建整车环境乘用车底盘控制、ADAS控制验证
Amesim + Simulink液压、气动、热流体多物理域建模能力强液压伺服系统、工程机械、航空燃油系统

如果你以后的课题偏重机械结构设计,Adams是绕不开的;如果偏整车动力学,CarSim可能更顺手。但对初学者来说,Adams对多体动力学的基本概念构建最扎实,而且它的表达式函数体系学会了以后,理解和迁移到其他软件不难。

7.3 给初学者的建议路线

我建议初学者不要一上来就奔着复杂项目去,先把联合仿真的"手感"练出来。具体而言:

先用半个月到一个月把本文的案例完全吃透。多换几组参数看看变化,比如把刚度加大10倍、阻尼减小一半,观察系统响应怎么变。这个过程中你会慢慢理解机械参数和控制参数的耦合关系。

然后做一个中等复杂度的项目,比如车辆1/4悬架或者平面五杆机构。这个阶段重点是学会在Adams里用坐标点、杆件几何、约束副搭建一个"像样"的机构模型,并且在模型出错时能快速定位问题。

等这些基础打牢了,再去看Adams的帮助文档里关于Controls模块的高级章节,了解更多关于状态空间导出、实时仿真、模型降阶的内容。此时你的知识框架已经搭好,再学什么都是往框架里填内容。

8. 写在最后的一点经验

每次带新人做联合仿真,我都会反复强调一个观点:工具是次要的,理解系统才是核心。软件操作可以一步步学,但如果你心里不清楚Adams算的是什么、Simulink算的是什么、两者之间传递的每个信号物理含义是什么,那么再简单的模型也会出问题。

在我做过的实际项目里,联合仿真让我省下的最大成本不是建模时间,而是避免了很多"做完才发现方向错了"的返工。机械结构和控制算法放在一个仿真环境里联动验证,很多问题在设计阶段就暴露了,不用等到物理样机阶段去烧钱。

入门阶段会遇到各种各样的问题,但绝大多数都能通过"分而治之"来解决——先单独验Adams,再单独验Simulink,最后联调。把问题在某一侧锁定,比在联合环境里猜测要高效得多。

希望这篇偏实操的分享能帮你把第一个联合仿真模型跑起来。后面有时间的话,我打算再整理一篇车辆悬架联合仿真的案例,把从三维几何导入、柔性体替换到PID参数整定的完整流程都过一遍。先写到这儿,有问题的同学欢迎在评论区交流,看到都会回。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询