1. 二连杆仿真为什么总在坐标系上翻车
做过多体动力学仿真的人大概都有过这种体验:模型搭好了,参数填对了,求解器也没报错,但仿真结果就是不对劲——连杆飞出去了、关节角度乱跳、力矩曲线像心电图。排查半天发现,问题既不在物理参数也不在求解器设置,而是出在Solid模块的坐标系和Rigid Transform的配置上。
SimMechanics(现在叫Simscape Multibody)做二连杆仿真,本质上是在搭建一个刚体系统。每个连杆是一个Solid模块,关节是Revolute Joint,而连接它们的桥梁就是Rigid Transform。坐标系一旦设错,整个运动学链就全乱了。更麻烦的是,SimMechanics不会因为你坐标系设错就报错——它照样能跑,只是结果完全不对。这种“静默错误”才是最坑的。
这篇内容适合正在用SimMechanics/Simscape Multibody做多体仿真的人,尤其是刚接触Solid模块和Rigid Transform、被坐标系搞得头大的朋友。我会从坐标系的基本概念讲起,把二连杆仿真中Solid模块的坐标系设置逻辑、Rigid Transform的常见错误、以及排查方法一步步拆开讲清楚。不堆公式,用实操中能直接用的方式来说。
2. 坐标系基础:SimMechanics里的“位置”到底怎么定义
2.1 Solid模块的坐标系原点在哪里
SimMechanics的Solid模块,坐标系原点默认在几何体的参考点上。这个参考点是什么,取决于你怎么创建这个Solid。如果你是从STEP文件导入的,原点通常在CAD软件导出时设定的位置;如果你是用Brick Solid、Cylinder Solid这些内置模块搭的,原点就在几何中心或者底面中心。
这里有个很容易忽略的点:Solid模块的坐标系原点和几何体的质心(Center of Mass)是两回事。SimMechanics里,Solid模块有一个“Inertia”参数组,里面要填质量、质心位置、惯性张量。质心位置是相对于Solid模块坐标系原点来定义的。如果你从CAD导入的模型,质心位置填错了,重力方向对力矩的影响就全错了。
我一般建议在CAD里就把每个连杆的坐标系原点设在关节旋转轴线上。比如二连杆的第一根杆,原点设在和地面铰接的那个孔的中心;第二根杆的原点设在它和第一根杆铰接的孔中心。这样后面配Rigid Transform的时候会省很多事。
2.2 坐标系旋转的欧拉角到底怎么转
SimMechanics里Rigid Transform的旋转参数用的是欧拉角,具体来说是Z-Y-X顺序的内旋(Intrinsic)欧拉角。什么意思呢?就是先绕Z轴转,再绕新的Y轴转,最后绕新的X轴转。这和航空领域常用的Yaw-Pitch-Roll是一致的。
很多人在这里翻车,是因为把“绕移动坐标系旋转”和“绕固定坐标系旋转”搞混了。SimMechanics的Rigid Transform用的是绕移动坐标系旋转,也就是每次旋转都是相对于上一次旋转后的新坐标系。如果你按绕固定坐标系的方式去填角度,结果肯定不对。
举个具体例子:假设你要把一个坐标系绕全局Z轴转90度,再绕全局X轴转90度。如果是绕固定坐标系(外旋),你填的欧拉角是[90, 0, 90](Z-Y-X顺序下,Y是0)。但如果是绕移动坐标系(内旋),你需要填的是[90, 90, 0]——因为绕Z转90度后,原来的X轴已经转到了新的位置,你再绕“新的X轴”转90度,等价于绕原来的Y轴转。
实操建议:如果你不确定该填什么角度,先用一个简单的测试模型验证。建一个只有Rigid Transform的模型,输入角度,观察输出坐标系的方向,和你的预期对比。花五分钟验证比花两小时排查划算得多。
2.3 Rigid Transform在运动学链中的角色
Rigid Transform在SimMechanics里就是一个刚体变换:把一个坐标系的位置和方向,通过平移和旋转,变换到另一个位置和方向。在二连杆仿真中,它的作用是把上一个模块的坐标系“搬”到下一个模块需要的位置。
具体来说,二连杆的运动学链是这样的:
- World坐标系 → 地面(Ground模块)
- Ground → Revolute Joint 1(第一个关节)
- Revolute Joint 1 → Rigid Transform 1 → Solid 1(第一根连杆)
- Solid 1 → Rigid Transform 2 → Revolute Joint 2(第二个关节)
- Revolute Joint 2 → Rigid Transform 3 → Solid 2(第二根连杆)
每个Rigid Transform的作用,是把前一个模块的坐标系原点,平移到下一个模块的坐标系原点,同时把方向对齐。平移量是相对于前一个模块的坐标系来定义的,旋转也是相对于前一个模块的坐标系。
这里的关键点是:Rigid Transform的平移和旋转都是相对于它的输入坐标系(也就是Base坐标系)来定义的。不是相对于全局坐标系,也不是相对于下一个模块的坐标系。这个“相对性”是很多错误的根源。
3. Solid模块坐标系设置的实操要点
3.1 从CAD导入模型时的坐标系对齐
从SolidWorks或其他CAD软件导入模型到SimMechanics,最常见的问题就是坐标系对不上。CAD软件里的坐标系原点和SimMechanics里期望的原点往往不一致。
我的做法是这样的:在CAD里就把每个连杆单独存成一个零件文件,每个零件的坐标系原点设在关节旋转轴线上。具体来说,第一根杆的原点设在它与地面连接的孔中心,第二根杆的原点设在它与第一根杆连接的孔中心。导出STEP文件时,选择“保留零件坐标系”选项。
导入到SimMechanics后,用Solid模块的“File Solid”功能加载STEP文件。加载后,SimMechanics会自动读取CAD里的坐标系原点作为Solid模块的坐标系原点。你可以在Solid模块的“Geometry”选项卡里看到“Origin”的位置,确认它是不是在关节轴线上。
如果CAD里没设好,导入后也可以在SimMechanics里调整。Solid模块有一个“Visual Properties”里的“Origin”参数,可以手动输入偏移量。但这个偏移量是相对于CAD原点的,调起来比较绕。所以我还是建议在CAD里就设好。
3.2 用内置几何体搭建时的坐标系选择
如果你不想从CAD导入,直接用SimMechanics的内置几何体(Brick Solid、Cylinder Solid等)搭二连杆,坐标系设置会更直观一些,但也有一些坑。
Brick Solid的原点在几何中心,Cylinder Solid的原点在底面中心。对于二连杆来说,第一根杆通常是一个长方体,原点在几何中心。但关节旋转轴线不在几何中心,而是在杆的一端。所以你需要用Rigid Transform把坐标系从几何中心平移到关节轴线位置。
平移量怎么算?假设杆长L,截面是宽w、高h的长方体。几何中心在杆的中点,关节轴线在杆的一端。那么平移量就是[L/2, 0, 0](假设杆沿X轴方向放置)。这个平移是在Solid模块的坐标系里定义的,方向要和杆的放置方向一致。
这里有个细节:Solid模块的坐标系方向默认和全局坐标系一致。如果你把杆沿X轴放置,那杆的长度方向就是X轴。但如果你旋转了Solid模块,坐标系也跟着转。所以Rigid Transform的平移量要基于旋转后的坐标系来算。
3.3 质心和惯性参数的坐标系归属
Solid模块的“Inertia”参数组里,质心位置(Center of Mass)是相对于Solid模块坐标系原点来定义的。惯性张量也是相对于质心坐标系来定义的,但SimMechanics会自动处理这个转换,你只需要填相对于质心坐标系的惯性张量。
对于二连杆,如果杆是均匀长方体,质心就在几何中心。如果Solid模块的原点也在几何中心,那质心位置就是[0, 0, 0]。但如果原点在杆的一端(比如关节轴线位置),质心位置就是[L/2, 0, 0]。
惯性张量的计算,对于长方体绕质心的转动惯量,公式是:
- Ixx = m*(h^2 + d^2)/12
- Iyy = m*(w^2 + d^2)/12
- Izz = m*(w^2 + h^2)/12
其中w是宽度,h是高度,d是深度(沿X轴的长度)。这些值填在Solid模块的Inertia参数里。
注意:SimMechanics的惯性张量是相对于质心坐标系的,不是相对于Solid模块坐标系。如果你填错了参考坐标系,力矩计算就会出错,表现为关节力矩异常大或异常小。
4. Rigid Transform常见错误与排查方法
4.1 平移方向搞反:最常见的低级错误
Rigid Transform的平移量是相对于输入坐标系(Base坐标系)来定义的。很多人会误以为它是相对于输出坐标系或者全局坐标系,结果平移方向搞反。
举个例子:第一根杆长1米,Solid模块原点在杆的几何中心。你要把坐标系从几何中心平移到杆的右端(关节位置)。如果杆沿X轴正方向放置,平移量应该是[0.5, 0, 0]。但如果你填了[-0.5, 0, 0],坐标系就跑到杆的左端去了。
更隐蔽的情况是:杆的方向不是沿X轴,而是沿Y轴或Z轴。这时候平移量的方向也要对应调整。我见过有人杆沿Y轴放置,但平移量还是填[0.5, 0, 0],结果坐标系跑到了杆的侧面。
排查方法:在SimMechanics里打开“Mechanics Explorer”,可视化显示每个坐标系的位置和方向。如果坐标系不在预期位置,检查Rigid Transform的平移量方向是否和杆的放置方向一致。
4.2 旋转顺序和方向错误
前面说过,SimMechanics的Rigid Transform用的是Z-Y-X内旋欧拉角。但很多人会按外旋或者别的顺序来填,导致方向错误。
一个典型的场景:你要把第二根杆的坐标系旋转90度,让它和第一根杆垂直。如果第一根杆沿X轴,第二根杆沿Y轴,你需要绕Z轴旋转90度。填[90, 0, 0]是对的。但如果你填了[0, 90, 0],那就是绕Y轴转90度,杆的方向就跑到Z轴去了。
还有一种情况是旋转方向搞反。绕Z轴旋转90度和-90度,结果是不一样的。如果你发现杆的方向反了,试试把角度取负。
排查方法:同样用Mechanics Explorer可视化。旋转后的坐标系方向应该和你的预期一致。如果不一致,先检查旋转顺序(Z-Y-X),再检查角度符号。
4.3 多个Rigid Transform串联时的累积误差
二连杆仿真里通常有多个Rigid Transform串联。每个Rigid Transform的平移和旋转都是相对于前一个坐标系的,所以误差会累积。
比如第一个Rigid Transform的平移量差了0.01米,第二个Rigid Transform又差了0.01米,累积起来就是0.02米。对于精密仿真来说,这个误差可能已经很大了。
更麻烦的是旋转误差。如果第一个Rigid Transform的旋转角度差了1度,第二个又差了1度,累积起来就是2度。在长连杆的情况下,2度的角度误差可能导致末端位置偏差好几厘米。
排查方法:逐个检查每个Rigid Transform的输入输出坐标系。在Mechanics Explorer里,可以单独显示每个坐标系,对比它们的位置和方向。如果发现某个坐标系偏离了预期,就从那个Rigid Transform开始排查。
4.4 坐标系单位不一致
SimMechanics默认使用国际单位制(米、千克、秒)。但如果你从CAD导入模型,CAD文件可能用的是毫米。导入时如果没有做单位转换,尺寸就会差1000倍。
这种错误的表现是:模型看起来正常,但仿真结果完全不对——重力效果几乎为零,或者关节力矩异常大。排查方法是检查Solid模块的尺寸参数,确认单位是米而不是毫米。
实操心得:从CAD导入模型时,我习惯在CAD里就把单位设成米,导出STEP文件时也确认单位是米。这样导入SimMechanics后就不用再做单位转换了。如果CAD里已经是毫米,导入后在Solid模块里手动把尺寸除以1000。
5. 二连杆仿真完整搭建流程与参数计算
5.1 模型参数定义
先定义二连杆的物理参数。假设:
- 第一根杆:长度L1 = 0.5 m,宽度w1 = 0.05 m,高度h1 = 0.02 m,质量m1 = 1 kg
- 第二根杆:长度L2 = 0.4 m,宽度w2 = 0.04 m,高度h2 = 0.02 m,质量m2 = 0.8 kg
- 重力加速度:g = 9.81 m/s²,方向沿-Z轴
第一根杆的惯性张量(相对于质心):
- Ixx1 = m1*(h1² + L1²)/12 = 1*(0.0004 + 0.25)/12 = 0.02087 kg·m²
- Iyy1 = m1*(w1² + L1²)/12 = 1*(0.0025 + 0.25)/12 = 0.02104 kg·m²
- Izz1 = m1*(w1² + h1²)/12 = 1*(0.0025 + 0.0004)/12 = 0.000242 kg·m²
第二根杆的惯性张量:
- Ixx2 = m2*(h2² + L2²)/12 = 0.8*(0.0004 + 0.16)/12 = 0.01069 kg·m²
- Iyy2 = m2*(w2² + L2²)/12 = 0.8*(0.0016 + 0.16)/12 = 0.01077 kg·m²
- Izz2 = m2*(w2² + h2²)/12 = 0.8*(0.0016 + 0.0004)/12 = 0.000133 kg·m²
这些值填在Solid模块的Inertia参数里。
5.2 模块连接与坐标系配置
按照下面的顺序搭建模型:
- World模块:提供全局坐标系,重力设[0, 0, -9.81]。
- Ground模块:连接World,提供固定参考。
- Revolute Joint 1:连接Ground和Rigid Transform 1。关节旋转轴设为Z轴。
- Rigid Transform 1:连接Revolute Joint 1和Solid 1。平移量[0, 0, 0],旋转[0, 0, 0]。因为Solid 1的原点已经设在关节轴线上,不需要额外平移。
- Solid 1:第一根杆。原点在左端关节轴线位置,质心位置[L1/2, 0, 0] = [0.25, 0, 0]。
- Rigid Transform 2:连接Solid 1和Revolute Joint 2。平移量[L1, 0, 0] = [0.5, 0, 0],旋转[0, 0, 0]。把坐标系从第一根杆的左端平移到右端。
- Revolute Joint 2:连接Rigid Transform 2和Rigid Transform 3。关节旋转轴设为Z轴。
- Rigid Transform 3:连接Revolute Joint 2和Solid 2。平移量[0, 0, 0],旋转[0, 0, 0]。
- Solid 2:第二根杆。原点在左端关节轴线位置,质心位置[L2/2, 0, 0] = [0.2, 0, 0]。
这里的关键是Rigid Transform 2的平移量。它把坐标系从第一根杆的左端(Solid 1的原点)平移到右端(关节2的位置)。平移量是[L1, 0, 0],因为第一根杆沿X轴放置,长度是L1。
5.3 仿真配置与结果验证
仿真配置:
- 求解器:ode45(变步长)
- 仿真时间:10秒
- 初始条件:关节1角度30度,关节2角度-45度,初始速度都为0
仿真跑完后,验证结果的方法:
- 能量守恒检查:无摩擦情况下,系统总能量(动能+势能)应该守恒。如果能量不守恒,说明坐标系或惯性参数有问题。
- 关节角度曲线:关节角度应该是平滑的周期运动。如果出现突变或发散,说明坐标系配置有误。
- 可视化检查:在Mechanics Explorer里观察连杆运动。如果连杆飞出去或者穿模,说明坐标系位置不对。
我一般会先跑一个简单的自由落体测试:把二连杆水平放置,初始速度为零,看它是否像预期那样在重力作用下摆动。如果摆动方向不对,检查重力方向和坐标系方向。
6. 常见问题速查与避坑经验
6.1 坐标系设置问题速查表
| 问题现象 | 可能原因 | 排查方法 |
|---|---|---|
| 连杆飞出去 | Rigid Transform平移量方向错误 | 检查平移量是否与杆的放置方向一致 |
| 关节角度乱跳 | 旋转顺序或方向错误 | 确认使用Z-Y-X内旋欧拉角 |
| 力矩异常大 | 惯性张量参考坐标系错误 | 确认惯性张量是相对于质心坐标系 |
| 重力效果不对 | 重力方向或Solid方向错误 | 检查World模块的重力设置和Solid的旋转 |
| 尺寸差1000倍 | 单位不一致 | 检查CAD导入时的单位设置 |
| 末端位置偏差大 | 多个Rigid Transform累积误差 | 逐个检查每个Rigid Transform的输入输出 |
6.2 独家避坑技巧
技巧一:用“坐标系可视化”功能提前验证。在搭建模型之前,先建一个只有World、Ground和几个Rigid Transform的测试模型,把每个坐标系的位置和方向可视化出来。确认坐标系配置正确后,再把Solid模块加进去。这样可以把坐标系问题和动力学问题分开排查。
技巧二:从简单到复杂逐步搭建。不要一上来就搭完整的二连杆。先搭一个单连杆,验证坐标系和惯性参数。确认单连杆没问题后,再加第二个连杆。这样出问题时容易定位。
技巧三:用“零重力”测试验证运动学。把重力设为零,给关节一个初始速度,观察连杆的运动。如果运动学链正确,连杆应该做匀速圆周运动。如果运动轨迹不对,说明坐标系配置有问题。
技巧四:记录每个Rigid Transform的输入输出坐标系。在搭建过程中,把每个Rigid Transform的输入坐标系原点、输出坐标系原点、平移量、旋转角度都记录下来。出问题时对照记录排查,比在模型里翻参数快得多。
技巧五:用MATLAB脚本批量检查参数。如果模型比较复杂,可以写一个MATLAB脚本,遍历所有Solid模块和Rigid Transform模块,输出它们的参数。这样可以快速发现参数异常。
6.3 坐标系旋转的快速验证方法
如果你不确定欧拉角该怎么填,可以用这个快速验证方法:
- 在MATLAB命令窗口输入
rotx、roty、rotz函数,生成旋转矩阵。 - 对于Z-Y-X内旋欧拉角[z, y, x],旋转矩阵是
R = rotz(z) * roty(y) * rotx(x)。 - 把旋转矩阵乘以一个单位向量,看结果是否和你的预期一致。
比如,你要验证[90, 0, 0]是否表示绕Z轴旋转90度:
R = rotz(90) * roty(0) * rotx(0); v = R * [1; 0; 0]; % 结果应该是[0; 1; 0],表示X轴转到了Y轴方向这个方法比在SimMechanics里反复试快得多。
7. 坐标系旋转的数学原理与SimMechanics实现
7.1 旋转矩阵与欧拉角的对应关系
SimMechanics的Rigid Transform在底层用的是旋转矩阵,但用户界面提供的是欧拉角输入。理解旋转矩阵和欧拉角的对应关系,有助于排查旋转相关的错误。
Z-Y-X内旋欧拉角的旋转矩阵是:
R = Rz(α) * Ry(β) * Rx(γ)
其中α是绕Z轴的角度,β是绕Y轴的角度,γ是绕X轴的角度。注意乘法顺序是Rz在前,Rx在后,这对应的是内旋(每次绕新的坐标轴旋转)。
展开后:
R = [cosαcosβ, cosαsinβsinγ - sinαcosγ, cosαsinβcosγ + sinαsinγ; sinαcosβ, sinαsinβsinγ + cosαcosγ, sinαsinβcosγ - cosαsinγ; -sinβ, cosβsinγ, cosβcosγ]
这个矩阵看起来复杂,但实际用的时候不需要手算。SimMechanics会自动处理。你只需要确保填的角度和旋转顺序正确。
7.2 绕任意轴旋转的处理方法
有时候你需要绕一个任意轴旋转,而不是绕坐标轴。SimMechanics的Rigid Transform不直接支持任意轴旋转,但你可以通过组合旋转来实现。
比如,你要绕向量[1, 1, 0]旋转45度。可以先绕Z轴旋转45度,把[1, 1, 0]转到X轴方向,然后绕X轴旋转45度,再绕Z轴旋转-45度转回来。这个过程用欧拉角表示就是[45, 45, -45](Z-Y-X顺序下,Y是0)。
更通用的方法是:用旋转矩阵的轴角表示(Axis-Angle),然后转换成欧拉角。MATLAB的rotm2eul函数可以做这个转换:
% 定义旋转轴和角度 axis = [1, 1, 0] / norm([1, 1, 0]); angle = 45 * pi / 180; % 生成旋转矩阵 R = axang2rotm([axis, angle]); % 转换成Z-Y-X欧拉角 eul = rotm2eul(R, 'ZYX'); % eul的单位是弧度,转换成角度 eul_deg = eul * 180 / pi;这样得到的eul_deg就是SimMechanics里应该填的欧拉角。
7.3 坐标系变换的链式法则
在二连杆仿真中,末端执行器的位置是通过一系列坐标系变换计算出来的。每个变换包括平移和旋转,变换的顺序很重要。
假设从World到末端执行器的变换链是:
T = T1 * T2 * T3 * ... * Tn
其中每个Ti是一个4x4的齐次变换矩阵,包括旋转矩阵Ri和平移向量pi:
Ti = [Ri, pi; 0, 1]
末端执行器的位置就是T的最后一列的前三个元素。
如果某个Ti的旋转或平移错了,末端位置就会错。排查时可以从末端反推,逐个检查每个Ti是否正确。
实操心得:我习惯在MATLAB里写一个脚本,把SimMechanics模型里的所有Rigid Transform参数读出来,手动计算变换链,和SimMechanics的输出对比。如果一致,说明坐标系配置正确;如果不一致,说明某个Rigid Transform的参数填错了。
8. 从单连杆到多连杆的扩展思路
二连杆的坐标系配置逻辑,可以直接扩展到多连杆。核心原则是一样的:每个连杆的Solid模块原点设在关节轴线上,Rigid Transform负责把坐标系从一个关节搬到下一个关节。
对于N连杆系统,你需要:
- N个Solid模块,每个的原点在关节轴线上
- N个Revolute Joint,每个的旋转轴方向一致(通常都是Z轴)
- N+1个Rigid Transform,其中第一个和最后一个可能平移量为零
- 每个Rigid Transform的平移量等于前一个连杆的长度
扩展时最容易出错的地方是:连杆数量多了以后,Rigid Transform的平移量容易搞混。我的做法是给每个Rigid Transform命名,比如“RT_Joint1_to_Solid1”、“RT_Solid1_to_Joint2”,这样一看名字就知道它的作用。
另外,多连杆系统的惯性参数累积误差会更大。建议在CAD里就把所有连杆的坐标系和质心位置算好,导入SimMechanics后直接填,不要在SimMechanics里手动算。
9. 仿真结果验证与调试实战
9.1 能量守恒验证法
无摩擦的二连杆系统,总能量应该守恒。总能量E = KE + PE,其中KE是动能,PE是势能。
在SimMechanics里,可以用Simscape的“PS-Simulink Converter”把关节角度和角速度输出到Simulink,然后用MATLAB Function计算总能量。如果总能量随时间变化超过1%,说明模型有问题。
常见的问题原因:
- 惯性张量填错,导致动能计算错误
- 质心位置填错,导致势能计算错误
- 坐标系方向错误,导致重力做功计算错误
9.2 可视化调试技巧
Mechanics Explorer是排查坐标系问题的最强工具。我一般会:
- 打开“Coordinate Systems”显示,把每个模块的坐标系都显示出来。
- 用不同颜色区分不同模块的坐标系,方便识别。
- 在仿真过程中观察坐标系的位置和方向变化,确认和预期一致。
- 如果某个坐标系偏离了预期,暂停仿真,检查对应的Rigid Transform参数。
还有一个技巧:把Solid模块的几何体透明度调低,这样可以看到内部的坐标系。在Solid模块的“Visual Properties”里可以设置透明度。
9.3 参数扫描与敏感性分析
如果模型比较复杂,不确定哪个参数对结果影响最大,可以做参数扫描。比如,把某个Rigid Transform的平移量在±10%范围内变化,观察末端位置的变化。如果变化很大,说明这个参数很敏感,需要精确设置。
在Simulink里可以用“Parameter Sweep”功能做这个分析。或者写一个MATLAB脚本,循环修改参数并运行仿真,记录结果。
我一般会先做一遍参数扫描,确认哪些参数对结果影响大,然后重点检查这些参数。这样可以快速定位问题。
10. 一些踩过的坑和最后的建议
说几个我实际踩过的坑。
第一个坑:从SolidWorks导入STEP文件时,没注意单位。SolidWorks默认是毫米,SimMechanics默认是米。导入后模型看起来正常,但仿真时重力效果几乎为零。排查了半天才发现是单位问题。后来我养成了习惯,导入前先在CAD里把单位设成米。
第二个坑:Rigid Transform的旋转角度填了弧度而不是角度。SimMechanics的Rigid Transform默认用角度,但有时候从MATLAB脚本里设置参数时容易搞混。弧度制下90度是1.57,角度制下是90。填错了结果完全不对。
第三个坑:多个Rigid Transform串联时,平移量的参考坐标系搞混了。我以为平移量是相对于全局坐标系的,实际上是相对于输入坐标系的。结果第一个Rigid Transform的平移量对了,第二个就错了,因为输入坐标系已经变了。
第四个坑:Solid模块的质心位置填的是相对于全局坐标系的位置,而不是相对于Solid模块坐标系的位置。SimMechanics要求的是相对于Solid模块坐标系,填错了力矩计算就全错了。
这些坑的共同点是:SimMechanics不会报错,但结果不对。所以排查时不能只看有没有报错,要看结果是否符合物理预期。
最后分享一个小技巧:如果你不确定坐标系配置对不对,先把模型简化到极致——只保留一个Solid和一个Rigid Transform,跑一个自由落体测试。确认这个最简单的模型没问题后,再逐步加复杂度。这样可以把问题隔离在最小的范围内,排查起来快得多。
二连杆仿真的坐标系配置,说到底就是“原点在哪、方向朝哪、平移多少、旋转多少”这四个问题。把这四个问题搞清楚,大部分错误都能避免。剩下的就是耐心和细心了。