Ubuntu18.04安装编译pangolin库及简单使用

一. Pangolin介绍

主页介绍:pangolin的github官网

Pangolin是一个轻量、便携的管理OpenGl显示、交互和提取的视频输入的快速开发库。其核心是一个简单的OpenGl视口管理器,它能帮助模块化3D可视化,不增加复杂性,提供一个先进且直接的3D导航处理器。
Pangolin也提供一个操作程序的机制,这个机制通过配置文件和UI集成,有一个灵活的实时绘图仪,用于可视图形图像数据。

二.安装Pangolin

1.安装依赖库

sudo apt-get install libglew-dev
sudo apt-get install libboost-dev libboost-thread-dev libboost-filesystem-dev
sudo apt-get install libx11-dev libxmu-dev libglu1-mesa-dev libgl2ps-dev libxi-dev g++ libzip-dev libpng12-dev libcurl4-gnutls-dev libfontconfig1-dev libsqlite3-dev libglew*-dev libssl-dev
sudo apt-get install glew-utils

2.安装cmake

安装pangolin库使用cmake命令进行,所以要先安装cmake这个工具。
cmake的学习可参考我的另外一些博客,https://blog.csdn.net/Wadewhl/article/details/112555043

sudo apt-get install cmake

3.下载pangolin

git clone https://github.com/stevenlovegrove/Pangolin

4.cmake命令安装

cd Pangolin
mkdir build
cd build
cmake -DCPP11_NO_BOOST=1 ..
make -j
sudo make install 

三.安装及使用pangolin库遇到的问题

1.安装时

[ 72%] Linking CXX executable VideoViewer
CMakeFiles/VideoViewer.dir/main.cpp.o:无法识别文件: 文件被截断

解决方法

查阅资料发现,如有出现无法识别文件:文件被截断等问题,一般都是由于:在先前的构建过程中发生了中断并且目标文件未完全生成,会导致文件中只有部分内容,或者是直接缺少文件。

这个解决方法一是删除对应的目标文件使其重新编译生成,二是多目标文件缺少太多时可以考虑重新安装,删除整个pangolin文件夹,在git clone步骤开始重新安装,并保证整个过程中不要发生中断。

2.简单程序编译过程

(1)libGL.so的问题

在使用cmake和make命令过程时,编译时出现问题如下:

/usr/bin/ld: CMakeFiles/main.dir/test_pangolin.cpp.o: undefined reference to symbol 'glGenTextures'
//usr/lib/x86_64-linux-gnu/libGL.so.1: 无法添加符号: DSO missing from command line

解决方法

首先安装配置openGL的依赖:

$ sudo apt-get install build-essentia
$ sudo apt-get install libgl1-mesa-dev
$ sudo apt-get install libglu1-mesa-dev
$ sudo apt-get install freeglut3-dev

使用locate命令找到libGL.so这个文件所在的路径:

locate libGL //定位寻找所有的libGL文件
//或者是如下的,先进入系统文件夹,再遍历寻找GL文件
cd /usr/lib/x86_64-linux-gnu/
ls libGL*

locate命令得到的结果:
在这里插入图片描述cd到所知的路径下,再使用ls命令得到遍历的结果:
在这里插入图片描述知道该包所在的位置,我们将其建立链接到系统使用cmake命令查找的路径下/usr/lib,指令如下:

sudo ln -s /usr/lib/x86_64-linux-gnu/libGL.so.1 /usr/lib/libGL.so.1

之后,我们就可以在/usr/lib路径下查找到libGL.so该包,在编译过程中就可以找到该包并进行编译。

2)libGLEW.so的问题

一个是如下的形式的问题:

/usr/lib/x86_64-linux-gnu/libGLEW.so.2.0: 无法添加符号: DSO missing from command line

或者是查找不到该包

/usr/bin/ld: 找不到 -llibGLEW.so.2.0

解决方法

与libGL类似,使用链接sudo ln -s的命令,但是需要把libGLEW.so的各版本都链接进去。
解决方法

链接libGLEW文件到系统搜索的路径下:

sudo ln -s /usr/lib/x86_64-linux-gnu/libGLEW.so /usr/lib/libGLEW.so
sudo ln -s /usr/lib/x86_64-linux-gnu/libGLEW.so.2.0 /usr/lib/libGLEW.so.2.0
sudo ln -s /usr/lib/x86_64-linux-gnu/libGLEW.so.2.0.0 /usr/lib/libGLEW.so.2.0.0

当然,文件链接后,记得要在CMakeLists.txt上把这些动态库文件添加进去,否则还是会显示找不到。

TARGET_LINK_LIBRARIES(main libpangolin.so libGL.so.1 libGLEW.so

四.测试及学习pangolin简单程序

编写包含pangolin库的代码,一般也需要安装eigen3、boost等库。

任务:pangolin绘制数据曲线

我们将在一个视图中分别绘制 sin ⁡ ( x ) \sin(x) sin(x)、 cos ⁡ ( x ) \cos(x) cos(x)以及 sin ⁡ ( x ) + cos ⁡ ( x ) \sin(x)+\cos(x) sin(x)+cos(x)的曲线。

#include <iostream>
#include <pangolin/pangolin.h>

int main(/*int argc, char* argv[]*/)
{
    
    
  // Create OpenGL window in single line
  pangolin::CreateWindowAndBind("Main",640,480);

  // Data logger object
  pangolin::DataLog log;

  // Optionally add named labels
  std::vector<std::string> labels;
  labels.push_back(std::string("sin(t)"));
  labels.push_back(std::string("cos(t)"));
  labels.push_back(std::string("sin(t)+cos(t)"));
  log.SetLabels(labels);

  const float tinc = 0.01f;

  // OpenGL 'view' of data. We might have many views of the same data.
  pangolin::Plotter plotter(&log,0.0f,4.0f*(float)M_PI/tinc,-4.0f,4.0f,(float)M_PI/(4.0f*tinc),0.5f);
  plotter.SetBounds(0.0, 1.0, 0.0, 1.0);
  plotter.Track("$i");//坐标轴自动滚动

  // Add some sample annotations to the plot(为区域着色)
  plotter.AddMarker(pangolin::Marker::Vertical,   50*M_PI, pangolin::Marker::LessThan, pangolin::Colour::Blue().WithAlpha(0.2f) );
  plotter.AddMarker(pangolin::Marker::Horizontal,   3, pangolin::Marker::GreaterThan, pangolin::Colour::Red().WithAlpha(0.2f) );
  plotter.AddMarker(pangolin::Marker::Horizontal,    3, pangolin::Marker::Equal, pangolin::Colour::Green().WithAlpha(0.2f) );

  pangolin::DisplayBase().AddDisplay(plotter);

  float t = 0;

  // Default hooks for exiting (Esc) and fullscreen (tab).
  while( !pangolin::ShouldQuit() )
  {
    
    
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    log.Log(sin(t),cos(t),sin(t)+cos(t));
    t += tinc;

    // Render graph, Swap frames and Process Events
    pangolin::FinishFrame();
  }

  return 0;
}

CMakeists.txt内容

主目录下:

# 声明要求的 cmake 最低版本
cmake_minimum_required(VERSION 3.10)

# project name
PROJECT(ubuntu18.04_libs)

ADD_SUBDIRECTORY(src)

src下:

ADD_EXECUTABLE(main test_pangolin.cpp)

INCLUDE_DIRECTORIES(/home/wenhaolun/ubuntu18.04_libs/pangolin/include /home/wenhaolun/ubuntu18.04_libs/eigen3)

TARGET_LINK_LIBRARIES(main libpangolin.so libGL.so.1 libGLEW.so)

运行结果
在这里插入图片描述
解析

1.在pangolin中,待可视化的数据全部存储在pangolin::DataLog对象中,因此我们首先创建了一个pangolin::DataLog对象,并使用对应的成员函数SetLabels()设置对应数据的名称。

2.而数据的可视化则是通过pangolin::Plotter对象来实现的,该对象的构造参数的第一个参数为需要绘制pangolin::DataLog对象;随后4个参数依次Plotter的左边界、右边界、下边界、上边界,即Plotter中 x轴、y轴的范围;最后两个参数依次为 x轴和 y轴的坐标轴刻度大小。

3.随后我们演示了在Plotter中使用plotter的成员函数AddMarker添加一些标志块的功能,该函数入口参数依次为标志块的方向,标志块的数值,标志块的判别方式以及标志块的颜色。例如第一个标志块的方向为垂直方向,数值为 50 π,判断方式为小于,颜色为带透明度的蓝色,因此我们在程序的运行结果中会发现 x轴坐标小于 50 π的范围都被标记为了透明的蓝色。同理第二个Marker将 y轴大于3的区域标记为了红色,第三个Marker由于是等于,因此其只将 y = 3这一条线标记为了绿色。

4.随后,我们将构建好的plotter添加到Display中。

5.在帧循环中,我们只需要使用DataLog::Log()函数不断更新DataLog中的数据,pangolin就会根据我们之前创建的plotter自动在视窗中绘制数据。

参考:SLAM可视化绘图库——Pangolin教程

猜你喜欢

转载自blog.csdn.net/Wadewhl/article/details/112845664
今日推荐