lidarbuffer.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316
  1. #include "lidarbuffer.h"
  2. #include <iostream>
  3. #include "math/gnss_coordinate_convert.h"
  4. lidarbuffer::lidarbuffer(int64_t nLookTime,double fProb_Thresh,double fLidarOffX, double fLidarOffY, double fDisThresh)
  5. {
  6. mnLookTime = nLookTime;
  7. mfProb_Thresh = fProb_Thresh;
  8. mfLidarOffX = fLidarOffX;
  9. mfLidarOffY = fLidarOffY;
  10. mfDisThresh = fDisThresh;
  11. }
  12. void lidarbuffer::AddGPS(iv::gps::gpsimu & xgpsimu)
  13. {
  14. const int nMaxGPSFre = 100;
  15. if(mvectorgps_rec.size() > static_cast<unsigned int>( (mnLookTime * nMaxGPSFre*2/1000) ) )
  16. {
  17. std::cout<<" Warning. GPS Buffer Warning."<<std::endl;
  18. mmutex.lock();
  19. mvectorgps_rec.clear();;
  20. mmutex.unlock();
  21. }
  22. int64_t nnow = std::chrono::system_clock::now().time_since_epoch().count()/1000000;
  23. mmutex.lock();
  24. while(mvectorgps_rec.size()>0)
  25. {
  26. if(abs(nnow - mvectorgps_rec[0].nTime)>static_cast<unsigned int>( mnLookTime))
  27. {
  28. mvectorgps_rec.erase(mvectorgps_rec.begin());
  29. }
  30. else
  31. {
  32. break;
  33. }
  34. }
  35. mmutex.unlock();
  36. mmutex.lock();
  37. iv::gps_rec xrec;
  38. xrec.nTime = xgpsimu.msgtime();
  39. xrec.xgpsimu.CopyFrom(xgpsimu);
  40. mvectorgps_rec.push_back(xrec);
  41. mmutex.unlock();
  42. }
  43. void lidarbuffer::AddLidarObj(iv::lidar::objectarray & xobjarray)
  44. {
  45. const int nMaxLidarFre = 100;
  46. if(mvectorgps_rec.size() > static_cast<unsigned int>( (mnLookTime * nMaxLidarFre*2/1000) ) )
  47. {
  48. std::cout<<" Warning. Lidar Buffer Warning."<<std::endl;
  49. mmutex.lock();
  50. mvectorlidarobj_rec.clear();;
  51. mmutex.unlock();
  52. }
  53. int64_t nnow = std::chrono::system_clock::now().time_since_epoch().count()/1000000;
  54. mmutex.lock();
  55. while(mvectorlidarobj_rec.size()>0)
  56. {
  57. if(abs(nnow - mvectorlidarobj_rec[0].nTime)>static_cast<unsigned int>( mnLookTime))
  58. {
  59. mvectorlidarobj_rec.erase(mvectorlidarobj_rec.begin());
  60. }
  61. else
  62. {
  63. break;
  64. }
  65. }
  66. mmutex.unlock();
  67. mmutex.lock();
  68. iv::lidarobj_rec xrec;
  69. xrec.nTime = xobjarray.timestamp(); //to ms
  70. xrec.xobjarray.CopyFrom(xobjarray);
  71. ChangePos(&xrec);
  72. mvectorlidarobj_rec.push_back(xrec);
  73. mmutex.unlock();
  74. }
  75. void lidarbuffer::ChangePos(iv::lidarobj_rec * xrec)
  76. {
  77. if(mvectorgps_rec.size() == 0)
  78. {
  79. std::cout<<" warning no gps data. "<<std::endl;
  80. return;
  81. }
  82. unsigned int nnearindex = 0;
  83. int64_t ntimediff = mnLookTime;
  84. // xrec->nTime = std::chrono::system_clock::now().time_since_epoch().count()/1000000 - 100;
  85. unsigned int nsize = static_cast<unsigned int>( mvectorgps_rec.size());
  86. unsigned int i;
  87. for(i=1;i<nsize;i++)
  88. {
  89. if(abs(xrec->nTime - mvectorgps_rec[i].nTime)<abs(ntimediff))
  90. {
  91. ntimediff = xrec->nTime - mvectorgps_rec[i].nTime;
  92. nnearindex = i;
  93. }
  94. }
  95. if(abs(ntimediff) > 100)
  96. {
  97. std::cout<<"warning. lidar gps time diff more than 100ms"<<std::endl;
  98. }
  99. iv::gps::gpsimu xgpsimu;
  100. xgpsimu.CopyFrom(mvectorgps_rec[nnearindex].xgpsimu);
  101. double hdg = (90 - xgpsimu.heading())*M_PI/180.0;
  102. double fsr = hdg - M_PI/2.0;
  103. double x_sensor = mfLidarOffX * cos(fsr) - mfLidarOffY * sin(fsr);
  104. double y_sensor = mfLidarOffX * sin(fsr) + mfLidarOffY * cos(fsr);
  105. xrec->sensor_hdg = hdg;
  106. xrec->sensor_x = x_sensor;
  107. xrec->sensor_y = y_sensor;
  108. double x_gps,y_gps;
  109. GaussProjCal(xgpsimu.lon(),xgpsimu.lat(),&x_gps,&y_gps);
  110. nsize = xrec->xobjarray.obj_size();
  111. for(i=0;i<nsize;i++)
  112. {
  113. iv::lidar::lidarobject * pobj = xrec->xobjarray.mutable_obj(i);
  114. double x_raw = pobj->position().x();
  115. double y_raw = pobj->position().y();
  116. double x_abs = x_gps + x_sensor + x_raw * cos(fsr) - y_raw * sin(fsr);
  117. double y_abs = y_gps + y_sensor + x_raw * sin(fsr) + y_raw * cos(fsr);
  118. pobj->mutable_position()->set_x(x_abs);
  119. pobj->mutable_position()->set_y(y_abs);
  120. }
  121. xrec->sensor_x = xrec->sensor_x + x_gps;
  122. xrec->sensor_y = xrec->sensor_y + y_gps;
  123. }
  124. int lidarbuffer::MergeLast(iv::lidar::objectarray & xselarray)
  125. {
  126. int nsel = 0;
  127. if(mvectorlidarobj_rec.size() == 0)return 0;
  128. mmutex.lock();
  129. int nsize = mvectorlidarobj_rec.size();
  130. int i;
  131. std::vector<std::vector<iv::stats_count>> xvectorcount_series;
  132. for(i=0;i<nsize;i++)
  133. {
  134. unsigned int j;
  135. unsigned int nobjsize = mvectorlidarobj_rec[i].xobjarray.obj_size();
  136. std::vector<iv::stats_count> xvectorcount;
  137. for(j=0;j<nobjsize;j++)
  138. {
  139. iv::stats_count sc;
  140. sc.ncount = 1;
  141. sc.nIndex_vector = i;
  142. sc.nIndex_obj = j;
  143. sc.nSameRef = -1;
  144. xvectorcount.push_back(sc);
  145. }
  146. if(xvectorcount.size()>0) xvectorcount_series.push_back(xvectorcount);
  147. }
  148. std::vector<std::vector<iv::stats_count>> xvectorcount_same;
  149. while(xvectorcount_series.size()>0)
  150. {
  151. if(xvectorcount_series[0].size() == 0)
  152. {
  153. xvectorcount_series.erase(xvectorcount_series.begin());
  154. continue;
  155. }
  156. iv::stats_count scref = xvectorcount_series[0].at(0);
  157. xvectorcount_series[0].erase(xvectorcount_series[0].begin());
  158. std::vector<iv::stats_count> xvectorsa;
  159. xvectorsa.push_back(scref);
  160. iv::lidar::lidarobject * pobj = mvectorlidarobj_rec[scref.nIndex_vector].xobjarray.mutable_obj(scref.nIndex_obj);
  161. for(i=1;i<static_cast<int>( xvectorcount_series.size());i++)
  162. {
  163. double fdismin = 1000.0;
  164. int nindexmin = -1;
  165. int j;
  166. for(j=0;j<static_cast<int>( xvectorcount_series[i].size());j++)
  167. {
  168. iv::lidar::lidarobject * pobj2 = mvectorlidarobj_rec[xvectorcount_series[i].at(j).nIndex_vector].xobjarray.mutable_obj(xvectorcount_series[i].at(j).nIndex_obj);
  169. double fdis =sqrt(pow(pobj->mutable_position()->x() - pobj2->mutable_position()->x(),2)
  170. +pow(pobj->mutable_position()->y() - pobj2->mutable_position()->y(),2));
  171. if(fdis<fdismin)
  172. {
  173. fdismin = fdis;
  174. nindexmin = j;
  175. }
  176. }
  177. if(nindexmin>=0)
  178. {
  179. if(fdismin<mfDisThresh)
  180. {
  181. xvectorsa.push_back(xvectorcount_series[i].at(nindexmin));
  182. xvectorcount_series[i].erase(xvectorcount_series[i].begin() + nindexmin);
  183. }
  184. }
  185. }
  186. xvectorcount_same.push_back(xvectorsa);
  187. }
  188. //Select Object
  189. for(i=0;i<static_cast<int>( xvectorcount_same.size());i++)
  190. {
  191. double fprob = ((double)xvectorcount_same[i].size())/((double)nsize);
  192. if(fprob >= mfProb_Thresh)
  193. {
  194. iv::lidar::lidarobject * pobj = xselarray.add_obj();
  195. iv::stats_count sc = xvectorcount_same[i].at(xvectorcount_same[i].size() -1);
  196. pobj->CopyFrom(*mvectorlidarobj_rec[sc.nIndex_vector].xobjarray.mutable_obj(sc.nIndex_obj));
  197. nsel++;
  198. }
  199. }
  200. mmutex.unlock();
  201. return nsel;
  202. }
  203. int lidarbuffer::FilterLidarObj(iv::lidar::objectarray & xobjarray)
  204. {
  205. int nAdd = 0;
  206. iv::lidar::objectarray xlast;
  207. MergeLast(xlast);
  208. iv::lidarobj_rec xrec;
  209. xrec.nTime = xobjarray.timestamp(); //to ms
  210. xrec.xobjarray.CopyFrom(xobjarray);
  211. mmutex.lock();
  212. ChangePos(&xrec);
  213. mmutex.unlock();
  214. iv::lidar::objectarray xobjarraylast;
  215. int i;
  216. for(i=0;i<xlast.obj_size();i++)
  217. {
  218. iv::lidar::lidarobject * pobjlast = xlast.mutable_obj(i);
  219. double fdismin = 1000.0;
  220. int nindexmin = -1;
  221. int j;
  222. for(j=0;j<xrec.xobjarray.obj_size();j++)
  223. {
  224. iv::lidar::lidarobject * pobjnow = xrec.xobjarray.mutable_obj(j);
  225. double fdis = sqrt(pow(pobjlast->mutable_position()->x() - pobjnow->mutable_position()->x(),2)
  226. +pow(pobjlast->mutable_position()->y() - pobjnow->mutable_position()->y(),2));
  227. if(fdis<fdismin)
  228. {
  229. fdismin = fdis;
  230. nindexmin = j;
  231. }
  232. }
  233. if(fdismin< mfDisThresh)
  234. {
  235. //same
  236. }
  237. else
  238. {
  239. iv::lidar::lidarobject * pobj = xobjarraylast.add_obj();
  240. pobj->CopyFrom(*pobjlast);
  241. nAdd++;
  242. }
  243. }
  244. if(nAdd>0)
  245. {
  246. int i;
  247. for(i=0;i<xobjarraylast.obj_size();i++)
  248. {
  249. iv::lidar::lidarobject * pobj = xobjarraylast.mutable_obj(i);
  250. double x_abs = pobj->mutable_position()->x();
  251. double y_abs = pobj->mutable_position()->y();
  252. double x_rel,y_rel;
  253. x_rel = x_abs - xrec.sensor_x;
  254. y_rel = y_abs - xrec.sensor_y;
  255. double fsr = 0 + M_PI/2.0 - xrec.sensor_hdg;
  256. double x_raw = x_rel * cos(fsr) - y_rel * sin(fsr);
  257. double y_raw = x_rel * sin(fsr) + y_rel * cos(fsr);
  258. pobj->mutable_position()->set_x(x_raw);
  259. pobj->mutable_position()->set_y(y_raw);
  260. std::cout<<" add: x:"<<x_raw<<" y: "<<y_raw<<std::endl;
  261. iv::lidar::lidarobject * pnew = xobjarray.add_obj();
  262. pnew->CopyFrom(*pobj);
  263. }
  264. }
  265. return nAdd;
  266. }