vtd_pilot.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370
  1. #include "vtd_pilot.h"
  2. static void CalcXY(const double lat0,const double lon0,
  3. const double lat,const double lon,
  4. double & x,double & y)
  5. {
  6. double x0,y0;
  7. GaussProjCal(lon0,lat0,&x0,&y0);
  8. GaussProjCal(lon,lat,&x,&y);
  9. x = x - x0;
  10. y = y- y0;
  11. }
  12. vtd_pilot::vtd_pilot(std::string strfromvtd,std::string strtovtd)
  13. {
  14. (void)strfromvtd;
  15. ModuleFun funvtd =std::bind(&vtd_pilot::UpdateVTD,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
  16. mpfromvtd = iv::modulecomm::RegisterRecvPlus(strfromvtd.data(),funvtd);
  17. mptovtd = iv::modulecomm::RegisterSend(strtovtd.data(),10000,1) ;
  18. ModuleFun fungpsimu =std::bind(&vtd_pilot::UpdateGPSIMU,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
  19. mpagpsimu = iv::modulecomm::RegisterRecvPlus("hcp2_gpsimu",fungpsimu);
  20. mpaegostate = iv::modulecomm::RegisterSend("egostate",10000,1);
  21. mpafusion = iv::modulecomm::RegisterSend("li_ra_fusion",10000000,1);
  22. mpthread = new std::thread(&vtd_pilot::threadego,this);
  23. mpthreadfusion = new std::thread(&vtd_pilot::threadobject,this);
  24. memset( &sOwnObjectState, 0, sizeof( RDB_OBJECT_STATE_t ) );
  25. }
  26. void vtd_pilot::UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  27. {
  28. (void)index;
  29. (void)dt;
  30. (void)strmemname;
  31. iv::gps::gpsimu xgpsimu;
  32. if(!xgpsimu.ParseFromArray(strdata,nSize))
  33. {
  34. std::cout<<"parse gpsimu fail"<<std::endl;
  35. return;
  36. }
  37. mmutex.lock();
  38. mgpsimu.CopyFrom(xgpsimu);
  39. mbupdate_gps = true;
  40. mmutex.unlock();
  41. mcv.notify_all();
  42. }
  43. void vtd_pilot::ConvertToObjectArray(std::vector<iv::vtd::rdbdata> &xvectorrdbdata, iv::fusion::fusionobjectarray &xfusionarray)
  44. {
  45. int i;
  46. int j;
  47. std::cout<<" obj size: "<<xvectorrdbdata.size()<<std::endl;
  48. for(i=0;i<(int)xvectorrdbdata.size();i++)
  49. {
  50. iv::vtd::rdbdata * prdbdata = &xvectorrdbdata[i];
  51. for(j=0;j<prdbdata->mrdbitem_size();j++)
  52. {
  53. iv::vtd::rdbitem * pitem = prdbdata->mutable_mrdbitem(j);
  54. if(pitem->pkgid() == RDB_PKG_ID_OBJECT_STATE)
  55. {
  56. RDB_OBJECT_STATE_t xobj;
  57. // std::cout<<" structure RDB_OBJECT_STATE_t size: "<<sizeof(xobj)<<"data size: "<<xrdbitem.mnpkgdatasize<<std::endl;
  58. memcpy(&xobj,pitem->pkgdata().data(),sizeof(RDB_OBJECT_STATE_t));
  59. // std::cout<<"id:"<<xobj.base.id<<" name:"<<xobj.base.name<< " pos : x "<<xobj.base.pos.x<<" y "<<xobj.base.pos.y<<" z "<<xobj.base.pos.z<<std::endl;
  60. if(xobj.base.id == 1)
  61. {
  62. mfX = xobj.base.pos.x;
  63. mfY = xobj.base.pos.y;
  64. mfHeading = xobj.base.pos.h;
  65. }
  66. else
  67. {
  68. iv::fusion::fusionobject * pobject = NULL;
  69. int k;
  70. for(k=0;k<xfusionarray.obj_size();k++)
  71. {
  72. if(xfusionarray.mutable_obj(k)->id() == xobj.base.id)
  73. {
  74. pobject = xfusionarray.mutable_obj(k);
  75. break;
  76. }
  77. }
  78. if(pobject == NULL)
  79. {
  80. pobject = xfusionarray.add_obj();
  81. }
  82. pobject->set_id(xobj.base.id);
  83. double x,y;
  84. x = xobj.base.pos.x - mfX;
  85. y = (xobj.base.pos.y - mfY)*(1.0);
  86. double relx,rely;
  87. double beta = mfHeading*(-1.0);
  88. relx = x*cos(beta) - y*sin(beta);
  89. rely = x*sin(beta) + y*cos(beta);
  90. double vx,vy;
  91. vx = xobj.ext.speed.x;
  92. vy = xobj.ext.speed.y;
  93. vx = vx - mfvx;
  94. vy = vy - mfvy;
  95. double relvx,relvy;
  96. relvx = vx*cos(beta) - vy*sin(beta);
  97. relvy = vx*sin(beta) + vy*sin(beta);
  98. double fobjheading = xobj.base.pos.h;
  99. fobjheading = fobjheading - mfHeading;
  100. pobject->set_lifetime(100);
  101. pobject->set_prob(1.0);
  102. pobject->set_sensor_type(1);
  103. pobject->set_yaw(fobjheading);
  104. iv::fusion::PointXYZ * ppointxyz = new iv::fusion::PointXYZ;
  105. ppointxyz->set_x(rely*(-1.0));
  106. ppointxyz->set_y(relx);
  107. ppointxyz->set_z(0);
  108. iv::fusion::Dimension * pdim = new iv::fusion::Dimension;
  109. pdim->set_x(xobj.base.geo.dimX);
  110. pdim->set_y(xobj.base.geo.dimY);
  111. pdim->set_z(xobj.base.geo.dimZ);
  112. pobject->set_allocated_centroid(ppointxyz);
  113. // int m,n;
  114. // for(m=-30;m<30;m++)
  115. // {
  116. // for(n=-30;n<30;n++)
  117. // {
  118. // iv::fusion::NomalXYZ *pnormal = pobject->add_nomal_centroid();
  119. // pnormal->set_nomal_x((rely+m*0.1)*(-1.0));
  120. // pnormal->set_nomal_y(relx+n*0.1);
  121. // }
  122. // }
  123. double dimx,dimy,dimz;
  124. dimx = xobj.base.geo.dimX;
  125. dimy = xobj.base.geo.dimY;
  126. dimz = xobj.base.geo.dimZ;
  127. // std::cout<<" dimx: "<<dimx<<" dimy: "<<dimy<<std::endl;
  128. double xoff,yoff;
  129. std::cout<<" obj hedad: "<<xobj.base.pos.h<<" our head: "<<mfHeading<<" rel heading: "<<fobjheading<<std::endl;
  130. for(xoff = (dimx*(-0.5));xoff<=(dimx*0.5);xoff=xoff+0.2)
  131. {
  132. for(yoff = (dimy*(-0.5));yoff<=(dimy*0.5);yoff = yoff+0.2)
  133. {
  134. double reloffx,reloffy;
  135. if(fabs(fobjheading) < 0.1)
  136. {
  137. for(int m=0;m<1000;m++)
  138. std::cout<<" hello;"<<std::endl;
  139. }
  140. // fobjheading = 0;
  141. // std::cout<<"xoff: "<<xoff<<" yoff: "<<yoff<<std::endl;
  142. reloffx = xoff*cos(fobjheading) - yoff*sin(fobjheading) + relx;
  143. reloffy = xoff*sin(fobjheading) + yoff*cos(fobjheading) + rely;
  144. iv::fusion::NomalXYZ *pnormal = pobject->add_nomal_centroid();
  145. pnormal->set_nomal_x((reloffy)*(-1.0));
  146. pnormal->set_nomal_y(reloffx);
  147. }
  148. }
  149. pobject->set_allocated_dimensions(pdim);
  150. pobject->set_velocity_linear_x(sqrt(pow(relvx,2)+pow(relvy,2)));
  151. // std::cout<<" x: "<<relx<<" y: "<<rely<<std::endl;
  152. }
  153. }
  154. }
  155. }
  156. }
  157. void vtd_pilot::threadobject()
  158. {
  159. std::vector<iv::vtd::rdbdata> xvectorrdbdata;
  160. int64_t nlastsharetime = std::chrono::system_clock::now().time_since_epoch().count();
  161. // int nmaxobjid = 2;
  162. int nshareinter = 20; //100 ms share a data.
  163. bool bshare = false;
  164. while(mbRun)
  165. {
  166. int64_t now = std::chrono::system_clock::now().time_since_epoch().count();
  167. int64_t timediff = abs(now-nlastsharetime)/1000000;
  168. if(timediff >= nshareinter)
  169. {
  170. bshare = true;
  171. }
  172. if(bshare)
  173. {
  174. iv::fusion::fusionobjectarray xfusionarray;
  175. ConvertToObjectArray(xvectorrdbdata,xfusionarray);
  176. if(xfusionarray.obj_size()>=1)
  177. {
  178. std::cout<<" now : "<<now/1000000<<std::endl;
  179. int nbytesize = xfusionarray.ByteSize();
  180. std::shared_ptr<char> pstr_ptr = std::shared_ptr<char>(new char[nbytesize]);
  181. if(xfusionarray.SerializeToArray(pstr_ptr.get(),nbytesize))
  182. {
  183. iv::modulecomm::ModuleSendMsg(mpafusion,pstr_ptr.get(),nbytesize);
  184. }
  185. }
  186. else
  187. {
  188. std::cout<<"no object. "<<std::endl;
  189. }
  190. //share object data.
  191. bshare = false;
  192. nlastsharetime = now;
  193. xvectorrdbdata.clear();
  194. }
  195. std::unique_lock<std::mutex> lk(mmutexcvrdb);
  196. if(mcvrdb.wait_for(lk,std::chrono::milliseconds(10)) == std::cv_status::timeout)
  197. {
  198. lk.unlock();
  199. continue;
  200. }
  201. else
  202. {
  203. lk.unlock();
  204. }
  205. mmutexrdb.lock();
  206. int i;
  207. for(i=0;i<(int)mvectorrdbdata.size();i++)
  208. {
  209. xvectorrdbdata.push_back(mvectorrdbdata[i]);
  210. }
  211. mvectorrdbdata.clear();
  212. mmutexrdb.unlock();
  213. }
  214. }
  215. void vtd_pilot::UpdateVTD(const char *strdata, const unsigned int nSize, const unsigned int index, const QDateTime *dt, const char *strmemname)
  216. {
  217. (void)index;
  218. (void)dt;
  219. (void)strmemname;
  220. iv::vtd::rdbdata xrdbdata;
  221. if(xrdbdata.ParseFromArray(strdata,nSize))
  222. {
  223. mmutexrdb.lock();
  224. mvectorrdbdata.push_back(xrdbdata);
  225. mmutexrdb.unlock();
  226. mcvrdb.notify_all();
  227. // std::cout<<"notify"<<std::endl;
  228. // if(xrdbdata.mrdbitem_size()>0)
  229. // {
  230. // iv::vtd::rdbitem * pitem = xrdbdata.mutable_mrdbitem(0);
  231. // msimFrame = pitem->simframe();
  232. // msimTime = pitem->simtime();
  233. // if(pitem->pkgid() == RDB_PKG_ID_OBJECT_STATE)
  234. // {
  235. // }
  236. // }
  237. }
  238. }
  239. void vtd_pilot::setOwnState(double x, double y, double z,double vx,double vy,double fheading)
  240. {
  241. sOwnObjectState.base.id = 1;
  242. sOwnObjectState.base.category = RDB_OBJECT_CATEGORY_PLAYER;
  243. sOwnObjectState.base.type = RDB_OBJECT_TYPE_PLAYER_CAR;
  244. strcpy( sOwnObjectState.base.name, "Ego" );
  245. // dimensions of own vehicle
  246. sOwnObjectState.base.geo.dimX = 4.60 ;//* dimFactor;
  247. sOwnObjectState.base.geo.dimY = 1.86 ;//* dimFactor;
  248. sOwnObjectState.base.geo.dimZ = 1.60 ;//* dimFactor;
  249. // offset between reference point and center of geometry
  250. sOwnObjectState.base.geo.offX = 0.0;//0.80;
  251. sOwnObjectState.base.geo.offY = 0.00;
  252. sOwnObjectState.base.geo.offZ = 0.0;//0.30;
  253. sOwnObjectState.base.pos.x = x;
  254. sOwnObjectState.base.pos.y = y;
  255. sOwnObjectState.base.pos.z = z;
  256. sOwnObjectState.base.pos.h = fheading;
  257. sOwnObjectState.base.pos.p = 0.0;
  258. sOwnObjectState.base.pos.r = 0.0;
  259. sOwnObjectState.base.pos.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
  260. sOwnObjectState.ext.speed.x = vx;
  261. sOwnObjectState.ext.speed.y = vy;
  262. sOwnObjectState.ext.speed.z = 0;
  263. sOwnObjectState.ext.speed.h = 0.0;
  264. sOwnObjectState.ext.speed.p = 0.0;
  265. sOwnObjectState.ext.speed.r = 0.0;
  266. sOwnObjectState.ext.speed.flags = RDB_COORD_FLAG_POINT_VALID | RDB_COORD_FLAG_ANGLES_VALID;
  267. sOwnObjectState.ext.accel.x = 0.0;
  268. sOwnObjectState.ext.accel.y = 0.0;
  269. sOwnObjectState.ext.accel.z = 0.0;
  270. sOwnObjectState.ext.accel.flags = RDB_COORD_FLAG_POINT_VALID;
  271. sOwnObjectState.base.visMask = RDB_OBJECT_VIS_FLAG_TRAFFIC | RDB_OBJECT_VIS_FLAG_RECORDER;
  272. }
  273. void vtd_pilot::threadego()
  274. {
  275. while(mbRun)
  276. {
  277. if(mbupdate_gps == false)
  278. {
  279. std::unique_lock<std::mutex> lk(mmutexcv);
  280. if(mcv.wait_for(lk,std::chrono::milliseconds(100)) == std::cv_status::timeout)
  281. {
  282. lk.unlock();
  283. continue;
  284. }
  285. else
  286. {
  287. lk.unlock();
  288. continue;
  289. }
  290. }
  291. iv::gps::gpsimu xgpsimu;
  292. mmutex.lock();
  293. xgpsimu.CopyFrom(mgpsimu);
  294. mbupdate_gps = false;
  295. mmutex.unlock();
  296. double x,y,z;
  297. CalcXY(mflat0,mflon0,xgpsimu.lat(),xgpsimu.lon(),x,y);
  298. double vx = xgpsimu.ve();
  299. double vy = xgpsimu.vn();
  300. z = 0;
  301. double fheading = (90 - xgpsimu.heading())*M_PI/180.0;
  302. setOwnState(x,y,z,vx,vy,fheading);
  303. mfX = x;
  304. mfY = y;
  305. mfHeading = fheading;
  306. mfvx = vx;
  307. mfvy = vy;
  308. // RDB_OBJECT_STATE_t * pr = &sOwnObjectState;
  309. iv::modulecomm::ModuleSendMsg(mpaegostate,(char *)&sOwnObjectState,sizeof(RDB_OBJECT_STATE_t));
  310. //convert to x,y,z
  311. //send data.
  312. }
  313. }