机器人SLAM
SLAM(simultaneous localization and mapping), 也称为CML(Concurrent Mapping and Localization), 即时定位与地图构建, 或并发建图与定位
问题可以描述为:
将一个机器人放入未知的环境中的未知位置, 是否有办法让机器人一边移动一边逐步描绘出此环境完全的地图
(所谓完全的地图 –a consistent map
: 是指不受障碍行进到房间可进入的每个角落)
ROS的二维导航功能包, 简单来说, 就是根据输入的里程计等传感器的信息流和机器人的全局位置, 通过导航算法, 计算得出安全可靠的机器人速度控制指令
但是, 如何在特定的机器人上实现导航功能包的功能, 却是一件较为复杂的工程
作为导航功能包使用的必要先决条件, 机器人必须运行ROS, 发布tf变换树, 并发布使用ROS消息类型的传感器数据
同时, 为了让机器人更好的完成导航任务, 开发者还要根据机器人的外形尺寸和性能, 配置导航功能包的一些参数
机器人必要的配置:
- ROS: 确保机器人安装了ROS框架
- tf变换(sensortransforms): 导航功能包要求机器人以tf树的形式发布各个相关参考系的变换关系
- 传感器信息(sensor sources): 导航功能包需要才起机器人的传感器信息, 以达到实时避障的效果
- 里程计信息(odometry sources): 导航功能包要求机器人发布
nav_msgs/Odometry
格式的里程计信息, 同时也要发布相应的tf变换- 机器人控制器(base_controller): 导航功能包最终的输出是针对机器人
geometry_msgs/Twist
格式的控制指令- 地图(map_server): (不必须)
准备工作
- 可以对机器人进行控制, 通过消息
rosmsg show geometry_msgs/Twist
- 导航功能包要求机器人必须有激光雷达等测距设备
- 导航功能包以长方形或圆柱形机器人模板进行开发, 其他外形机器人可以正常使用但可能功能不佳
传感器信息
rosmsg show sensor_msgs/LaserScan
里程计信息
- 里程计根据传感器获取的数据来预估机器人随时间发生的位置变化
- 比如, 利用旋转编码器计算机器人运行的距离
rosmsg show nav_msgs/Odometry
- pose: 机器人当前位置坐标, 以及用于矫正误差的协方差矩阵
- twist: 机器人三轴的线速度与角速度
仿真平台创建
- 运行gazebo
- Edit -> Building Editor
- 可绘制仿真环境
gmapping
- ROS开源社区汇集了多种SLAM算法, 可以直接用于二次开发, 其中最为常用和成熟的是gmapping功能包
- 下载方法:
sudo apt-get install ros-kinetic-gmapping
- 优点: Gmapping可以实时构建室内地图, 在构建小场景地图所需的计算量较小且精度较高
- 缺点: 随着场景增大所需的粒子增加, 因为每个粒子都会携带一幅地图, 因此在构建大地图时所需内存和计算量都会增加, 因此不适合构建大场景地图
地图构建
自主导航
导航框架:
导航的关键是机器人定位和路径规划两大部分
针对这两个核心, ROS提供了以下两个功能包
- move_base 实现机器人导航中最优路径规划
- amcl 实现二维地图中机器人的定位
安装导航框架:
sudo apt-get install ros-kinect-navigation
move_base是ROS中完成路径规划的功能包, 主要由以下两大规划器组成:
- 全局规划路径: 根据给定的位置和全局地图进行总体路径规划
- 本地实时规划: 实际情况中不可能完全按照全局路线进行运动, 针对障碍物, 地图信息, 碰撞, 综合评价标准选取最优路径
acml
自主定位, 即机器人在任意状态下都可以推算出自己在地图中的位置
同样需要了解amcl提供的话题, 服务与参数
amcl与里程计定位的区别:
- 里程计定位: 只是处理/base与/odom之间的TF变换
- amcl定位: 可以估算机器人在地图坐标系/map下的位资信息, 提供/base, /odom, /map之间的TF变换