2026/9/10 5:37:23

扫地机全覆盖与AGV路径规划:从随机碰撞到多机调度

扫地机全覆盖与AGV路径规划:从随机碰撞到多机调度 先给个总体的判断这篇稿子原本是奔着“扫地机全覆盖路径”和“AGV点到点路径”两个方向去的但标题里“随机碰撞”四个字其实藏着更大的学问。它不只是早期扫地机那种“撞墙就转”的笨办法更是一种在低算力、低成本约束下依然成立的算法流派。真正做过多机器人项目的人会明白理解“随机”为什么能用、什么时候不能用比背下A*的公式更有工程价值。所以这篇文章我没有把它写成单纯的算法梳理而是按“差异对比 → 全覆盖原理 → 随机碰撞真相 → AGV多机核心 → 工程落地 → 排错经验”这条线展开。每一节都保留了我在实际项目中摔过跤、填过坑的东西比如膨胀半径怎么标定、为什么A*在车间里不能直接用、多AGV死锁为什么不能靠“加了CBS就万事大吉”来解决。篇幅较长但每一个字都落在场景上。1. 明明是“小车”为什么AGV和扫地机的路径规划是两套东西我最早接触移动机器人路径规划是从一台潜伏式AGV项目开始的。那会儿我对扫地机器人路径规划的印象还停留在“绕圈、撞墙、再绕圈”的层面心想AGV和扫地机不都是地图上走路径嘛算法应该是通用的。可真把两套系统摆在一起看发现差异大到可以当成两个学科来学。先说根本区别AGV要解决的是“从A点到B点、在最短时间和最低能耗内到达并且不让任何两辆车撞上”而扫地机器人要解决的是“在不重复、不漏扫的前提下把整个可达区域都覆盖一遍”。一个是点对点的最优问题一个是面对自由空间的遍历问题。目标函数不同算法选型自然完全不同。从环境信息来看AGV运行的车间、仓库、产线通常是提前建模好的有明确的数字化地图、工位坐标、充电桩位置甚至地磁、反光板、二维码这些固定参照物都提前布设完毕。也就是说AGV面对的是“已知环境下的在线规划”。扫地机器人则倒霉一些家里可能沙发昨天还在这边、今天就被挪了个位置窗帘、电线、拖鞋这种随时变动的障碍物比比皆是。不少扫地机走的是“边建图边清扫”路线本质上是“未知环境下的同时定位、建图与规划”。从硬件约束看两者的自由度、转向能力和安全机制也完全不同。家用扫地机器人普遍是差速轮结构直径30厘米左右可以原地掉头转弯半径几乎为零所以路径规划往往不需要考虑转弯半径约束。但工业AGV里有很多是舵轮驱动或麦克纳姆轮驱动车体动辄一米多长在窄巷道里转弯非常吃力路径规划必须把转弯半径、航向连续性和车体包络考虑进去否则规划出来的路径根本执行不了。我把两边在工程上最关键的差异整理成一张表做过项目的人应该深有体会维度扫地机器人工业AGV核心目标全覆盖、低重复率最快/最省到达目标点、多车无冲突环境先验通常边建图边运行动态障碍多提前建图结构化或半结构化主流定位激光/视觉SLAM厘米级二维码、激光反光板、磁条毫米级运动学约束差速轮可原地旋转约束弱舵轮/麦克纳姆轮有转弯半径约束算力预算嵌入式MCU/低算力SoC工控机/高算力控制器多机协同少见最多单机分区非常普遍必须考虑调度与冲突失败代价漏扫一块地再补扫一次撞车、卡死、停产甚至伤人所以说如果一上来就用AGV的思路去做扫地机或者反过来用扫地机的全覆盖思路去安排AGV路线都会出大问题。这篇稿子后面所有内容都是建立在“先把场景和约束搞明白再谈算法选型”这个前提下展开的。2. 全覆盖路径规划从牛耕式单元分解到在线探索2.1 牛耕式全覆盖最稳的骨架算法全覆盖路径规划Complete Coverage Path PlanningCCPP的目标很朴素把机器人的工作区域走遍漏扫尽可能少重复率尽可能低。最简单也最经典的方法就是仿照农民犁地——牛耕式路径Boustrophedon。规划器把整个自由空间划分成若干个互不重叠的凸区域Cell每个区域内用来回往返的平行直线路径覆盖区域之间再用一条转移路径串起来。为什么是凸区域因为凸区域内部任意两点间连线都不会穿过障碍物机器人只要按直线往复走就不用担心中途碰到内凹障碍物导致漏扫。非凸区域则要先做分解把凹角处理成多个凸区域。这一步可以用近似单元分解也可以用精确单元分解。精确分解的做法是沿着障碍物的每一个顶点朝特定方向作延长线把自由空间切成一个个四边形或凸多边形然后对每个凸细胞做牛耕覆盖。牛耕式路线看着简单但工程里有两个细节特别容易被忽略。第一栅格化后路径间隔不能等于机器人直径必须小于清扫/作业幅宽。扫地机靠边刷和吸风口工作有效覆盖幅宽往往小于车体直径间隔取小了浪费取大了漏扫。第二区域顺序也是个优化问题。多个凸细胞的访问顺序本质上是解旅行商问题TSP贪心法能快速得到一个可用解但要追求低重复率就得用动态规划加剪枝。对室内十几个区域来说动态规划完全扛得住不需要上太多启发式算法。2.2 感知前沿与在线探索扫地机为什么不能只靠离线地图牛耕式最大问题是要求地图已知、静态。但扫地机真正开机的时候地图往往是不完整的。它得先沿着墙面、桌腿完成一轮探索一边构建占据栅格地图一边清扫已探索区域。这时候驱动它“去没去过的地方”的核心策略就是感知前沿Frontier探索。感知前沿的概念很简单把地图中“已探索区域”和“未探索区域”之间的边界像素提取出来作为一个候选目标点。机器人每完成一片区域的清扫就计算所有前沿簇的位置、大小和距当前点的路径代价优先选择代价最低、面积较大的前沿作为下一个覆盖目标。这一机制保证了机器人不会在局部来回打转而是始终有动力去发现新区域。在线覆盖和离线全覆盖的规划目标不一样。离线时可以把全图当成已知直接输出一条尽量不重复的连续路径在线时则必须在“探索”和“清扫”之间做权衡。经常有人把扫地机的重复率归咎于算法不好但实际是探索路径和清扫路径交织在一起机器人在返回充电桩、经过已清扫区域时必然会带来一部分重复。工程上为了压低重复率通常会让已探索区域在栅格地图上打上“已覆盖”标签规划器在找前沿路径时对这些标签区域施加额外的路径代价惩罚引导它尽量走未覆盖的格子。还有一个经验是前沿探索的质量极度依赖SLAM建图的准确性。如果回环检测参数没调好地图一扭曲机器人会把一堵虚构的墙当成实际边界导致一片区域始终无法到达。我见过不少扫地机器人项目“漏扫率很高”的bug追根溯源不是覆盖算法的问题而是栅格地图里出现了重影和裂缝。2.3 覆盖率、重复率与“最后5%”的工程困扰做产品的都会看两个指标覆盖率coverage rate和重复率repeat rate。覆盖率是指实际清扫面积占可达面积的百分比通常要求做到99%以上重复率是指机器人走过的路径长度减去理论最短覆盖长度后的比例家庭场景希望控制在20%以内工业清扫车则更严。这里有个经常被低估的问题最后那5%的区域成本可能比前面95%都高。牛耕式路径按顺序覆盖完大部分区域后地图角落里往往会剩下一些狭长的小块区域可能是床脚周边的空隙、家具之间的通道、门后的三角形死角。要专门给这些小块规划路径机器人必须频繁转弯、反复定位、重新对位时间成本急剧上升而且狭小区域对定位精度要求很高稍微偏一点就可能漏掉一条缝。解决思路一般有三条。一是从路径规划层面改进用螺旋式内缩路径boustrophedon variant处理这些小块让机器人贴着区域边界一路向中心收缩减少漏扫二是把“最后5%”交给沿墙/沿边模式处理机器人绕边界走一圈顺带把缝隙吸掉三是在产品逻辑上接受“少量区域未覆盖”用户启动一次补充清扫或指定区域清扫来兜底。家庭用户其实不太在意5%的未覆盖只要肉眼看不出来就行。工业场景则不同比如园区洗地车、光伏板清洁机器人漏5%可能就是验收不合格必须把阈值调得更严。2.4 喷涂/喷洒场景里的全覆盖变体路径间距由喷幅决定全覆盖路径规划不只是扫地机的专利。工业里的喷漆路径规划、消毒机器人、植保无人机、光伏板清洁全都属于同一类问题。区别只在于“覆盖工具”的作业幅宽不同以及路径不一定是地面二维的可能是三维曲面上的轨迹。以喷漆路径规划为例喷枪在空间中以一定的喷幅paint width和搭接率overlap ratio移动相邻两道路径的间距必须根据喷幅和漆膜厚度均匀性要求来设定间距过大会出现漏喷色斑过小则漆膜过厚、材料浪费。这类问题在数学上仍然可以建模成“条带覆盖”sweep coverage只是把二维栅格换成待喷表面的参数化曲线再用弓字形路径把曲面展开成一系列平行条带。另一个典型是消毒机器人。它喷出来的消毒液覆盖半径通常远大于车体宽度路径间距就不用卡得很死反而可以放宽以提高作业效率。这些场景共同揭示了一个道理全覆盖算法的骨架是通用的真正决定覆盖间隔和工作效率的是“执行器幅宽”这个物理参数。做路径规划时先搞清楚执行器到底能覆盖多大范围再谈算法优劣否则只会陷入空谈。3. 随机碰撞不是听天由命而是一套完整的“随机响应”策略3.1 早期扫地机器人的随机模式你看它乱它其实不傻2002年iRobot发布第一代Roomba的时候算力非常有限SLAM和全覆盖规划这些技术还跑不动。但产品又必须“看起来会自己扫”于是就有了随机碰撞策略机器人先直行遇到障碍物就旋转一个随机角度继续直行如此循环。很多人以为这就是闭眼乱撞。实际上随机碰撞算法包含两种模式切换一种是直行碰撞转向机器人沿当前方向前进直至碰到障碍物然后随机转一个角度通常围绕90度或180度分布另一种是沿墙跟随一旦检测到侧面障碍物就沿着障碍物边界行进沿着墙边把房间的周长走一遍。真正的早期Roomba还会在清扫开始时先执行几圈螺旋动作把附近区域快速覆盖一遍再进入随机漫游。组合起来就是一个典型的有限状态机开机螺旋 → 直行 → 碰撞 → 随机旋转 → 沿墙跟随 → 退出墙边继续直行。这套模式的“聪明”之处在于它不需要任何地图和定位只需要碰撞开关、红外测距、里程计和陀螺仪就可以在未知环境里稳定运行。对当时几十美元BOM成本的硬件来说已经是成本和功能之间的最优解。3.2 随机覆盖的效率真相覆盖率曲线不是直线随机碰撞策略的效率到底行不行我拿二维随机游走的数学模型来解释一下。在有限平面上各向同性随机游走确实能够最终覆盖几乎整个区域但它的覆盖率随时间变化是一条“前快后慢”的曲线。开头阶段机器人走过的区域少、未覆盖区域多碰到新区域的概率大覆盖率上升很快到了一定程度剩下的是散落在各处的孤立未覆盖小区域机器人连续走很久都不一定能准确命中这些区域覆盖率提升变得极其缓慢。这就是为什么纯随机策略在真实家庭里往往留下几块永远扫不到的空地。而加了沿墙跟随之后情况会好很多因为房间边界是固定的沿墙走一圈就能覆盖边缘带且随机漫游会把中部区域慢慢填满。有研究者在标准房间仿真里对比过随机碰撞策略配合螺旋沿墙模式可以达到90%以上的覆盖率但重复率可能高达200%甚至更多也就是机器人走了3倍于理想长度的路径。这里要特别强调一个工程结论随机碰撞策略的“随机”不是均匀瞎转旋转角度的分布很重要。如果旋转角度始终是正负90度机器人容易形成网格状的往返对大型开阔区域覆盖较好如果旋转角度始终是较小的30度机器人在障碍物密集区域容易被“困”在局部实际产品中往往会设计一个混合分布一部分时间转大角度跳转一部分时间转小角度贴近边角。这个参数的调优通常要靠在真实户型里跑上千次仿真来做。3.3 碰撞传感器是随机策略的“安全带”也是覆盖边缘的感知手随机碰撞算法最依赖的硬件就是碰撞传感器和悬崖传感器。碰撞环bumper围绕机器人前半圈触发时告诉控制系统“这里有障碍物”悬崖传感器一般是红外、垂直向下的传感器负责探测楼梯、台阶防止机器人从高处跌落。这两类传感器看似基础实际是随机策略能安全运行的前提。从感知角度看碰撞环其实是机器人与环境交互的最原始通道比激光雷达、深度相机都可靠。激光雷达在有玻璃、黑色家具、反光地砖时会出各种识别错误但碰撞环永远“撞到了就是撞到了”不会骗你。所以即便现在的主流扫地机都标配了激光雷达和SLAM机身前端依然保留碰撞环这不仅是兜底也是边缘覆盖能力的重要补充。很多规划式扫地机在沿墙模式里会用碰撞环信号来校准墙体的精确位置单靠激光雷达贴墙太近反而容易打滑或错位。3.4 随机思想在专业规划算法中的“亲戚”RRT、概率路线图讲随机碰撞策略容易让人误会“随机低级”但在路径规划这个领域随机性恰恰是现代采样算法的基础。快速扩展随机树RRT就是最典型的例子每轮迭代在地图里随机采样一个点把现有树向这个点扩展一段距离反复迭代直到树连接到目标点。RRT的“随机”和扫地机的“随机”在哲学上是相通的都是为了在缺乏先验信息时靠随机采样来保证概率完备性。RRT 的一个关键优势是它对复杂障碍物的处理非常自然不用像A*那样把空间栅格化也不用像人工势场法那样设计复杂的斥力函数。在做机械臂避障、高维空间搜索的时候RRT的随机性远比穷举式搜索高效。再看扫地机早期那些随机策略其实可以理解为“在二维平面中做零先验探索”的特例。技术迭代到今天现代扫地机的导航早就把“随机漫游”换成了“SLAM全覆盖规划”但RRT、概率路线图PRM这些随机采样算法在专业级机器人和工业机械臂里反而越来越常用。从算法分类的角度全覆盖和随机碰撞并不是“先进”与“落后”的对立它们面对的环境假设完全不一样。全覆盖假设“地图足够好”随机碰撞假设“地图不存在”两者的边界是移动机器人感知水平决定的。当下很多低成本扫拖机器人重拾“随机陀螺仪”方案正是因为用户对几十平米的单室小户型需求相对简单随机沿墙在成本和性价比上仍然占优。4. AGV路径规划的核心A*不是终点多机调度才是重头戏4.1 单台AGV的路径栅格代价函数、方向约束、JPS加速单台AGV的点到点路径规划教科书最爱讲A*。工程实现上A*确实是一块结实的顶梁柱把地图栅格化每个栅格作为搜索节点启发式函数h(n)用曼哈顿距离在AGV可以沿横竖方向移动时或欧氏距离在可以任意方向移动时代价函数g(n)则累计从起点到当前点的实际行驶距离。但AGV毕竟不是扫地机纯A规划出来的路径经常没法直接用。原因有三一是代价函数不能光算距离还得考虑转弯惩罚。我曾经在一个厂区项目里遇到过AGV沿着A给出的最短路径行驶乍一看长度很短但中途出现大量90度转弯差速轮跑起来还行舵轮车每转一次都要减速再加速实际耗电量反而更高。所以要在代价函数里加一个转弯惩罚项f(n)g(n)h(n)T(n)T(n)是累积转弯代价转弯次数越多路径越劣。调T的权重时要权衡效率和能耗这是个在现场反复跑出来的值。二是车体有长度转弯半径不可忽略。传统A*是基于“机器人是一个点”的假设但在窄巷道里车体转弯的包络可能扫到墙壁。现在工程上普遍的处理方法是在地图上加“膨胀层”把障碍物栅格向外扩张一定半径这个半径至少等于AGV车体外接圆半径加上安全余量。膨胀半径设太小车容易蹭墙设太大过道如果只有刚好一车宽膨胀后地图上就找不到通路了等于把路堵死。通常做法是先用车体宽度的一半作为基础膨胀半径再在仿真里对过道宽度做敏感性测试逐步微调。三是算力受限时的搜索效率。A在大地图、高分辨率栅格下搜索节点数量增长很夸张。工业项目里如果地图是100米×100米、栅格10厘米就是100万节点实时重规划会有压力。工程优化路径一般有两类一类是跳点搜索JPS利用网格对称性跳过大量规则排列的等价节点速度比A快一个数量级另一类是分层规划先在稀疏拓扑图上找大方向再在局部栅格上做精细规划兼顾效率和精度。4.2 多AGV冲突消解从时间窗到CBS冲突搜索单机路径规划只是“入场券”多AGV车队调度才是真正拉开工程差距的地方。多机系统的核心矛盾很简单每台车都想要最优路径但车道、物料暂存区、充电站这些资源是共享的两台车同时经过同一个路口就撞上了。解决冲突的主流思路有两大类一类是“先到先得锁”另一类是“离线联合规划”。先到先得锁是最常见、最稳妥的方案每台车按自己的规划路线行驶在进入共享路段前申请路径锁占用中不放出路段后释放。这种方案逻辑简单、实时性好但吞吐量低车辆一多容易出现连锁等待、甚至死锁。举个实际例子两条AGV在同一段环形车道上对向行驶各自锁住了对方必经的路段两台车就这么隔着一个路口互相等待调度中心如果不处理整个产线就瘫了。更高阶的做法是基于冲突搜索Conflict-Based SearchCBS。CBS的思路分为两层低层为每台AGV单独规划路径高层检测所有路径之间是否存在时空冲突同一时刻占用同一节点或者同一时间段对向占用同一条边。一旦发现冲突就对该冲突涉及的任务分别添加约束重新进行低层搜索……循环往复直到得到一个无冲突的组合方案。相关文献比如张洪琳、吴耀华等人在多机器人路径规划领域做的改进冲突搜索研究思路也基本都是围绕“降低高层冲突搜索成本、提高低层路径复用率”来做的。但CBS在工业场景落地时有一个明显短板算法是静态规划产线是动态的。新车随时会被呼叫旧任务可能被取消某台车可能因为掉电、超时脱离调度。所以生产环境里更常见的是把“CBS离线求全局无冲突”和“时间窗在线预约”结合预先用CBS生成几套基准方案实时运行时通过预约时间窗动态调整各车速度实在扛不住时才会让部分车让路这比每次有新任务都重新跑一遍CBS要快得多。4.3 任务分配与动态重规划调度层不止管路径多AGV项目里路径规划只是调度系统的一个环节真正的复杂度在任务分配和动态重规划。任务分配解决的是“哪辆车去执行哪条搬运任务”如果只派最近的AGV远处订单一直饿死近处车辆忙死。工程上常用匈牙利算法、拍卖算法或贪心策略按“预计到达时间最短任务优先级最高电量约束满足”做加权匹配。动态重规划则要在“全局最优”和“局部稳定”之间找平衡。一个很深的坑是如果某台车因为障碍物绕行而晚点了调度中心把所有未完成任务重新全局规划一遍结果可能让几条原本合理的路径全部被打乱形成连锁反应。所以现在的大型调度系统基本都是“滚动时域”每隔一段时间比如10秒到30秒收集一次全局状态做一次整体优化但在两次优化之间各车保持既有路线和速度。这有点像系统里的“批处理实时中断”既保性能又保稳定。还有一点特别值得提醒AGV调度系统要专门处理“慢车堵路”问题。比如某台AGV电池衰减速度比预期慢了10%就会占用预定路段更久导致后面的车集体降速。我在项目里会保留每台车的实时性能档案当连续多次速度比预期低时调度系统自动降低该车的优先级引导其他车从替代路径绕行。这种细活算法论文里不会写但真正跑产线时是决定稳定性的关键。5. 地图、定位、运动控制算法落地比算法本身更吃经验5.1 栅格分辨率与代价地图膨胀半径怎么定路径规划算法的输入不是“真实世界”而是“地图模型”。地图建得不对算法再漂亮也没用。最常见的地图是占据栅格地图Occupancy Grid Map每个栅格存储被占用的概率。栅格分辨率的选择要同时考虑机器人尺寸和地图尺寸。经验值是用机器人外接圆半径的1/3到1/2作为栅格大小一台30厘米直径的扫地机栅格取5厘米左右一台2米长的AGV栅格取20到30厘米。分辨率太高会带来巨大的算力开销太低则让路径在窄通道里“看不见路”。代价地图Costmap则是在栅格地图上额外生成的一层“风险热力图”让规划器知道离障碍物多远才算安全。膨胀半径的设计是路径规划里最需要动手调的部分之一。扫地机器人一般设置1个机器人半径的膨胀工业AGV则要区分“车体硬包络”和“安全停车距离”在车体实际边界外再增加3到10厘米的缓冲。另外对动态障碍行人、叉车、其他AGV区域通常另设一层动态膨胀半径更大且随传感器检测结果实时更新。这两层膨胀如果都设置过大仓库的窄通道会变得不可通过调度系统被迫绕远路效率断崖式下降。5.2 定位方式决定路径规划的可用性毫米级和厘米级的差距AGV和扫地机的定位精度要求不同直接决定了它们可以用的路径规划策略。工业AGV要对接充电桩、举升货架、在产线节拍时间窗口内准确停车需要有毫米级重复定位精度。目前的工程实现主要依赖三类方案磁条导航铺磁条便宜但路径固定、二维码/反光板导航地面贴码精度高但需要铺设维护、激光SLAM自然导航灵活但受环境变化影响较大。不少项目会做“融合”激光SLAM负责全局定位和路径规划近场二维码负责停靠对位精度这已经是成熟方案。扫地机就宽松很多。激光SLAM或视觉SLAM给出厘米级坐标配合IMU、里程计和轮速计做运动预测。只要不乱撞、不卡死用户一般感知不出几厘米的偏差。但扫地机有个AGV没有的麻烦它在床底、沙发底、桌腿间穿行时视觉特征极少激光也容易扫不到有效特征定位容易漂移。这时候往往要依赖车轮里程计的短时预测和“回到已知区域后重新对正”。这也是扫地机在地毯、长毛地毯上容易乱跑的原因因为轮子打滑导致里程计失真定位系统瞬间失去可信度。5.3 运动学约束下的路径平滑全向轮、差速轮、舵轮差很多规划器输出的路径如果是一堆带角度的折线段直接丢给底层运动控制器去执行控制效果会很灾难。扫地机差速轮可以原地旋转折线转弯还能勉强接受工业AGV的舵轮有最小转弯半径麦克纳姆轮好一些但能耗高折线路径往往会引发频繁“停车-转向-再启动”磨损大、效率低。所以轨迹平滑是AGV工程闭环里绕不开的一环。我接触过两种主流的工程处理方式。一种是整条路径用Dubins曲线或Reeds-Shepp曲线来拟合专门处理“只能前进”或“可前进可后退”的车辆转弯约束生成由直线和圆弧组成的可行路径。另一种是对A*输出的折线做贝塞尔曲线平滑让路径更柔顺但要不断检查平滑后的曲线是否还会碰撞障碍物否则平滑出来的轨迹可能直接穿墙。在混合导航方案里这两种方式往往同时使用全局规划出折线局部控制里用圆弧/贝塞尔过渡经过碰撞校验后再执行。需要特别提一句运动中持续躲避动态障碍物不能只靠全局规划。工业AGV上现在主流的是动态窗口法DWA或TEB局部规划器实时采样速度空间选一条既能避开障碍、又能朝目标点前进的轨迹。DWA的调参非常依赖现场经验加速度限制设太小机器人反应迟钝设太大轨迹毛糙、易抖动。扫地机场景里机器人遇到拖鞋、宠物、电线时主要也是靠局部规划器做避障只是参数更保守优先保安全而不是保效率。6. 仿真验证与现场调参最容易翻车的几个环节6.1 先在仿真里把覆盖率和冲突率跑透路径规划算法改动后直接在真机上调参会把问题混在一起很难判断是规划问题、定位问题还是底层控制问题。稳妥的做法是先做仿真验证。扫地机方向用Gazebo或自建的二维仿真器批量生成几十套户型、家具排布跑全覆盖算法统计覆盖率、重复率、清扫时间分布的百分位数。AGV方向则建议用能模拟多车同步的仿真平台把每个任务的时间戳、每台车的位置随时间变化、潜在冲突事件都记录成结构化日志。统计的核心指标是“死锁次数”和“总调度延迟”。项目里有个经验如果在仿真里一个小时出现两次以上的死锁不要急着改CBS参数先检查地图中是否存在过窄通道、单行道设计不合理很多冲突从地图规划阶段就已经注定了。仿真里跑不出问题不等于真机没问题但仿真里出现的规律性问题真机上几乎必然放大。尤其是覆盖率这种统计指标仿真里多环境多参数跑出来的中位数、P90对产品验收很有参考价值。6.2 调参经验膨胀半径、转弯代价、回扫策略几个高频调参点我这里直接写结论参考。膨胀半径先按机器人外接圆半径设置再对目标图做“膨胀敏感性测试”。如果车能在某个过道顺畅往返但路径规划却显示两侧栅格均为危险区、过道被封死把膨胀半径下调5到10毫米直到出现一条窄但可用的路径。记住代价地图的目标是“约束机器人中心点不侵入禁区”不是“把禁区外推得越大越好”。A*转弯代价T(n)的权重一开始可以设成“一个转弯相当于直线走0.5到1米”在直行路径明显比频繁转弯路径更慢的现场适当加大。但调太大又会让规划器为避开转弯走很长的绕路需要对比实测运输时间来做最终裁定而不是只看路径长度。扫地机回扫策略全覆盖完成后常会出现“边缘漏扫一条”或“某个小房间漏扫”的情况。一个好的回扫策略是让机器人优先沿障碍物边缘踢脚线、家具底部绕行一圈而不是重新执行全书覆盖。这样会把边缘空洞补掉又不会浪费大量时间。至于孤立小区域则可以用“目标点导航局部螺旋”的方式补充清扫比全局重新规划速度更快、重复率更低。6.3 从仿真到真机的几个典型故障说几个我实际踩过、也常见于社区求助的典型故障。一个是“地图重影导致的漏扫”。扫地机刚开始建图时如果SLAM参数里“低质量帧插入”阈值过松机器人经过纹理稀疏的走廊时会把新帧错接到错误位置地图上叠出两个几乎一样的房间机器人会以为自己已经扫过其中一边实际却漏了另一边的物理区域。解决方法是检查建图时的回环检测参数以及“是否允许在定位置信度低时继续移动”的开关这比在覆盖算法上拼命调参更有效。另一个是“AGV在路口互相礼让结果谁都没有走”。多车系统中如果“等待策略”和“避让策略”没有区分优先级两辆车可能在路口互相让对方先走陷入“活死锁”。这个问题我见过不止一次出现在协议设计不完备的项目里。对策非常简单粗暴设定明确的行车优先级比如“直行优先于转弯”“已进入路口的车优先于未进入路口的车”“空车让重车”并且在调度中心加一个“等待超时强制规划替代路径”的兜底逻辑。还有一个是“扫地机充电座附近反复打转”。这通常是因为充电座被当成障碍物融进了代价地图机器人接近充电座时局部规划器总认为前方危险不断让机器人绕行。解决方式是把充电座区域单独标记为“可通行区域”并降低膨胀等级使它既能被检测到又不会被规划器当作危险障碍物。从实际现场看算法选型和参数调试永远是在“理想规划”和“物理现实”之间找平衡。仿真解决的是逻辑问题真机解决的是感知和控制问题两层都打通了项目才算真正闭环。我在多个项目里反复体会到一句话路径规划本身并不复杂复杂的是让机器人在充满噪声、漂移和不确定性的真实世界里稳稳地执行那条“理论上很完美”的路径。全覆盖的扫地机和点到点的AGV一个追求“面面俱到”一个追求“准时准确”最终都要回到对地图质量、定位精度和运动控制边界的敬畏上来。希望这篇笔记能帮你少走几步弯路少调几宿参数。