最近开始学习ORB_SLAM2,想试试它的AR功能。尝试的过程中遇到了一些问题,总结一下:
搭建ORB_SLAM2
ORB_SLAM2的搭建并不难,网上有很多教程,这个就不错点击打开链接
(我建议用opencv3.2,因为之前我装的3.0,没有成功,后来删了3.0换了3.2,就成功了)
ORB_SLAM2的源码git_hub上有:点击打开链接
ORB_SLAM2有四个Examples,跑AR的话需要安装ROS,其他的例子,下载数据集就可以跑了。
ROS安装
ROS的安装稍微麻烦一点,它有许多版本,具体要看你用的ubuntu版本了,我用的ubuntu 16.04,所以我用的是ROS Kinetic。如果是ubuntu 14.04的话,用ROS Indigo就行了。网上也有很多教程,但是你自己在操作的过程中可能会遇到一些问题,可能是这些博客没有指出来的。所以我建议如果是像我这种刚接触Linux或者ROS的小白,最好先了解一下Linux和ROS的基础知识,像什么shell、bashrc、source、export这些,还有ROS的topic、node什么的。虽然可能不会用它们进行多深入的工作,但是稍微了解一下这些概念,看起教程来会容易很多。你就会知道为什么要这么做,就算哪出错了,你也可以自己搞定了~
具体安装过程我就不啰嗦了,网上有写得很好的。我就把我遇到的一些问题,或者值得注意的地方写一写。
我主要参考的这篇博文:点击打开链接(注意,kinetic的k应该是小写的,文中貌似不太对)
我装的是ros-kinetic-desktop-full,用了15分钟左右吧。
有关环境配置
在安装ROS期间,你会看到提示说需要source 多个setup.bash文件中的某一个,或者甚至提示添加这条'source’命令到你的启动脚本里面。
这些操作是必须的,因为ROS是依赖于某种组合空间的概念,而这种概念就是通过配置脚本环境来实现的。
这可以让针对不同版本或者不同软件包集的开发更加容易。 如果你在查找和使用ROS软件包方面遇到了问题,请确保你已经正确配置了脚本环境。
一个检查的好方法是确保你已经设置了像ROS_ROOT和ROS_PACKAGE_PATH这样的环境变量,可以通过以下命令查看:
$export | grep ROS
如果发现没有配置,那这个时候你就需要’source’某些’setup.bash’文件了。
在终端下输入:
gedit ~/.bashrc
在最后面添加相应的setup.bash文件,这样就不用每次开启一个终端又需要重新配置。
修改完之后记得在终端 source ~/.bashrc 一下,让刚刚的修改立即生效。
有关ROS工作空间
一般我们都会创建一个ROS的工作空间:catkin_ws(把它放在home下就行了)
创建完之后记得把catkin_ws的setup.sh添加到.bashrc后面。
一般创建ROS的package都是在catkin_ws/src下面,比如后面要讲的usb_cam,就把它直接安装到catkin_ws/src就行了。
ORB_SLAM2也可以安装到catkin_ws/src下,这样你就不用把ORB_SLAM2添加到ROS的环境变量中去了。
当然,你也可以把ORB_SLAM2安装到其他地方,不过你要记得把ORB_SLAM2的setup.sh路径添加到.bashrc后面哦。
有关ORB_SLAM AR
1. 安装usb_cam驱动
usb_cam的驱动直接安装在catkin_ws/src下面就行了,因为之前已经把catkin_ws的setup.sh添加到.bashrc中了。如果你安装在其他地方,你还得把usb_cam的setup.sh添加到.bashrc中。
usb_cam的下载地址:点击打开链接,在catkin_ws中catkin_make一下就好了。
安装完之后就可以测试一下,有两种方法:
第一种:
a. 在一个终端下启动ROS内核:roscore
b. 在第二个终端输入:rosrun usb_cam usb_cam_node (这个时候是看不到画面的)
c. 在第三个终端输入:rosrun image_view image_view image:=/usb_cam/image_raw
(前提是你安装好了image-view:sudo apt-get install ros-kinetic-image-view)
第二种:
直接在一个终端下输入:roslaunch usb_cam usb_cam-test.launch
2. 编译ORB_SLAM2中的ROS
在一个终端下输入:
export ROS_PACKAGE_PATH=${ROS_PACKAGE_PATH}:/home/wnw/Projects/ORB_SLAM2-master/Examples/ROS
(根据你自己的路径修改)
或者你可以直接写在.bashrc最后面,记得要source一下哦~
然后在这个终端下继续编译ORB_SLAM2 ROS
mkdir build
cd build
cmake .. -DROS_BUILD_TYPE=Release
make -j
编译完之后,记得在.bashrc后面加入:
source /home/wnw/Projects/ORB_SLAM2-master/Examples/ROS/ORB_SLAM2/build/devel/setup.bash
3. 运行ROS中的Demo
直接跑MonoAR吧~
开始之前还有个地方需要改:
把ros_mono_ar.cc中的
ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabImage,&igb);
改为:
ros::Subscriber sub = nodeHandler.subscribe("/usb_cam/image_raw", 1, &ImageGrabber::GrabImage,&igb);
(看到没有,路径变了哟。因为我们的图片都是从/usb_cam/image_raw发送过来的)
然后再把Example编译一下~
这下可以开始了:
a. 在一个终端输入:
roscore(回车)
b. 在第二个终端输入:
roslaunch usb_cam usb_cam-test.launch(回车)
c. 在第三个终端输入:
rosrun ORB_SLAM2 MonoAR /home/wnw/Projects/ORB_SLAM2-master/Vocabulary/ORBvoc.txt /home/wnw/Projects/ORB_SLAM2-master/Examples/Monocular/TUM1.yaml(回车)
(路径按照自己的写哦,TUM1.yaml是参数设置文件,主要是相机的内参,这个得自己标定。如果懒得标定,直接用TUM1.yaml吧,凑合着用吧)
跑出来的效果是这样的: