LivoxMid70.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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. void LivoxMid70::SetTransformParam(Eigen::Vector3f rpy,Eigen::Vector3f transpose)
  60. {
  61. Eigen::AngleAxisf rollAngle(Eigen::AngleAxisf(rpy(0),Eigen::Vector3f::UnitX()));
  62. Eigen::AngleAxisf pitchAngle(Eigen::AngleAxisf(rpy(1),Eigen::Vector3f::UnitY()));
  63. Eigen::AngleAxisf yawAngle(Eigen::AngleAxisf(rpy(2),Eigen::Vector3f::UnitZ()));
  64. Eigen::Matrix3f rotation_matrix;
  65. rotation_matrix=yawAngle*pitchAngle*rollAngle;
  66. m_transform.rotate(rotation_matrix);
  67. m_transform.translation()<<transpose;
  68. }
  69. pcl::PointCloud<pcl::PointXYZ>::Ptr LivoxMid70::GetCloud()
  70. {
  71. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  72. /*printf("idx:%d\n",m_idx);
  73. m_frames[m_idx].is_timeout();
  74. int idc=m_idx-1;
  75. idc=(idc>=0)?idc:MAX_FRAME+idc;
  76. printf("idx-1:%d\n",idc);
  77. m_frames[idc].is_timeout();*/
  78. TimedLivoxExtendRawPoint frames[MAX_FRAME];
  79. m_mutex.lock();
  80. int id=m_idx-1;
  81. for(int i=0;i<MAX_FRAME;++i)
  82. {
  83. frames[i]=m_frames[i];
  84. }
  85. m_mutex.unlock();
  86. for(int i=0;i<MAX_FRAME;++i)
  87. {
  88. int idc=id-i;
  89. idc=(idc>=0)?idc:MAX_FRAME+idc;
  90. if(frames[idc].is_timeout()==false)
  91. {
  92. for (int j = 0; j < frames[idc].m_point_num; ++j)
  93. {
  94. pcl::PointXYZ point;
  95. point.x = frames[idc].m_frame[j].x/1000.0;
  96. point.y = frames[idc].m_frame[j].y/1000.0;
  97. point.z = frames[idc].m_frame[j].z/1000.0;
  98. if(fabs(point.x)>8||fabs(point.y)>8||fabs(point.z)>8)
  99. continue;
  100. cloud->push_back(point);
  101. }
  102. }
  103. else
  104. {
  105. break;
  106. }
  107. }
  108. //变换点云
  109. if(cloud->size()>0)
  110. {
  111. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_t(new pcl::PointCloud<pcl::PointXYZ>);
  112. pcl::transformPointCloud(*cloud,*cloud_t,m_transform);
  113. return cloud_t;
  114. }
  115. return cloud;
  116. }
  117. void LivoxMid70::LidarDataCallback(uint8_t handle, LivoxEthPacket *data, uint32_t data_num)
  118. {
  119. LivoxEthPacket *eth_packet = data;
  120. if (!data || !data_num || (handle >= kMaxLidarCount))
  121. {
  122. return;
  123. }
  124. if (eth_packet)
  125. {
  126. //uint64_t cur_timestamp = *((uint64_t *) (data->timestamp));
  127. LivoxExtendRawPoint *p_point_data = (LivoxExtendRawPoint *) data->data;
  128. //printf(" create point num:%d\n", data_num);
  129. m_mutex.lock();
  130. m_frames[m_idx].Reset(p_point_data, data_num,1.0/m_fps);
  131. m_idx = (m_idx + 1) % MAX_FRAME;
  132. m_mutex.unlock();
  133. }
  134. }
  135. }