基于ROS的自主导航小车Plantbot--自主导航

基于ROS的自主导航小车Plantbot--自主导航

Navigation是ROS中实现导航的集(stack),Navigation工作机制如下图所示。


可以看到Navigation的输入包括:里程计信息、激光雷达或者rgbd-camera信息、已知的先验地图(可选)和坐标系变换信息,输出为cmd_vel,即速度命令。move_base是navigation的核心部分,包括全局规划器(global_planner)、局部规划器(local_planner)、全局成本地图(global_costmap)、局部成本地图(local_costmap)以及行为恢复层(recovery_behaviors)。各部分功能如下:

(1)global_planner:接收global_costmap,采用A*/D*算法规划出从起始点到目标点的路径,为local_planner作参考;

(2)local_planner:接收local_costmap,采用动态窗算法(Dynamic Window Approach ,DWA)规划出小车的运动速度广播到底层ROS,这个速度既考虑到了更加精准的局部地图(避障)也考虑到了跟踪global_planner规划的路径(导航)。

(3)global_costmap:生成全局地图信息,通过costmap_2d,不同的数据被统一成栅格地图,作为global_planner的输入;

(4)local_costmap:生成局部地图信息,通过costmap_2d,不同的数据被统一成栅格地图,作为local_planner的输入;

(5)recovery_behaviors:恢复机制,用来处理move_base中的异常情况。

对应地,需要设置规划器和成本地图的配置文件,具体配置可以参考文档:Setup and Configuration of the Navigation Stack on a Robot。 文档中所列的参数只是一小部分,其它没有专门设置的参数使用的是默认值,具体参数的设置值需要根据实际表现以及报错和警告信息不断调节,可以参考Basic Navigation Tuning Guide 。正如调节文档所说,里程计对于导航的成功与否影响很大,为此,一方面可以根据文档中的方法将里程计的计算值尽量保持与实际值一致(对于差分驱动系统,实际是改变轮间距的值以靠近真实值),另一方面可以融合更多的传感器来确定里程,robot_localization是很常用的一个融合多传感器确定里程的集,如下图所示红色是真实轨迹,可以看到只使用编码器计算的里程计估计姿态(黄色轨迹)误差很大,融合一个IMU可以很大程度提高准度(青色轨迹)。[A Generalized Extended Kalman Filter Implementation for the Robot Operating]

robot_localization在navigation中的用法如下[Working with the robot_localization Package]:

Plantbot导航时的坐标变换关系如下所示:

另外,在试验发现,global_planner在规划路径时,成本函数的自变量并非只有距离,成本地图的计算还考虑到了实现过程中的可靠性。如下图所示,从初始位姿到目标位姿本来可以走更近的路线,但考虑到中间区域无参照物影响定位精度,规划器规划了另一条更可靠的路线,充分体现了ROS的实用性。



----------------------------------------------------------------------------------------------------------------------

目录:

基于ROS的自主导航小车Plantbot--底层驱动
基于ROS的自主导航小车Plantbot--SLAM
基于ROS的自主导航小车Plantbot--自主导航

后记:

整个项目历时三个月终于完成了,整个小车的成本为¥3000(包括NUC及激光雷达),成本低的另一方面是工作不可靠,如两个电机输入相同的PWM值转速也存在高于容许范围的速度差(电机互换性不高)、激光雷达转速不能太快(激光雷达性能不足)、导航不稳定(参数不优、系统稳定性有待提高),但总的来说实现了运动平台的多种控制方式以及SLAM、导航核心任务。

感谢@fly qq 的指导与帮助。项目的代码已经上传到github上:github.com/marooncn/pla

欢迎讨论、交流

编辑于 2017-06-22 21:04