首页 > 编程语言 >c++(4) pangolin可视化多线程

c++(4) pangolin可视化多线程

时间:2024-07-24 18:39:33浏览次数:10  
标签:std GL 1.0 pangolin 多线程 c++ pointQueue include


 

CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(3DTo3D)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_BUILD_TYPE Release)


find_package(Pangolin REQUIRED)# 可视化工具库
include_directories(${Pangolin_INCLUDE_DIRS})



# OpenCV
# find_package(OpenCV REQUIRED)
# include_directories(${OpenCV_INCLUDE_DIRS})
 

# Sophus
# find_package(Sophus REQUIRED)
# include_directories(${Sophus_INCLUDE_DIRS})
     
# Eigen
# 不需要寻找 手动指定默认安装位置 只是一堆头文件 无需target_link_libraries
find_package(Eigen3 REQUIRED)
include_directories("/usr/local/include/eigen3")


# 编译节点
add_executable(v1_node main.cpp)

# 链接目标
# target_link_libraries(v1_node ${Pangolin_LIBRARIES} ${OpenCV_LIBS}   -lgomp)

target_link_libraries(v1_node ${Pangolin_LIBRARIES} )

main.cpp

#include <iostream>
#include <thread>
#include <queue>
#include <mutex>
#include <unistd.h> // For sleep function
#include <Eigen/Core>
#include <pangolin/pangolin.h>
#include <vector>
using namespace std;

// 用于存储3D点的队列和互斥锁
vector<Eigen::Vector3d> pointQueue;
mutex queueMutex;

using namespace std;
using namespace Eigen;

 std::vector<Eigen::Vector3d> generateCircle3D(double radius, int numPoints) {
    std::vector<Eigen::Vector3d> circlePoints;

    for (int i = 0; i < numPoints; ++i) {
        double theta = 2.0 * M_PI * i / numPoints;
        double x = radius * std::cos(theta);
        double y = radius * std::sin(theta);
        double z = 0.0;  // 在平面内,z 始终为 0
        circlePoints.emplace_back(x, y, z);
    }

    return circlePoints;
}


// 主线程生成3D点的函数
void generatePoints() {
    int pointId = 0;


  

    double radius = 10;  // 圆的半径
    int numPoints = 10; // 生成的点的数量
    vector<Vector3d> source_points = generateCircle3D(radius, numPoints);



    while (true) {

        if (pointId>=source_points.size()){break;}
        // 模拟生成一个3D点
        Eigen::Vector3d point=source_points[pointId];
        // 加入队列
        queueMutex.lock();
        pointQueue.push_back(point);
        queueMutex.unlock();

        ++pointId;
        sleep(1); // 每秒生成一个点
    }
}

// 显示线程使用Pangolin显示和处理3D点
void displayPoints() {
  // create pangolin window and plot the trajectory
  pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768);
  glEnable(GL_DEPTH_TEST);
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

  pangolin::OpenGlRenderState s_cam(
      pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000),
      pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0)
  );

  pangolin::View &d_cam = pangolin::CreateDisplay()
      .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f)
      .SetHandler(new pangolin::Handler3D(s_cam));

   
  while (!pangolin::ShouldQuit()) {
        // 清空缓冲区
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        d_cam.Activate(s_cam);
        glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
        glLineWidth(2);

        // 处理队列中的所有点并绘制
        queueMutex.lock();


        
        if(pointQueue.size()>=2){  
            
            for (size_t i = 0; i < pointQueue.size() - 1; i++) {
                    Eigen::Vector3d point1 = pointQueue[i];
                   
                    Eigen::Vector3d point2 =  pointQueue[i+1];

                    cout<<point1<<"    "<< point2 <<endl;

                    glColor3f(0.0f, 0.0f, 1.0f);  // blue for ground truth
                    glBegin(GL_LINES);
            
                    glVertex3d(point1[0], point1[1], point1[2]);
                    glVertex3d(point2[0], point2[1], point2[2]);
                    glEnd();

                
           }
        }
        
        queueMutex.unlock();
        
    
        // 完成帧并交换缓冲区
        pangolin::FinishFrame();
        usleep(1000);   // sleep 5 ms
    }

    // 关闭Pangolin窗口
    pangolin::DestroyWindow("3D Points Display");
}

int main() {
    // 启动生成和显示线程
    thread generateThread(generatePoints);
    thread displayThread(displayPoints);

    // 等待线程结束
    generateThread.join();
    displayThread.join();

    return 0;
}

  

  

 

#include<iostream> #include<thread> #include<queue> #include<mutex> #include<unistd.h>// For sleep function #include<Eigen/Core> #include<pangolin/pangolin.h> #include<vector> using namespace std;
// 用于存储3D点的队列和互斥锁 vector<Eigen::Vector3d> pointQueue; mutex queueMutex;
using namespace std; using namespace Eigen;
std::vector<Eigen::Vector3d> generateCircle3D(double radius, int numPoints) { std::vector<Eigen::Vector3d> circlePoints;
for (int i = 0; i < numPoints; ++i) { double theta = 2.0 * M_PI * i / numPoints; double x = radius * std::cos(theta); double y = radius * std::sin(theta); double z = 0.0; // 在平面内,z 始终为 0 circlePoints.emplace_back(x, y, z); }
return circlePoints; }

// 主线程生成3D点的函数 void generatePoints() { int pointId = 0;

 
double radius = 10; // 圆的半径 int numPoints = 10; // 生成的点的数量 vector<Vector3d> source_points = generateCircle3D(radius, numPoints);


while (true) {
if (pointId>=source_points.size()){break;} // 模拟生成一个3D点 Eigen::Vector3d point=source_points[pointId]; // 加入队列 queueMutex.lock(); pointQueue.push_back(point); queueMutex.unlock();
++pointId; sleep(1); // 每秒生成一个点 } }
// 显示线程使用Pangolin显示和处理3D点 void displayPoints() { // create pangolin window and plot the trajectory pangolin::CreateWindowAndBind("Trajectory Viewer", 1024, 768); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
pangolin::OpenGlRenderState s_cam( pangolin::ProjectionMatrix(1024, 768, 500, 500, 512, 389, 0.1, 1000), pangolin::ModelViewLookAt(0, -0.1, -1.8, 0, 0, 0, 0.0, -1.0, 0.0) );
pangolin::View &d_cam = pangolin::CreateDisplay() .SetBounds(0.0, 1.0, pangolin::Attach::Pix(175), 1.0, -1024.0f / 768.0f) .SetHandler(new pangolin::Handler3D(s_cam));
  while (!pangolin::ShouldQuit()) { // 清空缓冲区 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); d_cam.Activate(s_cam); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); glLineWidth(2);
// 处理队列中的所有点并绘制 queueMutex.lock();

  if(pointQueue.size()>=2){   for (size_t i = 0; i < pointQueue.size() - 1; i++) { Eigen::Vector3d point1 = pointQueue[i];   Eigen::Vector3d point2 = pointQueue[i+1];
cout<<point1<<" "<< point2 <<endl;
glColor3f(0.0f, 0.0f, 1.0f); // blue for ground truth glBegin(GL_LINES);   glVertex3d(point1[0], point1[1], point1[2]); glVertex3d(point2[0], point2[1], point2[2]); glEnd();
  } }   queueMutex.unlock();     // 完成帧并交换缓冲区 pangolin::FinishFrame(); usleep(1000); // sleep 5 ms }
// 关闭Pangolin窗口 pangolin::DestroyWindow("3D Points Display"); }
int main() { // 启动生成和显示线程 thread generateThread(generatePoints); thread displayThread(displayPoints);
// 等待线程结束 generateThread.join(); displayThread.join();
return 0; }

标签:std,GL,1.0,pangolin,多线程,c++,pointQueue,include
From: https://www.cnblogs.com/gooutlook/p/18321478

相关文章

  • 在C++里如何释放内存的时候不调用对象的析构函数?
    今天,看到一个有趣的面试题,问题是:在C++里如何释放内存的时候不调用对象的析构函数?之所以有趣,是因为这个问题违反了C++中资源管理的RAII(资源获取即初始化),它要求资源的释放应当和对象的生命周期紧密相关。在正常情况下,当对象离开其作用域时,它的析构函数被调用,以释放它所管理的......
  • C++this指针--指针的介绍用法以及相关注意事项
    什么是this指针this指针是在C++中用来指向当前对象的特殊指针。它是每个非静态成员函数的隐式参数,指向调用该函数的对象。在C++类的成员函数中,除了静态成员函数外,每个成员函数都有一个隐含的this指针,它指向调用该函数的对象。这个指针可以让成员函数访问调用它的对象......
  • 为什么C++模板只能在头文件中实现
    为什么C++模板只能在头文件中实现答案:模板的实现并非必须在头文件中。bug再现:当我尝试将模板的定义和实现分别保存在头文件(Foo.h)和实现文件(Foo.cpp)中时,程序在链接时报错:错误 LNK2019 无法解析的外部符号"public:void__cdeclFoo<int>::doSomething(int)"(?doSome......
  • C++ opencv putText
    C++opencv putText  #include<opencv2/opencv.hpp>intmain(){//创建一个空白图像cv::Matimg(400,400,CV_8UC3,cv::Scalar(255,255,255));//设置文本内容std::stringtext="Hello,OpenCV!";//设置文本起始坐标(左下角坐标)......
  • 【lamda表达式】在多线程开发中的lamda表达书简化参数
    创建线程后传Runnable参数并实现run方法,可以采用下面两种方式,效果是一样的Threadt1=newThread(newRunnable(){@Overridepublicvoidrun(){//这里是线程应该执行的代码System.out.println("Hello,World!");......
  • c#写一个WINFORM的多线程操作
    以下是一个简单的示例,展示了如何在C#WinForms中创建一个按钮的异步事件,并使用Label控件来显示事件执行的时长。首先,确保你已经在你的项目中添加了一个Button和一个Label控件。假设按钮的名称是btnAsync,标签的名称是lblDuration。然后,在你的Form类中,添加以下代码:csha......
  • c++ 《小技巧》
    使用swap回收多余空间#include<vector>#include<iostream>usingnamespacestd;intmain(){vector<int>v;for(inti=0;i<100000;++i){v.push_back(i);}cout<<v.size()<<endl;//100000cout<......
  • C/C++ 建议编译选项
    本文介绍一些OI选手可能用到的编译选项。警告选项在程序设计中,我们可能不小心写出一些不合常理的代码语句。大部分情况下,这会使程序行为脱离我们的本意。使编译器发出警告可以在一定程度下规避这种情况。-Wall启动常见的警告选项,包括但不限于:未使用的变量、函数或标签未......
  • python_进程与线程_多线程
    一、程序与进程的概念1、进程:指启动后的程序,系统会为进程分配内存空间二、创建进程的方式1、第一种创建进程的方式process(group=None,target,name,args,kwargs)group:表示分组,实际上不使用,默认为None即可target:表示子进程要执行的任务,支持函数名name:表示子进程的......
  • C++ 打印菱形的程序(Program to print the Diamond Shape)
    给定一个数字n,编写一个程序来打印一个有2n行的菱形。例子:  //C++programtoprintdiamondshape//with2nrows #include<bits/stdc++.h>usingnamespacestd;//Printsdiamondpatternwith2nrows voidprintDiamond(intn) {   intspace=n......