“地图绘制” 技术调研与实现
SLAM 是机器人学中的一个核心概念,与语义建图密切相关,尤其是在语义 SLAM 领域。SLAM 使机器人能够利用多种传感器(如摄像头、激光雷达、惯性测量单元等)感知环境,并同时定位自身和构建地图。
云鲸扫地机器人所采用的地图构建技术是SLAM 技术的成熟应用。
一、核心技术原理:SLAM
SLAM(Simultaneous Localization and Mapping,即时定位与地图构建)是这类机器人的“大脑”。它要解决的是一个“鸡生蛋蛋生鸡”的问题:
- 定位:我需要知道自己在哪,才能把看到的东西画在地图的正确位置。
- 建图:我需要有一张地图,才能判断自己在哪里。
SLAM 让机器人在未知环境中,一边移动一边逐步构建出环境的地图,同时利用这张地图来实时推算自己的位置。
云鲸等家用机器人常用的 SLAM 类型:激光 SLAM 和 视觉 SLAM (vSLAM)
激光 SLAM (LiDAR SLAM)
- 传感器:机顶有一个旋转的激光雷达 (LiDAR)。它发射激光束并测量反射回来的时间,从而得到与周围物体精确的距离和角度信息。
- 工作原理:
- 机器人移动时,激光雷达每秒进行数百次扫描,得到一系列离散的“点”(距离数据),称为“点云”。
- 通过对比连续两帧点云之间的匹配关系(如特征点、线段、曲率),算法可以估算出机器人自身的运动方向和距离(这个过程叫“扫描匹配”,常用算法如 ICP)。
- 将每个时刻的位置和对应的点云数据,转换到同一个坐标系下,就逐步拼接成了整个房间的2D 平面地图(通常是栅格地图,用黑/白/灰表示障碍物、空闲和未知区域)。
- 优点:精度高,不受光线影响,直接获取距离信息,技术成熟。
- 缺点:传感器成本较高,只能探测同一水平面的障碍,无法识别物体类型(如椅子腿还是鞋子)。
视觉 SLAM (vSLAM)
- 传感器:使用摄像头(单目、双目或 RGB-D 深度相机)。
- 工作原理:
- 特征提取:从连续的图像帧中提取丰富的特征点(如墙角、纹理、边缘)。
- 运动估计:通过跟踪这些特征点在图像中的移动,利用几何原理(对极几何、三角测量)计算出相机(即机器人)的运动轨迹。
- 建图:除了 2D 平面地图,还可以构建稀疏的 3D 特征点地图,或利用深度相机(如 ToF、结构光)直接得到稠密的 3D 点云地图。
- 优点:成本低,信息丰富(可识别物体、颜色),有潜力实现更智能的交互。
- 缺点:对光照变化敏感,计算复杂度高,在纹理缺失(如白墙)或重复纹理(如格子地板)环境下容易失败。
目前主流方案:激光 SLAM因其稳定可靠,仍是中高端扫地机器人的首选。视觉 SLAM是未来的趋势,随着芯片算力提升和算法优化(如结合 AI 进行语义识别),正在快速普及。有些机器人会采用多传感器融合(如激光+视觉+惯性测量单元 IMU)来提升鲁棒性。
二、扫地机器人建图的完整流程
首次探索(建图模式):
- 机器人从充电桩出发,沿边或弓字形行走。
- SLAM 算法实时运行,同步完成定位和地图拼接。
- 遇到障碍物时,通过碰撞传感器或近距离红外传感器辅助避障,并将障碍物位置标记在地图上。
- 探索完成后,一张完整的、包含房间轮廓和固定障碍物的基础地图就生成了。
地图优化与语义标注:
- 区域分割:算法会自动或通过用户交互,将连续的地图分割成不同的房间(如客厅、卧室)。
- 虚拟墙/禁区设置:用户可以在 APP 上在地图中划定不需要清扫的区域(如宠物饭盆、地毯边缘)。
- 语义信息添加:高级机型会利用视觉识别出“椅子”、“桌子腿”、“电线”等,并在地图上进行特殊标记,以便更智能地避让。
定位与导航(每次清扫):
- 机器人从充电桩出发时,会利用已保存的地图进行重定位(通过匹配当前的传感器数据与地图特征,快速确定自己的初始位置)。
- 根据用户指定的清扫计划(如“全屋清扫”、“只扫客厅”),进行路径规划(通常使用 A*、D*等算法),计算最高效的覆盖路径(如弓字形)。
- 在移动中,持续进行局部定位(通过轮子编码器估算+激光/视觉扫描匹配纠正),确保自己始终知道在地图上的精确位置,从而实现厘米级的精准导航。
三、技术实现路径(从零开始的简化版)
如果你想亲自动手实现一个基础的“地图绘制”demo,可以遵循以下步骤:
1. 硬件选择:
- 主控:树莓派 4B 或 Jetson Nano(有较强的计算能力和丰富的接口)。
- 传感器(根据 SLAM 类型选择):
- 激光 SLAM 路线:一款 2D 激光雷达(如 RPLIDAR A1)。
- 视觉 SLAM 路线:一个 RGB-D 摄像头(如 Intel Realsense D435i,它同时提供彩色图像和深度图像,并内置 IMU)。
- 底盘:一个带编码器的差分驱动机器人底盘(编码器可以提供轮子转动的里程计信息,作为初步的运动估计)。
2. 软件栈:
- 操作系统:Ubuntu + ROS (Robot Operating System)。ROS 是机器人开发的“脚手架”,它提供了传感器驱动、消息传递、坐标变换、可视化工具等大量现成模块,可以极大简化开发。
- 核心 SLAM 算法包(ROS 内):
- 激光 SLAM:
gmapping(经典,基于粒子滤波)、cartographer(谷歌开源,效果优秀,支持多传感器融合和回环检测)。 - 视觉 SLAM:
ORB-SLAM2/3(性能强劲的经典 vSLAM)、RTAB-Map(支持 RGB-D,能直接构建稠密 3D 地图,且集成回环检测)。 - Karto SLAM:
karto(基于图优化的 SLAM,适合大范围地图构建)。
- 激光 SLAM:
扫地机器人 80% 用的是 Cartographer / Karto 思路,因为效果最好,而且开源。
3. 简化实现步骤:
# 这是一个高度简化的概念流程,实际在ROS中是通过节点和话题来组织的
1. 传感器数据读取
- 启动激光雷达/摄像头驱动,发布 `sensor_msgs/LaserScan` 或 `sensor_msgs/Image` 消息。
2. 里程计数据获取
- 从电机编码器读取数据,计算并发布 `nav_msgs/Odometry` 消息(机器人的初步位置估计)。
3. 运行SLAM核心节点
- 启动 `gmapping` 或 `RTAB-Map` 节点。
- 该节点会订阅 `激光扫描` 和 `里程计` 话题。
- 核心工作:进行扫描匹配,修正里程计的误差,估计最可能的机器人位姿,并将历史扫描数据融合到一张全局地图中。
4. 地图保存
- SLAM节点会实时发布 `nav_msgs/OccupancyGrid` 类型的地图话题(栅格地图)。
- 探索完成后,通过服务调用,将内存中的地图保存为图片文件(如PGM)和描述文件(YAML)。
5. 可视化
- 使用ROS的 `rviz` 工具,可以实时看到机器人感知的点云、估计的轨迹和正在构建的地图。4. 路径规划(进阶):
- 有了地图后,可以使用
move_base等 ROS 导航包。你需要提供:- 全局代价地图(即你构建的静态地图)。
- 局部代价地图(实时感知的动态障碍物)。
- 全局规划器(如 A,规划从 A 点到 B 点的整体路径)。
- 局部规划器(如 DWA,控制机器人沿全局路径行走,并实时避让动态障碍)。
四、总结与挑战
- 云鲸等产品的成熟度:得益于多年的算法迭代和工程优化,它们在家庭结构化环境下已经非常稳定。通过多传感器融合(激光/视觉 + 碰撞 + 悬崖 + 轮子编码器 + IMU)和强大的回环检测技术(识别出曾经到过的地方,纠正长期累积的定位漂移),确保了地图的准确性和可靠性。
- 当前技术挑战:
- 动态环境:如何在地图中区分固定家具和临时摆放的拖鞋、玩具。
- 跨楼层/复杂环境:复式结构、强烈光照变化、纯色墙面等对 SLAM 是巨大挑战。
- 长期地图维护:家具移动后,如何自动更新地图,而不是重新全图构建。
- 未来趋势:
- AI 与 SLAM 深度融合:用深度学习进行特征提取、场景识别、动态物体分割,使机器人不仅能建图,更能“理解”环境。
- 语义 SLAM:地图中不仅包含几何信息,还包含“这是桌子”、“那是门”等语义标签。
- 多机器人协同建图:多个机器人共享和更新同一张地图。
对于想要入门实践的开发者,建议从 ROS + 树莓派 + RPLIDAR A1 + cartographer 这个组合开始,网上有非常丰富的教程和社区支持,可以让你快速搭建出一个能够实际建图和导航的移动机器人原型。
五、备注
1. 地图的分类
绝对主流:几乎所有的现代扫地机器人,其内部存储和进行路径规划计算的基础地图,都是栅格地图,特别是占据栅格地图。
目前,常见的地图表示方法大致可分为三类:栅格表示、几何信息表示和拓扑图表示,每种方法都有自己的优缺点。
降低计算复杂度、提高鲁棒性(可以狭义的理解为“稳定性”)、适应不同应用场景。
- 鲁棒性 > 稳定性 > 实时性 > 精度。
- 鲁棒性 = 抗击打能力 + 恢复能力
2. 技术栈的工业化
注意:不要从零写 SLAM,而是基于开源的 SLAM 框架,如 Cartographer、ORB-SLAM 等,进行二次开发。需要重点关心的是:地图的表示、地图的存储、地图的更新、地图的查询、地图的优化等。
- C++:SLAM 核心(Cartographer / ORB-SLAM)
- Cartographer = ROS2 里的一个现成 SLAM 节点,可以生成 2D 和 3D 的地图。你可以理解为:激光雷达数据进入后,Cartographer 会生成一张地图和位置出来。
- Cartographer 的地图,本质是一个二维栅格数据(0~100),前端只需要把它当成“后端给的一张可缩放、可旋转的平面图”来画即可,使用
Canvas2D即可。
- Golang:机器人开发平台(ROS / ROS2)、云端、管理后台等,比如:地图管理、房间分区、清扫策略、后台系统、云端多设备等。