当前位置: 首页 > news >正文

不止于安装:用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 version"

1.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)

这个配置做了三件事:

  • 声明C++17标准
  • 自动查找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::vector<Eigen::Vector3f> points; for(float t=0; t<10*M_PI; t+=0.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_TYPE=Release make -j4

4.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::Var<bool> showPoints("ui.Show Points", true, true); pangolin::Var<float> 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);
http://www.jsqmd.com/news/579910/

相关文章:

  • 2026年热门的公路防护石笼网/景观装饰石笼网/水利工程石笼网/石笼网生产厂家推荐几家 - 行业平台推荐
  • 2026年比较好的洁净厂房/洁净设备/洁净板制造厂家推荐 - 行业平台推荐
  • NVIDIA Nemotron OCR v2:多语言文本识别新标杆
  • Hunyuan-MT-7B开源镜像:像素语言传送门v1.2-Legendary版Docker镜像拉取与验证教程
  • 使用Typora与Phi-3-mini-4k-instruct-gguf打造智能Markdown写作工作流
  • 2026年比较好的玻璃钢锚杆拉力计/陕西玻璃钢锚杆制造厂家哪家靠谱 - 行业平台推荐
  • PDF-Extract-Kit-1.0效果展示:高精度表格识别与公式还原真实案例集
  • 我的项目复盘,以及踩过的雷点
  • 告别轮询!用STM32串口空闲中断+DMA接收不定长数据,CubeMX配置保姆级教程
  • 2026年评价高的荣成旧房改造装修/荣成民房装修本地公司推荐 - 行业平台推荐
  • 2026年热门的气动矿用锯/矿用锯/陕西气动圆盘切割矿用锯/切割矿用锯厂家选择指南 - 行业平台推荐
  • 2026年质量好的张拉机具/矿用气动锚索张拉机具高口碑品牌推荐 - 行业平台推荐
  • MQ-2传感器数据飘忽不定?可能是你的ADC采样没做好(附STM32与ESP32配置要点)
  • 2026年热门的油管内衬设备装管机/油管内衬设备封口机/油管内衬设备口碑好的厂家推荐 - 行业平台推荐
  • QKV简单叙述
  • Qwen3-VL-2B-Instruct保姆级教程:视觉对话机器人部署
  • Z-Image-Turbo-辉夜巫女资源清理指南:释放C盘空间与优化Docker存储
  • Meixiong Niannian画图引擎入门教程:Streamlit界面操作+参数可视化调节
  • 2026年评价高的不锈钢倒角机/岩板倒圆倒角机/全自动玻璃倒角机/倒角机长期合作厂家推荐 - 行业平台推荐
  • 2026年口碑好的幕墙玻璃维修/铝合金玻璃维修/不锈钢玻璃维修实力品牌厂家推荐 - 行业平台推荐
  • Jimeng LoRA效果对比:不同GPU型号(3090/4090/A10/A100)显存占用实测
  • 2026年评价高的全自动上料激光切管机/三卡盘激光切管机/山东小型激光切管机/激光切管机实力工厂推荐 - 行业平台推荐
  • 别再手动整理PDF了!用PaddleOCR的PP-StructureV3,一键把合同/论文转成Markdown
  • 论文写作“神助攻”:好写作AI,开启智能创作新宇宙
  • 告别默认丑标签!手把手教你用QGIS 3.28自定义地图标注(附Python脚本)
  • Python开发者必看:如何用ujson模块让你的JSON处理速度提升3倍
  • 2026年热门的磨边机/全自动玻璃磨边机高口碑品牌推荐 - 行业平台推荐
  • Google 迎来「DeepSeek 时刻」:TurboQuant算法实现bit无损、×加速、×压缩、零预处理
  • 2026年热门的山东小型激光切割机/激光切割机公司选择指南 - 行业平台推荐
  • 2026年口碑好的稳压电源模块/高精度稳压电源采购指南厂家怎么选 - 行业平台推荐