c++的Pangolin模块的学习笔记。
运行系统:ubuntu
使用IDE:Visual Studio Code
运行方式:cmake项目
参考资料:
1. Pangolin绘图主体部分写法
// 主函数
ThisClass::ThisClass()
{
// 创建gui窗口
pangolin::CreateWindowAndBind(win_name_, 1280, 960);
// 启用深度
glEnable(GL_DEPTH_TEST);
// 启动pangolin线程
pangolin_run_thread_ = std::thread(&ThisClass::DrawPangolin, this);
// 多线程需要先分离线程
pangolin::GetBoundWindow()->RemoveCurrent();
}
// 单独线程中运行的函数
void ThisClass::DrawPangolin()
{
// 绑定绘图线程
pangolin::BindToContext(win_name_);
// 启动深度测试
glEnable(GL_DEPTH_TEST);
// 创建观测相机视图
int view_w_ = 640;
int view_h_ = 480;
pangolin::OpenGlRenderState visualization3d_camera(
pangolin::ProjectionMatrix(view_w_, view_h_, 400, 400, view_w_ / 2, view_h_ / 2, 0.001, 20),
pangolin::ModelViewLookAt(0, -1, -2, 0, 0, 0, pangolin::AxisNegY));
// 创建3D视图
pangolin::Handler3D handler_3d(visualization3d_camera);
int UI_WIDTH = 200;
// 右侧:交互视图
pangolin::View &visualization3d_display =
pangolin::CreateDisplay()
.SetBounds(0.0, 1.0, pangolin::Attach::Pix(UI_WIDTH), 1.0, -640.0f / 480.0f)
.SetHandler(&handler_3d);
// 左侧:控制面板
pangolin::CreatePanel("control_panel")
.SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(UI_WIDTH));
// 单选框
// 坐标轴
pangolin::Var<bool> DrawAxis("control_panel.DrawAxis", true, true);
// 每一帧的循环绘制
while (!pangolin::ShouldQuit() && !GetStopFlag())
{
// 固定等待刷新周期
std::this_thread::sleep_for(10ms);
// 清屏并激活视图
// 清空颜色和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
visualization3d_display.Activate(visualization3d_camera);
// 设置背景颜色
glClearColor(0.5f, 0.5f, 0.5f, 0.5f);
// 在这里绘制需要绘制的内容
if (DrawAxis) {
}
// 运行帧循环以推进窗口事件
pangolin::FinishFrame();
}
// 分离线程
pangolin::GetBoundWindow()->RemoveCurrent();
stop_ = true;
}
}
2. 可绘制的内容
2.1 坐标轴
// 在原点绘制坐标轴
pangolin::glDrawAxis(0.5);
2.2 点
// 设置点大小
glPointSize(15.0);
// 开始画点
glBegin(GL_POINTS);
// 调试用的绿色点
glColor3f(0, 1, 0);
glVertex3f(0.025, 0.025, 0.025);
glColor3f(0, 1, 0);
glVertex3f(0.075, 0.075, 0.075);
// 结束画点
glEnd();
2.3 立方体
// 绘制自带的彩色立方体
// 可以基于头文件中该函数的写法修改,渲染自定义位置和颜色的立方体/平面
glDrawColouredCube();
2.4 线
// 画线
// 设置线宽
glLineWidth(1);
// 设置颜色
glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
// 2点为1条线
glBegin(GL_LINES);
// 第一条线
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 1.0f, 1.0f);
// 第二条线
glVertex3f(1.0f, 1.0f, 1.0f);
glVertex3f(1.0f, 1.0f, 2.0f);
// 结束
glEnd();
2.5 移动轨迹
使用path_
储存历史位姿的世界坐标。
if (path_.size)
{
glLineWidth(1);
glBegin(GL_LINE_STRIP);
glColor3f(r, g, b);
for (size_t i = 0; i < path_.size(); i++)
{
glVertex3d(path_[i][0], path_[i][1], path_[i][2]);
}
glEnd();
}