如果想在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

看看安装情况。

image.png

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

image.png

有人指出,这些编译错误是由于使用了微软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相关的头文件。

image.png

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

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

image.png

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

image.png

编译选项都是关掉的。

这里先不管,重新编译,发现未声明标识符的错误瞬间消失。不过,还有个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,总算是跑出来了。

image.png


MorpheusDong
4 声望0 粉丝