在ros环境下的amcl配置笔记

这段时间导师让研究一下amcl,在这之前只有一点ros基础,根本不知道amcl是什么东东,于是开始查资料找教程,但是真心没有找到面向小白的配置教程,在这几天的摸索中,终于让amcl正常跑起来了,所以,一定要做一下笔记,免得以后忘光了。
amcl的英文全称是adaptive Monte Carlo localization,即自适应蒙特卡罗定位,它是2D机器人运动的概率定位系统,它实现了自适应(或KLD采样)Monte Carlo定位方法,该方法使用粒子滤波器跟踪已知地图上的机器人姿态。好了,废话就这么多,接下来开始介绍配置过程,面向小白哦。
既然是面向小白,那从ros安装开始说起吧:(以安装ros的indigo为例,ubuntu选用14.04版本,ubuntu版本不建议太高)
首先官网安装教程网址:http://wiki.ros.org/indigo/Installation/Ubuntu ,如果你不想看英文,那么对于下面的东西,一路复制粘贴就ok了。

sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list'
sudo apt-key adv --keyserver hkp://ha.pool.sks-keyservers.net:80 --recv-key 421C365BD9FF1F717815A3895523BAEEB01FA116
sudo apt-get update
# ------------下面几个不同功能的版本任选一个(强烈建议选第一个)------------------
 1. 完整版:
sudo apt-get install ros-indigo-desktop-full
 2. ROS,rqt,rviz和机器人通用库(rqt,用来显示节点、消息传递图;rviz,可视化界面)
sudo apt-get install ros-indigo-desktop
 3. ROS包,构建和通信库,没有GUI工具。
sudo apt-get install ros-indigo-ros-base
 4. 也可以安装特定的ROS软件包,例如gmapping;通过 apt-cache search ros-indigo 命令可以查看找到可用的软件包
sudo apt-get install ros-indigo-slam-gmapping
------------------------------以上4选1-------------------------------------
sudo rosdep init
rosdep update
echo "source /opt/ros/indigo/setup.bash" >> ~/.bashrc
source ~/.bashrc
sudo apt-get install python-rosinstall

嗯…,然后,再贴一个新手入门教程:http://wiki.ros.org/cn/ROS/Tutorials ,接下来,开始创建一个工作空间,开始鼓捣amcl

创建工作空间:

mkdir -p ~/catkin_ws/src

切换目录到src:

cd ~/catkin_ws/src

下载navigation,rbx包:

git clone https://github.com/ros-planning/navigation
git clone https://github.com/pirobot/rbx1

下载完之后编译

cd ..
catkin_make

然后报错:
这里写图片描述
然后(参考 https://answers.ros.org/question/220676/how-to-install-bullet-on-indigo-in-ubuntu/):

sudo apt-get install libbullet-dev

再编译,报错:
在ros环境下的amcl配置笔记_第1张图片
解决方案(参考 https://answers.ros.org/question/201630/orocos-bfl-not-found-while-installing-navigation-stack-ros-indigo-ubuntu-1404/):

sudo apt-get install ros-indigo-navigation

再编译,报错 Error: ‘shared_ptr’ in namespace ‘std’ does not name a type (参考https://blog.csdn.net/WangJiankun_ls/article/details/56277272),按照它的方法,在catkin_ws/src目录下的 CMakeLists.txt 文件中加如一行:

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -std=gnu++0x")

再编译,报错(参考 https://blog.csdn.net/handsome_for_kill/article/details/53288771):
在ros环境下的amcl配置笔记_第2张图片
解决方案,找到一个FindEigen3.cmake文件,直接在电脑里面搜索就行,应该会有的,找不到的话我给个百度云链接:https://pan.baidu.com/s/1zzK–WiLauQChzjDagbNhQ 密码:v58s,下下来放到 ~/catkin_ws/src 目录下,然后在该目录下的 CMakeLists.txt 文件中加一行:

set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR})

在ros环境下的amcl配置笔记_第3张图片
在ros环境下的amcl配置笔记_第4张图片
再 catkin_make 一下,编译成功,完美!
现在开始运行,

cd ~/catkin_ws
source devel/setup.bash
cd src/navigation
roscore

再开一个终端,每次开一个终端之后,记得运行一下 source ~/catkin_ws/devel/setup.bash 文件,当然,为避免麻烦,把 source ~/catkin_ws/devel/setup.bash 添加到 ~/.bashrc 文件下的最后一行,这样每次再开一个终端,系统会自动运行这条命令。接着运行机器人节点:

roslaunch rbx1_bringup fake_turtlebot.launch

接着报错(参考 https://answers.ros.org/question/243919/cannot-launch-node-of-type-arbotix_pythonarbotix_driver-arbotix_python/):
在ros环境下的amcl配置笔记_第5张图片
解决方案:

sudo apt-get install ros-indigo-arbotix

再次运行机器人节点,成功,然后再开一个终端运行 amcl 节点,使用测试地图:

roslaunch rbx1_nav fake_amcl.launch map:=test_map.yaml

接着再开一个终端,运行 rviz :

rosrun rviz rviz -d `rospack find rbx1_nav`/nav_fuerte.vcg

貌似不行,
在ros环境下的amcl配置笔记_第6张图片
错误提示是一种老的rviz格式,然后查看 rbx1/rbx1_nav 目录下发现都是.rviz格式的文件,所以将扩展名改为 rviz ,解决。

rosrun rviz rviz -d 'rospack find rbx1_nav'/nav_fuerte.rviz

另外一种解决方案,在 https://github.com/pirobot/ros-by-example 里面下载 nav_fuerte.vcg 下来放到 rbx1/rbx1_nav 目录下,然后再运行该命令即可:

rosrun rviz rviz -d `rospack find rbx1_nav`/nav_fuerte.vcg

rviz 节点运行成功之后,会弹出显示界面,然后 add --> By topic --> 分别添加 Map, Pose, Odometry, 然后OK确定,详情见下图:
在ros环境下的amcl配置笔记_第7张图片
在添加这几个显示 topic 之后, 如下图所示,会显示地图和初始位姿(在 home/sun/catkin_ws/src/rbx1/rbx1_nav/maps 目录下有几个pgm图和对应的yaml文件,yaml文件中包含了关于相应的地图信息,详情见下面),然后点击上面的 2D Nav Goal ,在地图上点击确定目标点,它就会自动导航到目的位姿。
在ros环境下的amcl配置笔记_第8张图片
效果图如下图所示:
在ros环境下的amcl配置笔记_第9张图片

以 test_map.yaml 文件为例, 其内容为:
image: test_map.pgm # 地图名称(也可以写成绝对路径)
resolution: 0.050000 # 地图分辨率,含义为每个像素 0.05m
origin: [-13.800000, -12.200000, 0.000000] # 【初始点坐标 x,y, 方向 yaw】
negate: 0 白色/黑色,自由/占用 的语义是否应该颠倒(阈值的解释不受影响)
occupied_thresh: 0.9 # 占用概率大于此阈值的像素被视为完全占用。
free_thresh: 0.196 # 占用概率小于此阈值的像素被视为完全空闲。
关于它的解释,可以参考http://wiki.ros.org/map_server/。所以,如果你想生成自己定义的地图,只需要创建yaml文件,根据需要修改前3行的值就行了,然后关于生成自定义地图的话,在ubuntu里面用gimp可以做,用 google 开源的 cartographer 也可以跑一个地图再导出来,其实用 matlab(直接 imwrite(‘map.pgm’, ‘map_matrix’) 用imwrite函数即可), C++都可以做一个 pgm地图出来,它其实和一般的png图片区别不大,只要你的地图最终能被正常加载进去就是胜利。关于pgm信息,可以参考这个网址:https://www.cnblogs.com/cxchanpin/p/6816981.html ,(注:里面说“每行长度不能超过70个字符”,我之前按照它的说法生成的地图用map_server加载进去报错,然后抛弃这个规则生成地图尝试了下,结果正确加载没有问题) 我根据它提供的头文件建了一个工程,做了些许修改,成功生成了pgm地图,并且能通过map_server正常加载进去没有问题,下载请见:https://download.csdn.net/download/sunqin_csdn/10431375, 有积分的童鞋帮忙捧个场,没积分的同学可以联系我[email protected] 。然后关于使用map_server加载pgm地图:
开终端,运行roscore, 开另外一个终端,运行 map_server 节点,参数为对应的yaml文件,再开一个终端,运行rviz, 然后 add --> by topic --> Map 就可以再rviz中查看地图了。

roscore
# 开另外一个终端, 这个yaml文件需要自己根据地图自己按照对应格式创建。
rosrun map_server map_server you_map_yaml_file.yaml
# 再开另外一个终端
rviz

然后,如果输出下面信息,说明地图加载成功了, 然后再打开rviz显示就可以了。
这里写图片描述
如果出现下面这个情况,请把map_server后面的 yaml 文件写成绝对路径或者 cd 到 yaml 文件所在的路径再执行该指令。
这里写图片描述
如果是下面这种情况,说明你的地图文件格式有问题,map_server 不能正常打开。
这里写图片描述

好了,到这里差不多可以告一段落了,如果想接着往后玩, https://www.cnblogs.com/yoyo-sincerely/p/5774622.html, https://www.cnblogs.com/talugirl/p/5962806.html, 这两个链接可以试一下。

参考链接:
ros安装配置:
http://wiki.ros.org/indigo/Installation/Ubuntu
http://wiki.ros.org/cn/ROS/Tutorials
https://github.com/ros-planning/navigation
https://github.com/pirobot/rbx1
amcl配置使用:
https://blog.csdn.net/hcx25909/article/details/12110959
https://www.cnblogs.com/yoyo-sincerely/p/5774622.html
https://www.cnblogs.com/talugirl/p/5962806.html
报错解决方案链接:
https://answers.ros.org/question/220676/how-to-install-bullet-on-indigo-in-ubuntu/
https://answers.ros.org/question/201630/orocos-bfl-not-found-while-installing-navigation-stack-ros-indigo-ubuntu-1404/
https://blog.csdn.net/handsome_for_kill/article/details/53288771
https://answers.ros.org/question/243919/cannot-launch-node-of-type-arbotix_pythonarbotix_driver-arbotix_python/

你可能感兴趣的:(程序调试)