如果想在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
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,总算是跑出来了。
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net