跳转至

第 10 章 案例与排障

两条端到端链路把前九章的机制串起来,再沉淀一份"装不上、跑不动、训不对、迁不过去"时按序排查的清单。两个案例走 Newton/MJWarp 后端 + RSL-RL 这条链路;排障条目按症状分类,并标出哪些边界需要完整 Isaac Sim 才能触及。

1. 端到端案例(一):摆杆到收敛并导出

一条把建模、训练、评估、导出、部署时延打通的完整线,每段都对应前面章节给出的接口与判据:

阶段 命令要点 产物
自检 导入 + physics=newton_mjwarp 起一代仿真(第 1 章) 后端可用、场景构建无异常
训练 isaaclab train --task Isaac-Cartpole-Direct-v0 --num_envs 1024 --max_iterations 300 --viz none(第 5 章) 回报随迭代上升、episode 长度涨到上限、成功率收敛
评估 isaaclab play --checkpoint model_299.pt --num_envs 256 --viz none(第 8 章) 载入 checkpoint 并持续 rollout
导出 play 内触发,写 exported/policy.{pt,onnx}(第 8 章) TorchScript 与 ONNX 两份推理产物
部署时延 torch.jit.load 单环境前向(第 8 章) 单步前向远小于 50–500 Hz 控制周期

链路的价值在于每段的输入输出都有明确出处:换 Isaac-Cartpole-Direct-v0 为任一内置任务,命令链完全同构,只是任务配置换文件。

2. 端到端案例(二):四足平地行走起步

四足速度跟踪是 Isaac Lab 的招牌任务。在不装 Isaac Sim 的 Newton/MJWarp 后端上,isaaclab train --rl_library rsl_rl --task Isaac-Velocity-Flat-Unitree-Go2-v0 --num_envs 64 --max_iterations 1 --viz none physics=newton_mjwarp 能正常起步:资产(Unitree Go2)经 S3 自动拉取、环境搭建完成,一代内即输出回报与速度误差指标(error_vel_xy / error_vel_yaw)。

Manager-Based 的 locomotion 任务因此不必先装完整 Isaac Sim 就能离屏训练,后端切换不改变任务配置的写法。

要训到能走,需把 num_envs 提到第 4 章预算内的规模、迭代数拉长,并按第 6 章配好奖励项与(粗糙地形版的)地形课程 Isaac-Velocity-Rough-*。四足训到稳定行走的完整收敛曲线耗时较长,属可扩展项。

3. 版本与安装错配排障

装不上,绝大多数是配对与环境,不是代码:

  • 导入即报模块不存在 / 扩展加载失败:优先查版本配对。Isaac Lab 3.0.0 只配 Isaac Sim 6.2.0.0,5.1 及更早不受支持(第 1 章)。跨小版本混装(如 2.x 的 isaaclab.sh --conda 老流程配 6.x)会让包路径与扩展布局对不上。
  • --extra isaacsim 装不上 / 大 wheel 反复超时:files.pythonhosted、pypi.nvidia.com 直连吞吐可能极低,uv 对大文件不续传。解法是配可达代理并同时设大小写两组代理环境变量(HTTPS_PROXY 与 https_proxy),否则 uv 仍可能走直连(第 1 章)。
  • 驱动/系统下限:isaacsim 轮子要 GLIBC 2.35+(Ubuntu 22.04 恰好满足);文档推荐 Linux x86_64 驱动 595.58.03,但 PyTorch cu130 对 Blackwell 的有效下限更低,580 系列驱动上 Newton 路径可用(第 1 章)。显卡驱动安装与 GPU 观测手段见 linux-note 第 5 章「桌面、显示与显卡驱动」 与 第 8 章「性能观测工具链」。
  • conda 与 uv 混用:3.0 默认 uv 管环境,isaaclab.sh 已降为转发到 isaaclab CLI 的薄壳(第 1 章);把老的 conda 建环境流程硬套到 3.0 上易踩解释器/环境变量冲突。

判据:跨后端先对约定

重力、单位、关节顺序与执行器符号是迁移时最常见的静默错位;换后端或从别的仿真器迁入,先逐项对约定再谈训练。

4. 运行时与显存排障

  • CUDA out of memory:先降 num_envs,再看是不是相机/点云观测在吃显存——带相机的任务单环境足迹大,num_envs 上调空间远小于无相机任务(第 4 章的预算式:每环境足迹 × num_envs ≤ 可用显存)。
  • 首代巨慢、之后才快:第一代含 CUDA graph 编译与 kernel 预热,吞吐读数要看稳态代而非首代(第 4 章)。
  • 训练中途 reward 变 NaN/Inf:向量化下一处发散污染全批(第 4 章)——查 sim.dt 是否过大、有无穿透深碰撞或未限幅的关节速度,从源头设界而非逐环境检查。

4.1 NaN 的定位顺序

单个 NaN 就能吞掉整批统计,这是向量化训练的常态而非罕见:批均值与标准差在出现一个非有限值后整体变成 nan,有限值占比则只从 100% 略微下降——统计量已经失效,却看不出是哪一路量出的事。

状态 批均值 批标准差 有限值占比
健康批次 收敛值 收敛值 100%
出现一个非有限值 nan nan 略低于 100%
bad_env = np.where(~np.isfinite(reward).all(axis=1))[0]     # 先按环境维筛出污染环境
first_step = np.argmax(~np.isfinite(reward[bad_env[0]]))    # 再沿步维定位首个非有限步

判据:每代做一次有限性检查并记录(环境、步、量名)三元组。少数环境出错就足以让整批 loss 变成 nan,而逐环境打印在向量化规模下不可行——先按环境维定位、沿步维回溯物理量,是唯一可行的顺序。

单个 NaN 的定位与恢复顺序:

flowchart TD
    bad["批统计突变:均值/标准差变 nan"] --> isf["isfinite 掩码<br/>按环境维筛出失效环境"]
    isf --> back["沿步维回溯<br/>首个非有限步的动作与接触"]
    back --> rec["记录(环境、步、量名)三元组"]
    rec --> reset["按环境单独 reset<br/>不整批重启"]

坑:NaN 定位按环境维再按步维

单个 NaN 就能让整批统计失效;先 isfinite 掩码按环境筛出污染项,再沿步维回溯首个非有限步的动作与接触,最后只 reset 坏环境。

5. 建模与约定坑

跨后端、从别的仿真器迁移时,最容易静默出错的是约定不一致:

  • 四元数顺序:Isaac Lab 3.0 用 (x, y, z, w),identity 是 (0, 0, 0, 1)(w 在末位)。从 wxyz 习惯(如老版本或某些工具)平移时若不换算,初始姿态会莫名翻转——第 2 章的 init_state.rot 即按此序。
  • 单位:关节角、角速度一律弧度制;URDF 里以度标注的关节限位导入要确认已转弧度。scale/use_default_offset 决定动作是"相对默认角的增量"还是绝对目标(第 3 章),配错会让策略动作整体偏移。
  • 资产路径与命名空间:随环境克隆的实体必须挂 {ENV_REGEX_NS},全局实体才挂 /World(第 2 章);远程资产经 S3 提供自动拉取。URDF Importer 3.0 已移除 convert_mimic_joints_to_normal_joints 等旧选项,沿用会告警。
  • 后端属性类不通用:物理属性覆写类分 PhysxRigidBodyPropertiesCfg/NewtonRigidBodyPropertiesCfg/MujocoRigidBodyPropertiesCfg,physics= 换后端要换对应类,挂错静默失效(第 4 章);随机化字段同理(第 6 章:Newton 仅单一摩擦系数)。
  • 观测顺序/尺度:真机部署拼观测向量必须与训练期 policy 组逐维同序同尺度,错位即失灵(第 9 章)。

6. 要点

  • 两条端到端链路:cartpole-direct 走完"训练→评估→导出→推理时延"全程(回报收敛、两份推理产物、单步前向远低于控制周期);四足 go2 平地速度任务在 Newton 后端可离屏起步(无需先装 Isaac Sim)。
  • 装不上先查配对(Isaac Sim ≤5.1 不支持、GLIBC 2.35、uv+代理双大小写变量),显卡驱动与 GPU 观测回引 linux-note 第 5、8 章。
  • 跑不动查显存预算(相机是主因)与首代编译预热;reward 变 NaN 从 sim.dt/限幅在源头设界,勿逐环境查。
  • 约定坑以"静默失效"为特征:四元数 (x,y,z,w) 序、弧度单位、{ENV_REGEX_NS} 与资产路径、后端属性类不通用、观测逐维同序——迁移前逐项核对。
  • 四足完整收敛曲线、PhysX 路径的仿真表现与 ROS 2 / LEAPP 的端到端部署,按各自版本的文档与发布说明核对;覆盖范围是 Newton + RSL-RL 这条链路。

参考文献与延伸阅读

  • Isaac Lab. 文档入口. 文档
  • NVIDIA. CUDA Toolkit 文档. 文档
  • Isaac Sim. 文档入口. 文档