如果想在windows上配置slam的开发环境,以前是比拟麻烦的,然而当初有了微软vcpkg的反对,在win上装置依赖也能够像pip和apt那样难受,尽管还不算那么欠缺,但微软将来还会加大反对。

pangolin是slam零碎实时可视化的一个重要工具,简直各个支流开源我的项目都会用它,但网上对于怎么在windows环境装置pangolin的博客不太多,大多步骤都十分繁琐,为了躲避编译问题还要使出各种奇技淫巧,集成到我的项目中时也要费一番功夫。

我在vcpkg反对的软件包list里能看到pangolin的最新开源,所以打算用vcpkg一键装置。

装置

间接在vcpkg根目录下执行:
.\vcpkg.exe install pangolin:x64-windows

就会主动装置pangolin,主动下载相干依赖,主动实现编译,超级不便。目前最新的版本是0.8。

能够执行:
.\vcpkg.exe list

看看装置状况。

pangolin会依赖opengl和glew,所以它们也会被装置。

接着别忘了集成到VS中,对于vcpkg的应用能够去找博客疾速理解一下。我这里是集成到全局的,所以在任何我的项目里都能够间接应用装置好的依赖。

测试

新建一个我的项目,用上面的代码测试一下pangolin的应用。

#include <pangolin/pangolin.h>int main(int /*argc*/, char** /*argv*/){    // 创立名称为“Main”的GUI窗口,尺寸为640×640    pangolin::CreateWindowAndBind("Main", 640, 480);    // 启动深度测试    glEnable(GL_DEPTH_TEST);    // 创立一个察看相机视图    pangolin::OpenGlRenderState s_cam(        pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 320, 0.2, 100),        pangolin::ModelViewLookAt(2, 0, 2, 0, 0, 0, pangolin::AxisY)    );    // 创立交互视图    pangolin::Handler3D handler(s_cam); //交互相机视图句柄    pangolin::View& d_cam = pangolin::CreateDisplay()        .SetBounds(0.0, 1.0, 0.0, 1.0, -640.0f / 480.0f)        .SetHandler(&handler);    while (!pangolin::ShouldQuit())    {        // 清空色彩和深度缓存        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);        d_cam.Activate(s_cam);        // 在原点绘制一个立方体        pangolin::glDrawColouredCube();        // 绘制坐标系        glLineWidth(3);        glBegin(GL_LINES);        glColor3f(0.8f, 0.f, 0.f);        glVertex3f(-1, -1, -1);        glVertex3f(0, -1, -1);        glColor3f(0.f, 0.8f, 0.f);        glVertex3f(-1, -1, -1);        glVertex3f(-1, 0, -1);        glColor3f(0.2f, 0.2f, 1.f);        glVertex3f(-1, -1, -1);        glVertex3f(-1, -1, 0);        glEnd();        // 运行帧循环以推动窗口事件        pangolin::FinishFrame();    }    return 0;}

问题

编译时会报错,一大堆GL结尾的未定义标识符,发现是pangolin的头文件中找不到位于gl.h中的宏定义,对于这个问题我搜寻了很久才找到答案。

pangolin要用到opengl,而opengl的初始化须要两块货色,一个是opengl的context,一个是函数加载,官网开始文档有具体阐明:https://www.khronos.org/opengl/wiki/Getting_Started。下面装置的glew库就是负责第二方面的,即加载opengl的函数。

stackoverflow这篇帖子和我遇到的状况相似:
Lots of undeclared identifiers related to OpenGL using GLFW

有人指出,这些编译谬误是因为应用了微软SDK自带的旧版本的gl.h。

这篇帖子也参考了一下,解答很具体,倡议应用glew.h代替gl.h。
https://stackoverflow.com/questions/17957325/how-do-i-install-a-current-version-of-opengl-for-windows-c

于是我去pangolin援用的头文件上来找哪里援用了gl.h,而后在glplatform.h下找到了,这里有许多预处理定义,决定了援用opengl相干的头文件。

发现援用的是这个gl.h,所以就是下面老哥说的,因为援用了微软SDK自带的旧版gl.h导致编译谬误。

我是装置了glew的,所以只有把预处理定义HAVE_GLEW加上就好了。

想想也是,因为是用vcpkg一键装置的pangolin,从头至尾没有指定过什么编译选项,所以很多必定是默认的。能够去vcpkg的ports目录下找到pangolin的portfile.cmake,关上看一下。

编译选项都是关掉的。

这里先不论,从新编译,发现未声明标识符的谬误霎时隐没。不过,还有个M_PI标识符未声明,是gldraw要用到的宏。

参考:
https://blog.csdn.net/duoduohair/article/details/116561278

接着又报了一个error 语言性能 "结构化绑定" 须要编译器标记 "/std:c++17"

这是因为pangolin最新版本用到了c++17的个性。

参考:
https://blog.csdn.net/aoxuestudy/article/details/112313824

ok,总算是跑进去了。