第 1 步的 remove_ground 按“离雷达多高”一刀切。路面一斜,这一刀就切错了。下面是假雷达在 4% 上坡上扫出来的一圈真实点(20016 个),一步一步看:一刀切错在哪,RANSAC 怎么把路面找出来。
| 第几次抽 | 抽到的 3 个点 | 定出来的平面 | 票数(离平面 < 0.15 米的点) |
|---|
从侧面看,路面点排成一条斜线(灰),车和人的点竖在线上面(蓝)。侧面看只要 2 个点就能连成一条线;3D 里是 3 个点撑起一块板,道理一样。下面一次一次地试:随便抽 2 个点 → 连一条线 → 数有几个点贴着这条线(离它不到 15 厘米,就是线两边的浅绿带子)→ 记下来。全部试完,贴着的点最多的那条线就是路面。
| 第几次抽 | 抽到的 2 个点 | 贴着线的点 |
|---|
竖直方向放大了 4 倍。这里只画了 287 个点(路面 209 个、车和人 78 个),所以票数和上面 3D 里的 2 万个点不一样,道理一样。
| 路面点被当成障碍物 | DBSCAN 分出几堆(真的 5 个) | 召回率(门槛 2 米) | 精确率 | |
|---|---|---|---|---|
| 平地,一刀切 z > −1.6 | 0 | 5 | 0.60 | 0.60 |
| 上坡 4%,一刀切 z > −1.6 | 3371 | 24 | 0.20 | 0.04 |
| 上坡 4%,RANSAC + 离路面 > 0.2 米 | 0 | 5 | 0.60 | 0.60 |
召回、精确不是 1.00,是第 3 步的老问题:前车、左车道车只打到车尾,框中心偏 2.30 米,超过 2 米门槛。和去地面无关。数字都来自 python -m examples.a_stack.a5_slope(改第 23、24 行的坡度和方法)。