E4 验证与交付范围#

Learning home · MuJoCo contents

Course text is primarily Chinese, with English terminology and summaries. The original content is preserved.

任务:MuJoCo #5,A6 传感器、渲染与可视化。固定 MuJoCo 3.15.0 源码 9ea3cdfcae93bf2cc4dc0e1a1627c5a39a1e06e5。从实际 main 85d8f4b9eef2f603a0ed98f13cc00a0d6c950cd0 创建 docs/e4-sensors-rendering;开始前核对干净工作树、E1 前置及无未关闭 PR。远端发布状态以主审和 Git 历史为准,本记录不把本地提交当作发布。

Issue 验收映射#

范围

交付

边界

原生传感器

传感与采样:sensor地址/维度/单位、IMU、相对frame、contact/tactile、noise/cutoff、history、disable/sleep、用户/plugin分派

不把元数据当噪声模型,不把全部传感器当同一采样时刻;插件完整实现留E6

原生几何查询与相机

相机与查询:坐标、投影、range/depth、像素中心、ray过滤、距离上限、主点/正交路径差异

没有像素对齐、遮挡或传感器运行验收;按固定源码限定假设

RGB/depth/segmentation

渲染与viewer:mjv/mjr分层、实际classic路径、数组shape/dtype、深度反变换、对象标签、显示组/容量

未创建GL context、未生成图像;显示项不等于碰撞对象

headless与交互

同篇:导入时provider选择、线程/current context、资源上传与释放、passive双向sync及state_only调用forward

未验证EGL/OSMesa/GLFW/macOS设备;Filament明确为另一套接口,后端完整课程仍E6

原创片段与练习

单状态观测片段,三篇共24道带答案练习

1个Python、1个XML;不显式step,但若执行将编译/forward/render,本轮全部未执行

导航与来源

中英文README、curriculum/roadmap、source map/manifest

保留Sim Atlas首页;E5/E6仍是独立待开发阶段

实际静态检查#

git diff --check
git diff --cached --check
python scripts/check_docs.py
python scripts/check_examples.py

本机 Python 3.10.12 与 CI 使用的 Python 3.12.12 下均执行文档/语法脚本:本地 Markdown 链接通过;全仓 5 个 Python 文件、3 个文档 Python 片段、4 个 XML 文件文本解析通过。示例仅 AST/ElementTree 解析;没有 import MuJoCo、MJCF schema 验证、模型编译、forward/step、传感器执行、渲染、viewer、headless初始化、实验、训练或benchmark。

对 sources.json 的 44 个官方文件按 SHA1("blob <byte-count>\0" + bytes) 计算身份并对照固定官方 Git 树,全部一致;全仓本引擎 blob URL 均固定同一SHA、收录manifest,行锚存在且有序。文件身份与行号验证不等于审计整个文件;结论所依赖分支另经人工阅读。新增引用13个文件,完整路径/用途见source map,未将只下载的候选文件计作已交付知识。

首轮 source-link 检查发现 rendering/classic/gl_context.py#L17-L63 超过该文件56行,修正为L17–L56并重跑通过。另一次 git diff --check 在非仓库工作目录返回129,已在正确仓库目录及暂存新增文件后重新运行,通过;失败不作为已验收。没有通过放宽检查、跳过新增文件或运行native来掩盖失败。

固定源码与文档措辞差异#

项目

本课采用的证据与处理

noise、cutoff

noise只是元数据;一般cutoff是幅值限制而非低通频率;碰撞sensor另有查询语义,contact忽略

history

内置sensor读与advanceStart写分开;超出最老边界钳为最老值,并非无限回放;USER/PLUGIN未走同一读取分支

contact found

匹配循环直接遍历d.contact,不筛正力/efc_address;无力记录也可能found>0。netforce无匹配仍写固定normal/tangent,必须据found判空

tactile

实际3N通道优先;正穿透max、切向abs投影累加;支持分派中的六类primitive/SDF/带octree mesh,hfield不在支持分支;不照抄XML页“仅SDF”的旧限制

相机路径

camprojection忽略principal/orthographic,camera ray显式intrinsic主点中心偏移与正交横向范围有版本差异;不承诺与渲染像素一致

classic Renderer

旧renderer.py是转发文件;实际代码在rendering/classic,shape采用(H,W),不照抄docstring局部(width,height)文字

depth、segmentation

depth为轴向长度,背景far;segmentation为(objid,objtype)与(-1,-1)背景,不是body/class label,out也非统一复用规则

passive viewer

默认可视化副本复制与state_only的INTEGRATION+forward分支分开;sync可回传GUI输入,不能视为无副作用显示

Filament

独立Context/scene/target/view、CPUbuffer读回,render等待且返回None;不以同名Renderer套用classic契约

逐项固定行锚分别位于三篇正文,不用一个宽泛文档URL替代实现依据。低层distance函数、classic投影视口计算也沿调用链核对,避免只读sensor上层就推断所有geom/相机行为。

自审、未决项与下一阶段#

实现者完成本地自审,重点核对单位/shape、frame和作用侧、内置/扩展边界、版本差异、示例所有权与未运行声明。此记录不声称独立主审已通过;主agent负责复审及远端交付。没有向上游发Issue、修改引擎、向DexLab写结果或复做实验。

课程主线没有为“凑齐”内容而遗留未标注的API身份;明确未验证的是实际包/驱动可用性、模型编译、图像朝向与像素匹配、回调/plugin与history组合的运行行为和传感器/渲染数值。版本源码中存在的差异已写明,未来实际使用时应针对所选路径核验,不据本文推断最新版是否已修正。

下一项建议 E5:E2控制/任务与本轮E4观测的课程前置已具备,可继续原生批量隔离、学习接口和带时间/来源的数据契约;仍需本轮主审发布后另行派发。E6继续承担完整后端、插件、flex/IPC扩展,E4的边界说明不替代它。实验最终复用DexLab的原始版本/配置/工况,不建立另一个benchmark或评分器。

Course source · GitHub · License