main.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #include <QCoreApplication>
  2. #include "modulecomm.h"
  3. #include "input.h"
  4. #include "rsdriver.h"
  5. #include "convert.h"
  6. #include <QMutex>
  7. #include <QWaitCondition>
  8. #include <thread>
  9. volatile sig_atomic_t flag = 1;
  10. std::shared_ptr<rs_driver::lidarscan> grawscan;
  11. QMutex gMutexScan;
  12. bool gbUpdate = false;
  13. QMutex gMutexWait;
  14. QWaitCondition gWait;
  15. rslidar_pointcloud::Convert * gpConvert;
  16. void * g_lidar_pc;
  17. std::thread * gthreadpoll,*gthreadconvert;
  18. void PublishPointCloud(std::shared_ptr<rs_driver::lidarscan> rawscan)
  19. {
  20. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud;
  21. gpConvert->processScan(rawscan,point_cloud);
  22. char * strOut = new char[4+sizeof(point_cloud->header.frame_id.size()) + 4+8+point_cloud->width * sizeof(pcl::PointXYZI)];
  23. int * pHeadSize = (int *)strOut;
  24. *pHeadSize = 4 + point_cloud->header.frame_id.size()+4+8;
  25. memcpy(strOut+4,point_cloud->header.frame_id.c_str(),point_cloud->header.frame_id.size());
  26. pcl::uint32_t * pu32 = (pcl::uint32_t *)(strOut+4+sizeof(point_cloud->header.frame_id.size()));
  27. *pu32 = point_cloud->header.seq;
  28. memcpy(strOut+4+sizeof(point_cloud->header.frame_id.size()) + 4,&point_cloud->header.stamp,8);
  29. pcl::PointXYZI * p;
  30. p = (pcl::PointXYZI *)(strOut +4+sizeof(point_cloud->header.frame_id.size()) + 4+8 );
  31. memcpy(p,point_cloud->points.data(),point_cloud->width * sizeof(pcl::PointXYZI));
  32. iv::modulecomm::ModuleSendMsg(g_lidar_pc,strOut,4+sizeof(point_cloud->header.frame_id.size()) + 4+8+point_cloud->width * sizeof(pcl::PointXYZI));
  33. delete strOut;
  34. }
  35. void pollthread()
  36. {
  37. rs_driver::rslidarDriver lidarm1;
  38. while(true)
  39. {
  40. std::shared_ptr<rs_driver::lidarscan> rawscan;
  41. if(true == lidarm1.poll(rawscan))
  42. {
  43. gMutexScan.lock();
  44. grawscan = rawscan;
  45. gbUpdate = true;
  46. gMutexScan.unlock();
  47. gWait.wakeAll();
  48. }
  49. }
  50. }
  51. void convertthread()
  52. {
  53. while(true)
  54. {
  55. gMutexWait.lock();
  56. gWait.wait(&gMutexWait,300);
  57. gMutexWait.unlock();
  58. if(gbUpdate)
  59. {
  60. gMutexScan.lock();
  61. std::shared_ptr<rs_driver::lidarscan> rawscan;
  62. rawscan = grawscan;
  63. gbUpdate = false;
  64. gMutexScan.unlock();
  65. PublishPointCloud(rawscan);
  66. }
  67. }
  68. }
  69. int main(int argc, char *argv[])
  70. {
  71. QCoreApplication a(argc, argv);
  72. g_lidar_pc = iv::modulecomm::RegisterSend("lidar_pc",20000000,1);
  73. gpConvert = new rslidar_pointcloud::Convert("ChannelNum.csv","limit.csv");
  74. gthreadpoll = new std::thread(pollthread);
  75. gthreadconvert = new std::thread(convertthread);
  76. return a.exec();
  77. }