本节摘要:MuJoCo 自带一套以「让算法与工程师看见场景」为目标的渲染系统:读 mjData 的状态,按相机的位姿与内参出图,既能弹窗交互调试,也能离屏渲染生成视觉观测。它没有游戏引擎的光影豪华,但像素级忠实于物理状态——对 RL 观测、控制器调试、结果展示三个用途绰绰有余。本节给出观测管线的标准接法、相机与光照的配置要点、以及「什么时候必须请外部渲染」的判断线。
前两节解决了「算得到」,本节解决「看得见」。渲染在 MuJoCo 里的定位一开始就要摆正:它是物理状态的忠实显示器,不是美术管线。这个定位决定了它的强项与边界,也决定了「什么时候够用、什么时候换人」的判断。
MuJoCo 渲染的原料清单极短:mjModel 里的几何、材质、光源定义,加上 mjData 里的当前位姿。渲染器按相机的位姿与视场角把这些内容投影成图——没有粒子特效、没有后处理链、没有动态阴影调试面板。像素与物理状态的关系是「所见即所测」:画面里机械臂末端在某处,mjData 里的坐标就是那里,不存在「看起来在这、实际算到那」的美化偏差。
这个特性是双刃。对算法,它是福气:视觉 RL 的观测与真实状态严格对应,不会学进「渲染美化」的伪相关。对展示,它是短板:宣传片、汇报视频的观感天花板明显。判断线因此很清晰——交付物是策略或数据,自带渲染够用;交付物是画面本身,物理输出喂给专业渲染栈(第一章选型时提过这条,本节给出操作细节)。
用法一:交互窗口调试。 加载模型后弹一个查看器,鼠标转视角、拖关节、单步执行——建模期的主力工具,第二章其实一直在用它。这里只补一个专业习惯:把常用视角存成 MJCF 里的命名相机,调试时一键切换,比每次手拖快且可复现。
用法二:离屏渲染生成观测。 视觉 RL 与基于图像的控制是它的大场面:不弹窗、不开屏幕,渲染到内存缓冲,作为观测直接进训练管线。标准接法十行以内:
import mujoco import numpy as np model = mujoco.MjModel.from_xml_path("scene.xml") data = mujoco.MjData(model) renderer = mujoco.Renderer(model, height=240, width=320) mujoco.mj_forward(model, data) # 刷新位姿 camera_id = model.camera("wrist_cam").id renderer.update_scene(data, camera=camera_id) pixels = renderer.render() # 高宽乘通道数的数组 print("观测图像形状:", pixels.shape) # 喂给策略前通常做三件事:缩放、归一化、必要时转灰度 obs = pixels.astype(np.float32) / 255.0
三个工程细节决定观测质量。分辨率:一百二十乘一百六十的观测就能支撑大量抓取任务,分辨率翻倍训练开销跟着翻倍,按任务下限取;相机位姿:腕部相机跟随臂动,观测分布剧烈变化,训练早期常用「第三人称全局相机」过渡;时间戳对齐:渲染读的是最近一次 forward 后的位姿,3.5 节讲过的「过期一步」问题在视觉观测里同样存在,采样纪律照搬。
用法三:结果展示。 录制视频、拼接多相机画面、叠加轨迹曲线——自带渲染出「干净工整」的画面没有问题,配合离屏渲染逐帧导出即可。要光影质感,把同一份 mjData 的位姿流导出,交给游戏引擎或专业渲染器「回放」——物理与美术各司其职,这是第一章说的混合栈在渲染问题上的落点。
渲染参数不用学图形学,按任务角色配。给算法看的画面,三个参数最要紧:视场角要贴近真机镜头(视觉 sim-to-real 的对齐项之一,视角差个二十度,策略迁移就打折扣);光照保持简单稳定,一到两盏固定方向光,刻意避免复杂光影——观测里的阴影变化是策略容易过拟合的伪特征;背景与地面纹理适度即可,棋盘格地面是经典选择,给策略提供运动参照又不至于喧宾夺主。
给工程师看的画面,另三件事要紧:命名相机覆盖关键机位、模型分色(左右件、动静态用颜色区分,装配关系一眼可辨)、以及把重要 site 显式画出来(末端目标点、传感器位置可视化,调试效率立涨)。

视觉任务的训练吞吐瓶颈通常不在物理而在渲染——一步物理几十微秒,一帧渲染毫秒级,差着两个量级。三招管住这笔账:降分辨率是第一杠杆,观测尺寸减半像素量减为四分之一;降频采样,物理两步渲染一次(视觉观测的合理频率通常就是几十赫兹,与真机相机一致,顺便对齐了 sim-to-real 的采样率);多环境合批,第七章的 GPU 路线把渲染也批量化,上千环境的画面渲染进同一张纹理图集——这是视觉任务上 GPU 并行的额外红利。
反向的坑也报备一下:调试时开着交互窗口跑长训练,窗口刷新会持续吃掉主线程时间——训练脚本与调试窗口分开跑,是低成本高回报的习惯。
至此第四章的备货完成:扩展力学与视觉观测都齐了。下一章正式上主菜——用这台配齐了感知与动力的引擎构建强化学习环境,把控制器跑起来。