问题描述: ROS 移动机器人建图后,用Navigation导航包执行 起始位置到 目标位置的路径规划和导航行走的过程中。 机器人导航初始化的时候,刚加载地图,如何让移动机器人执行 全局定位 global localization,把max Nparticles的粒子数量均匀撒在整张地图上?


 首先 在navigation的launch文件 amcl.launch 或者类似的文件中增加或修改以下内容,让粒子的位置高斯分布协方差大一点。分布广一点。 value值可以是4、8或者类似的值


<param name=”initial_cov_xx” value=”8”/>
<param name=”initial_cov_yy” value=”8”/>
<param name=”initial_cov_zz” value=”8”/>

方法:另开一个命令行控制台窗口,执行一些命令 调用全局定位服务。

  • rosservice call /global_localization “{}”

刚加载地图时如下图所示:

不管是空闲区域 free 还是占用区域 occupied 都撒了粒子。



重新开一个控制台命令行窗口后,执行如下命令 (以下命令,每执行一次,粒子和小车的位置变化一次,但是仍然很难定位准确,只是随机的全局定位貌似。)


  • rosservice call /global_localization “{}”
  • 结果如下所示,粒子遍布整张地图的空闲区域,占用区域没有粒子了。

参考:Robots/TIAGo/Tutorials/Navigation/Localization - ROS Wiki

执行命令:rosservice call /global_localization “{}” 


 request_nomotion_update (std_srvs/Empty):该服务是手动的来更新粒子并发布新的粒子,可以使用如下命令来调用服务执行更新粒子的操作,该服务一般需要多次调用才能逐渐看到粒子收敛的效果:

如何让粒子撒满地图后,一步一步地收敛,看到粒子收敛的过程,粒子簇的聚类 最后收敛到正确或错误位置后 只剩下一簇粒子堆。

1. 打开终端,打开实际gazebo空间

2. 再打开一个终端,在空间中建图(house 或者其他场景)

3. 再打开一个终端,调用键盘控制小车移动包

4. 再打开一个终端,保存地图

5. 关掉slam建图, 再打开终端调用导航包

6. 按照本文上半部分内容,调节amcl文件内容,调用全局定位服务;

7. 之后根据键盘控制终端的前进后退或者转动的操作,控制小车移动,rviz界面可以查看粒子收敛和移动的步骤过程。 直至最后收敛到正确或者错误的一簇粒子堆。

如何安装ROS turtlebot3软件包和依赖库的参考:

Ubuntu16.04 + ROS kinetic + 激光slam-cartographer ROS + 数据仿真 + Turtlebot3仿真_GGY1102的博客-CSDN博客