Wink Pings

64个距离点,这只开源鸭子被抱走也能找回位置

Microduck 用头顶一个8×8 ToF 做 SLAM,板载运行,不靠云。它靠停下时的关键帧认路,能区分磕碰和搬运,也会在沙发底下犯错。

Microduck 在学落脚规划。Thomas Wolf 放出的视频里,这只蓝橙色小机器人走起来落点更准,旁边放着两张画了线条的白纸,地板是浅色木纹。Antoine Pirrone 说,footstep planning 让相对定位更准,看起来有希望。配合 SLAM,这是开源鸭子自己在屋里游荡的积木之一。

只看参数,Microduck 的传感器寒酸得不像2026年的机器人。头顶一个 VL53L5CX 飞行时间传感器,离地约25厘米,每秒15次测64个距离,8×8网格覆盖前方45°锥。可靠距离不到一米。扫地机的激光雷达能转一圈,它只看前方一小块。

但这只鸭子用这64个距离点建图。地图存在机器人上,关机也保留。被人放到房间另一头,它要在地图里重新找到自己。整套东西跑在 RK3566 的四颗 Cortex-A55 核心上,和走路策略做邻居。没有笔记本,没有云。代码是一个叫 mapd 的小服务。

模拟房间里的鸭子,64条橙色射线从头部散开

建图在停下时发生。鸭子走的时候,建图器跟着腿里程计走。站定半秒,它开始收集传感器每一帧,直到再次移动。这些帧合成一个关键帧,就是鸭子在这个位置看到的小块局部地图。头在停顿时转动,关键帧就能覆盖更多房间。

然后它把关键帧放进地图。做法很直接:在里程计给出的位置附近,试一串位置和朝向,给每个候选打分,看关键帧里的障碍物有多少落在地图已有障碍物上。分最高的赢。分数在周围掉得多快,说明这个答案有多确定,以及在哪些方向上不确定。面对一堵平墙,扫描能钉住到墙的距离,钉不住沿墙的位置。建图器就只信距离,沿墙仍用里程计。

一步停顿时关键帧的放置过程

真正麻烦的是验证。地图看起来不对,很容易盯着它调参数,调到顺眼。Pollen Robotics 团队做了一阵,发现看起来好一点说明不了什么。他们停下来,搭了一套测量装置。

地面贴 ArUco 标签,角落固定相机拍鸭子头顶标签

八个 ArUco 标签贴在地面,定义房间坐标。角落高处一台 Orbbec Femto Bolt 用4K拍全场,找鸭子头顶6厘米的标签。小标签在四米外方向准、距离差,所以他们不用距离,改用头高和相机视线交点定位,误差约一厘米。相机和机器人各有各的时钟,两边都看头在转,用转速对齐,七分钟会话里对齐到10毫秒内,连130 ppm 的漂移也算进去。空房间提前用手持相机扫成3D点云,只保留离地3到40厘米的点,作为参考地图。

有了真值,他们能回放记录,检查建图器每一次判断。回放几秒跑完,改一个想法就能测,不用猜。数据也公开了,在 Hugging Face 的 SLAM_JJ_Salon_with_GT 数据集里,带头部相机视频,想拿自己的 SLAM 对同一份真值也可以。

第一个发现和建图器无关。把64个传感器读数用机器人真实位姿放回房间,它们该落在墙上和家具上,实际没有。三处小修正解决了大部分问题。VL53L5CX 报的是沿光轴的距离,不是每个格子自己方向的距离,角落会短最多11%。每帧到手时已经过了约60毫秒,不是10毫秒。传感器在头里的实际位置比模型低约3°。

传感器读数用真实位姿放置,修正前后对比

第二个发现关于信任。匹配器很自信,也经常错。一段窄墙扫描,沿同一堵墙挪30厘米,照样能匹配到95%。与此同时,腿里程计在两次停顿之间其实准到几厘米。所以他们给匹配加了门控:只在里程计位置10厘米、3°以内才信。超出的匹配不是修正,是认错墙。

三种建图版本的每次停顿位置误差

门控之后,匹配在这段会话里没比纯里程计好多少。它真正有用的地方在地图。地图让鸭子被搬走后还能找回自己。

机器人有一个学出来的抱起检测器,有人把它拎起来,走路会停。对建图器来说,抱起意味着脚离开地面。里程计的位置暂时没意义,鸭子丢了,直到它认出自己在哪。但并非每次抱起都是搬运。绊一下会触发检测器,快速拎起来摆正也会。为这些情况丢地图、从头找自己,比忽略更糟。

16次抱起,磕碰和搬运在持握时间上分开

角落相机记录了真实搬运的样子。16次抱起里,磕碰都持续约0.4秒,移动不到40厘米。搬运都持续1.5秒以上,移动超过1.2米。两组不重叠,阈值放在1秒。最初阈值是2秒,一次1.25米的快速搬运从下面溜过去,建图器当成磕碰,按旧位置继续跟了一分钟,偏了一米多。

坐下是特殊情况。抱起检测器只在走路策略运行时工作,鸭子坐下、被搬走、再站起来,不会报告任何东西。所以鸭子坐下后再站起,建图器把它当成可能的搬运。先搜坐下位置附近,失败再搜整张地图。

丢了以后,建图器在每个停顿搜全图,朝向仍信陀螺仪。只有64个距离点,单次停顿的最佳匹配经常错,一堵直墙沿墙哪都能匹配。一次不够。相隔几秒的两次停顿必须各自同意同一个位置。某次停顿的最佳匹配有接近的对手,建图器会保留两个,等后面一次停顿只同意其中一个时再决定。

成绩放在两段公开会话里。四分钟那段,停顿位置误差中位数2.7厘米,最差6.6厘米。七分半、多次搬运那段,中位数4.8厘米,最差15厘米。它说自己知道位置的时间占60%和63%,其中99%和94%在15厘米内。两次会话都没有重定位到错误地点。七分半会话里,1.46米搬运后它找回自己,误差2厘米;1.54米坐着被搬后误差11厘米;摔落后误差3厘米。地图里75%到80%的障碍格在真实障碍物5厘米内。换到一个完全没调过的房间,同样代码正确找到自己三次。

它也有明显短板。沙发底下的地板会被画成空的,因为传感器低处光束从沙发下面看过去了。它只在停顿时搜索,一直走个不停,丢的时间就会比需要的长。

下一步是多房间。今天鸭子只建一张房间地图。在客厅关机,到厨房开机,它会拿客厅地图找一个从没见过的地方。在不在图里的房间,两次停顿甚至可能同意一个错误位置,他们见过一次。团队想让鸭子发现房间未知,在那里新建地图,最后每个认识的房间各留一张。还想让它自己建图:走一圈,看,补上没看过的部分。

这套东西的启发不在参数多漂亮。64个距离点少得可怜,可靠距离不到一米。把关键帧、匹配门控、搬运检测、两次停顿确认这些细节做扎实,足够让一只开源鸭子被抱走后找回位置。真正难的是知道什么时候不该相信匹配。

发布时间: 2026-10-29 18:38