amcl中手动定位自主定位问题

来源:互联网 发布:淘宝详情页视频下载 编辑:程序博客网 时间:2024/06/13 05:59

amcl手动和自动定位问题

  首先定位问题要基于建好的地图上,相信大家已经建好了自己的地图,建图方法其他博主写的很详细,在这里不做过多的介绍。本博客只介绍博主在学习ROS中遇到的各种问题,希望以后的朋友们不要再陷入这样的“坑”。

   言归正传,我们在做小车的导航时,都需要在rviz图形界面下进行小车的位姿矫正,点击2D pose estimates进行大致位置的估计,如图所示:

    但是,从图中可以看出,激光数据不是很准确,所以需要在teleop_twist_keyboard的终端小范围前后左右移动小车,小车逐步确定它自身的位置。 判断小车是否定位成功,主要看小车周围红色的点是否收缩到一起。如图为收敛后的粒子图:


    这个过程是最基础的小车手动定位的实例,也相对的简单。但是对于自动定位,如果夹杂视觉来做的话,简单易懂,但是如果在不用视觉的情况下会怎样呢?基于此问题,博主历经千辛万苦,最后幸不辱命调试成功。

 

 基于global_localization service的自主定位,主要步骤

1、打开已建好的地图,运行自己的launch文件(需包含:小车底盘,激光雷达,amclmove_basetf变换等节点功能)

2、调用 global_localization service

global_localization serviceROS自带的一个服务,详细用法可查ROS wiki官网。以下是调用该服务的代码:

#include "ros/ros.h"  #include "std_msgs/Int16.h"  #include <move_base_msgs/MoveBaseAction.h>  #include <actionlib/client/simple_action_client.h>  #include "std_srvs/Empty.h"  #include <cstdlib>  int main(int argc, char **argv)  {    ros::init(argc, argv, "robot_global_localization");     ros::NodeHandle n;    ros::ServiceClient client = n.serviceClient<std_srvs::Empty>("global_localization");    std_srvs::Empty srv;          if (client.call(srv))//服务调用   {       ROS_INFO("  Successful call");    }    else   {     ROS_ERROR("Failed to call service global_location");      return 1;   }     return 0;  }  

此程序主要用来进行自主定位。

    

3、更改amcl中协方差参数

  路径:navigation>amcl>test>small_loop_crazy>driving>prg.xml,内容如图

   我们默认值是0.1,此时我们只需将initial_cov_xx/yy/aa都改成8,或者4。当我们打开rviz图形界面下得particlecloud时,会看到粒子铺满地图,如图所示


4、这时我们需要运行键盘控制小车运动:

    rosrun dashgo_bringup telep_twist_keyboard.py

5、观察rviz图形界面,过程如下:



总结:

   调用Global_localization这个服务虽然可以完成小车的自主初始化位姿,但是粒子收敛时间很长,平均在90s左右,如果减少相对粒子数min_particles,max_particles,收敛时间会相对减小。Amcl中默认的最小,最大粒子数分别为500,5000。基于此,得出结论,该方法试用初学者更好的了解amcl,博主亲身体验,当然amcl的优化很重要也是后续工作的一大难题。希望广大朋友一起努力。有优化想法的可以联系我。微信734349984


版权声明:本文为博主原创文章,未经博主允许不得转载。 


原创粉丝点击