ADAMS与MATLAB联合仿真:单足跳跃机器人模型与PID控制实战
2026/9/11 17:26:14 网站建设 项目流程

简介:面向单足机器人跳跃仿真的ADAMS与MATLAB联合仿真工程包,适合从事多体动力学、腿部机器人控制算法设计与验证的研究者、学生或工程师,可用于复现单腿跳跃全过程。压缩包共17个文件,约6.21MB,覆盖ADAMS标准模型文件(biq/bin)、MATLAB/Simulink控制模型(mdl)、控制器脚本(m)以及批处理、通讯配置、结果图形等辅助文件,能够直接支撑联合仿真、数据导出与后处理分析;已有267人学习下载。工程中提供的PID控制模型、仿真参数和结果文件,既有利于理解腿部构型建立、跳跃驱动施加、空中姿态保持和落地缓冲等关键环节,也可借助后处理绘制位移、速度与加速度曲线;其模块化思路便于迁移到仿人机器人或单足平台上,为后续控制优化与实验验证提供实用参考。

1. 拆开Adams_Onelegged.zip:单足跳跃联合仿真的模型包到底能做什么

解压这个压缩包,迎面是几十个扩展名各异的文件:MODEL_1_3D_v5.bin、TriD_Hopping_Control_PID.m、TriD_Hopping_Control.mdl.r2010a、adams_sys_.mdl、adamsctl_6994.bat,外加一堆.adm、.cmd、.res、.gra。这不是一份简单的三维模型,而是一条完整的ADAMS与MATLAB联合仿真链路:ADAMS负责三维多体动力学的建模、接触和数值求解,MATLAB负责PID控制器和期望轨迹生成。单足跳跃对关节力矩时序、落地缓冲和姿态稳定要求极高,把控制环放到Simulink里调,比在ADAMS里反复改前馈力更接近工程实际。这个包适合两类人:一是做机器人控制、多体动力学课程设计的学生,想直接拿到“能跑出跳跃动画”的起点;二是用ADAMS做仿真、又需要接入复杂控制算法的工程师。复现它需要本机同时装好ADAMS和MATLAB,版本跨度不宜太大,否则二进制模型文件会打不开。

2. 模型文件拓扑梳理:从.bin/.adm到.cmd,把单足机器人读进ADAMS/View

模型层在包里给出两种载体:MODEL_1_3D_v5.bin和.biq是二进制模型文件,TriD_Hopping_Control_PID.adm和.cmd是文本命令文件。很多人一上来随便双击,要么提示“模型版本过高”,要么打开一个空白视图。正确路径是:优先用ADAMS/View读取二进制文件,再用.cmd做命令流复现,.adm则作为跨版本迁移的保底方案。

2.1 二进制模型与文本模型的分工

.bin/.biq保存ADAMS/View内存里的完整模型状态,包括几何显示、约束和仿真设置,缺点是跨大版本兼容性差。.adm是纯文本的多体模型描述,记录几何点、质量、关节、力、约束,便于做文本对比;.cmd是ADAMS/View命令脚本,导入它等于把建模操作重放一遍,适合参数化复现。在这个包里,TriD_Hopping_Control.mdl.r2010a说明Simulink模型是R2010a时代的产物,因此ADAMS版本选2010到2019这个区间比较稳妥。

2.2 在ADAMS/View里打开MODEL_1_3D_v5并核对约束拓扑

常规做法是File -> Open,文件类型选ADAMS Binary,指向MODEL_1_3D_v5.bin。如果报版本错误,再File -> Import,选ADAMS .adm格式。为了批量可复现,我通常把下面的命令存成load_model.cmd,用adams view命令行执行:

! load_model.cmd 读入模型并清点约束 model restore file_name = MODEL_1_3D_v5.bin model display model_name = .MODEL_1_3D_v5 information list constraints model_name = .MODEL_1_3D_v5

第一行从二进制恢复模型,第二行把模型设为当前显示对象,第三行列出所有约束。执行后会看到类似“JOINT_1: Revolute on ground -> thigh”“JOINT_2: Revolute thigh -> shank”“CONTACT_1: foot ground”的列表,说明髋、膝、踝和脚地接触都在。如果只有几何没有约束,说明.bin和.adm内容不一致,应改用.cmd重新生成。

提示:ADAMS/View的命令语言关键字大小写敏感,后续查找状态变量时,保持一致的大小写拼写,否则变量找不到。

2.3 状态变量与输入输出接口的检查

联合仿真的核心不是几何外形,而是ADAMS/Controls接口里定义的状态变量。打开.cmd文件,搜索state_variable,能看到类似这样的块:

state_variable create variable_name = .MODEL_1_3D_v5.TOR_KNEE & function = "if(.MODEL_1_3D_v5.DOF_KNEE>0: 0, VAR_KNEE_TORQUE, 0)"

这段命令的作用是把Simulink传入的力矩信号映射成ADAMS内部力矩变量。function里的正负号代表作用方向,单足机器人最容易犯的错误就是把膝关节力矩方向写反,导致PID输出越大,腿反而越弯。检查完状态变量后,要确认plant input和plant output的顺序。ADAMS/Controls导出的adams_sub模块,端口顺序由Input Signal和Output Signal列表决定。一般单足模型至少是两个力矩输入(髋、膝),输出是关节角度、角速度,也可能包含质心位移。端口顺序错位,会让PID把角度信号当力矩用,仿真起步即发散。

以下是包内模型相关文件的小结:

文件扩展名类型主要作用
.bin/.biq二进制模型带显示信息,打开快,跨版本兼容弱
.adm多体模型文本几何、质量、关节和力的完整描述
.cmd命令脚本重放建模、仿真、后处理操作
.xmt_txt导出模型给第三方CAD或多体工具
.res/.gra结果/图形后处理曲线与动画数据

3. MATLAB接管控制环:TriD_Hopping_Control_PID.m与adams_sub接口的PID映射

ADAMS能解刚体动力学,但一个稳定的单足跳跃需要轨迹规划、闭环反馈和阶段切换,这更适合放在Simulink里做。TriD_Hopping_Control_PID.m负责在仿真开始前把PID参数、期望关节角、模型全局量写进MATLAB工作区;TriD_Hopping_Control.mdl.r2010a则把这些参数连接到adams_sub模块上。版本兼容上,如果你的MATLAB高于R2010a,打开.mdl时选择“另存为当前版本”即可,不用修改模型的逻辑。

3.1 初始化脚本TriD_Hopping_Control_PID.m的常见结构

不同ADAMS版本生成的.m文件格式略有差异,但核心动作一致:定义物理参数、PID增益、期望角度、Simulink全局变量。一个典型单足跳跃PID初始化脚本是这样组织的:

% TriD_Hopping_Control_PID.m - 单足跳跃控制参数初始化 clear; clc; % 物理量:质量、重力加速度 m = 34; % 机器人等效质量 [kg] g = 9.80665; % 重力加速度 [m/s^2] % 姿态期望值,单位 rad hip_ref = 0.05; % 髋关节期望角度 knee_ref = 1.25; % 膝关节期望角度(起跳前预蹲) % PID 增益:先给线性化后的保守值 Kp_hip = 2800; Kd_hip = 120; Kp_knee = 6500; Kd_knee = 520; % 跳跃阶段时间常数 t_pre = 0.3; % 预蹲时间 [s] t_pushoff = 0.15; % 蹬伸时间 [s] ts_sim = 5.0; % 仿真总时长 [s] % 为 Simulink 的 adams_sub 预留变量结构 adams_sys_parameters.model = 'MODEL_1_3D_v5'; adams_sys_parameters.inputs = {'TOR_HIP','TOR_KNEE'}; adams_sys_parameters.outputs = {'THETA_HIP','THETA_KNEE',... 'DTHETA_HIP','DTHETA_KNEE'};

Kp_knee和Kd_knee不是最终值,它对应弹簧-质量模型的一阶近似,量级约为$Kp \approx m g / l$。实际调参时,根据ADAMS后处理里的质心高度曲线做缩放,增益乘0.1到10倍去扫。最后的结构体adams_sys_parameters是给adams_sub S-Function读的,inputs和outputs顺序必须和ADAMS/Controls里定义的一致。

3.2 adams_sys_.mdl与adams_sub的输入输出顺序

ADAMS/Controls导出联合仿真模块时,自动生成adams_sys_.mdl,里面放着一个封装好的adams_sub S-Function。双击它,参数表大致如下:

参数名称典型值说明
Model File NameTriD_Hopping_Control_PID.adm关联的ADAMS模型
Input SignalsTOR_HIP, TOR_KNEE来自PID控制器的驱动
Output SignalsTHETA_HIP, THETA_KNEE, DTHETA_HIP, DTHETA_KNEE反馈给控制器
Communication Interval0.001联合仿真交换数据周期
Result FileTriD_Hopping_Control_PID.res保存ADAMS求解结果

在Simulink模型里,adams_sub左边的In端口依次接收髋力矩和膝力矩,右边的Out端口输出反馈状态。如果.m中的inputs顺序写反,或者PID增益极性判断错误,关节会立刻超限。快速判断极性的办法是:把PID增益设为0,只给固定前馈偏置,观察脚是否按预期蹬地。若蹬地方向反了,把对应关节的输入力矩取负。

3.3 PID参数映射和单位换算

ADAMS默认单位制是mmks,即长度mm、质量kg、时间s、力N,力矩单位是N·mm。而MATLAB控制脚本里习惯用N·m。如果.m文件直接用N·m计算,必须换算:1 N·m = 1000 N·mm。接口层没有加单位转换时,PID输出会小三个数量级,表现为关节几乎不动,但控制量看起来正常。我习惯在.m定义比例因子,并在Simulink PID输出端串一个Gain:

% 在.m中定义单位换算,避免每次改模型都翻单位 tau_scale = 1000; % N·m -> N·mm Kp_knee_mm = Kp_knee * tau_scale; Kd_knee_mm = Kd_knee * tau_scale;

对应Simulink里,PD控制器计算出的力矩乘以tau_scale,再进adams_sub。除了单位,还有代数环问题:adams_sub在离散求解时,反馈通道经过微分或直接用了输出信号,Simulink会检测到代数环。常见做法是给控制器输出加一个MemoryUnit Delay块,把瞬间代数依赖打破,联合仿真才能顺利初始化。

4. 把联合仿真跑起来:adamsctl批处理、求解器配置与结果文件后处理

模型读进来了,控制环接上了,下一步是把整体跑通。很多人直接在Simulink点Run,结果MATLAB卡在初始化界面,或者报Unknown ADAMS error。要理解这套文件的使用链:TriD_Hopping_Control.mdl不是独立模型,它会调用adamsctl_*.bat去拉起ADAMS求解器进程。

4.1 adamsctl_*.bat的作用与启动校验

每次在Simulink里开始联合仿真时,ADAMS/Controls会在工作目录生成一个adamsctl_随机数.bat。本包里有两个:adamsctl_6994.bat和adamsctl_45818.bat,说明至少跑过两次联合仿真。批处理负责设置环境变量、启动ADAMS求解器、监听通信端口。内容大致如下:

@echo off set ADAMS_CONTROL_PORT=6994 call "C:\MSC.Software\Adams\2019\common\mdi.bat" adams ru-solver modelname=TriD_Hopping_Control_PID ...

ADAMS_CONTROL_PORT是ADAMS和Simulink通信用的本地TCP端口,每次运行会随机生成。如果系统杀毒软件拦截本地端口监听,Simulink会停在“Initializing ADAMS”很长一段时间。经验做法是把ADAMS安装目录加入白名单,并允许adamsctl_*.bat访问网络。另一个容易踩的坑是工作目录不能有中文,否则批处理里调用mdi.bat时路径解析失败。

4.2 求解器配置:固定步长与积分器选择

Simulink侧的参数不能照搬默认。推荐如下配置:

位置参数推荐值说明
SolverTypeFixed-step变步长会使通信点错位
SolverFixed-step size0.001与ADAMS通信周期匹配
SolverSolverode4 (RK4)平衡精度与速度
adams_subCommunication Interval0.001必须与步长一致或整数倍
Stop time5覆盖一次完整起跳落地

如果ADAMS侧本身是自适应步长,Simulink固定步长不再是硬性要求,但为了结果可重现,统一用固定步长更稳妥。求解器方面,ADAMS默认GSTIFF适合强耦合、含高副约束的机械系统;HHT对接触和柔性阻尼问题更稳定。单足跳跃落地瞬间有接触力突变,我一般先试HHT,积分误差容差设为1e-4,若计算太慢再换回GSTIFF,并把容差放宽到1e-3。

4.3 结果文件.res/.gra/.req的后处理

仿真结束后,包里的TriD_Hopping_Control_PID.res、.gra和.req会更新。.res是ADAMS求解器二进制结果,包含所有位移、速度、加速度和接触力;.gra是ADAMS/View图形动画数据;.req是用Request定义的输出通道。重复利用这些数据,可以在ADAMS/PostProcessor里直接读.res画曲线。要在MATLAB里做参数辨识,建议导出成csv或mat,然后统一分析:

% 读取ADAMS导出数据(假设通过export生成timeseries) load('jump_result.mat'); t = jump_result.time; zc = jump_result.signals.values(:, 3); % 第三列是质心高度 [zc_max, idx_max] = max(zc); fprintf('最大高度 %.3f mm,时间 %.3f s\n', zc_max, t(idx_max));

这里zc_max的单位取决于ADAMS模型单位制。如果模型是mmks,高度就是mm。与理论值对比时,把mm换成m再代入能量公式$mg\Delta h = \frac{1}{2}mv^2$,可以反推起跳初速度。课程设计报告里的数据对不上,多数是单位没有换算。检查.res是否有效,还可以看aview.log里的错误消息;.msg文件如果包含“Warning: step size too small”,说明系统刚度过大,优先降低通信步长或改用HHT。

5. 调参排错:跳跃落地发散的四个检查点与参数修正

5.1 接口方向:先加一个固定前馈验证力矩极性

把Simulink中所有PID增益设为0,在求和节点前加一个常值力矩。膝关节给200 N·m,髋关节给0,观察模型是否做出伸膝蹬地动作。如果反了,把对应输入力矩取负即可。这一步能规避后续调参时“越调越乱”的困境。

5.2 落地发散:先调接触与积分器,再动PID

仿真在起跳阶段正常、着地瞬间发散,往往是接触参数不合适,而不是PID问题。在.cmd或.adm中搜索contact,典型设置是STIFFNESS=1.0E+05 DAMPING=1.0E+02。若落地时接触力突变太大,先把刚度减半,阻尼增加30%,同时把Simulink固定步长从0.001降到0.0005,观察是否仍发散。多数情况下,发散起源于积分器无法收敛脚底接触力,而不是增益过大。

5.3 膝关节速度反馈是落地缓冲的关键

单足落地时,膝关节需要先屈曲再伸展来耗散能量。只靠位置PID会硬碰硬。正确做法是把期望膝角速度设为0,并在触地后的阶段提高Kd_knee。比如在.m中加一个阶段分支:

% 落地缓冲:t_touch 后提高膝阻尼 if t > t_pre + t_pushoff && t < t_pre + t_pushoff + 0.2 tau_knee = Kp_knee*err_knee - 2.5*Kd_knee*dq_knee; else tau_knee = Kp_knee*err_knee - Kd_knee*dq_knee; end

系数2.5表示落地瞬间阻尼增益抬升,具体倍数根据质心高度过冲量选择;过冲超过30%时,抬到4倍,并减少期望伸展角。

5.4 用曲线而非动画判断稳定性

动画看起来“好像稳了”不代表稳定。要看三条曲线:质心垂直位移是否只出现一个主峰且第二个峰值小于第一个的15%;髋关节角是否在±0.2 rad内收敛;膝关节力矩在落地瞬间是否出现正常的正负交替。如果质心高度曲线出现高频振荡,检查.adm中的质量是否与.m中m一致,常见错误是把kg与t混用,导致控制增益相差1000倍。检查顺序按极性、接触、速度阻尼、单位依次来,每次只改一个变量,保留对应的.res文件作对比,就能快速定位问题点。

本文还有配套的精品资源,点击获取

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

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

立即咨询