1. 前提摘要
最近准备在mac上跑一下这个东西: https://github.com/MIT-SPARK/Kimera-vio,MIT的大佬真的厉害,克隆下来翻代码看,有好多非常精妙(不知道在写什么)的方法类,弄得我一愣一愣的,就好比这个用来测量一个函数运行时间的,一开始我愣是不知道为啥一定要写成std::forward<decltype(func)>(func)
:
template <typename T = std::chrono::milliseconds>
struct Measure {
template <typename F, typename... Args>
static typename T::rep execution(F&& func, Args&&... args) {
auto start = std::chrono::steady_clock::now();
std::forward<decltype(func)>(func)(std::forward<Args>(args)...);
auto duration =
std::chrono::duration_cast<T>(std::chrono::steady_clock::now() - start);
return duration.count();
}
};
关于这个代码的解释,StackFlow上也有,也是来自《Effective Modern C++》这本书上的(然鹅这本书被我荒废在宿舍很久了...),我也有那么一点意会,但这里就不展开了,之后可能会有相关的KimeraVIO的解析文章。
话说回来,今天的主要目的是,是能够编译运行 Kimera-VIO,但是这个东西使用了OpenCV的viz
模块来做显示,请看!!!
那么问题就来了,MacOS上通过Homebrew安装的OpenCV,是不带viz
的... (哭泣.jpg),这就导致了,在编译的时候突然跑出来:找不到 #include <opencv2/viz/types.hpp>
那么只能自己编译了。正当我想骂一句MIT SPARK,你明说mac上可以爽快(爽快是我意淫的)地用,为毛我这里编译都不通过了???我意外看到了,嗯??还有一个安装说明?? ???Tested on Mac, Ubuntu 14.04, 16.04 & 18.04.....
往下拉拉,看到了关于OpenCV的部分 ♂️ ♂️ ♂️ ♂️ ♂️ ♂️ 好吧,我瞎了,真的要自己编译。
2. 编译!!!
首先,我们从github将opencv克隆下来,这个克隆的时间还是蛮久的,不过可以挂个代理啥的。为了表示诚意,我已经打包放百度云上了,有绅士想要zip文件的可以留言私戳...
这时候就有老哥要问了,我克隆的时候用
git clone XXX --depth=1
不就让拷下来的包又小,速度就快了吗??那我就是想要完整的你能怎么我
在把opencv弄下来之后,我们需要切换到非4.X的分支,我大概看了一下,4.X怎么没有viz.hpp
这个头文件???( 尼克杨.jpg ),我是切换到了3.4.10
来操作的
git checkout tags/3.4.10
OpenCV的默认编译配置中,是不包括 viz
模块的,为了启用这一个的编译,必须先安装vtk,如果已经安装 brew 的朋友,就直接如下安装(顺便连tbb
也一起装了吧)
brew install vtk tbb
没有安装的朋友,装完 brew 后我们还是朋友....
然后:
cd
到opencv的文件夹下,然后新建一个名叫build
的文件夹,用于存放编译产生的文件- 进入build文件夹下,使用cmake配置编译选项,接着make执行编译。
具体来说,我自己的CMake的配置项为:
cmake -DWITH_VTK=On -DWITH_TBB=On -DBUILD_opencv_python2=OFF -DBUILD_opencv_python3=ON -DWITH_QT=ON -DOPENCV_ENABLE_NONFREE=ON ..
解释一下一些选项:开启VTK和TBB的编译选项。然后由于python2在2020年已经“寿终正寝”了,系统里自带的python2和brew的python@2经常有莫名其妙的兼容问题,就不编python2的部分了。而OpenCV在官网有那么一个说明,就是要编译python3的话还得3.8:
安装python3.8也可以使用 brew 完成:
brew uninstall --ignore-dependencies python
brew install python@3.8
brew link python@3.8 --force
在配置的过程中,还得下一个 ipp**什么什么的东西,这就要求终端必须也处于代理的环境下,才比较快。在终端启用代理得像下面这样设置环境量(我是不是应该把这段放在前面,这样git clone的时候也会快点):
export all_proxy=http://127.0.0.1:1087
上面都没啥问题之后,就花半小时左右等待编译把~
3. 试用
这一节,大概试试viz
能不能用。首先我们新建一个工作区来做有关viz的试验(之后说不定还会再写几篇有关viz的...咕咕咕)
mkdir viz_tutorial_ws
cd viz_tutorial_ws
touch CMakelists.txt
CMakelists.txt
内容如下:
cmake_minimum_required (VERSION 3.5)
project(viz_tutorial VERSION 0.1.0)
set(CMAKE_CXX_STANDARD 17) # 个人习惯
find_package(OpenCV 3.3.1 REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
add_executable(launch_viz launch_viz.cpp)
target_link_libraries(launch_viz ${OpenCV_LIBRARIES})
添加一个源文件launch_viz.cpp
,其内容如下:
#include <opencv2/viz.hpp>
using namespace std;
int main()
{
auto window = cv::viz::getWindowByName("iceytan");
while(!window.wasStopped())
{
window.spinOnce();
}
return 0;
}
接着
mkdir build && cd build && cmake .. && make && launch_viz
可以看到viz
的窗口出现了,虽然里面什么都没有,但你说我激动不激动!!这样一来kimeraVIO
也可以编译了!!
那就先这样吧