10.4 map_server & amcl
在某些固定场景下,我们已经知道了地图(无论通过SLAM还是测量),这样机器人每次启动最好就能直接加载已知地图,而是每次开机都重建。在这种情况下,就需要有一个节点来发布/map
,提供场景信息了。
10.3.1 map_server
map_server是一个和地图相关的功能包,它可以将已知地图发布出来,供导航和其他功能使用,也可以保存SLAM建立的地图。
要让map_server发布/map
,需要输入给它两个文件:
- 地图文件,通常为pgm格式;
- 地图的描述文件,通常为yaml格式
例如在ROS-Academy-for-Beginners
里,我们提供了软件博物馆的地图文件,见slam_sim_demo/maps
下:
Software_Museum.pgm
Software_Museum.yaml
image: Software_Museum.pgm #指定地图文件
resolution: 0.050000 #地图的分辨率 单位为m/pixel
origin: [-25.000000, -25.000000, 0.000000] #地图的原点
negate: 0 #0代表 白色为空闲 黑色为占据
occupied_thresh: 0.65 #当占据的概率大于0.65认为被占据
free_thresh: 0.196 #当占据的概率小于0.196认为无障碍
其中占据的概率 occ = (255-color_avg)/255.0, color_avg为RGB三个通道的平均值。
有了以上两个文件,你可以通过指令来加载这张地图,map_server相关命令如下:
map_server命令 | 作用 |
---|---|
rosrun map_server map_server Software_Museum.yaml |
加载自定义的地图 |
rosrun map_server map_saver -f mymap |
保存当前地图为mymap.pgn和mymap.yaml |
当我运行rosrun map_server map_server ***.yaml
时,会有以下的通信接口:
Topic
通常我们是在launch文件中加载map_server,发布地图。而map_server发布的消息包括:
- /map_metadata: 发布地图的描述信息
- /map: 发布锁存的地图消息
Service
amcl的服务只有一个:
- static_map: 用于请求和响应当前的静态地图。
Param
amcl有一个参数需要设置,就是发布地图的frame。
- ~frame_id: string类型,默认为map。 绑定发布的地图与tf中的哪个frame,通常就是map。
有两个概念不要搞混淆,map既是一个topic,也是一个frame,前者是topic通信方式中的一个话题,信息交互的频道,后者是tf中的一个坐标系,map_frame需要和其他的frame相连通。
10.3.2 amcl
Adaptive Mentcarto Localization(AMCL),蒙特卡洛自适应定位是一种很常用的定位算法,它通过比较检测到的障碍物和已知地图来进行定位。
AMCL上的通信架构如上图所示,与之前SLAM的框架很像,最主要的区别是/map
作为了输入,而不是输出,因为AMCL算法只负责定位,而不管建图。
同时还有一点需要注意,AMCl定位会对里程计误差进行修正,修正的方法是把里程计误差加到map_frame
和odom_frame
之间,而odom_frame
和base_frame
之间是里程计的测量值,这个测量值并不会被修正。这一工程实现与之前gmapping、karto的做法是相同的。
演示截图
amcl算法演示效果图如下: