一. 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自动在视窗中绘制数据。