一份可检查的 YAML
image: demo-before.pgm mode: trinary resolution: 0.05 origin: [-1.6, -1.2, 0.0] negate: 0 occupied_thresh: 0.65 free_thresh: 0.196
image 的相对路径按 YAML 所在目录解析。resolution 单位是米/像素,应为正数;origin 的三项是 x、y、yaw,yaw 单位为弧度。Nav2 的 mode 使用 trinary、scale 或 raw 等字符串,不能用数字 0 代替。
用灰度算一次占用量
对 8 位灰度图,negate=0 时可用 p=(255-g)/255 理解 trinary 的分类。g=0 得到 p=1;g=254 得到 p≈0.0039;g=205 得到 p≈0.19608。使用上方阈值时,前两者分别为 occupied 和 free,205 落入 unknown。阈值边界的实现应核对所用 ROS/Nav2 版本。
| g | p(negate=0) | 本例分类 |
|---|---|---|
| 0 | 1.000000 | 占用 |
| 128 | 0.498039 | 未知 |
| 205 | 0.196078 | 未知 |
| 254 | 0.003922 | 空闲 |
灰度检查器
以下只计算本页固定参数的 8 位 trinary 示例,不替代地图服务。可以更改灰度和 negate,观察语义变化。
图像行号为什么要翻转
PGM 的行从上往下增加;地图栅格的 y 通常从下往上增加。设图像高度 H、列号 c、从顶端计数的行号 r,索引均从 0 开始。yaw=0 时该像素中心的地图坐标为:
x = origin_x + (c + 0.5) * resolution y = origin_y + (H - r - 0.5) * resolution
本站 64×48 示例的 r=0、c=0 像素中心位于 (-1.575, 1.175) 米。origin 指向地图栅格的左下边界参考位置,不能解释成图像左上角像素中心。yaw 不为 0 时,还需要用对应旋转矩阵把局部坐标转到地图坐标系。
裁剪后的 origin 怎么变化
假设从左边去掉 L 列、从下边去掉 B 行,分辨率不变且 yaw=0,则新的 origin 为 (origin_x+L·resolution, origin_y+B·resolution)。例如左裁 10 列、底裁 4 行,本例新原点为 (-1.1, -1.0)。从顶部裁剪不会直接抬高左下原点。存在旋转时,应先旋转裁剪偏移再加到原点。
只修改地图像素,不修改几何关系时保留元数据。缩放、裁剪和旋转都需要单独核对,不能靠文件名相同判断地图配套。