main.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #include <QCoreApplication>
  2. #include <QDateTime>
  3. #include <iostream>
  4. #include "modulecomm.h"
  5. #include "radarobjectarray.pb.h"
  6. #include "objectarray.pb.h"
  7. #include "fusionobjectarray.pb.h"
  8. #include "fusionobject.pb.h"
  9. #include "gpsimu.pb.h"
  10. #include "lidarbuffer.h"
  11. #include "xmlparam.h"
  12. #include <QThread>
  13. #include <QString>
  14. #include <QMutex>
  15. #include "eigen3/Eigen/Dense"
  16. //#include "data_manager.h"
  17. #include "fusion.hpp"
  18. #include "Tracking.hpp"
  19. #include "transformation.h"
  20. #include "mobileye.pb.h"
  21. using namespace iv;
  22. using namespace fusion;
  23. void *gfu = iv::modulecomm::RegisterSend("li_ra_fusion",10000000,1);
  24. static QMutex gMutex;
  25. typedef iv::radar::radarobjectarray RadarDataType;
  26. typedef iv::lidar::objectarray LidarDataType;
  27. typedef std::chrono::system_clock::time_point TimeType;
  28. iv::radar::radarobjectarray radarobjvec;
  29. iv::lidar::objectarray lidar_obj;
  30. iv::mobileye::mobileye mobileye_info;
  31. iv::mobileye::obs obs_info;
  32. iv::mobileye::lane lane_info;
  33. iv::mobileye::tsr tsr_info;
  34. QTime gTime;
  35. using namespace std;
  36. int gntemp = 0;
  37. iv::fusion::fusionobjectarray li_ra_fusion;
  38. void datafusion(iv::lidar::objectarray& lidar_obj,iv::radar::radarobjectarray& radarobjvec, iv::fusion::fusionobjectarray& li_ra_fusion);
  39. TrackerSettings settings;
  40. CTracker tracker(settings);
  41. bool m_isTrackerInitialized = false;
  42. static bool gbUseLastLidar = false;
  43. static lidarbuffer * gplidarbuffer;
  44. void Listenesrfront(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  45. {
  46. iv::radar::radarobjectarray radarobj;
  47. if(nSize<1)return;
  48. if(false == radarobj.ParseFromArray(strdata,nSize))
  49. {
  50. std::cout<<" Listenesrfront fail."<<std::endl;
  51. return;
  52. }
  53. else{
  54. //std::<<"srfront byte size: "<<radarobjvec.ByteSize()<<std::endl;
  55. }
  56. // std::cout<<"radar is ok : "<<radarobj.obj_size()<<std::endl;
  57. gMutex.lock();
  58. // for(int i=0;i<radarobj.obj_size();i++)
  59. // {
  60. // if(abs(radarobj.obj(i).x())<2 && abs(radarobj.obj(i).vy()) >10)
  61. // {
  62. // std::cout<<"x y vx vy "<<radarobj.obj(i).x()<<" "
  63. // <<radarobj.obj(i).y()<<" "
  64. // <<radarobj.obj(i).vx()<<" "
  65. // <<radarobj.obj(i).vy()<<" "<<std::endl;
  66. // }
  67. // }
  68. //std::cout<<"radar size:"<<nSize<<std::endl;
  69. radarobjvec.CopyFrom(radarobj);
  70. gMutex.unlock();
  71. }
  72. void Listenlidarcnndetect(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  73. {
  74. iv::lidar::objectarray lidarobj;
  75. if(nSize<1)return;
  76. if(false == lidarobj.ParseFromArray(strdata,nSize))
  77. {
  78. std::cout<<"PecerptionShow Listenesrfront fail."<<std::endl;
  79. return;
  80. }
  81. // static int a = 0;
  82. // if(a != 0)
  83. // {
  84. // lidarobj.clear_obj();
  85. // }
  86. // a++;
  87. // if(a == 2)a = 0;
  88. std::cout<<" before obj size: "<<lidarobj.obj_size()<<std::endl;
  89. if(gbUseLastLidar)
  90. {
  91. iv::lidar::objectarray lidarobjraw;
  92. lidarobjraw.CopyFrom(lidarobj);
  93. gplidarbuffer->FilterLidarObj(lidarobj);
  94. gplidarbuffer->AddLidarObj(lidarobjraw);
  95. }
  96. std::cout<<" after obj size: "<<lidarobj.obj_size()<<std::endl;
  97. // std::cout<<" lidar is ok "<<lidarobj.obj_size()<<std::endl;
  98. gMutex.lock();
  99. // std::cout<<" obj size "<<lidarobj.obj_size()<<std::endl;
  100. for(int i = 0; i < lidarobj.obj_size();i++) {
  101. if(abs(lidarobj.obj(i).centroid().x())<4){
  102. std::cout<<lidarobj.obj(i).velocity_linear_x()<<std::endl;
  103. }
  104. }
  105. datafusion(lidarobj,radarobjvec,li_ra_fusion);
  106. gMutex.unlock();
  107. }
  108. void Listenmobileye(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  109. {
  110. iv::mobileye::mobileye mobileye;
  111. if(nSize<1)return;
  112. if(false == mobileye.ParseFromArray(strdata,nSize))
  113. {
  114. std::cout<<"PecerptionShow Listenesrfront fail."<<std::endl;
  115. return;
  116. }
  117. // std::cout<< " obj size "<<mobileye.xobj_size()<<std::endl;
  118. // for (int m_index = 0; m_index< mobileye.xobj_size(); m_index++)
  119. // {
  120. // std::cout<<" p_x p_y v_x v_y "<<mobileye.xobj(m_index).pos_y()<< " "<<mobileye.xobj(m_index).pos_x()
  121. // <<" "<<mobileye.xobj(m_index).obs_rel_vel_x() * tan(mobileye.xobj(m_index).obsang())
  122. // <<" "<<mobileye.xobj(m_index).obs_rel_vel_x()<<" \n"
  123. // << mobileye.xobj(m_index).obsang()<<std::endl;
  124. // }
  125. gMutex.lock();
  126. mobileye_info.CopyFrom(mobileye);
  127. gMutex.unlock();
  128. }
  129. int ccccc =0;
  130. void datafusion(iv::lidar::objectarray& lidar_obj,iv::radar::radarobjectarray& radarobjvec, iv::fusion::fusionobjectarray& li_ra_fusion)
  131. {
  132. // gMutex.lock();
  133. // Transformation::RadarPross(radarobjvec);
  134. RLfusion(lidar_obj,radarobjvec,li_ra_fusion);
  135. // li_ra_fusion.Clear();
  136. // std::cout<<" RLFusion begin "<<std::endl;
  137. // AddMobileye(li_ra_fusion,mobileye_info);
  138. // std::cout<<" RLFusion end "<<std::endl;
  139. // mobileye_info.clear_xobj();
  140. // std::cout<< " fusion size "<<li_ra_fusion.obj_size()<<std::endl;
  141. // for(int i=0;i<li_ra_fusion.obj_size();i++)
  142. // {
  143. // if(abs(li_ra_fusion.obj(i).vel_relative().y())>10 )
  144. // {
  145. // std::cout<<"x y vx vy w "<<li_ra_fusion.-obj(i).centroid().x()<<" "
  146. // <<li_ra_fusion.obj(i).centroid().y()<<" "
  147. // <<li_ra_fusion.obj(i).vel_relative().x()<<" "
  148. // <<li_ra_fusion.obj(i).vel_relative().y()<<" "
  149. // <<li_ra_fusion.obj(i).dimensions().x()<<std::endl;
  150. // }
  151. // }
  152. // int nsize =0;
  153. // for(int nradar = 0; nradar<radarobjvec.obj_size(); nradar++)
  154. // {
  155. // if(radarobjvec.obj(nradar).bvalid() == false) continue;
  156. // if(sqrt(abs(radarobjvec.obj(nradar).x()))< 4 && radarobjvec.obj(nradar).y()< 20 ) nsize = nsize +1;
  157. // }
  158. // std::cout<<" fusion_obj_size radar_obj_size : "<<li_ra_fusion.obj_size()<<" "<<nsize<<std::endl;
  159. // gMutex.lock();
  160. // std::cout<<" track begin"<<std::endl;
  161. //--------------------------------------------- init tracker -------------------------------------------------
  162. // if (!m_isTrackerInitialized)
  163. // {
  164. // m_isTrackerInitialized = InitTracker(tracker);
  165. // if (!m_isTrackerInitialized)
  166. // {
  167. // std::cerr << "Tracker initialize error!!!" << std::endl;
  168. // }
  169. // }
  170. // iv::fusion::fusionobjectarray trackedobjvec = Tracking(li_ra_fusion, tracker);
  171. // std::<<"track end"<<std::endl;
  172. //-------------------------------------------- end tracking --------------------------------------------------
  173. // gMutex.unlock();
  174. iv::fusion::fusionobjectarray out_fusion = li_ra_fusion;
  175. ObsToNormal(out_fusion);
  176. string out;
  177. if(out_fusion.obj_size() == 0)
  178. {
  179. // std::cout<<" fake obj"<<std::endl;
  180. iv::fusion::fusionobject fake_obj;
  181. iv::fusion::fusionobject *fake_obj_;
  182. iv::fusion::PointXYZ fake_cen;
  183. iv::fusion::PointXYZ *fake_cen_;
  184. fake_cen.set_x(10000);
  185. fake_cen.set_y(10000);
  186. fake_cen.set_z(10000);
  187. fake_cen_ = fake_obj.mutable_centroid();
  188. fake_cen_ ->CopyFrom(fake_cen);
  189. fake_obj_ = out_fusion.add_obj();
  190. fake_obj_->CopyFrom(fake_obj);
  191. out = out_fusion.SerializeAsString();
  192. }else
  193. {
  194. out = out_fusion.SerializeAsString();
  195. // for (int k = 0; k<trackedobjvec.obj_size();k++){
  196. // std::cout<<" size x y vy : "<<trackedobjvec.obj_size()<<" "
  197. // <<trackedobjvec.obj(k).centroid().x()<< " "<<trackedobjvec.obj(k).centroid().y()<<" "
  198. // <<trackedobjvec.obj(k).vel_relative().y()<<" "<<trackedobjvec.obj(k).nomal_centroid_size() <<std::endl;
  199. // }
  200. }
  201. iv::modulecomm::ModuleSendMsg(gfu,out.data(),out.length());
  202. // gMutex.unlock();
  203. }
  204. void ListenGPS(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  205. {
  206. (void)index;
  207. (void)dt;
  208. (void)strmemname;
  209. iv::gps::gpsimu xgpsimu;
  210. if(!xgpsimu.ParseFromArray(strdata,nSize))
  211. {
  212. std::cout<<"ListenGPS Parse error."<<std::endl;
  213. return;
  214. }
  215. if(gbUseLastLidar)
  216. {
  217. gplidarbuffer->AddGPS(xgpsimu);
  218. }
  219. }
  220. int main(int argc, char *argv[])
  221. {
  222. QCoreApplication a(argc, argv);
  223. QString strpath = QCoreApplication::applicationDirPath();
  224. if(argc < 2)
  225. strpath = strpath + "/lidar_radar_fusion_cnn.xml";
  226. else
  227. strpath = argv[1];
  228. std::cout<<strpath.toStdString()<<std::endl;
  229. tracker.setSettings(settings);
  230. iv::xmlparam::Xmlparam xparam(strpath.toStdString());
  231. std::string strgpsmsgname = xparam.GetParam("gpsmsg","hcp2_gpsimu");
  232. std::string struselast = xparam.GetParam("uselast","false");
  233. std::string strlooktime = xparam.GetParam("LookTime","3000"); //3000ms
  234. std::string strlookprob = xparam.GetParam("LookProb","0.3");
  235. std::string strlidaroffx = xparam.GetParam("LidarOffX","0.0");
  236. std::string strlidaroffy = xparam.GetParam("LidarOffY","0.0");
  237. std::string strdisthresh = xparam.GetParam("disthresh","1.0");
  238. if(struselast == "true")
  239. {
  240. gbUseLastLidar = true;
  241. gplidarbuffer = new lidarbuffer(atoi(strlooktime.data()),atof(strlookprob.data()),
  242. atof(strlidaroffx.data()),atof(strlidaroffy.data()),atof(strdisthresh.data()));
  243. }
  244. else
  245. {
  246. gbUseLastLidar = false;
  247. }
  248. void * pa = iv::modulecomm::RegisterRecv(strgpsmsgname.data(),ListenGPS);
  249. void *gpa;
  250. gpa = iv::modulecomm::RegisterRecv("radar_front",Listenesrfront);
  251. gpa = iv::modulecomm::RegisterRecv("lidar_track",Listenlidarcnndetect);
  252. gpa = iv::modulecomm::RegisterRecv("mobileye",Listenmobileye);
  253. return a.exec();
  254. }