前阵子调一个动力总成悬置模型,碰上一件怪事:我明明只在发动机侧加了激励力,结果副车架那边也跟着剧烈振动,整个模型的响应曲线怎么看都不对。排查了大半天,最后发现问题出在力的定义方式上——Adams默认给受力物体和施力物体成对施加作用力与反作用力,而我想要的那个激励,在实际台架测试里压根不会“反扑”回激振器。把力改成Action Only之后,模型瞬间就贴合理工科直觉了。
这个场景在Adams的日常应用里其实很常见。很多人一上来就用默认的力定义,直到后处理曲线出现诡异的串扰才回头去查帮助文档。今天这篇文章,我就围绕Adams里的Action Only函数/力定义,聊清楚它到底改了物理模型里的什么、适合哪些工程场景、函数怎么写、联合仿真里怎么用,以及我实测过程中踩过的几个隐蔽的坑。
1. 先搞清楚Action Only到底改了物理模型里的什么
1.1 默认力定义里的“看不见的对手”
在Adams里创建一个力元(Force Element)或者施加一个外部力时,默认的物理模型是符合牛顿第三定律的:你对某一个物体施加力F,系统会自动在另一个物体上生成一个大小相等、方向相反的力-F。这个“另一个物体”可以是明确的施力物体,也可以是Ground地面。
举个例子:你用两物体之间的力元把发动机和副车架连起来,让发动机有一个向上的激励力,副车架端会自动收到一个向下的反作用力。这种处理在绝大多数结构动力学问题里是对的,因为现实中的力确实是这样成对出现的。但在某些场景里,反作用力反而会制造麻烦,比如:
- 你想模拟一个“理想的激振器”,它只负责对结构施加激励,本身不参与动力学响应。
- 你想让基础(Ground或大刚度结构)只传递载荷、不产生反馈,默认的双向力会把基础结构也拉进动力学耦合里。
- 你明明是单向约束(只能拉不能压、只能推不能扯),结果默认力元在压缩方向上也生成了一个反向的力,让模型出现了物理上不存在的“黏连”。
这就是我为建议每个做Adams仿真的人都好好理解一下Action Only的原因——它是你从“理想的成对力世界”走向“工程近似单边力世界”的那把钥匙。
1.2 Action Only的底层语义:力是单向的
勾选Action Only之后,力元的物理语义就变成:只在Action物体上施加这个力,Reaction物体上不再自动生成反作用力。
在Adams/View中创建力时,你会看到对话框里有一个“Action Only”的复选项。它的含义用白话说就是:我指定的I Marker所在的那个物体(Action Body)承担这个力;至于J Marker所在的物体,只是用来确定力的方向和作用位置,它不会收到伴随的反作用力。
从数学上看,这相当于把力矩阵里“成对项”的另一半直接置零。在求解器层面,这意味着该力不再满足动量守恒定律——因为外部输入的力没有产生等大反向的力来“平衡”。所以Adams官方文档里也特别提醒,这是个有意的工程近似,使用时要清楚自己的模型边界。
1.3 什么时候允许自己“违反”牛顿第三定律
这么说听起来有点吓人,仿佛一用Action Only模型就违反物理定律了。实际上,这种单向力在工程控制论和结构动力学里大量存在:
- 激振器、作动器、气缸、伺服电机输出力,它们在物理系统中有一端固定在基础上,那一端的基础响应远小于被激励结构的响应,可以忽略不计。
- 你要分析的子结构只是整个大系统的一小块,外部环境对它的反作用力被边界条件“吸收”掉了。
- 你建模的目的是算结构内部某个点的响应,并不关心力源端的反馈路径。
所以Action Only的适用判断标准其实就三条:反作用力是否会被边界条件吸收;基础结构刚度是否远大于作用对象;你是否只关心局部动力学响应。如果答案是“是”,用Action Only就是合理的工程化处理。
2. 三个适合Action Only的工程场景
2.1 悬置与衬套:把试验台架装进模型
我做动力总成悬置分析时,最喜欢用Action Only的地方就是模拟台架激励。
试验台架上,激振器通过顶杆把力传给发动机,顶杆本身刚度很大、质量很小,它的响应几乎不影响发动机的运动。如果我用默认力元在Adams里建模,给物体A一个力,物体B也会被拉进动力学方程里一起抖,这跟台架实际完全不一致。
正确做法:一端固定在Ground上,另一端作用在发动机悬置点上,力方向按台架布置定义,勾选Action Only。这样激励力就是“单向输入”,发动机在该点受到的力完全等于你设定的激励函数,不会混入基础结构的反作用。
在具体操作上,我一般还会配合Spline曲线,把台架实测的激励数据导进来,用AKISPL(time, 0, spline_load, 0)去驱动这个Action Only力。这样得到的模型响应曲线,可以直接跟台架实测的振动加速度做对比,趋势通常非常接近。
2.2 等效载荷输入:用试验数据驱动模型
很多情况下,我们手头没有物理激振器,只有之前采集到的载荷谱,比如某悬置点在典型工况下的力-时间曲线。这时候建模目标不是“把实际连接关系模拟出来”,而是“把已知载荷施加到模型上,考察结构响应”。
这类等效载荷输入如果使用默认双向力,潜在风险是:当你把力加到悬置点上时,反作用力会设法影响你采集载荷时的那个基准结构——但那个基准结构往往已经被你从模型里省略了,于是反作用力只能作用到Ground或者某个残余节点上,造成能量泄漏或局部应力集中。
Action Only可以直接解决这个矛盾:模型里只有一个力源,没有成对的“影子结构”,载荷谱读取出来后完整施加在目标节点上,干净的。配合函数表达式还可以做载荷的平滑加载、渐变加载,避免突然的阶跃力把模型冲飞。
2.3 碰撞与接触的单向约束近似
提到碰撞检测函数,很多新手第一反应就是直接上Impact或Restitution接触。接触力本身是双向的——两个物体压在一起那必然内部有等大反向的内力。但工程里有很多“跟随-分离”型结构,比如离合器分离轴承、锁止机构、间隙铰链,它们只在特定方向传力,另一方向完全不产生力。
处理这类问题,我经常先用Action Only配合IF函数做一个“单边力等效”:当接触距离小于零时,产生一个与侵入深度挂钩的压力;距离大于零时,力为零。这样模型跑起来之后的运动趋势和接触检测时的趋势基本一致,可用于前期快速参数扫略。
当然,等模型收敛到一定精度要求后,还是要换回正规的Contact算法来精确计接触刚度、阻尼和摩擦力。Action Only在这个阶段的作用,是从“有无碰撞”的定性判断,过渡到“碰撞力多大”的定量计算,不至于一上来就被接触参数调试折磨。
3. 在Adams里把Action Only配成函数驱动的完整操作
3.1 创建Action Only力的入口和关键选项
以Adams/View为例(2020及以上版本界面略有差异,但逻辑一致):
- 进入主界面,点击顶部菜单
Forces→Applied Force→Create。Adams会自动弹出创建力的对话框。 - 在“Direction”区域选择“On One Body”或“Between Two Bodies”。这里的语义区别是:
On One Body:你在某个物体上选一点,创建作用于该物体的力,默认采用Action Only逻辑。Between Two Bodies:两端各选一个物体,创建成对作用的力元;也可以在对话框里勾选“Action Only”,这样可以借用J物体的位置和方向,但力只落在A物体上。
- 设置力的作用点、参考坐标系、力方向类型(Body Fixed 还是 Space Fixed)。
- 在力大小区域选择“Function”模式,输入函数表达式,或者选择Constant并用数值框赋值。
- 关键一步:确认对话框中的“Action Only”处于勾选状态,如果没勾选,默认是双向力。
有朋友问我:“在Between Two Bodies模式下勾选Action Only,到底哪个物体是Action?”正常情况下,你先选的物体就是Action Body,后选的是Reaction Body(也就是只负责提供位置和方向的参考物体)。操作顺序影响很大,别选反了。
创建完之后,可以在左侧模型树中定位到该力元,右键查看其属性,确认Action Marker与Reaction Marker的位置、方向以及函数表达式是否和预期一致。这一步对排查“力的方向怎么跟我想的不一样”特别有用。
3.2 用函数表达非线性力:IF、STEP、AKISPL
Action Only配合函数使用,才是工程应用的正确打开方式。我给几个自己经常用的函数模板,大家可以直接抄:
IF函数做阶跃加载:模拟瞬间施加的载荷,但数值上会有跳变,容易引起初始冲击。
IF(time-0.1:0, 0, 10000)意思是在0.1秒前力为0,0.1秒时变为10000 N。如果直接用于仿真,求解器初始步长会被强行压小,建议配合积分容差使用。
STEP函数做平滑加载:推荐,避免数值冲击。
STEP(time, 0, 0, 0.05, 10000)这是在0到0.05秒内,力从0平滑过渡到10000 N。对多体动力学来说,平滑加载不仅能稳定积分器,还能避免柔性体里出现虚假的高频应力波。
AKISPL函数读试验数据:把外部测到的载荷谱导成Spline,再用AKISPL插值。设Spline名为
spline_load,则:AKISPL(time, 0, spline_load, 0)AKISPL用的是Akima插值,曲线不会出现大的过冲,适合载荷谱类数据。
IF嵌套做单边约束:模拟单向“只受压不受拉”的约束。
IF(DX(marker_i, marker_j): 1e5*ABS(DX(...)), 0, 0)当两个Marker的相对位移为负时产生压力,否则力为0。这种表达式写起来稍繁琐,但比直接用Contact高效很多,适合前期的趋势性分析。
3.3 Action Only与Sforce、Vforce、Gforce的选择逻辑
Adams里有几个容易混淆的“力”对象:Sforce(单点力)、Vforce(单点力矩)、Gforce(广义六分力)以及常规的单元力元(如Spring、Bushing)。Action Only选项在这些对象上的表现形式不太一样,选型逻辑也有讲究。
| 对象类型 | 作用 | Action Only适用性 | 典型场景 |
|---|---|---|---|
| Sforce | 单点作用力 | 适用,勾选Action Only后仅施加力于一个物体 | 激振器、作动器推力 |
| Vforce | 单点作用力矩 | 适用,勾选Action Only后仅施加力矩于一个物体 | 电机驱动力矩输入 |
| Gforce | 广义六分力(3力+3力矩) | 适用,勾选Action Only后六分量全部单向 | 复杂载荷边界条件输入 |
| Spring | 弹簧力元 | 默认双向,无Action Only概念,但有单边可选 | 线性弹性连接,首选Bushing |
| Bushing | 衬套力元(6向刚度和阻尼) | 不适用Action Only,但可以用单向衬套近似 | 悬置、隔振器、橡胶减振元件 |
如果你想施加一个力矩来驱动某个轴转动,用Vforce并勾选Action Only的效果是:只对这个轴施加力矩,不反作用到电机壳体上。这在分析电机内部转子响应时特别省心。
4. 联合仿真场景下的Action Only:接口力与反馈的坑
4.1 联合仿真中为什么经常用Action Only
热词里出现“adams联合仿真问题”,这里我必须多说几句。Adams和Simulink、或者Adams和自编控制程序联合仿真时,最常见的接口就是“控制系统算出力,多体模型吃下这个力,反馈给控制系统的则是运动学或动力学状态量”。
问题在于:如果你在Adams这边用默认双向力,控制端的力输入与机械端反作用力会形成一个闭合回路。如果控制器的初值没设好、或者控制律对干扰敏感,这个双向往返很容易让联合仿真发散。
我个人的实操习惯是:联合仿真里,凡是“外部输入力”一律用Action Only。理由有二:
- 控制系统模型里往往没有对应的机械结构来承受反作用力,强行反向只会让状态量突变。
- Action Only把力源看作理想源,不会因为机械响应而改变输出力,这让联合仿真的收敛性和鲁棒性显著提升。
4.2 力方向由谁定义:Body-Fixed和Space-Fixed的选择
联合仿真里比“是不是Action Only”更隐蔽的问题是力的方向参考。Adams创建力时有一个Direction选项:
Body Fixed:力始终相对于Action物体坐标系的方向设定。物体旋转时,力的方向也跟着转。Space Fixed:力保持世界坐标系的方向,不随物体转动变化。Two Bodies:力的方向由I Marker和J Marker的相对位置确定,常用于弹簧、阻尼类力元。
如果联合仿真里你输入的是一个轴向力,而该轴本身在空间里旋转,选Body Fixed才正确。如果你输入的是“水平方向恒定推力”,那必须选Space Fixed。我见过很多联合仿真的异常结果,最后发现不是控制律写错,而是力的参考方向跟着物体转了几十度,输出当然对不上。
4.3 反馈量取力的什么形式
联合仿真中,很多工程师想把“力”作为反馈量,比如监测悬置点受力。要注意:如果这个力是Action Only施加的,那么你在Adams后处理中直接读取的是该力的定义值;如果你想看结构内部反力,需要另外在Marker上定义Request或Sensor来测量。
单位也经常坑人。Adams里面N和N·mm很容易混淆,尤其是从CAD导入几何模型后单位设置不对,力数量级差出1000倍。我建议在联合仿真接口处,对力、力矩、位移、速度分别做一次单位换算和量级检查,省得后续对着不合理的曲线浪费半天。
5. 实测踩坑:Action Only带来的三个隐蔽问题
5.1 动量不守恒:模型可能越跑越飘
Action Only把反作用力“扔掉”之后,系统总动量不再守恒。这在稳态分析或短时间冲击响应里没问题,但在长时间仿真、或者是带柔性体的模型里,误差会一点点累积,模型表现为“越跑越飘”。
我之前做某机械臂的力矩输入分析,任务要求仿真10秒的动态过程。用Action Only施加电机驱动力矩跑了3秒后,机械臂末端的位移曲线就开始缓慢上漂。换成Vforce+默认双向力之后,漂移消失。这里的关键是:Action Only适用于激励时间远小于结构特征响应时间的场景;长时间仿真要慎用。
5.2 与Contact并用的力突变
有的模型里,Action Only力同时又参与了接触检测(比如一个气缸杆端冲击挡块),这时候会碰到力突变的问题。Action Only力是突然加上去的,接触力是按穿透深度和速度计算的,两者叠加后可能造成节点加速度跳变,严重时直接导致求解器报错“Error: singularity in equations of motion”。
我的处理办法是:让Action Only力作用阶段和接触阶段在时间上错开,或者用STEP函数给Action Only力增加一个微小斜率。如果必须同时存在,就在接触参数里增加一个很小的阻尼,帮助吸收突变能量。
5.3 后处理里看不到反作用力的“直觉陷阱”
用Action Only建模之后,很多人会在后处理里查看J Marker上的反作用力,结果发现归零,第一反应是“模型是不是出故障了”。实际上这恰恰是Action Only的正常表现——J Marker上的力本来就不存在。
我建议在后处理之前,先在模型检查里确认两件事:一是该力元的Action Markers是否是你想作用的物体;二是力的方向定义是否和实际载荷一致。这两点确认没问题,后处理曲线就算反作用力为零,结果也是有效的。
6. 最后聊两句经验
Action Only在Adams里不算什么尖端功能,但我个人觉得它是“区分仿真新手和老手”的一个典型设置。新手默认用双向力,模型也算得动、曲线也出得来,但一旦跟试验对标,就会发现奇奇怪怪的误差找不到来源。老手在建模初期就会把力的物理路径画清楚,谁受力、谁不受力、反作用力去哪了,全都在脑子里过一遍。
如果你也碰到“模型看起来没问题但结果老是对不上”的情况,不妨回头看一眼你的力定义里有没有Action Only选项。多数时候,问题就藏在这个不起眼的小勾选里。