2. 环境建模基础
做路径规划这么多年,我越来越觉得一个道理:地图选不对,算法全白费。你想想看,再好的A*算法、再牛的DWA,如果地图本身就没建好,那机器人要么撞墙,要么原地转圈。
今天咱们就来聊聊环境建模这件事。说白了,就是怎么把真实世界翻译成机器人能看懂的语言。我习惯把地图分成三类:栅格地图、代价地图、拓扑地图。每种都有它的脾气,选对了事半功倍。
一、栅格地图:最朴素的表达方式
栅格地图,也叫占据网格地图。它的思路特别简单——把空间切成一个个小格子,每个格子标记为"有障碍"或"无障碍"。
我在做扫地机器人项目时,用的就是这种地图。激光雷达扫一圈,把障碍物位置投影到网格上,黑色格子代表墙,白色格子代表可通行区域。嗯,就是这么直白。
核心参数:
- 分辨率:每个格子代表的实际尺寸。比如0.05m/格,就是5厘米一格
- 占据概率:不是简单的0或1,而是用概率表示"这个格子有障碍的可能性"
- 更新策略:每次传感器读数都会更新格子的概率值
举个例子,假设我们有一个10m×10m的房间,用0.1m分辨率建图:
# 伪代码:栅格地图初始化
grid_width = 100 # 10m / 0.1m = 100格
grid_height = 100
occupancy_grid = [[0.5] * grid_width for _ in range(grid_height)]
# 激光扫描到障碍物时
def update_grid(x, y, hit=True):
grid_x = int(x / 0.1)
grid_y = int(y / 0.1)
if hit:
occupancy_grid[grid_y][grid_x] += 0.3 # 增加占据概率
else:
occupancy_grid[grid_y][grid_x] -= 0.2 # 减少占据概率
# 限制在[0, 1]范围内
occupancy_grid[grid_y][grid_x] = max(0, min(1, occupancy_grid[grid_y][grid_x]))
我的经验:分辨率不是越高越好。0.05m对于室内导航已经够用,再高反而增加计算量。我曾经试过0.01m分辨率,结果一个100平米的房间建了100万格,路径规划慢得让人抓狂。
二、代价地图:给每个格子打分
栅格地图只告诉你"能不能走",但代价地图告诉你"好不好走"。说白了,就是给每个格子赋予一个代价值。
为什么会需要这个?你想想看,机器人经过地毯和经过瓷砖地面,代价能一样吗?靠近墙边走和走中间,风险能一样吗?
代价地图通常由三层叠加而成:
| 图层 | 来源 | 作用 |
|---|---|---|
| 静态层 | 预先建好的栅格地图 | 表示固定障碍物 |
| 障碍物层 | 实时传感器数据 | 表示动态障碍物 |
| 膨胀层 | 算法生成 | 把障碍物"胖一圈",防止碰撞 |
膨胀层这个设计,我特别喜欢。它其实是在说:别贴着障碍物走,留点安全余量。膨胀半径一般设为机器人半径的1.2倍,这样规划出来的路径,机器人走起来才踏实。
避坑指南:我曾经在仓库AGV项目里,把膨胀半径设得太小,结果机器人贴着货架走,稍微有点定位误差就撞上了。后来改成机器人半径的1.5倍,再也没出过问题。记住:安全第一,效率第二。
三、拓扑地图:只关心"怎么走"
拓扑地图的思路完全不同。它不关心具体坐标,只关心节点之间的连接关系。就像地铁线路图,你不需要知道站台的具体经纬度,只需要知道哪站换乘。
拓扑地图的核心要素:
- 节点:关键位置,比如房间门口、走廊拐角
- 边:节点之间的可通行路径
- 权重:边的长度或通行代价
我做过一个酒店送物机器人项目,就是用拓扑地图。每个房间门口是一个节点,走廊交叉口是一个节点,电梯口是一个节点。机器人只需要知道"从301房间到电梯,走走廊右转",根本不需要知道精确坐标。
# 拓扑地图示例
topo_map = {
'nodes': ['room_301', 'corridor_A', 'elevator', 'lobby'],
'edges': [
('room_301', 'corridor_A', 5.0), # 距离5米
('corridor_A', 'elevator', 12.0), # 距离12米
('elevator', 'lobby', 8.0) # 距离8米
]
}
# 路径规划:从room_301到lobby
# 结果:room_301 -> corridor_A -> elevator -> lobby
# 总距离:5 + 12 + 8 = 25米
我的建议:拓扑地图特别适合结构化环境,比如办公楼、医院、酒店。但如果环境经常变化(比如仓库货架位置常变),拓扑地图维护起来就麻烦了。这时候还是栅格地图更靠谱。
四、三种地图怎么选?
说实话,没有绝对的好坏,只有合不合适。我一般这样选:
- 室内导航、扫地机器人:栅格地图为主,代价地图辅助
- 仓储物流、工厂AGV:拓扑地图为主,栅格地图做局部避障
- 自动驾驶、室外巡检:三种地图混合使用
嗯,这里要注意:实际项目中往往是混合使用。比如我的一个医院物流机器人,全局规划用拓扑地图(知道要去哪个科室),局部规划用代价地图(避开走廊里的行人)。
五、本章知识体系
下面这张图,是我自己总结的环境建模知识框架,你看一眼就能明白三种地图的关系:
好了,这一章的内容就到这里。环境建模是路径规划的基石,地基打不牢,后面盖什么楼都白搭。下一章咱们聊聊全局路径规划算法,到时候你会回来感谢今天认真学地图的自己。
本章要点回顾:
- 栅格地图:把空间离散化,适合精确导航
- 代价地图:给格子打分,考虑通行代价和安全性
- 拓扑地图:只关心连接关系,适合大范围规划
- 选型原则:看环境特点、看任务需求、看计算资源
可可精品资料库