状态:契约 v3,输入侧定稿。 DrivoR 侧数字均对
valeoai/DrivoR@main逐行核对, 设计依据来自 ICML 2024 覆盖路径规划工作的实验结论。
一眼版
BEV 支路 N=2 · 8 通道 · 224² → 2 × 16 = 32 token
近图 0.05 m/格(±5.6 m)
远图 0.20 m/格(±22.4 m)
相机支路 N=1 · RGB 640×480 → 16 token
ego 向量 4 维 (v, ω, a, ω̇) → 加到 proposal query 上
──────────────────────────────────────────────────────
上下文 = 48 token
对比 DrivoR:4 路相机 = 64 token,11 维 ego。
一、BEV 支路
通道
| # | 通道 | 来源 | 近图 | 远图 |
|---|---|---|---|---|
| 0 | 静态图 | 地图 | ✓ | ✓ |
| 1 | tanh(0.2·visits) 软覆盖 |
几何记账 | ✓ | ✓ |
| 2 | frontier | 由 0/1 算出 | ✓ | ✓ |
| 3 | occ_a 0.03–0.15 m |
STVL 体素 | ✓ | 0 |
| 4 | occ_b 0.15–1.01 m |
STVL 体素 | ✓ | 0 |
| 5 | occ_c 1.01–2.00 m |
STVL 体素 | ✓ | 0 |
| 6 | z_min 最低回波对地高度 |
STVL 体素 | ✓ | 0 |
| 7 | z_max 最高回波对地高度 |
STVL 体素 | ✓ | 0 |
远图后 5 个通道填 0——「这个尺度上没有雷达数据」本身就是有意义的信息, 雷达标记半径只有 4 m,铺到 ±22.4 m 上没有意义。
为什么远图必须单独过一遍,不能堆成通道
近图第 (100,100) 格是车前 0.5 m,远图同一格是车前 2 m。 两个尺度的像素位置不对应同一个世界坐标——堆成同一张图的通道, 卷积核会把两个不同地点的东西当成同一点。
ICML 2024 那篇专门为此设计了 SGCNN,按尺度分组分别卷积。我们的对应做法是
把近图和远图当成 N=2 塞进同一个 ImgEncoder——DrivoR 的 4 路相机本来就是这么共享 ViT 的。
为什么是 2 级不是 4 级
级数由场地尺寸定。ICML 那篇用 4 级,是因为他们最细一级只有 1.2 m 见方 (32×32 @ 0.0375 m),得叠 4 级才够到 76.8 m。
我们最细一级是 11.2 m 见方,边长就是他们的 9 倍:
| 级 | 我们 | 他们 |
|---|---|---|
| 1 | 11.2 m | 1.2 m |
| 2 | 44.8 m | 4.8 m |
| 3 | 179 m | 19.2 m |
| 4 | — | 76.8 m |
第 2 级 44.8 m 覆盖整层楼绰绰有余,第 3 级纯属浪费。
二、相机支路
| 值 | |
|---|---|
| 路数 | 1(RealSense RGB) |
| 分辨率 | 640×480 —— ÷16 正好 = 40×30 = 1,200 patch |
| 预处理 | 和 DrivoR 完全一致:resize → ÷255 → ImageNet 标准化 |
| GridMask | 保持开启(相机上是合理增强;BEV 支路才必须关) |
| 内外参 | 不用——DrivoR 本来就不消费 cam_K / world_2_cam |
一期就接,走「冻结骨干 + 少量标注」路线。
理由:相机的价值是语义——地上 8 mm 高的东西,是数据线(会卷进滚刷,必须绕) 还是地砖缝(直接压过去)?几何上一模一样,只能看图像。
而冻结的 DINOv2/v3 特征本身已经把语义分开了(拿官方素材跑一遍,
主成分上色后路面、植被、车体、天空各自成片,没人教过它)。所以只需要
在那 16 个 register token 上分出一路轻量辅助头,标几百到几千张就够——
不必标到分割数据集的量级。这和 DrivoR 用 bev_semantic_map 做辅助监督是同一个套路。
三、ego 向量
4 维 (v, ω, a, ω̇) → Linear(4 → 256) → 加到 64 条 proposal query 上
DrivoR 是 11 维、其中 3 维恒为零;我们删掉 pose、vy 换 ω、ay 换 ω̇、命令位闲置。
逐维对照、每一条的理由、以及两条被否掉的自研维度(footprint / 定位置信度), 全部搬到了单独一篇:机器人姿态输入对比 →
一句话记住:ω 是新增的——DrivoR 根本没有角速度,
而 53 次 cusp 硬停恰恰全在原地转那个动作上。
四、明确不要的六样
这一节比上面三节更重要——每一条都是想加过、然后被否掉的。
| 不要 | 理由 |
|---|---|
| 全局坐标 (x, y) | 位置用图给不用数字给。ICML 2024 §3.3 明确比较过并选择不给(详述) |
| footprint 6 顶点 | 一期机构冻结 → 每帧同一组数 → 常量就是死输入 |
| 定位置信度 | 改用 ICML 的做法:训练时往位姿注入高斯噪声,让策略学出鲁棒性,有实验背书 |
| 实时占据(costmap 层) | 带 inflation_radius: 0.55(= 11 格)的膨胀,会把桌腿间隙抹平——正是高度分档要暴露的东西 |
| 深度相机 | 留在 stvl_depth_layer 喂安全否决层。并进 z_min 会把玻璃幻影带进「能不能钻」的判据 |
| 超声波 | enabled: false,2026-06-27 已退出导航,只留驱动层 30 cm 硬急停 |
从这六条里长出来的四条规矩
- 死输入比没有输入更糟。 DrivoR 那 3 维恒零的
ego_pose就是活教材—— 官方自己的另一个 agent 早把它删了,DrivoR 留着纯属照抄没删。 - 图里看得出来的东西,不要再喂一遍数字。 喂了是有损的重复,还会让网络背地图。
- 膨胀是规划器的概念,不是感知的概念。 TransFuser、BEVFormer、占据网络喂进网络的 全是原始几何,没有一个先做膨胀。
- 不同尺度不能堆成同一张图的通道。 像素位置不对应同一个世界坐标。
五、仍待定
- 辅助头预测什么——二分类(前方有无线缆/液体)还是小分割图
- 标注类别与数量
- 相机接入时机——一开始就带,还是先训通纯 BEV 再加?后者可能更稳
- 清扫意图(沿带进度 / 横向偏差 / 目标带方向)——闲置中。
三个量里只有「目标带方向」是
driving_command的真对应物, 另外两个是空间量、BEV 图里本来就有
参考
- DrivoR 怎么处理相机 · 雷达 z 轴怎么编码 · 11 维自车状态 · 覆盖染色图格式 · 为什么不给全局坐标
- Jonnarth, Zhao & Felsberg. Learning Coverage Paths in Unknown Environments with Deep RL. ICML 2024(多尺度、frontier 跨尺度、噪声鲁棒性、TV 奖励)
valeoai/DrivoR@main·turn_on_td25a_robot/config/nav2_params.yaml
