双足人形机器人这个方向很多人第一反应是强化学习、是运动控制算法但真正动手做过整机仿真的人都清楚建模这一步没打牢后面控制器调得再花哨都是空中楼阁。我前后参与过三台不同规格的双足平台从零搭建仿真环境踩过最深的坑不是算法本身而是模型到底该怎么建——用SimMechanics搭物理模型还是用ARX辨识出状态空间模型这两条路我都完整走过一遍各有各的适用场景也各有各的暗坑。这篇就把这两种建模方法的完整思路、实操细节和我自己踩过的坑摊开讲清楚适合正在做双足机器人仿真、或者准备从零搭建Simulink仿真环境的朋友参考。不管你是刚接触Simulink的新手还是已经能跑通联合仿真的老手应该都能从里面找到一些能直接抄作业的东西。1. 为什么双足机器人的建模路线要分两条1.1 双足系统的建模难点到底在哪双足人形机器人和轮式、四足最大的区别在于它是一个欠驱动、变拓扑、强耦合的非线性系统。支撑腿和摆动腿在行走过程中不断切换接触约束时有时无关节之间的动力学耦合非常严重。你没法像机械臂那样简单地用一组固定方程描述它。这就导致建模时面临一个根本性的选择你是想从物理结构出发正向推导还是想从输入输出数据出发反向辨识正向推导就是SimMechanics这条路——把每个连杆的质量、惯量、关节类型、约束关系都定义清楚让仿真引擎自己去解多体动力学方程。反向辨识就是ARX这条路——把机器人当成一个黑箱给它激励信号采集输入输出数据用系统辨识的方法拟合出一个数学模型。两条路没有绝对的优劣关键看你拿模型来干什么。1.2 SimMechanics路线适合什么场景SimMechanics现在叫Simscape Multibody本质上是基于物理网络的多体动力学建模工具。它的核心优势是模型参数有明确的物理意义你可以直接改连杆长度、质量、质心位置然后立刻看到对整体行为的影响。我一般在这几种情况下优先选SimMechanics需要做机械结构迭代比如你想验证不同大腿长度对步态稳定性的影响直接改参数重新仿真就行不需要重新辨识。需要接触力建模双足和地面的接触是核心问题SimMechanics可以配合Spatial Contact Force模块直接建模法向力和摩擦力这是ARX很难做到的。需要和CAD模型对接从SolidWorks、Inventor导出的模型可以直接转成Simscape Multibody省去大量手工建模时间。需要观察内部状态每个关节的力矩、每个连杆的加速度都能直接测量方便做动力学分析。但它的代价也很明显计算量大、仿真速度慢、对参数精度敏感。一个20自由度的双足模型跑1秒仿真可能要几十秒甚至几分钟做优化或者实时控制的时候基本没法用。1.3 ARX辨识路线适合什么场景ARXAutoRegressive with eXogenous input是系统辨识里最经典的一类模型本质上是用差分方程描述输入输出关系。它的思路是我不关心你内部有多少个连杆、每个连杆多重我只关心我给你关节力矩你的关节角度怎么变。ARX模型的标准形式是这样的y(k) a1*y(k-1) ... an*y(k-n) b1*u(k-1) ... bm*u(k-m) e(k)其中y是输出比如关节角度u是输入比如关节力矩a和b是待辨识的参数e是噪声项。这条路适合的场景控制器设计你要设计PID或者LQR有一个低阶的状态空间模型就够了不需要完整的物理模型。实时控制ARX模型阶数低、计算快可以直接嵌入到嵌入式控制器里。数据驱动优化你有一堆实测数据想快速得到一个能用的模型不想花几周时间调物理参数。频域分析ARX辨识出来的模型可以直接转成传递函数方便做Bode图、稳定性分析。代价是模型是黑箱物理意义不明确泛化能力有限超出辨识数据范围的外推可能完全失效对激励信号的质量要求很高。1.4 两条路线的核心对比对比维度SimMechanics物理建模ARX数据辨识建模依据物理参数质量、惯量、几何输入输出数据模型可解释性强每个参数有物理意义弱参数是拟合结果建模周期长需要精确的CAD和参数短有数据就能跑仿真速度慢多体动力学求解开销大快差分方程计算量小接触建模原生支持很难处理泛化能力强参数对了就能外推弱依赖数据覆盖范围适合场景结构设计、动力学分析控制器设计、实时控制实际项目中我经常是两条路一起用先用SimMechanics搭一个高保真模型作为虚拟样机用它生成数据再用ARX辨识出一个低阶模型用于控制器设计。这样既保证了物理正确性又保证了控制器的实时性。2. SimMechanics物理建模的完整落地流程2.1 从CAD到Simscape Multibody的模型导入如果你手上有机器人的三维模型最省事的做法是直接从CAD导入。以SolidWorks为例需要先安装Simscape Multibody Link插件然后在SolidWorks里通过Simscape Multibody Link菜单导出XML和STEP文件。导出的时候有几个细节特别容易出问题坐标系要对齐SolidWorks里的装配体原点要和Simulink里的World Frame对齐否则导入后整个模型是歪的。我一般会在CAD里先把机器人摆成标准站立姿态让基座坐标系和世界坐标系重合。单位要统一SolidWorks默认可能是毫米Simscape默认是米导入后模型可能大1000倍。导出前一定要确认单位设置。质量属性要检查导入后每个连杆的质量、惯量、质心位置都要逐个核对。CAD里的材料密度如果设错了惯量矩阵就全错了。导入完成后Simulink里会出现一个完整的Multibody模型包含所有连杆和关节。但这只是起点后面还有大量配置工作。2.2 关节配置与驱动方式选择双足机器人的关节主要分两类旋转关节髋、膝、踝的俯仰和球关节髋的横滚偏航。Simscape Multibody里对应的是Revolute Joint和Spherical Joint。配置关节时要注意关节限位每个关节都要设上下限否则仿真时腿可能反关节弯曲。膝关节一般限制在0到-150度踝关节俯仰限制在-45到45度。驱动方式可以选择力矩驱动Torque Actuation或者运动驱动Motion Actuation。做动力学分析用力矩驱动做运动学验证用运动驱动。我一般先用运动驱动验证步态轨迹再切换成力矩驱动做动力学仿真。关节阻尼和摩擦真实关节有摩擦模型里不加的话仿真结果会过于理想。我一般会在关节里加一个小的粘性阻尼系数大概0.1到0.5 N·m·s/rad具体值根据实测数据调。2.3 接触力建模双足仿真的核心难点双足和地面的接触是整个仿真里最棘手的部分。Simscape Multibody提供了Spatial Contact Force模块可以建模两个几何体之间的接触力。接触力模型一般用弹簧-阻尼模型F_normal k * penetration^e c * penetration_dot其中k是接触刚度c是阻尼系数penetration是穿透深度e是刚度指数一般取1.5到2。参数怎么定我的经验是接触刚度k太小了脚会陷进地面太大了仿真会震荡。一般取1e5到1e7 N/m^1.5根据机器人重量调。60kg的机器人我一般用5e6。阻尼c一般取刚度的1%到10%用来耗散能量。太小了脚会弹跳太大了接触力会突变。摩擦系数静摩擦0.8到1.0动摩擦0.6到0.8模拟橡胶脚垫和地面的接触。注意接触力参数调不好仿真要么穿透要么爆炸。建议先用单腿落地测试确认接触力曲线平滑后再做完整步态。2.4 仿真求解器配置与性能优化SimMechanics模型跑得慢是常态但可以通过求解器配置大幅优化。求解器选择变步长求解器ode45、ode15s适合精度要求高的场景但步长会自适应变化接触瞬间步长会变得极小导致仿真极慢。定步长求解器ode4、ode1适合实时仿真和代码生成步长固定速度快但精度略低。我一般这样配置仿真步长1ms0.001s这是双足控制的常用周期。求解器ode4四阶龙格库塔定步长。接触力模块的采样时间和求解器步长一致避免代数环。性能优化技巧简化几何体接触检测用的几何体尽量用简单形状球、圆柱、长方体不要用复杂的网格。关闭不必要的可视化仿真时关掉3D动画能快不少。使用Simulink Accelerator把模型编译成MEX文件速度能提升5到10倍。3. ARX辨识建模的实操细节3.1 激励信号设计与数据采集ARX辨识的第一步是给系统足够的激励。如果输入信号太温和系统很多动态特性激发不出来辨识出来的模型就不准。常用的激励信号扫频信号Chirp频率从低到高线性变化能覆盖系统的整个频带。我一般用0.1Hz到10Hz的扫频覆盖双足关节的主要动态范围。伪随机二进制序列PRBS幅值在正负之间随机跳变频谱丰富适合辨识。多正弦信号多个频率的正弦叠加可以精确控制激励的频点。数据采集时要注意采样频率至少是系统最高动态频率的10倍。双足关节的动态一般在10Hz以内采样频率取1kHz足够。数据长度至少覆盖系统主要动态的10个周期。扫频信号一般采集30到60秒。输入幅值不能太大会触发非线性也不能太小信噪比不够。我一般用额定力矩的20%到30%作为激励幅值。3.2 ARX模型阶数选择与参数辨识阶数选择是ARX辨识里最关键的决策。阶数太低模型拟合不够阶数太高模型过拟合泛化能力差。我一般用这几种方法确定阶数AIC准则赤池信息准则在拟合精度和模型复杂度之间取平衡。试凑法从低阶开始逐步增加阶数看拟合度是否显著提升。物理先验如果知道系统大概有几个主要模态阶数可以据此估计。双足单关节一般用2到4阶。MATLAB里的辨识命令% 假设u是输入数据y是输出数据Ts是采样周期 data iddata(y, u, Ts); % 辨识2阶ARX模型 sys arx(data, [2 2 1]); % 查看拟合度 compare(data, sys);[2 2 1]表示输出滞后2阶输入滞后2阶输入延迟1个采样周期。辨识完成后一定要做残差分析如果残差是白噪声说明模型把系统的动态都抓住了如果残差还有相关性说明阶数不够或者有未建模动态。3.3 从ARX到状态空间模型的转换ARX模型是差分方程形式做控制器设计时一般要转成状态空间形式。转换命令% ARX转状态空间 sys_ss ss(sys); % 查看状态空间矩阵 [A, B, C, D] ssdata(sys_ss);转换后得到的状态空间模型可以直接用于LQR、MPC等控制器设计。但这里有个坑ARX转状态空间后状态变量没有物理意义。它们只是数学上的中间变量不代表关节角度或者角速度。如果你需要物理状态得用其他辨识方法比如子空间辨识。3.4 辨识模型的验证方法辨识出来的模型不能直接用必须验证。我一般做三层验证拟合度验证用辨识数据回代看模型输出和实际输出的拟合度。一般要求85%以上。交叉验证用另一组数据不参与辨识测试模型看泛化能力。如果交叉验证拟合度远低于训练拟合度说明过拟合了。频域验证画Bode图对比模型和实际系统的频率响应。重点关注幅值裕度和相位裕度。提示交叉验证是必须做的我见过太多人只看训练拟合度结果模型一上实际系统就崩了。4. 两种方法的联合使用与闭环控制集成4.1 用SimMechanics生成辨识数据的完整流程这是我最常用的工作流SimMechanics当虚拟样机ARX当控制器设计模型。具体步骤在SimMechanics里搭好完整的双足模型配置好接触力。给每个关节施加扫频力矩信号采集关节角度响应。把输入输出数据导出到MATLAB工作空间。用ARX辨识每个关节的模型。把辨识出的模型用于控制器设计。把控制器放回SimMechanics模型里验证。这样做的好处是辨识数据来自高保真模型比实测数据干净没有噪声和干扰。而且可以反复生成不同工况的数据不用担心实验成本。4.2 PID控制器与辨识模型的闭环搭建辨识出ARX模型后最直接的应用就是设计PID控制器。在Simulink里搭建闭环的步骤把ARX模型转成状态空间或者传递函数用Discrete State-Space模块或者Discrete Transfer Fcn模块实现。设计PID控制器用Discrete PID Controller模块。连接成闭环加参考信号和扰动信号。调PID参数看阶跃响应和抗扰能力。PID参数整定的经验先调P从小到大增加直到系统开始振荡然后退回一半。再调I消除稳态误差但太大会导致超调和振荡。最后调D抑制超调但对噪声敏感一般加低通滤波。双足关节的位置控制我一般用PI控制就够了D项容易引入噪声。参数范围大概是Kp50到200Ki1到10具体看关节惯量和减速比。4.3 状态空间模型与LQR控制器设计如果辨识出的是状态空间模型可以用LQR设计最优控制器。LQR的核心是求解Riccati方程得到最优反馈增益K% A, B是状态空间矩阵 % Q, R是权重矩阵 Q diag([100, 100, 1, 1]); % 状态权重 R diag([1, 1]); % 输入权重 K lqr(A, B, Q, R);Q和R的选择是LQR设计的核心Q大更看重状态误差控制更激进。R大更看重控制能量控制更保守。双足平衡控制里我一般给角度误差大的权重给角速度误差小的权重。具体值需要反复试。4.4 联合仿真中的常见问题与排查SimMechanics和ARX模型联合仿真时最常见的问题代数环接触力和关节力矩互相依赖形成代数环。解决办法是在接触力模块里加一个小的延迟或者用定步长求解器。采样时间不匹配SimMechanics是连续求解ARX是离散模型采样时间要统一。我一般把ARX模型的采样时间设成和求解器步长一致。状态初始化不一致SimMechanics的初始状态和ARX模型的初始状态要对齐否则仿真一开始就会有大偏差。排查方法先单独跑SimMechanics确认物理模型没问题再单独跑ARX闭环确认控制器没问题最后联合跑逐步定位问题。5. 实操中踩过的坑与经验总结5.1 SimMechanics参数标定的几个致命细节惯量矩阵的单位CAD导入时惯量单位经常是kg·mm²Simscape要的是kg·m²差10的6次方。我第一次做的时候没注意机器人仿真时像纸片一样轻关节力矩一加就飞了。质心位置CAD里的质心是相对于零件坐标系的导入后要确认是不是相对于连杆坐标系。如果质心偏了重力矩就全错了。关节零位Simscape里的关节零位和CAD里的装配位置可能不一致。我一般会在导入后手动调整关节零位让机器人处于标准站立姿态时所有关节角度为零。5.2 ARX辨识中数据质量的决定性影响数据里的噪声实测数据一定有噪声辨识前要做滤波。但滤波会引入相位滞后影响辨识精度。我一般用零相位滤波filtfilt避免相位失真。数据里的趋势项如果数据有直流偏置或者线性趋势要先去掉否则辨识出的模型会有很大的稳态误差。激励幅值的非线性如果激励幅值太大系统进入非线性区ARX线性模型就拟合不准了。我一般会做多组不同幅值的辨识看模型参数是否一致如果差异大说明非线性严重。5.3 从仿真到实际的模型修正思路仿真模型再准和实际机器人也有差距。我一般这样修正静态修正让机器人保持几个标准姿态对比仿真和实际的关节力矩修正重力项。动态修正给关节施加阶跃力矩对比仿真和实际的响应曲线修正惯量和阻尼。接触修正让机器人单腿落地对比仿真和实际的接触力曲线修正接触刚度和阻尼。修正的顺序是先静态后动态先单关节后整机。每次只改一个参数改完验证避免多个参数耦合。5.4 代码生成与嵌入式部署的注意事项如果要把控制器部署到嵌入式平台Simulink的Embedded Coder可以直接生成C代码。但有几个坑数据类型Simulink默认是double嵌入式平台一般用float或者定点。要在模型里显式指定数据类型。求解器代码生成只支持定步长求解器变步长的不行。模块支持不是所有Simulink模块都支持代码生成用之前要查文档。特别是SimMechanics模块一般不能直接生成代码只能生成控制器的代码。我一般的做法是SimMechanics模型只用于仿真验证控制器部分单独建一个模型用Embedded Coder生成代码部署到实际机器人上。最后分享一个我自己的习惯每次建完模型我都会把关键参数、辨识结果、验证曲线整理成一个文档标注清楚每个参数的来源和调整过程。双足机器人的建模是个反复迭代的过程今天调好的参数过两周可能就忘了为什么这么设。有个文档在手下次改的时候能省大量时间。另外SimMechanics和ARX这两条路不是非此即彼我现在的项目基本都是两条路并行用物理模型保证正确性用辨识模型保证实时性两者互相验证心里才踏实。