晚上八点回到家,发现扫地机器人又卡在床底一根电源线旁边,电机嗡嗡响,轮子空转。你很难不把它和大疆无人机做对比——无人机能在树林里高速穿行,灵活避开树枝,为什么换个场景就“笨”成这样?
答案不在电机,在感知。
大疆真正让人印象深刻的地方,不只是飞控和云台,而是那套从视觉里程计到障碍物感知、从建图到自主返航的完整感知系统。过去这套能力只管天空。而现在,一个更值得注意的信号是,它正在被尝试搬到地面。ROMO2 这个名字,搭配“居家省心伙伴”的定位,指向的正是家庭地面移动机器人这个赛道。
本文不预测具体产品销量,只拆解一个技术问题:无人机感知技术搬到地面,哪些能直接用,哪些必须重写,真正的卡点在哪里。如果你正在做无人机、SLAM、机器人导航,或者只是想搞清楚“为什么家用机器人还不聪明”,这篇文章会给出一个比较完整的视角。
1. 为什么无人机巨头要做地面机器人
先给一个判断:无人机公司做地面机器人,不是简单扩充产品线,而是在做感知能力的资产复用。
无人机和地面机器人在技术底层并不是两条平行线。大疆在无人机上积累的视觉惯性里程计、双目立体避障、激光雷达辅助定位、目标跟踪、自主返航、路径规划等能力,在逻辑上几乎都能对应到地面机器人的某个模块。
比如“自主返航”对应扫地机器人的“自动回充”,“避障”对应“防碰撞”,“建图”对应“家居地图管理”,“拍摄目标并跟踪”对应“看护老人小孩”。复用这套技术栈的代价,远低于从零开始组建新的感知团队。
ROMO2 的定位是“居家省心伙伴”,这通常意味着它不会是一台单纯的扫地机,而是集清洁、巡检、陪伴或看护于一体的家用移动机器人。这类产品有一个共同刚需:理解家庭环境,而不只是执行一次直线清扫。
它要能识别宠物和正在走动的人,判断哪些区域能进、哪些不能进;要能识别电线、拖鞋、袜子和毯子;要在夜晚低光照环境下继续工作;还要在长期运行中保持地图不漂移。这些需求,恰恰是无人机感知技术在特定约束下的延伸。
这里要说明:当前公开资料里,ROMO2 的具体硬件配置和功能细节还不算多,本文的讨论重点是“无人机感知技术落地地面机器人”这一技术方向,产品细节以官方发布为准。
2. 无人机感知与地面感知:不是同一个问题
很多人容易产生一个误解:把无人机的传感器和算法模块直接装到地面机器人上,感知能力就“降维”了。但真实情况是,地面感知不是无人机感知的简化版,而是另一种难度结构。
一张表可以看出主要差异:
| 维度 | 无人机 | 地面机器人 |
|---|---|---|
| 运动空间 | 三维空间,可悬停、俯仰、滚转 | 二维平面为主,受地形起伏约束 |
| 主要风险 | 撞树、撞楼、炸机 | 卷入线缆、卡困、跌落、推倒物品 |
| 视觉视野 | 前视 + 下视,视野开阔 | 近地平视,视野被家具遮挡 |
| 定位信源 | 室外可依赖 GNSS / RTK | 室内多数无卫星信号,依赖 VIO / SLAM |
| 避障距离 | 5-20 米开始路径规划 | 0.1-2 米内必须做出判断 |
| 算力与功耗 | 机载电脑空间较大,功耗容忍度高 | 家用设备功耗受限,端侧推理要求高 |
| 场景复杂度 | 树木、建筑相对结构化 | 家庭环境高度非结构化,物体小且杂 |
最容易被忽略的差异是“障碍物高度语义”。
无人机在空中飞行时,障碍物通常是一个完整的立体对象,比如一棵树或一栋楼。它只需要知道“前方有东西,绕开”。地面机器人不同,它面前可能是一张地毯、一个门槛、一根电线、一只猫的尾巴。它需要判断的是:这东西能不能压过去,会不会被卷进去,到底要不要绕。
这已经不是单纯的感知问题,而是感知加语义理解的结合。
另一个关键差异是安全边界。无人机炸机后还能找回,但地面机器人在家里卡住、撞倒物品、卷入线缆,每一次都直接影响用户体验。家用产品对稳定性的要求,比实验室里的无人机原型要高一个量级。
所以“把无人机感知搬到地面”这句话,正确理解应该是:迁移底层的感知硬件能力和部分算法框架,同时针对地面场景重新建立障碍物模型、运动模型和决策逻辑。
3. 哪些感知技术可以直接迁移
从行业通用技术栈看,以下几项能力可以比较平滑地迁移到地面机器人。
3.1 视觉惯性里程计(VIO)
无人机上广泛使用的 VIO(Visual Inertial Odometry)是视觉 SLAM 与 IMU 融合的里程计方案。它在地面机器人上依然适用,因为两者的本质需求一致:在没有外部定位信号时,持续估计设备自身的位姿。
一个典型家庭环境的纹理丰富度其实不错,光线均匀时对 VIO 非常友好。VIO 相比普通轮式里程计的优势在于,轮子打滑、悬空空转时,它依然能通过视觉特征给出相对靠谱的位姿估计。这正好弥补地面机器人最典型的“轮式里程计失效”场景。
3.2 双目立体避障
无人机常用的双目前视避障,可以直接迁移到地面机器人的前向感知。双目不需要主动光源,室内户外都可用,功耗可控,测距范围从十几厘米到十几米,覆盖了家庭机器人的近距离判断需求。
但要注意,地面机器人的双目相机安装高度更低、视角更平,低矮障碍物在图像中占比很小。直接套用无人机的避障模型,容易漏掉桌腿、台阶和地面杂物。通常需要调整相机俯仰角,并在画面中设定关注区域,重点分析中下部视野。
3.3 目标检测与识别
无人机上的目标识别技术,检测车辆、行人、建筑,在地面场景可以平移成检测宠物、人、家具、线缆、拖鞋。算法框架完全相同,甚至可以直接用 YOLO 系列模型做迁移学习。
这部分是感知技术中商业价值最直接的一块。“省心”不只是能避障,还意味着识别家里是否有宠物在睡觉、是否有窗户没关、是否有老人跌倒。这类语义感知能力,无人机行业已经验证了技术路线,地面机器人只需要换数据集和任务定义。
3.4 路径规划与覆盖算法
无人机航迹规划中的 A*、Dijkstra、RRT 等搜索算法,与地面机器人的路径规划在数学基础上高度一致。扫地机器人需要的是弓字覆盖、区域划分、禁区设置、动态避障;无人机需要的是航点规划、绕障、返航。相同算法,不同约束。
如果之前做过无人机路径规划,切换到地面机器人会非常快。难点不在算法本身,而在“代价地图怎么建”。
3.5 点云处理与三维重建
无人机航拍三维重建中常用的点云处理,也可以用于建立高精度家居地图。通过深度相机或激光雷达生成的家庭点云,可以用来检测地面高度差、识别障碍物轮廓,还能作为视觉重定位的特征来源。
区别在于,无人机三维重建通常面向大规模场景,地面机器人只需要局部精细模型。因此算法可以简化,但精度要求反而更高,尤其是对地面边缘和门槛这类细节。
4. 居家场景的真正难点
迁移了传感器和算法之后,真正让产品拉开差距的,是家庭环境特有的复杂情况。
4.1 动态物体干扰
家庭环境的动态物体密度远高于户外。人走动、宠物跑动、玩具被踢开、窗帘被风吹动,都会触发感知系统产生“虚假障碍”或重定位误差。对无人机来说,动态目标通常是航线上的一个例外;对家用机器人来说,动态物体是默认常态。
解决方向通常是:把地图分成静态层和动态层,静态层用于全局规划,动态层用于局部实时避障;同时使用多目标跟踪,把行人和宠物识别为“短暂阻挡”而不是永久障碍。
4.2 低矮物体与“可通过性”判断
电线、拖鞋、椅子腿、床单边、书架底层,是地面机器人最容易执行失败的地方。很多家用机器人不是“感知不到”低矮障碍,而是感知到了,却无法判断“压过去会不会出问题”。
这个问题的本质是:感知系统要输出的不仅是“哪里有障碍物”,而是“哪里能通过”。可通过性判断需要结合机器人底盘结构、悬挂、轮径、离地间隙、驱动方式。同一个视觉结果,在不同机身上会产生完全不同的决策。
这就是为什么只靠视觉识别无法根治卡困问题,必须联动底盘模型做通过性分析。
4.3 光照变化与反射
白天靠窗区域和夜晚的走廊,光照差异可能相差几十倍。纯视觉方案在夜间容易失效。地面机器人常用的做法是加红外补光、ToF、结构光,或者做多传感器融合,让它在弱光条件下依然能拿到可信的深度信息。
4.4 回充与重定位
无人机的“返航”依赖 GNSS 和视觉定位的组合,室内机器人的“回充”则是从任意位置定位到充电座,这需要厘米级相对位姿估计。如果机器人中途被抱到另一个房间,或者家具位置被改动,它还要能重新定位。
GPS 不可用的问题,让室内地面机器人比无人机更依赖 VIO 和 SLAM 的长期稳定性。这是感知迁移中真正值得投入的部分。
5. 感知与决策的落地实现示例
下面用几个通用技术栈示例,演示无人机感知能力如何在地面场景“改造成型”。这里不依赖特定品牌 SDK,代码只做思路演示。
5.1 低矮障碍物检测示例
无人机避障通常关注中远距离的物体,地面机器人更关注近处低矮区域。我们可以读取深度相机数据,只分析图像的中下部区域,并把“前方 25cm 内出现不可通行物体”判定为需要停车的信号。
文件路径:src/perception/low_obstacle_detector.py
import rclpy from rclpy.node import Node from sensor_msgs.msg import Image import cv2 import numpy as np class LowObstacleDetector(Node): def __init__(self): super().__init__('low_obstacle_detector') self.sub = self.create_subscription( Image, '/camera/depth/image_raw', self.depth_callback, 10 ) # 地面机器人比较关心近处低矮障碍 self.stop_distance_m = 0.25 # 前方 0.25 米内必须停车 self.low_height_m = 0.15 # 低于 0.15 米的物体按低矮障碍处理 def depth_callback(self, msg): # 将 ROS Image 转为 OpenCV 深度图,单位通常为 mm depth = np.frombuffer( msg.data, dtype=np.uint16 ).reshape(msg.height, msg.width) # 只关注图像中下部区域,因为相机视野较低 region = depth[int(msg.height * 0.5):, :] valid = region[region > 0] if valid.size == 0: return min_depth = np.min(valid) # 单位 mm if min_depth < self.stop_distance_m * 1000: self.get_logger().warn( '检测到近距离低矮障碍,距离:%.2f cm' % (min_depth / 10.0) ) # 这里可以调用底盘控制服务,执行减速或停车 self.publish_stop_cmd() def publish_stop_cmd(self): # 实际项目中通过 cmd_vel 话题发布速度零值 self.get_logger().warn('发送停车指令') def main(args=None): rclpy.init(args=args) node = LowObstacleDetector() rclpy.spin(node) node.destroy_node() rclpy.shutdown() if __name__ == '__main__': main()这段代码的核心是“感知”和“决策”分离:深度图只负责提取障碍信息,后续是否停车、如何绕行交给行为控制模块。这也是从无人机感知迁移到地面时需要注意的边界。
5.2 代价地图参数配置示例
在 ROS 2 导航栈中,代价地图的配置直接决定机器人怎么看这个世界。无人机代价地图通常把三维点云直接映射成二维密集栅格,地面机器人则需要按高度裁剪,避免把地毯当作障碍,同时也不能漏掉低矮线缆。
文件路径:config/costmap_common.yaml
obstacle_range: 3.0 raytrace_range: 3.5 # 地面机器人轮廓,单位米,用于判断是否会被卡住 footprint: [[-0.15, -0.15], [0.15, -0.15], [0.15, 0.15], [-0.15, 0.15]] # 膨胀层参数 inflation_radius: 0.25 cost_scaling_factor: 3.0 # 传感器来源:深度相机 + 2D 激光 observation_sources: depth_camera laser_2d # 深度相机点云 depth_camera: topic: /camera/depth/points sensor_frame: camera_link observation_persistence: 0.0 expected_update_rate: 10.0 data_type: PointCloud2 # 低于 2cm 的物体通常可以压过,避免把地毯当成障碍 min_obstacle_height: 0.02 # 高于 30cm 的障碍可以先靠近再绕行,不需要过早避让 max_obstacle_height: 0.30 marking: true clearing: true laser_2d: topic: /scan sensor_frame: base_link observation_persistence: 0.0 expected_update_rate: 10.0 data_type: LaserScan clearing: true marking: true这里真正容易踩坑的是min_obstacle_height和max_obstacle_height。如果下限设得过高,会把低矮线缆漏掉;下限过低,又会在地毯和地垫处产生一堆伪障碍。不同机型需要实际测量后微调,不能直接照抄模板。
5.3 覆盖路径与行为决策示例
地面机器人除了感知,还需要行为决策。下面这段伪代码演示了一个最简单的决策控制器,用于在障碍物接近时选择合适行为。
文件路径:src/navigation/coverage_controller.py
from enum import Enum class Behavior(Enum): BOW_COVERAGE = 1 # 弓字覆盖清扫 EDGE_AVOID = 2 # 沿障碍边缘绕行 REVERSE_TURN = 3 # 后退并转向,尝试脱离卡困 DIVE_UNDER = 4 # 低矮空间探底 RETURN_DOCK = 5 # 返回充电座 def decide_next_behavior(robot_state, map_status, obstacle_nearby): """根据机器人状态和感知结果,决定下一个行为。""" if obstacle_nearby: if robot_state.is_stuck: # 自检发现轮子空转/电流异常,先后退再转向 return Behavior.REVERSE_TURN if robot_state.has_low_clearance: # 上方空间足够,可以进入床底等低矮区域 return Behavior.DIVE_UNDER return Behavior.EDGE_AVOID if map_status.cleaning_finished: return Behavior.RETURN_DOCK return Behavior.BOW_COVERAGE决策逻辑的核心原则是:优先保证不卡死,其次保证覆盖完整,最后才考虑效率。很多家用机器人体验差,不是因为路径规划算法弱,而是因为决策层没有把“脱困”放在足够高的优先级上。
5.4 端侧目标检测模型部署示例
如果要在低功耗端侧运行目标检测,可以用 ONNX Runtime 加 NPU 加速。比如部署一个轻量 YOLO 模型,识别宠物、拖鞋、线缆等目标。
import cv2 import numpy as np import onnxruntime as ort # 加载端侧模型 session = ort.InferenceSession("home_objects_yolov8n.onnx") input_name = session.get_inputs()[0].name # 读取一帧图像 img = cv2.imread("living_room.jpg") img_resized = cv2.resize(img, (640, 640)) input_tensor = img_resized.transpose(2, 0, 1).astype(np.float32) / 255.0 input_tensor = np.expand_dims(input_tensor, axis=0) # 推理 outputs = session.run(None, {input_name: input_tensor}) # 后处理解析检测框,并判断是否需要避让 # 如果检测到线缆,且距离小于安全阈值,通知导航模块降低速度 post_process(outputs, img)需要说明的是,这样的模型必须使用家庭场景数据集微调,没有任何通用检测模型能开箱即用地判断“哪些线缆不能压”。数据集质量往往决定产品体验的上限。
6. 从算法验证到整机量产:工程化才是门槛
把代码跑通只是第一步。感知技术要真正落到地面机器人产品里,还要过几道工程关。
6.1 仿真先行
在真机调试之前,先在 Gazebo、Isaac Sim 等仿真环境里跑通导航栈,能节省大量时间。仿真里可以模拟光线变化、家具摆放、宠物移动等场景,自动生成回归测试用例。
值得投入的方向是把仿真环境做成“场景生成器”,随机摆放家具、线缆、拖鞋,让机器人在大量地图中做强化学习和压力测试。这样能提前发现很多在单一实验室环境里观察不到的边界问题。
6.2 标定流程
从无人机迁移到地面,相机安装高度、俯仰角、到 IMU 的外参都变了。需要重新做相机内参标定、相机到 IMU 的外参标定、深度图与彩色图对齐。标定误差会直接在 VIO 和避障上放大,导致建图漂移或测距不准。
比较好的实践是建立自动化标定产线,每一台量产机都要单独标定,并把标定文件写入设备分区。
6.3 功耗与算力
家用机器人不能用无人机上那种高功耗的机载电脑。它需要在几瓦的功耗预算内完成 VIO、避障、目标检测、导航规划。主流方案是低功耗 CPU + NPU 的异构架构,把 SLAM 放在 CPU,把 YOLO 这类卷积模型放在 NPU。
如果算力不够,优先保证 VIO 和实时避障,目标检测可以降到每秒一次左右,不必逐帧推理。
6.4 安全与回滚
地面机器人也一样需要急停机制。碰撞传感器、跌落传感器、电流异常检测要独立于主控存在。任何感知模块升级,都必须支持快速回滚。你可以不写一次做到完美的代码,但必须让每次更新失败时都能回到上一个可信版本。
7. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 机器人把小地毯推起并卡住 | 代价地图忽略低矮物体,通过性判断错误 | 查看点云或栅格地图中地毯高度 | 调高min_obstacle_height,或加入“可压过织物”语义识别 |
| 夜间运行时频繁撞墙 | 纯视觉方案依赖环境光,夜间深度信息缺失 | 检查相机曝光和深度图质量 | 增加红外补光,或加装 ToF / 结构光 |
| 跑一段时间后地图逐渐偏移 | VIO 初始化外参不准,或轮式里程计打滑累积误差 | 查看定位漂移曲线 | 重新标定内外参,增加闭环检测频率 |
| 回充时对不准充电座 | 室内无 GNSS,近场定位精度不足 | 观察重定位粒子分布 | 在充电座附近增加视觉标记或发射红外引导信号 |
| 反复绕开同一个虚拟障碍 | 动态物体被写入静态地图层 | 查看代价地图是 source 还是 costmap 中残留 | 启用清除策略,将动态目标放到局部层 |
| 端侧模型识别慢导致避障延迟 | NPU 上算子优化不足 | 查看模型每层耗时 | 改用 INT8 量化,替换轻量骨干网络 |
| 从无人机算法迁移后 VIO 初始化失败 | 相机视野、安装角度与无人机差异大 | 抓取图像序列检查特征点数量 | 调整俯仰角,增强纹理区域曝光 |
排查的第一原则永远是“先确认是感知问题还是决策问题”。把传感器原始数据录制下来回放,能有效区分这两类问题。不要在一开始就盲目调参数。
8. 给开发者的实践路线建议
如果你是从无人机领域转向地面感知,或者想把家里的机器人变成自己可控的实验平台,下面的路径比较稳妥。
8.1 先跑通 ROS 2 导航栈
不要从零开始写感知算法。先在 ROS 2 + Nav2 环境里,用现成的仿真地图跑通“建图、定位、导航”三步。熟悉代价地图、行为树、里程计这些核心概念。
8.2 接入真实深度传感器
在仿真跑通后,把真实深度相机接入,做相机标定。重点关注低矮障碍物漏检、强光下深度缺失、夜间失效这三个典型问题。每解决一个,都在自己的检查清单上记录下来。
8.3 加入语义识别
当 VIO 和避障稳定后,再加入目标检测模型。从识别三类物体开始:宠物、线缆、拖鞋。先离线跑数据集,再上机部署。注意量化后的精度损失,要保留一个可回滚的未量化模型版本。
8.4 关注定位鲁棒性
家用机器人的难点不是“能建图”,而是“长时间不漂移、被搬走后能重定位”。建议重点研究:视觉词袋、闭环检测、多传感器融合定位。这部分是无人机感知迁移中被低估的地方。
8.5 协议栈注意
无人机开发者习惯使用 MAVLink、PX4 工具链,地面机器人则普遍走 ROS 2、Nav2。传感器数据格式、时间同步、坐标系定义都不同。迁移时不要试图用一套协议打天下,而是把“感知算法”和“通信协议”解耦,感知模块输出标准位姿和障碍物列表,再由导航模块消费。
9. 总结与后续关注方向
大疆 ROMO2 的完整技术细节,还是要以官方发布为准。但“无人机感知技术落地地面”这个方向,已经不只是概念。
对开发者来说,最值得做的不是纠结下一代产品叫什么,而是先把 VIO、SLAM、目标检测、代价地图这套技术栈在自己的项目里跑通。因为无论是天空还是地面,机器人的“省心”都来自感知系统对环境的提前理解。
接下来的时间里,有三个方向值得继续跟踪:
第一,大模型与机器人感知的结合。大模型擅长把视觉信息转成语义描述,未来机器人在判断“能不能压过这条线缆”时,可能会调用更通用的世界知识。
第二,语义地图的落地。家用地面的机器人如果能把“沙发”“桌腿”“充电座”作为语义图层保存,路径规划和交互体验会上一个台阶。
第三,端侧模型进一步轻量化。算力约束会长期存在,模型压缩、量化、知识蒸馏依然有巨大价值。
最后说句实在的:做地面机器人感知,永远不要只盯着论文里的算法效果。把产品放到真实的、乱糟糟的家庭环境里跑一个月,所有问题都会自己浮出来。这比任何评测指标都有说服力。