lidarbuffer.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. #include "lidarbuffer.h"
  2. #include <iostream>
  3. #include "math/gnss_coordinate_convert.h"
  4. lidarbuffer::lidarbuffer()
  5. {
  6. }
  7. void lidarbuffer::AddGPS(iv::gps::gpsimu & xgpsimu)
  8. {
  9. const int nMaxGPSFre = 100;
  10. if(mvectorgps_rec.size() > static_cast<unsigned int>( (mnLookTime * nMaxGPSFre*2/1000) ) )
  11. {
  12. std::cout<<" Warning. GPS Buffer Warning."<<std::endl;
  13. mmutex.lock();
  14. mvectorgps_rec.clear();;
  15. mmutex.unlock();
  16. }
  17. int64_t nnow = std::chrono::system_clock::now().time_since_epoch().count()/1000000;
  18. mmutex.lock();
  19. while(mvectorgps_rec.size()>0)
  20. {
  21. if(abs(nnow - mvectorgps_rec[0].nTime)>static_cast<unsigned int>( mnLookTime))
  22. {
  23. mvectorgps_rec.erase(mvectorgps_rec.begin());
  24. }
  25. else
  26. {
  27. break;
  28. }
  29. }
  30. mmutex.unlock();
  31. mmutex.lock();
  32. iv::gps_rec xrec;
  33. xrec.nTime = xgpsimu.msgtime();
  34. xrec.xgpsimu.CopyFrom(xgpsimu);
  35. mvectorgps_rec.push_back(xrec);
  36. mmutex.unlock();
  37. }
  38. void lidarbuffer::AddLidarObj(iv::lidar::objectarray & xobjarray)
  39. {
  40. const int nMaxLidarFre = 100;
  41. if(mvectorgps_rec.size() > static_cast<unsigned int>( (mnLookTime * nMaxLidarFre*2/1000) ) )
  42. {
  43. std::cout<<" Warning. Lidar Buffer Warning."<<std::endl;
  44. mmutex.lock();
  45. mvectorlidarobj_rec.clear();;
  46. mmutex.unlock();
  47. }
  48. int64_t nnow = std::chrono::system_clock::now().time_since_epoch().count()/1000000;
  49. mmutex.lock();
  50. while(mvectorlidarobj_rec.size()>0)
  51. {
  52. if(abs(nnow - mvectorlidarobj_rec[0].nTime)>static_cast<unsigned int>( mnLookTime))
  53. {
  54. mvectorlidarobj_rec.erase(mvectorlidarobj_rec.begin());
  55. }
  56. else
  57. {
  58. break;
  59. }
  60. }
  61. mmutex.unlock();
  62. mmutex.lock();
  63. iv::lidarobj_rec xrec;
  64. xrec.nTime = xobjarray.timestamp()/1000; //to ms
  65. ChangePos(&xrec);
  66. xrec.xobjarray.CopyFrom(xobjarray);
  67. mvectorlidarobj_rec.push_back(xrec);
  68. mmutex.unlock();
  69. }
  70. void lidarbuffer::ChangePos(iv::lidarobj_rec * xrec)
  71. {
  72. if(mvectorgps_rec.size() == 0)
  73. {
  74. std::cout<<" warning no gps data. "<<std::endl;
  75. return;
  76. }
  77. unsigned int nnearindex = 0;
  78. int64_t ntimediff = mnLookTime;
  79. unsigned int nsize = static_cast<unsigned int>( mvectorgps_rec.size());
  80. unsigned int i;
  81. for(i=1;i<nsize;i++)
  82. {
  83. if(abs(xrec->nTime - mvectorgps_rec[i].nTime)<abs(ntimediff))
  84. {
  85. ntimediff = xrec->nTime - mvectorgps_rec[i].nTime;
  86. nnearindex = i;
  87. }
  88. }
  89. if(abs(ntimediff) > 100)
  90. {
  91. std::cout<<"warning. lidar gps time diff more than 100ms"<<std::endl;
  92. }
  93. iv::gps::gpsimu xgpsimu;
  94. xgpsimu.CopyFrom(mvectorgps_rec[nnearindex].xgpsimu);
  95. double hdg = (90 - xgpsimu.heading())*M_PI/180.0;
  96. double fsr = hdg + M_PI/2.0;
  97. double x_sensor = mfLidarOffX * cos(fsr) - mfLidarOffY * sin(fsr);
  98. double y_sensor = mfLidarOffX * sin(fsr) + mfLidarOffY * cos(fsr);
  99. double x_gps,y_gps;
  100. GaussProjCal(xgpsimu.lon(),xgpsimu.lat(),&x_gps,&y_gps);
  101. for(i=0;i<nsize;i++)
  102. {
  103. iv::lidar::lidarobject * pobj = xrec->xobjarray.mutable_obj(i);
  104. double x_raw = pobj->position().x();
  105. double y_raw = pobj->position().y();
  106. double x_abs = x_gps + x_sensor + x_raw * cos(fsr) - y_raw * sin(fsr);
  107. double y_abs = y_gps + y_sensor + x_raw * sin(fsr) + y_raw * cos(fsr);
  108. pobj->mutable_position()->set_x(x_abs);
  109. pobj->mutable_position()->set_y(y_abs);
  110. }
  111. }