main.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. #include <QCoreApplication>
  2. //sudo apt install libopen3d-dev
  3. #include <open3d/Open3D.h>
  4. #include <open3d/core/TensorFunction.h>
  5. #include <open3d/visualization/visualizer/RenderOption.h>
  6. #include <pcl/io/pcd_io.h>
  7. #include <pcl/common/io.h>
  8. #include <thread>
  9. #include <QFile>
  10. #include "modulecomm.h"
  11. #include "ivversion.h"
  12. #include "xmlparam.h"
  13. char gstr_memname[256];
  14. std::shared_ptr<open3d::geometry::PointCloud> gcloud_ptr = nullptr;
  15. open3d::visualization::VisualizerWithKeyCallback gvis;
  16. bool readpcd(std::string strpcdpath,open3d::t::geometry::PointCloud &cloud)
  17. {
  18. open3d::core::Dtype dtype_f{open3d::core::Dtype::Float32};
  19. open3d::core::Device device_type{open3d::core::Device::DeviceType::CPU, 0};
  20. std::vector<float> intensities_buffer;
  21. std::vector<Eigen::Vector3d> points_buffer;
  22. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  23. new pcl::PointCloud<pcl::PointXYZI>());
  24. pcl::io::loadPCDFile<pcl::PointXYZI>(strpcdpath,*point_cloud);
  25. int i;
  26. int nsize = static_cast<int>(point_cloud->width);
  27. for(i=0;i<nsize;i++)
  28. {
  29. float x,y,z,intens;
  30. x = point_cloud->points[i].x;
  31. y = point_cloud->points[i].y;
  32. z = point_cloud->points[i].z;
  33. intens = point_cloud->points[i].intensity;
  34. points_buffer.push_back(Eigen::Vector3d(x, y, z));
  35. intensities_buffer.push_back(intens);
  36. }
  37. std::vector<float> times_buffer(points_buffer.size(), 0.0f);
  38. open3d::core::Tensor positions =
  39. open3d::core::eigen_converter::EigenVector3dVectorToTensor(
  40. points_buffer, dtype_f, device_type);
  41. cloud.SetPointPositions(positions);
  42. auto intensity = open3d::core::Tensor(
  43. intensities_buffer, {1, static_cast<int>(intensities_buffer.size())},
  44. open3d::core::Dtype::Float32);
  45. auto time = open3d::core::Tensor(times_buffer,
  46. {1, static_cast<int>(times_buffer.size())},
  47. open3d::core::Dtype::Float32);
  48. cloud.SetPointAttr("intensity", intensity);
  49. cloud.SetPointAttr("time", time);
  50. return true;
  51. }
  52. void test()
  53. {
  54. auto cloud_ptr = std::make_shared<open3d::t::geometry::PointCloud>();
  55. if (readpcd(std::string("/home/nvidia/1.pcd"), *cloud_ptr)) {
  56. auto positions = cloud_ptr->GetPointPositions();
  57. auto intensities = cloud_ptr->GetPointAttr("intensity").Reshape({-1, 1});
  58. auto times = cloud_ptr->GetPointAttr("time").Reshape({-1, 1});
  59. auto concat = open3d::core::Concatenate({positions, intensities, times}, 1);
  60. float *d_points = nullptr;
  61. int num_points = cloud_ptr->ToLegacy().points_.size();
  62. float *tmp = (float *)concat.GetDataPtr();
  63. // open3d::visualization::VisualizerWithKeyCallback vis;
  64. // vis.CreateVisualizerWindow("Point Cloud Viewer", 1600, 900);
  65. // vis.GetRenderOption().background_color_ = {0.0, 0.0, 0.0};
  66. // vis.GetRenderOption().point_color_option_ =
  67. // open3d::visualization::RenderOption::PointColorOption::Color;
  68. // vis.GetRenderOption().point_size_ = 1.0;
  69. gvis.AddGeometry(std::make_shared<open3d::geometry::PointCloud>(
  70. cloud_ptr->ToLegacy().PaintUniformColor({1.0, 1.0, 1.0})));
  71. // gvis.Run();
  72. // gvis.DestroyVisualizerWindow();
  73. }
  74. }
  75. void threadvis()
  76. {
  77. test();
  78. std::cout<<" vis close."<<std::endl;
  79. }
  80. void ListenPointCloud(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  81. {
  82. (void)index;
  83. (void)dt;
  84. (void)strmemname;
  85. if(nSize <=16)return;
  86. unsigned int * pHeadSize = (unsigned int *)strdata;
  87. if(*pHeadSize > nSize)
  88. {
  89. std::cout<<"ListenPointCloud data is small headsize ="<<*pHeadSize<<" data size is"<<nSize<<std::endl;
  90. }
  91. open3d::core::Dtype dtype_f{open3d::core::Dtype::Float32};
  92. open3d::core::Device device_type{open3d::core::Device::DeviceType::CPU, 0};
  93. std::vector<float> intensities_buffer;
  94. std::vector<Eigen::Vector3d> points_buffer;
  95. open3d::t::geometry::PointCloud cloud;
  96. pcl::PointCloud<pcl::PointXYZI>::Ptr point_cloud(
  97. new pcl::PointCloud<pcl::PointXYZI>());
  98. int nNameSize;
  99. nNameSize = *pHeadSize - 4-4-8;
  100. char * strName = new char[nNameSize+1];strName[nNameSize] = 0;
  101. memcpy(strName,(char *)((char *)strdata +4),nNameSize);
  102. point_cloud->header.frame_id = strName;
  103. memcpy(&point_cloud->header.seq,(char *)strdata+4+nNameSize,4);
  104. memcpy(&point_cloud->header.stamp,(char *)strdata+4+nNameSize+4,8);
  105. int nPCount = (nSize - *pHeadSize)/sizeof(pcl::PointXYZI);
  106. int i;
  107. point_cloud->height = 1;
  108. point_cloud->width = 0;
  109. pcl::PointXYZI * p;
  110. std::cout<<std::chrono::system_clock::now().time_since_epoch().count()/1000000 <<"ms size : "<<nPCount<<std::endl;
  111. p = (pcl::PointXYZI *)((char *)strdata + *pHeadSize);
  112. for(i=0;i<nPCount;i++)
  113. {
  114. pcl::PointXYZI xp;
  115. xp.x = p->x;
  116. xp.y = p->y;
  117. xp.z = p->z;
  118. xp.intensity = p->intensity;
  119. float x,y,z,intens;
  120. x = p->x;
  121. y = p->y;
  122. z = p->z;
  123. intens = p->intensity;
  124. points_buffer.push_back(Eigen::Vector3d(x, y, z));
  125. intensities_buffer.push_back(intens);
  126. // if(xp.intensity>10)
  127. // {
  128. point_cloud->push_back(xp);
  129. ++point_cloud->width;
  130. // }
  131. p++;
  132. // std::cout<<" x is "<<xp.x<<" y is "<<xp.y<<std::endl;
  133. }
  134. std::vector<float> times_buffer(points_buffer.size(), 0.0f);
  135. open3d::core::Tensor positions =
  136. open3d::core::eigen_converter::EigenVector3dVectorToTensor(
  137. points_buffer, dtype_f, device_type);
  138. cloud.SetPointPositions(positions);
  139. auto intensity = open3d::core::Tensor(
  140. intensities_buffer, {1, static_cast<int>(intensities_buffer.size())},
  141. open3d::core::Dtype::Float32);
  142. auto time = open3d::core::Tensor(times_buffer,
  143. {1, static_cast<int>(times_buffer.size())},
  144. open3d::core::Dtype::Float32);
  145. cloud.SetPointAttr("intensity", intensity);
  146. cloud.SetPointAttr("time", time);
  147. if(gcloud_ptr != nullptr)
  148. {
  149. // gvis.RemoveGeometry(gcloud_ptr);
  150. gcloud_ptr = std::make_shared<open3d::geometry::PointCloud>(
  151. cloud.ToLegacy().PaintUniformColor({1.0, 1.0, 1.0}));
  152. gvis.AddGeometry(gcloud_ptr);
  153. }
  154. else
  155. {
  156. gvis.RemoveGeometry(gcloud_ptr);
  157. gcloud_ptr = std::make_shared<open3d::geometry::PointCloud>(
  158. cloud.ToLegacy().PaintUniformColor({1.0, 1.0, 1.0}));
  159. gvis.AddGeometry(gcloud_ptr);//gvis.UpdateGeometry(gcloud_ptr);
  160. gvis.UpdateRender();
  161. }
  162. // return;
  163. // gw->UpdatePointCloud(point_cloud);
  164. // DBSCAN_PC(point_cloud);
  165. }
  166. int main(int argc, char *argv[])
  167. {
  168. QCoreApplication a(argc, argv);
  169. snprintf(gstr_memname,255,"lidar_pc");
  170. void * pa = iv::modulecomm::RegisterRecv(gstr_memname,ListenPointCloud);
  171. gvis.CreateVisualizerWindow("Point Cloud Viewer", 1600, 900);
  172. open3d::visualization::gui::SceneWidget;
  173. gvis.GetRenderOption().background_color_ = {0.0, 0.0, 0.0};
  174. gvis.GetRenderOption().point_color_option_ =
  175. open3d::visualization::RenderOption::PointColorOption::Color;
  176. gvis.GetRenderOption().point_size_ = 1.0;
  177. // std::thread * pt = new std::thread(&threadvis);
  178. gvis.Run();
  179. gvis.DestroyVisualizerWindow();
  180. return 0;
  181. while(1)
  182. {
  183. std::this_thread::sleep_for(std::chrono::seconds(1));
  184. std::cout<<"main."<<std::endl;
  185. }
  186. // test();
  187. return a.exec();
  188. }