DSO在泡泡机器人平台上沉寂了这么久之后,今天我们将给大家带来一个新鲜出炉的重磅文章:在Windows下玩转DSO!
DSO(direct sparseodometry)是当前visual SLAM的代表性算法之一,出自SLAM的重镇慕尼黑工业大学[1]。其相关程序已于2016年11月开源 [2],在SLAM领域引起了广泛关注。相信不少小伙伴已经在Linux系统中体验过了。
DSO程序的作者Jakob Engel是当前direct method流派的扛把子人物。此番开源的代码很有亮点:
(1)核心功能和输入输出做了封装,代码结构很清晰;
(2)核心程序依赖的库不多,包括Eigen3、SuiteSparse、Sophus,其中Eighen和Sophus是轻量级的。
(3)代码的风格很好,算法跟论文能对应。
从DSO代码的注释中看,有些代码写于2014年1月,说明程序的形成至少历经了3年的打磨。总之,这份代码值得认真研究。
虽说DSO在Linux下的安装极为方便,有些场合我们还是需要将它移植到Windows。例如,有人习惯使用Visual Studio写程序;或者相机在Linux下的驱动有问题;再或者虚拟Linux遇到难以解决的问题,等等。下面就以我自己的经验,介绍DSO移植到Windows系统的过程。实验所用的系统是64位Windows 7、Visual Studio 2013 + update 5(以下简称MSVS)。为了编译依赖库,提前安装好了CMake。
第1步:配置Eigen3、SuiteSparse、boost、openCV、ziplib。
- Eigen3库是著名的矩阵运算库。它的代码只有头文件,因此不需要安装,下载解压即可 [3]。
- SuiteSparse库是稀疏矩阵运算库。Github上有它的Windows版[4],网上能找到安装方法[5]。
- Boost库是为C++语言标准库提供扩展的一些C++程序库的总称。Boost库很庞大,DSO其实只用了它的多线程功能。由于它的编译比较耗时,我安装了一个预编译版本[6]。
- OpenCV是计算机视觉开发的必备库[7],它的安装勿需赘言,网上有大量的教程。
- Ziplib库是zip文件相关的库。这个库是可选的,DSO作者并没有强烈推荐大家安装。如果不安装的话,在运行TUM数据集的时候,需要把图像集的zip文件手动解压缩。为了避免配置过程中可能出现的问题,我直接选择了手动解压zip文件 :-)
以上几个库应用广泛,网上能搜到大量教程,相信花点时间都可以解决。
第2步:配置Pangolin库。
Pangolin库是一个比较好用的可视化库[8]。运行过ORB-SLAM程序的同学应该对它非常熟悉。相比于前文所述的几个库,pangolin在Windows系统的安装略显麻烦,因此把它单独列出来,大致需要如下步骤。
(1)安装Python2.x或Python 3.x [9]。
(2) 安装Git [10],这是因为pangolin的安装过程中需要用Git自动下载某些程序。
(3)用CMake生成MSVC工程文件,编译。
(4)参考pangolin自带的例子程序,研究如何在MSVC工程中配置pangolin,包括头文件的路径、lib文件的路径。还有一个比较重要的是Project Property Pages àConfigurationProperties à C/ C++ à Code GenerationàRuntime Library的设置。在自己创建工程中调用pangolin.lib的时候,须采用同样的设置。
在安装配置好所有的依赖库之后,务必先运行一些测试代码。确保这些库全部安装成功之后,再进行下面的步骤。
第3步:创建Visual Studio工程。
接下来我们创建一个Visual Studio C++工程。首先,按照前两步的方法配置好各种依赖库;其次,把DSO程序中的C++文件导入到这个工程里面。注意不要把ImageDisplay_dummy.cpp和ImageRW_dummy.cpp文件加进来,因为该文件是为了方便读者开发自己的IO Wrapper而提供的,加进来会导致某些函数重复定义。
此时我们可以对创建的工程进行编译了。不出所料,会出现大量的编译错误。接下来的步骤给出了几个主要问题的解决方法。
第4步:替换Sophus库。
DSO的程序自带了Sophus库。编译的时候,会出现关于Sophus库的错误。据stackoverflow上的问答[11],貌似是MSVS编译器的问题,使用带有template的Sophus库即可解决[12]。我们下载该版本,替换掉DSO程序自带的版本即可。这一步或许有改动较小的做法,可以尝试一下。
第5步:处理Linux特有的头文件和函数。
DSO程序用到了几个Linux下的头文件和函数,网上可以搜到它们在Window系统中的适配方法,包括:direct.h [13]、unistd.h[14]、gettimeofday[15] 、usleep[16]、snprintf[17]。此外,主函数中的exitThread线程是用来响应Ctrl+C中断的,里面也用到了一些linux下的函数。我没有花时间对其改造,而是注释掉了相关代码。
第6步:解决MSVS编译器与g++的差异导致的编译错误。
- 编译过程中有swap函数的错误,按网上的说法删掉模板参数即可[18]。
- 按照错误提示,包含头文件“#include ”。
- 下面的这类警告需要消除掉,warning C4099: type name first seen using 'class' now seen using'struct',否则会导致链接错误。警告的原因是CalibHessian、FrameHessian、PointHessian定义的时候是struct类型,而在有些地方被声明为class,需要统一改为struct。
- Residuals.h中,enumResState {IN=0, OOB, OUTLIER}中的IN跟系统中某个头文件的宏重复,需要在前面加上#undef IN。
第7步:运行程序。
按照前面的步骤,DSO的编译和链接基本没问题了。如果还有问题,相信稍微看下代码或者google一下错误信息即可找到解决方法。当编译成功后,下载TUM数据集,就可以顺利运行了,Windows系统中的运行界面如下图。
小结:
DSO的代码具有良好的跨平台特性,可以移植到Windows系统。
参考资料:
[1]J.Engel, V. Koltun, and D. Cremers. Direct Sparse Odometry. arXiv:1607.02565,2016.
[2]DSO程序. https://github.com/JakobEngel/dso
[3] Eigen3库. http://eigen.tuxfamily.org
[4] SuiteSparse的windows版. https://github.com/jlblancoc/suitesparse-metis-for-windows
[5] Eigen+suitesparsefor windows 安装. http://blog.csdn.net/xiamentingtao/article/details/50100549
[6]Boost库的预编译版本. https://sourceforge.net/projects/boost/files/boost-binaries/
[7]OpenCV.http://opencv.org/
[8]Pangolin库. https://github.com/stevenlovegrove/Pangolin
[9]Python for windows程序. https://www.python.org/downloads/
[10] Git程序. https://git-scm.com/downloads
[11]Sophuserror. http://stackoverflow.com/questions/23073510/syntax-error-for-typedef
[12]https://github.com/stevenlovegrove/Sophus
[13]https://github.com/tronkko/dirent/blob/master/include/dirent.h
[14]http://stackoverflow.com/questions/341817/is-there-a-replacement-for-unistd-h-for-windows-visual-c
[15]how to use gettimeofday() or somethingequivalent with Visual Studio C++ 2008?http://stackoverflow.com/questions/2494356/how-to-use-gettimeofday-or-something-equivalent-with-visual-studio-c-2008
[16]http://stackoverflow.com/questions/5801813/c-usleep-is-obsolete-workarounds-for-windows-mingw
[17]http://stackoverflow.com/questions/2915672/snprintf-and-visual-studio-2010
[18]http://stackoverflow.com/questions/37748309/using-swap-with-template-argument-conflicts-with-stdvector-include
【版权声明】泡泡机器人SLAM的所有文章全部由泡泡机器人的成员花费大量心血制作而成的原创内容,希望大家珍惜我们的劳动成果,转载请务必注明出自【泡泡机器人SLAM】微信公众号,否则侵权必究!同时,我们也欢迎各位转载到自己的朋友圈,让更多的人能进入到SLAM这个领域中,让我们共同为推进中国的SLAM事业而努力!
【注】商业转载请联系刘富强([email protected])进行授权。普通个人转载,请保留版权声明,并且在文章下方放上“泡泡机器人SLAM”微信公众账号的二维码即可。
【编辑】Brad Lucas