不止于安装:用Pangolin在Ubuntu20.04上快速可视化你的第一个SLAM点云

张开发
2026/4/10 20:57:34 15 分钟阅读

分享文章

不止于安装:用Pangolin在Ubuntu20.04上快速可视化你的第一个SLAM点云
不止于安装用Pangolin在Ubuntu20.04上快速可视化你的第一个SLAM点云当你第一次成功编译Pangolin时那种成就感可能很快会被一个现实问题冲淡这个库到底怎么用许多SLAM教程止步于环境配置却忽略了最关键的一环——让初学者立刻看到三维点云在窗口中跃动的震撼。本文将带你跳过Hello World式的演示直接动手实现一个能交互浏览的3D点云可视化工具。1. 从安装到第一个可视化窗口1.1 验证Pangolin安装完整性在开始编码前先确认你的Pangolin安装包含关键组件。执行以下命令检查pkg-config --modversion pangolin若返回版本号如0.8.0说明库文件已正确安装。接着验证OpenGL支持glxinfo | grep OpenGL version1.2 极简CMake工程配置新建项目目录pangolin_demo创建CMakeLists.txt文件cmake_minimum_required(VERSION 3.10) project(pangolin_pointcloud) set(CMAKE_CXX_STANDARD 17) find_package(Pangolin REQUIRED) add_executable(pointcloud main.cpp) target_link_libraries(pointcloud PRIVATE Pangolin::pangolin)这个配置做了三件事声明C17标准自动查找Pangolin安装路径将主程序与Pangolin动态库链接2. 构建基础可视化框架2.1 创建3D渲染窗口在main.cpp中写入以下骨架代码#include pangolin/pangolin.h int main() { // 初始化480x640像素的窗口 pangolin::CreateWindowAndBind(SLAM Point Cloud, 640, 480); // 启用深度测试 glEnable(GL_DEPTH_TEST); // 定义相机投影矩阵 pangolin::OpenGlRenderState camera( pangolin::ProjectionMatrix(640,480,420,420,320,240,0.1,1000), pangolin::ModelViewLookAt(-2,2,-2, 0,0,0, pangolin::AxisY) ); // 创建交互式视图 pangolin::Handler3D handler(camera); pangolin::View display pangolin::CreateDisplay() .SetBounds(0.0, 1.0, 0.0, 1.0) .SetHandler(handler); // 主循环 while(!pangolin::ShouldQuit()) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); display.Activate(camera); // 此处将添加点云绘制代码 pangolin::FinishFrame(); } return 0; }这段代码创建了一个带3D交互功能的窗口可通过鼠标拖拽旋转视角滚轮缩放场景右键平移观察点2.2 生成测试点云数据在循环前添加模拟点云生成代码// 生成螺旋线点云 std::vectorEigen::Vector3f points; for(float t0; t10*M_PI; t0.02f) { float x 0.5f * cos(t); float y t / 10.0f; float z 0.5f * sin(t); points.emplace_back(x,y,z); }3. 实现点云渲染3.1 使用OpenGL绘制点在主循环中添加绘制逻辑// 设置点大小和颜色 glPointSize(3.0f); glColor3f(0.8f, 0.2f, 0.2f); // 开始绘制点云 glBegin(GL_POINTS); for(const auto p : points) { glVertex3f(p.x(), p.y(), p.z()); } glEnd();3.2 添加坐标系辅助在绘制点云后添加坐标轴// 绘制RGB坐标系 glLineWidth(2.0f); glBegin(GL_LINES); glColor3f(1.0f,0.0f,0.0f); // X轴红色 glVertex3f(0,0,0); glVertex3f(1,0,0); glColor3f(0.0f,1.0f,0.0f); // Y轴绿色 glVertex3f(0,0,0); glVertex3f(0,1,0); glColor3f(0.0f,0.0f,1.0f); // Z轴蓝色 glVertex3f(0,0,0); glVertex3f(0,0,1); glEnd();4. 编译与调试技巧4.1 构建项目在项目目录下执行mkdir build cd build cmake .. -DCMAKE_BUILD_TYPERelease make -j44.2 常见问题解决若遇到链接错误检查是否缺少依赖sudo apt-get install libgl1-mesa-dev libx11-dev对于较新的NVIDIA显卡可能需要指定OpenGL实现target_link_libraries(pointcloud PRIVATE Pangolin::pangolin GL GLU GLEW)4.3 性能优化对于大规模点云改用顶点缓冲对象(VBO)GLuint vbo; glGenBuffers(1, vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, points.size() * sizeof(Eigen::Vector3f), points.data(), GL_STATIC_DRAW); // 绘制时改用 glBindBuffer(GL_ARRAY_BUFFER, vbo); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); glDrawArrays(GL_POINTS, 0, points.size());5. 进阶功能扩展5.1 添加交互控制创建UI面板控制点云显示pangolin::CreatePanel(ui) .SetBounds(0.0, 0.3, 0.0, 0.2); pangolin::Varbool showPoints(ui.Show Points, true, true); pangolin::Varfloat pointSize(ui.Point Size, 3.0, 0.5, 10.0); // 在主循环中使用 if(showPoints) { glPointSize(pointSize); // 绘制代码... }5.2 支持真实SLAM数据读取PLY格式点云文件#include pangolin/geometry/geometry.h auto geom pangolin::LoadGeometry(/path/to/cloud.ply); pangolin::GeometryRenderer renderer(geom); // 在循环中 renderer.Render(camera);5.3 多视口对比创建分屏显示pangolin::View left pangolin::Display(left) .SetBounds(0,1, 0,0.5); pangolin::View right pangolin::Display(right) .SetBounds(0,1, 0.5,1); // 在不同视口激活不同相机 left.Activate(camera_top); right.Activate(camera_side);

更多文章