mainwindow.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <pcl/io/pcd_io.h>
  4. #include <pcl/point_types.h>
  5. MainWindow * gw;
  6. char gstr_memname[256];
  7. double GetThresh(double x,double y)
  8. {
  9. double dis = sqrt(x*x + y*y);
  10. if(dis<20)return 0.4;
  11. if(dis<40)return 0.6;
  12. if(dis<60)return 0.8;
  13. // if((dis>=10)&&(dis<=30))return 0.5;
  14. return 1.0;
  15. }
  16. inline double CalcDis(double x0,double y0,double x1,double y1)
  17. {
  18. return sqrt((y1-y0)*(y1-y0) + (x1-x0)*(x1-x0));
  19. }
  20. int CountNearPoint(std::shared_ptr<std::vector<iv::ObstacleBasic>> lidar_obs,std::vector<iv::ObstacleBasic>::iterator its,double thresh)
  21. {
  22. std::vector<iv::ObstacleBasic>::iterator it = lidar_obs->begin();
  23. iv::ObstacleBasic xp = *it;
  24. int nRtn = 1;
  25. while(it!= lidar_obs->end())
  26. {
  27. if(its != it)
  28. {
  29. iv::ObstacleBasic xt = *it;
  30. if(CalcDis(xp.nomal_x,xp.nomal_y,(*it).nomal_x,(*it).nomal_y)<=thresh)nRtn++;
  31. }
  32. else
  33. {
  34. // std::cout<<"equal"<<std::endl;
  35. }
  36. it++;
  37. }
  38. // std::cout<<"nRtn = "<<nRtn<<std::endl;
  39. return nRtn;
  40. }
  41. void ListenPointCloud(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  42. {
  43. if(nSize <=16)return;
  44. unsigned int * pHeadSize = (unsigned int *)strdata;
  45. if(*pHeadSize > nSize)
  46. {
  47. std::cout<<"ListenPointCloud data is small headsize ="<<*pHeadSize<<" data size is"<<nSize<<std::endl;
  48. }
  49. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  50. new pcl::PointCloud<pcl::PointXYZI>());
  51. int nNameSize;
  52. nNameSize = *pHeadSize - 4-4-8;
  53. char * strName = new char[nNameSize+1];strName[nNameSize] = 0;
  54. memcpy(strName,(char *)((char *)strdata +4),nNameSize);
  55. point_cloud->header.frame_id = strName;
  56. memcpy(&point_cloud->header.seq,(char *)strdata+4+nNameSize,4);
  57. memcpy(&point_cloud->header.stamp,(char *)strdata+4+nNameSize+4,8);
  58. int nPCount = (nSize - *pHeadSize)/sizeof(pcl::PointXYZI);
  59. int i;
  60. pcl::PointXYZI * p;
  61. p = (pcl::PointXYZI *)((char *)strdata + *pHeadSize);
  62. for(i=0;i<nPCount;i++)
  63. {
  64. pcl::PointXYZI xp;
  65. xp.x = p->x;
  66. xp.y = p->y;
  67. xp.z = p->z;
  68. xp.intensity = p->intensity;
  69. point_cloud->push_back(xp);
  70. p++;
  71. // std::cout<<" x is "<<xp.x<<" y is "<<xp.y<<std::endl;
  72. }
  73. // return;
  74. gw->UpdatePointCloud(point_cloud);
  75. // DBSCAN_PC(point_cloud);
  76. }
  77. MainWindow::MainWindow(QWidget *parent) :
  78. QMainWindow(parent),
  79. ui(new Ui::MainWindow)
  80. {
  81. ui->setupUi(this);
  82. gw = this;
  83. mpcdview = new IVPCDView();
  84. mpcdview->start();
  85. mTime.start();
  86. mnlidarcount = 0;
  87. mnonepcd = 0;
  88. mbSaveOne = false;
  89. mbSave = false;
  90. mnsave = 0;
  91. mbOpen = false;
  92. mstrSavePath = QCoreApplication::applicationDirPath();
  93. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloudtemp(
  94. new pcl::PointCloud<pcl::PointXYZI>());
  95. mpoint_cloud = point_cloudtemp;
  96. myview = new MyView(this);
  97. myview->setObjectName(QStringLiteral("graphicsView"));
  98. myview->setGeometry(QRect(30, 30, 600, 600));
  99. image = new QImage(2000, 2000, QImage::Format_RGB32);//画布的初始化大小设为300*300,使用32位颜色
  100. myview->setCacheMode(myview->CacheBackground);
  101. painter = new QPainter(image);
  102. painter->end();
  103. scene = new QGraphicsScene;
  104. CreateView();
  105. // myview->scale(0.3,0.3);
  106. // myview->show();
  107. mpa = iv::modulecomm::RegisterRecv(gstr_memname,ListenPointCloud);
  108. connect(&mTimer,SIGNAL(timeout()),this,SLOT(onTimer()));
  109. #ifdef Q_OS_WIN32
  110. mTimer.start(1000);
  111. #else
  112. mTimer.start(10);
  113. #endif
  114. setWindowTitle("bqev-pcdview");
  115. }
  116. MainWindow::~MainWindow()
  117. {
  118. QTime time;
  119. time.start();
  120. mpcdview->requestInterruption();
  121. while(time.elapsed()<1000)
  122. {
  123. if(mpcdview->isFinished())
  124. {
  125. break;
  126. }
  127. }
  128. delete ui;
  129. }
  130. void MainWindow::UpdatePointCloud(pcl::PointCloud<pcl::PointXYZI>::Ptr pc)
  131. {
  132. if(mbSaveOne)
  133. {
  134. QString strpath = mstrSavePath;
  135. strpath = strpath+"/";
  136. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + "-1.pcd";
  137. if(0 == pcl::io::savePCDFile(strpath.toLatin1().data(),*pc))
  138. {
  139. mnonepcd++;
  140. mbSaveOne = false;
  141. }
  142. // pcl::io::loadPCDFile<pcl::PointXYZRGBA>("table_scene_lms400.pcd", *cloud
  143. }
  144. if(mbSave)
  145. {
  146. QString strpath = mstrSavePath;
  147. strpath = strpath+"/";
  148. strpath = strpath + QDateTime::currentDateTime().toString("yyyy-MM-dd-hh-mm-ss-zzz") + ".pcd";
  149. if(0 == pcl::io::savePCDFile(strpath.toLatin1().data(),*pc))
  150. {
  151. mnsave++;
  152. }
  153. }
  154. mpcdview->SetPointCloud(pc);
  155. // mMutex.lock();
  156. // pc.swap(mpoint_cloud);
  157. // mMutex.unlock();
  158. // mnlidarcount++;
  159. // if(!pc->empty())update();
  160. }
  161. void MainWindow::on_checkBox_clicked()
  162. {
  163. }
  164. void MainWindow::onTimer()
  165. {
  166. update();
  167. mpLE_lidarcount->setText(QString::number(mnlidarcount));
  168. mpLE_savepcd->setText(QString::number(mnsave));
  169. mpLE_onepcd->setText(QString::number(mnonepcd));
  170. }
  171. //刷新
  172. void MainWindow::paintEvent(QPaintEvent *)
  173. {
  174. // pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  175. // new pcl::PointCloud<pcl::PointXYZI>());
  176. // int nz = 0;
  177. // mMutex.lock();
  178. // point_cloud.swap(mpoint_cloud);
  179. // mMutex.unlock();
  180. // if(point_cloud->width <1)return;
  181. // painter->begin(image);
  182. // image->fill(QColor(255, 255, 255));//对画布进行填充
  183. //// std::vector<iv::GPSData> navigation_data = brain->navigation_data;
  184. // painter->setRenderHint(QPainter::Antialiasing, true);//设置反锯齿模式,好看一点
  185. // painter->translate(1000,1000);
  186. // painter->setPen(Qt::black);
  187. // painter->drawLine(-1000,0,1000,0);
  188. // painter->drawLine(0,-1000,0,1000);
  189. // int i;
  190. // for(i=-9;i<=9;i++)
  191. // {
  192. // painter->drawLine(i*100,0,i*100,-20);
  193. //// painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*10));
  194. // }
  195. //// std::cout<<"enter paint."<<std::endl;
  196. // painter->save();
  197. // painter->rotate(90);
  198. // for(i=-9;i<=9;i++)
  199. // {
  200. // painter->drawLine(i*100,0,i*100,-20);
  201. //// painter->drawText(i*100-20,-50,40,20,Qt::AlignHCenter | Qt::AlignTop,QString::number(i*(-10)));
  202. // }
  203. // painter->restore();
  204. // if(point_cloud != 0)
  205. // {
  206. // for(i=0;i<point_cloud->width;i++)
  207. // {
  208. // pcl::PointXYZI pxyzi = point_cloud->at(i);
  209. // int x,y;
  210. // // std::cout<<" x is "<<pxyzi.x<<" y is "<<pxyzi.y<<std::endl;
  211. // x =(int) (pxyzi.x*10.0);
  212. // y = (int)(pxyzi.y*(-10.0));
  213. // if((fabs(x)<5) &&(fabs(y)<5))
  214. // {
  215. // nz++;
  216. // }
  217. //// std::cout<<" x is "<<x<<" y is "<<y<<std::endl;
  218. // int inten = pxyzi.intensity;
  219. // inten = inten/2;
  220. // QColor color;
  221. // color.setHsl(inten,255,120);
  222. // painter->setPen(color);
  223. // painter->drawPoint(x,y);
  224. // }
  225. // }
  226. // qDebug("nz = %d",nz);
  227. //// QColor x;
  228. //// x.setHsl(200,255,120);
  229. //// painter->setPen(x);
  230. //// painter->drawText(-300,-300,40,40,Qt::AlignHCenter | Qt::AlignTop,"hello");
  231. // painter->end();
  232. QTime xTime;
  233. if(!mpcdview->IsHaveNew())
  234. {
  235. // qDebug("no pcd");
  236. return;
  237. }
  238. xTime.start();
  239. QImage imagex = mpcdview->GetImage();
  240. scene->clear();
  241. scene->addPixmap(QPixmap::fromImage(imagex));
  242. myview->setScene(scene);
  243. myview->show();
  244. qDebug("show time is %d ",xTime.elapsed());
  245. }
  246. void MainWindow::resizeEvent(QResizeEvent *event)
  247. {
  248. qDebug("resize");
  249. QSize sizemain = ui->centralWidget->size();
  250. qDebug("size x = %d y=%d",sizemain.width(),sizemain.height());
  251. AdjustWPos(sizemain);
  252. }
  253. void MainWindow::AdjustWPos(QSize sizemain)
  254. {
  255. myview->setGeometry(0,30,sizemain.width()-300,sizemain.height());
  256. mgplidar->setGeometry(sizemain.width()-280,30,260,200);
  257. }
  258. void MainWindow::CreateStatusView(QGridLayout *gl)
  259. {
  260. gl->setSpacing(10);
  261. int iRow = 0;
  262. QLabel * pl = new QLabel(this);
  263. pl->setText("Count");
  264. pl->setFixedWidth(80);
  265. QLineEdit * ple = new QLineEdit(this);
  266. ple->setFixedWidth(100);
  267. gl->addWidget(pl,iRow,0);
  268. gl->addWidget(ple,iRow,1);
  269. iRow++;
  270. mpLE_lidarcount = ple;
  271. QPushButton * pb2 = new QPushButton(this);
  272. pb2->setText("Save One");
  273. pb2->setFixedWidth(80);
  274. QLineEdit * ple2 = new QLineEdit(this);
  275. ple2->setFixedWidth(100);
  276. gl->addWidget(pb2,iRow,0);
  277. gl->addWidget(ple2,iRow,1);
  278. iRow++;
  279. mpPB_saveonepcd = pb2;
  280. mpLE_onepcd = ple2;
  281. connect(mpPB_saveonepcd,SIGNAL(clicked(bool)),this,SLOT(onSaveOnePCD()));
  282. QPushButton * pb3 = new QPushButton(this);
  283. pb3->setText("Start Save");
  284. pb3->setFixedWidth(80);
  285. QLineEdit * ple3 = new QLineEdit(this);
  286. ple3->setFixedWidth(100);
  287. gl->addWidget(pb3,iRow,0);
  288. gl->addWidget(ple3,iRow,1);
  289. iRow++;
  290. mpPB_savepcd = pb3;
  291. mpLE_savepcd = ple3;
  292. connect(mpPB_savepcd,SIGNAL(clicked(bool)),this,SLOT(onSavePCD()));
  293. QPushButton * pb4 = new QPushButton(this);
  294. pb4->setText("Set Folder");
  295. pb4->setFixedWidth(80);
  296. QLineEdit * ple4 = new QLineEdit(this);
  297. ple4->setFixedWidth(100);
  298. gl->addWidget(pb4,iRow,0);
  299. gl->addWidget(ple4,iRow,1);
  300. iRow++;
  301. mpLE_savefolder = ple4;
  302. connect(pb4,SIGNAL(clicked(bool)),this,SLOT(onSelectFolder()));
  303. QSpacerItem * xpsi2 = new QSpacerItem(200,1000,QSizePolicy::Maximum);
  304. gl->addItem(xpsi2,iRow,0);
  305. }
  306. void MainWindow::CreateView()
  307. {
  308. QGroupBox * gp1 = new QGroupBox(ui->centralWidget);
  309. gp1->setTitle(QStringLiteral("LIDAR Status"));
  310. gp1->setGeometry(QRect(10,100,400,600));
  311. QGridLayout * gll1 = new QGridLayout(ui->centralWidget);
  312. gp1->setLayout(gll1);
  313. CreateStatusView(gll1);
  314. mgplidar = gp1;
  315. }
  316. void MainWindow::onSaveOnePCD()
  317. {
  318. mbSaveOne = true;
  319. }
  320. void MainWindow::onSavePCD()
  321. {
  322. if(mbSave)
  323. {
  324. mbSave = false;
  325. mpPB_savepcd->setText("Start Save");
  326. }
  327. else
  328. {
  329. mbSave = true;
  330. mpPB_savepcd->setText("Stop Save");
  331. }
  332. }
  333. void MainWindow::onSelectFolder()
  334. {
  335. QString str = QFileDialog::getExistingDirectory(this, tr("Set PCD Save Directory"), mstrSavePath, QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
  336. if(!str.isEmpty())
  337. {
  338. mstrSavePath = str;
  339. mpLE_savefolder->setText(mstrSavePath);
  340. }
  341. else
  342. {
  343. qDebug("not change dir.");
  344. }
  345. }