|
@@ -0,0 +1,195 @@
|
|
|
+#include "mainwindow.h"
|
|
|
+#include "ui_mainwindow.h"
|
|
|
+
|
|
|
+#include <iostream>
|
|
|
+
|
|
|
+#include <QFileDialog>
|
|
|
+
|
|
|
+
|
|
|
+MainWindow::MainWindow(QWidget *parent)
|
|
|
+ : QMainWindow(parent)
|
|
|
+ , ui(new Ui::MainWindow)
|
|
|
+{
|
|
|
+ ui->setupUi(this);
|
|
|
+ vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
|
|
|
+ vtkSmartPointer<vtkGenericOpenGLRenderWindow> renderWindow = vtkSmartPointer<vtkGenericOpenGLRenderWindow>::New();
|
|
|
+ renderWindow->AddRenderer(renderer);
|
|
|
+ view.reset(new pcl::visualization::PCLVisualizer(renderer,renderWindow,"viewer",false));
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+#if VTK890
|
|
|
+ view->setupInteractor(ui->vtk->interactor(),ui->vtk->renderWindow());
|
|
|
+#else
|
|
|
+ view->setupInteractor(ui->vtk->GetInteractor(),ui->vtk->GetRenderWindow());
|
|
|
+#endif
|
|
|
+
|
|
|
+#if VTK890
|
|
|
+ this->ui->vtk->setRenderWindow(renderWindow);
|
|
|
+#else
|
|
|
+ this->ui->vtk->SetRenderWindow(renderWindow);
|
|
|
+#endif
|
|
|
+
|
|
|
+ ModuleFun xFun = std::bind(&MainWindow::ListenPointCloud,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
|
|
|
+ mpa = iv::modulecomm::RegisterRecvPlus("lidar_pc",xFun);
|
|
|
+
|
|
|
+ connect(this,SIGNAL(pointcloudupdate()),SLOT(onpointcloudupdate()));
|
|
|
+
|
|
|
+ setWindowTitle("PointCloud Viewer");
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+MainWindow::~MainWindow()
|
|
|
+{
|
|
|
+ delete ui;
|
|
|
+}
|
|
|
+
|
|
|
+void MainWindow::resizeEvent(QResizeEvent *event)
|
|
|
+{
|
|
|
+ (void)event;
|
|
|
+ QSize sizemain = ui->centralwidget->size();
|
|
|
+
|
|
|
+ ui->vtk->setGeometry(0,0,sizemain.width()-0,sizemain.height()-0);
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+//void MainWindow::on_actionLoad_triggered()
|
|
|
+//{
|
|
|
+// //读取pcd文件并显示
|
|
|
+// pcl::PointCloud<pcl::PointXYZI>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZI>());//创建点云指针
|
|
|
+// QString fileName = QFileDialog::getOpenFileName(this, "Open PointCloud", ".", "Open PCD files(*.pcd)");
|
|
|
+// if(fileName == "") return;
|
|
|
+// pcl::io::loadPCDFile(fileName.toStdString(),*cloud);
|
|
|
+// pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(cloud, "intensity"); // 按照y字段进行渲染
|
|
|
+// view->removePointCloud("cloud");
|
|
|
+// view->addPointCloud<pcl::PointXYZI>(cloud,fildColor,"cloud");
|
|
|
+
|
|
|
+// view->setCameraPosition(0,0,100,0,0,0,0,1,0);
|
|
|
+// view->resetCamera(); //视角
|
|
|
+// ui->vtk->update();
|
|
|
+//#if VTK890
|
|
|
+// ui->vtk->renderWindow()->Render();
|
|
|
+//#else
|
|
|
+// ui->vtk->GetRenderWindow()->Render();
|
|
|
+//#endif
|
|
|
+//}
|
|
|
+
|
|
|
+
|
|
|
+void MainWindow::on_actionSave_triggered()
|
|
|
+{
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void MainWindow::ListenPointCloud(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
|
|
|
+{
|
|
|
+ (void)index;
|
|
|
+ (void)dt;
|
|
|
+ (void)strmemname;
|
|
|
+
|
|
|
+ if(nSize <=16)return;
|
|
|
+ unsigned int * pHeadSize = (unsigned int *)strdata;
|
|
|
+ if(*pHeadSize > nSize)
|
|
|
+ {
|
|
|
+ std::cout<<"ListenPointCloud data is small headsize ="<<*pHeadSize<<" data size is"<<nSize<<std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
|
|
|
+ new pcl::PointCloud<pcl::PointXYZI>());
|
|
|
+ int nNameSize;
|
|
|
+ nNameSize = *pHeadSize - 4-4-8;
|
|
|
+ char * strName = new char[nNameSize+1];strName[nNameSize] = 0;
|
|
|
+ memcpy(strName,(char *)((char *)strdata +4),nNameSize);
|
|
|
+ point_cloud->header.frame_id = strName;
|
|
|
+ memcpy(&point_cloud->header.seq,(char *)strdata+4+nNameSize,4);
|
|
|
+ memcpy(&point_cloud->header.stamp,(char *)strdata+4+nNameSize+4,8);
|
|
|
+ int nPCount = (nSize - *pHeadSize)/sizeof(pcl::PointXYZI);
|
|
|
+ int i;
|
|
|
+ point_cloud->height = 1;
|
|
|
+ point_cloud->width = 0;
|
|
|
+ pcl::PointXYZI * p;
|
|
|
+ std::cout<<std::chrono::system_clock::now().time_since_epoch().count()/1000000 <<" size : "<<nPCount<<std::endl;
|
|
|
+ p = (pcl::PointXYZI *)((char *)strdata + *pHeadSize);
|
|
|
+ for(i=0;i<nPCount;i++)
|
|
|
+ {
|
|
|
+ pcl::PointXYZI xp;
|
|
|
+ xp.x = p->x;
|
|
|
+ xp.y = p->y;
|
|
|
+ xp.z = p->z;
|
|
|
+ xp.intensity = p->intensity;
|
|
|
+ if(xp.intensity>10)
|
|
|
+ {
|
|
|
+ point_cloud->push_back(xp);
|
|
|
+
|
|
|
+ ++point_cloud->width;
|
|
|
+ }
|
|
|
+ p++;
|
|
|
+
|
|
|
+ // std::cout<<" x is "<<xp.x<<" y is "<<xp.y<<std::endl;
|
|
|
+ }
|
|
|
+
|
|
|
+ mmutex.lock();
|
|
|
+ mpoint_cloud = point_cloud;
|
|
|
+ mbpcupdate = true;
|
|
|
+ mmutex.unlock();
|
|
|
+
|
|
|
+ emit pointcloudupdate();
|
|
|
+}
|
|
|
+
|
|
|
+void MainWindow::onpointcloudupdate()
|
|
|
+{
|
|
|
+ static bool bFirst = true;
|
|
|
+ pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
|
|
|
+ new pcl::PointCloud<pcl::PointXYZI>());
|
|
|
+
|
|
|
+ if(mbpcupdate == false)return;
|
|
|
+
|
|
|
+ mmutex.lock();
|
|
|
+ point_cloud = mpoint_cloud;
|
|
|
+ mbpcupdate = false;
|
|
|
+ mmutex.unlock();
|
|
|
+
|
|
|
+ pcl::visualization::PointCloudColorHandlerGenericField<pcl::PointXYZI> fildColor(point_cloud, "intensity"); // 按照y字段进行渲染
|
|
|
+ view->removePointCloud("cloud");
|
|
|
+ view->addPointCloud<pcl::PointXYZI>(point_cloud,fildColor,"cloud");
|
|
|
+
|
|
|
+ if(bFirst)
|
|
|
+ {
|
|
|
+ view->setCameraPosition(0,0,100,0,0,0,0,1,0);
|
|
|
+ bFirst = false;
|
|
|
+ view->resetCamera(); //视角
|
|
|
+ }
|
|
|
+
|
|
|
+// ui->vtk->update();
|
|
|
+#if VTK890
|
|
|
+ ui->vtk->renderWindow()->Render();
|
|
|
+#else
|
|
|
+ ui->vtk->GetRenderWindow()->Render();
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void MainWindow::on_actionFull_triggered()
|
|
|
+{
|
|
|
+ showFullScreen();
|
|
|
+ ui->menubar->setVisible(false);
|
|
|
+ ui->statusbar->setVisible(false);
|
|
|
+ ui->toolBar->setVisible(false);
|
|
|
+ mbFull = true;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+void MainWindow::keyReleaseEvent(QKeyEvent *event)
|
|
|
+{
|
|
|
+ if((event->key() == Qt::Key_Escape)||(event->key() == Qt::Key_F11))
|
|
|
+ {
|
|
|
+ if(mbFull)
|
|
|
+ {
|
|
|
+ showNormal();
|
|
|
+ ui->menubar->setVisible(true);
|
|
|
+ ui->statusbar->setVisible(true);
|
|
|
+ ui->toolBar->setVisible(true);
|
|
|
+ mbFull = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|