仅看车辆回正或喷流画面不足以证明控制器有效。这里同时检查控制链路,并在没有 Three.js、车模或动画的环境中运行同一套驾驶物理代码。
三组实验使用相同初态:离地 10 m、滚转倾角 150°、向前 5 m/s、下降 1 m/s,角速度为 [0.7, 0.2, 0.1] rad/s。满气 400 kg,总质量 2,140 kg。下抓力关闭,运行期间不补气,不触碰地图边界。
| 条件 | 实际喷力峰值 | 接触闭合速度 | 结果 | 运行期间复位 |
|---|---|---|---|---|
| 姿态辅助开启 | 58.98 kN | 0.285 m/s | 平稳落地 | 0 次 |
| 姿态辅助关闭 | 0 N | 13.885 m/s | 车身撞地 | 0 次 |
| 辅助仍开启,但物理引擎禁用全部喷嘴 | 0 N | 13.885 m/s | 车身撞地 | 0 次 |
后两组每一帧的位置、姿态、速度和角速度完全一致,最大数值差为 0。第三组控制器仍在计算和发出命令,但没有实际喷力就无法回正。这比观察辅助开关或喷流动画更能说明因果关系。
这些是指定初态下可重复的仿真证据,不是 Tesla 实车认证,也不能保证所有高度、速度和姿态都能救回。
驾驶控制代码每 20 ms 读取实际姿态、角速度、速度和剩余气体,计算 12 个喷嘴的阀门命令。它把命令送到MuJoCo 运行时,不把目标姿态写回车身。
运行时计算阀门滞后、剩余压力、实际喷力和耗气,把喷力施加到固定喷嘴位置,由 MuJoCo 每 2 ms 积分一次。力臂产生力矩。风机、轮轴和空气阻力也以力或力矩进入求解器。渲染层只读取物理姿态并插值显示。
代码中的目标四元数是反馈控制器追踪的目标,不是车身姿态。质量更新时的
mj_getState / mj_setState
原样保存并恢复积分状态,不会把车摆正。测试还检查相邻帧的姿态变化是否与角速度相容。
确实会主动复位的入口是初始化、R /
回中、触碰地图边界,以及实验装入初态。驾驶帧包含
resetSerial 与
resetReason;边界复原会显示“已到边界 ·
返回起点”。触边回中不能算作辅助救车成功。物理计算异常现在只报错,等待手动回中,不再自动重置姿态。
在站点源仓库根目录执行
node test-driving-assistance.mjs。它直接运行发布用的驾驶核心和
MuJoCo
WASM,不加载渲染器。初态、控制参数、每帧姿态、角速度、实际喷力、阀门开度、气量、压力和复位计数都保存在上方可下载的
JSON 中。
也可以在远离地图边界的空中按 M 关闭辅助:阀门以 25 ms 的时间常数逐渐关闭,HUD 总喷力会衰减,车辆继续按惯性和重力运动。再次开启时,控制器从当下真实状态重新计算。手动操作只能作直观检查;严格比较应使用上面的相同初态对照。
驾驶采用未调压供气假设,压力比例为
(剩余气量 / 初始气量)^1.2。剩一半气体时,压力及单喷嘴可用推力上限只剩约
43.5%。因此“还有气”不等于“仍有足够推力”。
| 同一 kickflip 测试 | 原配置 | 当前配置 |
|---|---|---|
| 初始气体 | 260 kg | 400 kg |
| 满气总质量 | 2,000 kg | 2,140 kg |
| 动作后剩余气体 | 103.7 kg | 237.1 kg |
| 最低压力比例 | 33.2% | 53.4% |
| 落地结果 | 成功 | 成功 |
30 m 高、倾斜 150° 的测试中,原配置最低压力约 21.8%,因接触力峰值超标判为硬着陆;400 kg 配置最低压力约 47.6%,落地通过。这不是“耗尽才失败”的情况。
扩大气量保留了原来的喷嘴峰值、总流量上限、比冲和压力衰减模型,同时增加气体质量。没有空中补气或无限喷力。520 kg 的另一个试配在全油门坡道测试中仍出现硬着陆,因此更多气体不保证所有控制过程更好。
400 kg 气罐与喷嘴参数是沙盘假设。额外气体质量已计入,气罐容积和结构重量尚未按真实硬件重新设计。正式飞行实验与 JEV 的历史配置和结果保留原样。