pangolin
pangolin用于图形可视化
简介
介绍
- Pangolin是对OpenGL进行封装的轻量级的OpenGL输入/输出和视频显示的库。可以用于3D视觉和3D导航的视觉图,可以输入各种类型的视频、并且可以保留视频和输入数据用于debug。
特性
- 在官方地址里面,对Pangolin有一个大致的介绍:
- 管理OpenGL的视角:画出想要的3D图。可以根据自己的需要调整视角。
- 高级的3D handler: Pangolin可以让你从很多视角看3D图,甚至可以搞一个model matrix。对3D点进行旋转平移。
- 输入控制:很多类型都可以(linear / log scale, runtime adjustable resolution, custom data types, …)
- 视频输入:调用了libDC1394和V4L进行视频流的输入,Pangolin提供了简单的C++接口给这些资源。可以使用图片、usb的摄像头输入、视频流、网络流等等都可以。
- 动态画图工具,可以处理科学数据。可以支持多种视图(time-series, parametric, cumulative, …)
- 记录视频和输入数据,可以用于debug。
安装
git clone https://github.com/stevenlovegrove/Pangolin |
使用
-
这里总结了博客yuntian_li中对Pangolin的使用方法
资料
Pangolin官方地址
泡泡机器人
github demo
opengl相机位置方向
lookat函数
Pangolin安装问题
Pangolin的Example
Pangolin的使用
特性
方法
| 方法 | 代码 | 说明 |
|---|---|---|
| 创建视窗对象 | pangolin::CreateWindowAndBind("Main",640,480); |
创建名称为“Main”的GUI窗口,尺寸为640×640 |
| 启动深度测试 | glEnable(GL_DEPTH_TEST); |
该功能会使得pangolin只会绘制朝向镜头的那一面像素点,避免容易混淆的透视关系出现,因此在任何3D可视化中都应该开启该功能 |
| 创建观察相机视图 | 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)); |
在视图中放置摄像机,在视窗中“放置”一个摄像机,给出摄像机的内参矩阵ProjectionMatrix从而在我们对摄像机进行交互操作时,Pangolin会自动根据内参矩阵完成对应的透视变换。此外,我们还需要给出摄像机初始时刻所处的位置,摄像机的视点位置(即摄像机的光轴朝向哪一个点)以及摄像机的本身哪一轴朝上。ProjectionMatrix的参数依次为 观察相机的图像高度 宽度 4个内参 最近和最远视距 ModelViewLookAt的参数依次为 相机所在的位置 相机所看的视点位置(一般会设置在原点) |
| 创建交互视图 | 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); |
创建一个交互式视图(view)用于显示上一步摄像机所“拍摄”到的内容,这一步类似于OpenGL中的viewport处理。setBounds()函数前四个参数依次表示视图在视窗中的范围(下、上、左、右),可以采用相对坐标(0~1)以及绝对坐标(使用Attach对象)。 |
| 清空颜色和深度缓存 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
分别清空色彩缓存和深度缓存并激活之前设定好的视窗对象(否则视窗内会保留上一帧的图形,这种“多重曝光”效果通常并不是我们需要的) |
| 激活交互视图 | d_cam.Activate(s_cam); |
|
| 绘制一个立方体 | pangolin::glDrawColouredCube(); |
在原点绘制一个立方体 |
| gl绘制 | glLineWidth(3);glBegin ( GL_LINES );glColor3f ( 0.8f,0.f,0.f );glVertex3f( -1,-1,-1 );glVertex3f( 0,-1,-1 );glEnd(); |
|
| 帧循环 | pangolin::FinishFrame(); |
运行帧循环以推进窗口事件 |
| 创建右侧用于显示视图视口 | pangolin::View& d_cam = pangolin::CreateDisplay().SetBounds(0.0, 1.0, pangolin::Attach::Pix(UI_WIDTH), 1.0, -640.0f/480.0f).SetHandler(new pangolin::Handler3D(s_cam)); |
|
| 创建左侧用于创建控制面板 | pangolin::CreatePanel("ui").SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(UI_WIDTH)); |
创建一个面板,并给这个面板明明为“ui”,这里"ui"是面板的tag名称,后续所有控制的操作都通过这个tag绑定到对应的面板上 |
| 创建控制面板的控件对象 | pangolin::Var<bool> A_Button("ui.a_button", false, false); // 按钮pangolin::Var<double> Double_Slider("ui.a_slider", 3, 0, 5); //double滑条pangolin::Var<int> Int_Slider("ui.b_slider", 2, 0, 5); //int滑条pangolin::Var<std::string> A_string("ui.a_string", "Hello Pangolin");pangolin::Var<std::function<void()>> reset("ui.Reset", SampleMethod);// |
创建参数依次为控件的tag、初始值以及是否可以toggle。 这一类Var对象为常见的滑条对象,创建参数依次为控件tag、初始值、最小值、最大值和logscale。 这一类控件同样实现按钮控件的功能,只是其在创建时传入一个std::function函数对象,因此不需要在后续循环中进行回调函数的书写。 |
| 判断状态 | pangolin::Pushed(A_Button) |
示例
简单使用
|
多线程
|
为Pangolin添加控件
|
多视图与图片显示
- 在SLAM的可视化中,有时我们期望实时显示相机的图像和特征点跟踪情况(例如VINS-Mono),pangolin同样提供了用于显示图像的一系列功能,下面的代码分别在视窗左上角和右下角实时显示了EuRoc数据集中的图像:
|
pangolin绘制数据曲线
- 使用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)的曲线,代码如下
|
