ROS常用来开发:SLAM 路径规划 机器视觉
SLAM:同步定位和建图
研究slam时,一般假设路径规划是已经解决的问题
SLAM常用的开源算法包 Gmapping karto Hetor Cartographer
Localization:AMCL
path planing: Navigation 其中又分成 global (dijkstra,A*) 和local(DWA) 问题
建图MAP
一个topic /map msg类型 OccipancyGrid(栅格地图)
三部分
报头header :序列 时间戳 和frame(就是map)
信息 info :存储了当前地图的一些相关信息 (地图加载时间,像素m/pixel 一个像素代表多少m 一般0.05 0.025 ,宽度,高度 pixel) geometry_msgs/pose orgin描述了初始化时相较于map这个frame的位置和朝向
数据 data:最重要的就是data,实际每一格地图的数值,数值表示的就是cost,机器人走到这一格要消耗的成本,用数组来表示,长度就是width×height 每一个像素都是一个字节,用来存放cost
Gmapping
最核心的node slam_gamapping
需要:感知环境(laser odom里程计 又分为encoder visual imu)
输入就两个
/tf :其中tf必须是base 到 odom的tf,里程计到机器人底盘之间的坐标转换关系,这个是通过odom 的 encoder visual imu读出来的,slam_gamapping只关心base 到 odom的tf
/scan
发布的:
**/tf :**就是用来定位的,发布的是map到odom之间的tf,也就知道了map和base之间的转换关系了,就实现了定位,tf tree就连通了,这里MAP指的是frame,坐标系
**/map:**把每次建图的结果图片发到 /map上,更新地图。这个map又会被很多其他的node接受,例如path planning ,Rviz中看到地图,也是因为订阅了map,这个map指的是topic
**/map_metadata:**把地图的一些信息,高度,宽度,分辨率单独作为一个topic发送出来了
**/entropy:**建图的精度
Gmapping Service
提供了一个服务,没有request,不用请求,直接调用,显示当前地图,提供了一个地图查询服务。
还有一些详细的参数
Karto Topic
一般map就是三个坐标系
odom通过encoder之类的计算,会有累计误差,但是slam不光接收odom和base之间的tf ,同时会修正误差,发布odom和map之间的tf。
slam一方面接受odom作为输入,定好位之后输出一个tf,也就是对之前odom的tf进行修正。无论是Gmapping karto 还是 AMCL都是这种算法,这是slam或者定位的算法所需要的工作。
相对的
只靠odometry 只用里程计来定位,不用一些优化算法来校正,这种方法map和odom之间的关系是固定的
例子:
roslaunch robot_sim_demo robot_spawn.launch
roslaunch slam_sim_demo gmapping_demo.launch
roslaunch slam_sim_demo view_slam.launch