尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RecurDyn表达式函数实战:实测载荷驱动与插值选型

RecurDyn表达式函数实战:实测载荷驱动与插值选型 简介《RecurDyn Expression Function Handbook》是一份面向RecurDyn多体动力学仿真初学者与工程人员的表达式函数速查手册适合需要频繁编写表达式、调试驱动与力元函数的用户用于解决建模过程中运算符写法与内置函数含义不清、参数和返回值容易混淆的问题。压缩包内仅含1个PDF文件大小约3.61MB内容按运算符、FORTRAN函数与仿真常量三大模块编排运算符部分梳理算术、关系与逻辑三类运算的书写方式函数部分逐一说明绝对值、反三角函数、取整、指数对数、最大最小、取余与符号等常用函数的用途和取值规则仿真常量部分则汇总时间、圆周率以及角度与弧度换算等常用量。目前已有673人学习下载。读者可把它当作案头工具书在编写表达式、调试驱动与力元函数、处理单位与角度换算时快速定位条目减少反复试错提升建模效率。1. 把实测载荷接进 RecurDyn 驱动为什么绕不开 Expression Function模型建完、约束加好真正让结果靠不靠谱的往往是加载那一层。台架测出的扭矩曲线、液压缸的流量-压力曲线、路面谱都是几十到几千个离散点硬塞进驱动里只能靠分段常数角加速度在拼接点直接跳变变步长求解器被迫把步长砍到 1e-6 s 量级一次仿真从十分钟拖到两小时。RecurDyn 的 Expression Function 就是处理这层映射的求值引擎它不单独存在而是挂在驱动、力元、约束、传感器上吃时间或者状态量吐回一个标量或向量。Handbook 给的是函数签名和参数表照着抄一般能把模型跑起来但容易翻车的地方签名里一个字都不写单位制对不对、拼接点一阶导连不连续、每个积分步会被求值几次。这三件事决定的是结果可不可信而不是能不能跑通。往下按语法骨架、函数选型、数据落地、调试排错推。适合已经在 RecurDyn 里建过完整模型、准备把实测数据或复杂载荷曲线接进去的人。2. RecurDyn 表达式函数的语法骨架与求值顺序2.1 一条 Expression 里能出现哪几类成分表达式在 RecurDyn 内部就是一串字符串求解器在需要的时候把它解析成一棵求值树。树的叶子无外乎几类常数、内置变量、外部请求量、已经定义过的别的 Expression 名字。把这四类分清楚报错信息就能对上一半。成分写法示例求值时机说明常数3.14、1e3解析期折叠数值单位要跟模型主单位一致内置变量TIME、PI每个求值点TIME单位是秒请求量DX(标记点, 参考点, 参考系)每个求值点依赖当前状态会引入隐式耦合函数调用STEP(TIME, 0, 0, 1, 10)每个求值点详见第 3 章Expression 引用MyTorque递归求值不能互相引用会死循环请求量这一类要特别小心。DX、VX、WZ这些返回的是当前时刻的真实状态把它们写进力表达式等于给系统加了一条反馈通道。用得好可以做半主动控制用得不好就是求解器反复迭代的分裂源。2.2 单位制与角度换算最容易静默出错的一环RecurDyn 内部有一套固定的基本量纲长度、质量、时间、力各自有主单位三角函数的自变量永远是弧度。建模界面里填的角度经常是度于是SIN(30)这种写法能把结果算出几百倍的偏差而且不报任何错。! 错误写法这里的 30 被当成 30 弧度 SIN(30) ! 正确写法一显式换算最不容易出歧义 SIN(30*PI/180) ! 正确写法二把角度做成子 Expression后面复用 ThetaDeg 30 ThetaRad ThetaDeg*PI/180 SIN(ThetaRad)PI是内置常数参与乘除不会引入量纲问题。子 Expression 的写法好处是后面改工况只改一处不用满模型去搜*PI/180。参数说明上有一条经验工程单位制如果在设置里改过主单位表达式里已有的数值不会自动跟着换算。导入外部数据时先确认源数据的单位再决定要不要乘系数别指望软件帮你兜。2.3 IF 的冒号写法与分支求值顺序RecurDyn 的IF用冒号把条件和真值分开整体形如IF(条件: 真值, 假值)。写惯了 C 或者 Python 的人第一次基本都会写成IF(a, b, c)然后收到一个参数个数不对的报错。! TIME 小于 1 s 输出 0否则输出一段衰减正弦 IF(TIME-1.0: 0, 50*SIN(2*PI*5*(TIME-1))*EXP(-(TIME-1)/0.2))注意条件的判断约定条件表达式返回负值代表成立返回零或正值代表不成立。这一点和多数编程语言的布尔语义不同写嵌套IF时按这个规则往下推逻辑才顺。分支求值是常见的坑。求值器有可能把真假两个分支都算一遍再挑一个所以不能让被舍弃的分支里出现除零或者负数开方。稳妥做法是用MAX、ABS把分母兜住! 坏写法TIME 接近 0 时假分支里的 1/TIME 会把求值打爆 IF(TIME-0.001: 0, 1/TIME) ! 稳的写法给分母顶一个下限 IF(TIME-0.001: 0, 1/MAX(TIME, 1e-6))2.4 用子 Expression 把长公式拆成可维护的层一条公式超过一屏改一个符号就得重新数括号这是纯粹的浪费。常见做法是拆成几层子 Expression从底往上叠。同一层在一个积分步里只算一次拆开带来的额外开销可以忽略换来的是可读性和可复用性。! 层 1把角度归一到 0~360 AngleMod MOD(ThetaDeg, 360) ! 层 2换算成弧度 AngleRad AngleMod*PI/180 ! 层 3基波加三次谐波 TorqueBase 120*SIN(AngleRad) 18*SIN(3*AngleRad) ! 层 4叠上转速相关的阻尼项 TorqueFinal TorqueBase - 0.8*WZ(曲轴标记点, 地面参考点, 地面参考系)MOD在两个参数同号时返回常规余数参数带负号时符号规则要自己验一遍。WZ取绕 Z 轴的角速度单位是 rad/s和前面按弧度写的项量纲一致可以直接相减。提示子 Expression 的命名带上前缀比如Drv_、Fr_模型大了以后在列表里能一眼分清哪些是驱动量、哪些是力元量。3. 驱动与力元里高频 Expression Function 的选型与参数3.1 STEP、STEP5 与 HAVSIN 的连续性差异阶跃类函数是用来做启停过渡的选错了直接反映在加速度曲线上。三者的区别集中在端点处几阶导连续。函数过渡多项式端点连续性过冲典型场景STEP三次一阶导连续无一般驱动、力斜坡STEP5五次二阶导连续无加速度敏感、柔性体HAVSIN半正弦一阶导连续无需要柔顺手感的位置驱动! 0~0.5 s 从 0 平滑升到 100两端一阶导为零 STEP(TIME, 0, 0, 0.5, 100) ! 同上但二阶导也连续适合带柔性体的模型 STEP5(TIME, 0, 0, 0.5, 100) ! 半正弦过渡形状更柔 HAVSIN(TIME, 0, 0, 0.5, 100)参数说明前两个参数是过渡区间的起止自变量这里是TIME后两个是对应的端点值。区间之外函数取端点常量不做外推。要求起止自变量前者小于后者写反了不会报错但结果很怪。一个实战坑过渡区间如果比求解器最大步长还窄整个阶跃会被一步跨过去力瞬间满值冲击响应失真。经验做法是过渡时长至少覆盖几个最大步长档越陡的载荷越要留够。3.2 AKISPL 与 CUBSPL插值函数怎么选实测曲线进模型最常用的就是这两个。区别在插值方式和过冲倾向。函数插值方式光滑性过冲倾向适用数据AKISPLAkima 局部插值一阶导连续低带噪声、有阶跃段的实测曲线CUBSPL三次样条二阶导连续高平滑、采样密的理论曲线! 2D 曲线插值第二个自变量固定填 0第三个是 Spline 名称 AKISPL(TIME, 0, SplineTorque) ! 需要二阶导连续时改用三次样条 CUBSPL(TIME, 0, SplineTorque) ! 2D 曲面例如 MAP 图两个自变量都参与 AKISPL(转速, 油门开度, EngineMap)参数说明第一个参数是自变量2D 曲线场景下第二个参数固定写 0只在曲面插值时才有意义。第三个参数直接写 Spline 对象名不加引号。数据点稀疏又带拐点的时候CUBSPL容易在两个台阶之间拱出一个不存在的峰值仿真里表现为莫名其妙的力尖峰。这种数据优先用AKISPL它的局部特性决定了过冲范围有限。反过来如果数据本身很平滑、又对加速度连续性有要求CUBSPL更合适。自变量超出数据范围时的行为取决于导入设置稳妥做法是给数据手动加一段外推的平直端点别让求解器去猜。3.3 IF 与阈值判断在限位、接触里的写法限位和单向接触天然带阈值。最直接的写法是硬判断! 位移超过 5 mm 才开始出力 IF(DX(滑块, 基座, 基座): 0, 0, 200*(DX(滑块, 基座, 基座)-5))DX返回位移单位跟模型主长度单位一致。位移小于 5 时条件成立返回 0模型里不产生力。这种写法在阈值附近一阶导不连续求解器会在该点附近反复试探步长掉得很快。改成让刚度渐入会好很多! 刚度随位移渐入5 mm 之前为零5.5 mm 之后满值 K_eff 200*STEP(DX(滑块, 基座, 基座), 5.0, 0, 5.5, 1) F K_eff*MAX(DX(滑块, 基座, 基座)-5.0, 0)STEP负责让刚度在 0.5 mm 的窗口里平滑起来MAX负责保证力不出现负值。两件事分开写调参的时候各改各的不会互相干扰。3.4 IMPACT 类接触力函数的参数含义IMPACT是把接触简化成非线性弹簧阻尼的一种写法参数顺序大致是位移量、速度量、接触起始位置、刚度、力指数、阻尼、穿透深度。不同版本提示条上的排布可能略有差别在表达式编辑框里敲函数名就能看到参数提示。参数含义取值思路位移量两体的相对侵入量用DX组合出来速度量相对接近速度用VX组合出来起始位置间隙距离按几何实测刚度赫兹接触刚度由材料与曲率估算或试算力指数非线性程度金属对金属常取 1.5 左右阻尼接触耗散常见做法是取刚度的一个小比例穿透深度阻尼满值时的侵入量与最小单元尺度同量级刚度和阻尼不能各自独立乱给。刚度太小物体互相穿透得像没接触阻尼给大接触瞬间会出现一个数值上的阻尼力尖峰。一般先把力指数和起始位置定下来再单独调刚度最后用阻尼把接触后的振荡压下去。4. 从台架数据到驱动曲线一条可复现的 Expression 落地路径4.1 数据预处理排序、去重、补外推段实测数据几乎不可能直接喂给插值函数。时间列可能有重复时间戳可能不是单调递增单位可能和模型对不上。用一个短脚本统一处理比在图形界面里手动改靠谱。import numpy as np import pandas as pd # 台架数据时间(s)、扭矩(N*mm)采样间隔不均匀 raw pd.read_csv(bench_torque.csv) t raw[time_s].to_numpy(dtypefloat) m raw[torque_Nmm].to_numpy(dtypefloat) # 插值函数要求自变量严格递增重复点会让插值矩阵退化 order np.argsort(t) t, m t[order], m[order] keep np.concatenate(([True], np.diff(t) 1e-9)) # 去掉时间戳重复的点 t, m t[keep], m[keep] # 两端各外推一小段平直值避免求解器跨出范围时被截断 span t[-1] - t[0] t_pad np.concatenate(([t[0] - 0.05*span], t, [t[-1] 0.05*span])) m_pad np.concatenate(([m[0]], m, [m[-1]])) np.savetxt(spline_ready.csv, np.column_stack([t_pad, m_pad]), delimiter,, headerx,y, comments, fmt%.6f)去重的阈值1e-9是按数据时间尺度定的如果采样在毫秒量级这个阈值要相应放大否则真正相邻的点会被误删。外推段取总时长的 5% 是个经验值目的是给求解器留出缓冲不是让曲线真的跑到那里去。顺手做一次过冲检查能提前发现该用哪个插值函数from scipy.interpolate import Akima1DInterpolator, CubicSpline ak Akima1DInterpolator(t_pad, m_pad) cs CubicSpline(t_pad, m_pad) grid np.linspace(t_pad[0], t_pad[-1], 4000) print(原始峰值 %.2f % m_pad.max()) print(Akima 峰值 %.2f % ak(grid).max()) print(三次样条峰值 %.2f % cs(grid).max())如果三次样条的峰值明显高出原始峰值说明数据里有台阶段直接上CUBSPL会在仿真里造出一个假力尖峰。4.2 导入 Spline 并接进 AKISPL数据准备完之后生成 Spline 对象常见做法是走曲线导入通道把上面那份两列 CSV 读进去指定第一列为自变量、第二列为因变量。导入后先确认两件事点数是否和 CSV 一致自变量范围是否和预期一致。点数少了说明去重过头范围不对说明有行被吞了。接下来在驱动或者力元里引用它。表达式里直接写 Spline 的名字不需要加引号或者路径! 用实测扭矩曲线做驱动 AKISPL(TIME, 0, SplineTorque) ! 如果模型里时间基准和台架数据起点差了一个偏移先平移 AKISPL(TIME - T_Start, 0, SplineTorque)T_Start建议也定义成一个子 Expression方便后面按工况改成参数。平移量写死在函数里换一个工况就得搜一遍。注意Spline 名字改了以后引用它的表达式不会自动更新模型会直接报找不到对象。重命名之前先把引用列表过一遍。4.3 先把表达式画出来再挂到模型上表达式写完直接挂到力元上跑仿真是最费时间的调试方式。更省事的做法是先用绘图功能把表达式单独画出来横轴给TIME看一眼量级、端点和形状。检查三个点就够端点值是不是想要的有没有非预期的跳变斜率在拼接处有没有折角。量级差得离谱基本是单位问题出现跳变基本是IF分支写反或者区间重叠折角说明该换STEP5。把表达式临时挂到一个不参与耦合的哑元上也是个办法比如建一个质量极小、不影响动力学的标记点把表达式赋给它作为传感器输出。这样能在完整求解过程里观察它的实际取值比离线画图更接近真实。4.4 分段拼接时把端点值和一阶导对齐多工况拼接是最容易出问题的地方。原则只有一条相邻段在交界处的值和一阶导都要对上。! 0~1 s 起升1~3 s 保持 803~3.5 s 卸载 IF(TIME-1.0: STEP5(TIME, 0, 0, 1.0, 80), IF(TIME-3.0: 80, STEP5(TIME, 3.0, 80, 3.5, 0)))STEP5在区间端点的值为给定端点值、一阶导为零恰好和两侧的常数段接上。如果用STEP三次多项式一阶导同样为零但二阶导在端点会跳加速度敏感的场景能看出差别。嵌套IF的缩进只是给人看的求值器不看这个。但把每一层的条件和区间在注释里写清楚半年后回来改参数能省不少时间。5. 表达式求值报错与让求解器少砍步长的写法5.1 五类高频报错与定位顺序现象大概率根因先查什么报参数个数不对IF写成逗号分条件条件与真值之间改冒号仿真跑不动步长一路下掉表达式在某处不连续画曲线看一阶导结果量级差几个数量级角度或长度单位不匹配核对主单位与外部数据单位报除零或负数开方条件分支被双向求值用MAX、ABS兜底仿真中途突然变慢Spline 点数过多或数据有重复精简数据、重新去重定位顺序建议从外向里先确认表达式本身能不能单独画出来再确认它挂载的对象类型对不对驱动要标量、力元要标量、向量场要向量最后才怀疑求解器设置。反过来查十有八九会在求解器参数里绕半天。5.2 把过渡区间和积分步长对齐变步长求解器对不连续点的处理方式是反复减半步长去逼近这个动作本身很贵。除了前面说的把硬阈值换成STEP、把分段常数换成STEP5还有两个低成本的习惯。第一个是把过渡区间取成基本积分步长的整数倍。比如最大步长设成 1e-3 s过渡时长给 0.5 s正好 500 步跨步采样时不会出现半截落在区间外的情况。! 最大步长 1e-3 s 时的推荐写法过渡区间为步长整数倍 STEP5(TIME, 0, 0, 0.5, 100) ! 避免这种写法0.5003 不是步长整数倍端点附近会额外试探 STEP5(TIME, 0, 0, 0.5003, 100)第二个是别在表达式里高频引用相互耦合的请求量。DX取的是当前求解状态把它写进力表达式之后力又反过来影响状态求解器每次迭代都要多算一轮雅可比。真要做反馈控制优先用低通滤波后的信号或者干脆拆成两步仿真。5.3 一个两分钟能做完的自检动作写完任何一条要上模型的表达式做三件事画一遍曲线看形状手算两个端点值和表达式输出对不对得上用两个不同的最大步长各跑 0.1 s 看输出差多少。第三步最容易被跳过但它能提前暴露不连续点——两种步长下结果差异超过几个百分点说明表达式里藏着求解器在追的跳变后面长时仿真只会更贵。本文还有配套的精品资源点击获取
返回列表