LivoxMid70.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. //
  2. // Created by zx on 2021/12/15.
  3. //
  4. #include "LivoxMid70.h"
  5. namespace livox
  6. {
  7. TimedLivoxExtendRawPoint::TimedLivoxExtendRawPoint()
  8. {
  9. m_point_num=0;
  10. m_frame= nullptr;
  11. m_timeout=0;
  12. m_time_point=std::chrono::steady_clock::now();
  13. }
  14. void TimedLivoxExtendRawPoint::Reset(LivoxExtendRawPoint* data ,int count,float timeout_time){
  15. if(m_frame!=nullptr)
  16. {
  17. free(m_frame);
  18. }
  19. m_frame=(LivoxExtendRawPoint*)malloc(sizeof(LivoxExtendRawPoint)*count);
  20. m_point_num=count;
  21. memcpy(m_frame,data,count*sizeof(LivoxExtendRawPoint));
  22. m_time_point=std::chrono::steady_clock::now();
  23. m_timeout=timeout_time;
  24. }
  25. TimedLivoxExtendRawPoint::~TimedLivoxExtendRawPoint()
  26. {
  27. if(m_frame!=nullptr)
  28. {
  29. free(m_frame);
  30. m_frame=nullptr;
  31. m_point_num=0;
  32. }
  33. }
  34. void TimedLivoxExtendRawPoint::operator=(const TimedLivoxExtendRawPoint& frame)
  35. {
  36. if(m_frame!=nullptr)
  37. {
  38. free(m_frame);
  39. }
  40. m_point_num=frame.m_point_num;
  41. m_frame=(LivoxExtendRawPoint*)malloc(sizeof(LivoxExtendRawPoint)*frame.m_point_num);
  42. memcpy(m_frame,frame.m_frame,m_point_num*sizeof(LivoxExtendRawPoint));
  43. m_time_point=frame.m_time_point;
  44. m_timeout=frame.m_timeout;
  45. }
  46. bool TimedLivoxExtendRawPoint::is_timeout(){
  47. auto tic=std::chrono::steady_clock::now();
  48. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(tic - m_time_point);
  49. double tm=double(duration.count()) * std::chrono::microseconds::period::num /
  50. std::chrono::microseconds::period::den;
  51. return tm>m_timeout;
  52. }
  53. LivoxMid70::LivoxMid70(){
  54. m_idx=0;
  55. m_fps=2.0;
  56. m_transform=Eigen::Affine3f::Identity();
  57. }
  58. LivoxMid70::~LivoxMid70(){}
  59. bool LivoxMid70::is_connected()
  60. {
  61. auto tic=std::chrono::steady_clock::now();
  62. auto duration = std::chrono::duration_cast<std::chrono::microseconds>(tic - m_last_data_tp);
  63. double tm=double(duration.count()) * std::chrono::microseconds::period::num /
  64. std::chrono::microseconds::period::den;
  65. return tm<1.0;
  66. }
  67. void LivoxMid70::SetTransformParam(Eigen::Vector3f rpy,Eigen::Vector3f transpose)
  68. {
  69. Eigen::AngleAxisf rollAngle(Eigen::AngleAxisf(rpy(0),Eigen::Vector3f::UnitX()));
  70. Eigen::AngleAxisf pitchAngle(Eigen::AngleAxisf(rpy(1),Eigen::Vector3f::UnitY()));
  71. Eigen::AngleAxisf yawAngle(Eigen::AngleAxisf(rpy(2),Eigen::Vector3f::UnitZ()));
  72. Eigen::Matrix3f rotation_matrix;
  73. rotation_matrix=yawAngle*pitchAngle*rollAngle;
  74. m_transform.rotate(rotation_matrix);
  75. m_transform.translation()<<transpose;
  76. }
  77. pcl::PointCloud<pcl::PointXYZ>::Ptr LivoxMid70::GetCloud()
  78. {
  79. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  80. /*printf("idx:%d\n",m_idx);
  81. m_frames[m_idx].is_timeout();
  82. int idc=m_idx-1;
  83. idc=(idc>=0)?idc:MAX_FRAME+idc;
  84. printf("idx-1:%d\n",idc);
  85. m_frames[idc].is_timeout();*/
  86. TimedLivoxExtendRawPoint frames[MAX_FRAME];
  87. m_mutex.lock();
  88. int id=m_idx-1;
  89. for(int i=0;i<MAX_FRAME;++i)
  90. {
  91. frames[i]=m_frames[i];
  92. }
  93. m_mutex.unlock();
  94. for(int i=0;i<MAX_FRAME;++i)
  95. {
  96. int idc=id-i;
  97. idc=(idc>=0)?idc:MAX_FRAME+idc;
  98. if(frames[idc].is_timeout()==false)
  99. {
  100. for (int j = 0; j < frames[idc].m_point_num; ++j)
  101. {
  102. pcl::PointXYZ point;
  103. point.x = frames[idc].m_frame[j].x/1000.0;
  104. point.y = frames[idc].m_frame[j].y/1000.0;
  105. point.z = frames[idc].m_frame[j].z/1000.0;
  106. if(fabs(point.x)>8||fabs(point.y)>8||fabs(point.z)>8)
  107. continue;
  108. cloud->push_back(point);
  109. }
  110. }
  111. else
  112. {
  113. break;
  114. }
  115. }
  116. //变换点云
  117. if(cloud->size()>0)
  118. {
  119. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_t(new pcl::PointCloud<pcl::PointXYZ>);
  120. pcl::transformPointCloud(*cloud,*cloud_t,m_transform);
  121. return cloud_t;
  122. }
  123. return cloud;
  124. }
  125. void LivoxMid70::LidarDataCallback(uint8_t handle, LivoxEthPacket *data, uint32_t data_num)
  126. {
  127. m_last_data_tp=std::chrono::steady_clock::now();
  128. LivoxEthPacket *eth_packet = data;
  129. if (!data || !data_num || (handle >= kMaxLidarCount))
  130. {
  131. return;
  132. }
  133. if (eth_packet)
  134. {
  135. //uint64_t cur_timestamp = *((uint64_t *) (data->timestamp));
  136. LivoxExtendRawPoint *p_point_data = (LivoxExtendRawPoint *) data->data;
  137. //printf(" create point num:%d\n", data_num);
  138. m_mutex.lock();
  139. m_frames[m_idx].Reset(p_point_data, data_num,1.0/m_fps);
  140. m_idx = (m_idx + 1) % MAX_FRAME;
  141. m_mutex.unlock();
  142. }
  143. }
  144. }