main.cpp 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313
  1. #include <QCoreApplication>
  2. #include <math.h>
  3. #include <string>
  4. #include <thread>
  5. #include <QFile>
  6. #include "OpenDrive/OpenDrive.h"
  7. #include "OpenDrive/OpenDriveXmlParser.h"
  8. #include "globalplan.h"
  9. #include "gpsimu.pb.h"
  10. #include "mapdata.pb.h"
  11. #include "mapglobal.pb.h"
  12. #include "v2x.pb.h"
  13. #include "modulecomm.h"
  14. #include "xmlparam.h"
  15. #include "gps_type.h"
  16. #include "xodrdijkstra.h"
  17. #include "gnss_coordinate_convert.h"
  18. #include "ivexit.h"
  19. #include "ivversion.h"
  20. #include "ivbacktrace.h"
  21. #include <signal.h>
  22. #include "service_roi_xodr.h"
  23. #include "ivservice.h"
  24. OpenDrive mxodr;
  25. xodrdijkstra * gpxd;
  26. bool gmapload = false;
  27. double glat0,glon0,ghead0;
  28. double gvehiclewidth = 2.0;
  29. bool gbExtendMap = true;
  30. static bool gbSideEnable = false;
  31. static bool gbSideLaneEnable = false;
  32. static void * gpa;
  33. static void * gpasrc;
  34. static void * gpmap;
  35. static void * gpagps;
  36. static void * gpasimple;
  37. static void * gpav2x;
  38. static void * gpanewtrace;
  39. static void * gpamapglobal;
  40. iv::Ivfault *gfault = nullptr;
  41. iv::Ivlog *givlog = nullptr;
  42. static QCoreApplication * gApp;
  43. service_roi_xodr gsrx;
  44. namespace iv {
  45. struct simpletrace
  46. {
  47. double gps_lat = 0;//纬度
  48. double gps_lng = 0;//经度
  49. double gps_x = 0;
  50. double gps_y = 0;
  51. double gps_z = 0;
  52. double ins_heading_angle = 0; //航向角
  53. };
  54. }
  55. /**
  56. *
  57. *
  58. *
  59. *
  60. * */
  61. bool LoadXODR(std::string strpath)
  62. {
  63. OpenDriveXmlParser xp(&mxodr);
  64. xp.ReadFile(strpath);
  65. std::cout<<"road cout is "<<mxodr.GetRoadCount()<<std::endl;
  66. if(mxodr.GetRoadCount() < 1)
  67. {
  68. gmapload = true;
  69. return false;
  70. }
  71. xodrdijkstra * pxd = new xodrdijkstra(&mxodr);
  72. gpxd = pxd;
  73. // std::vector<int> xpath = pxd->getpath(10001,2,30012,2);
  74. // pxd->getgpspoint(10001,2,30012,2,xpath);
  75. int i;
  76. double nlenth = 0;
  77. int nroadsize = mxodr.GetRoadCount();
  78. for(i=0;i<nroadsize;i++)
  79. {
  80. Road * px = mxodr.GetRoad(i);
  81. nlenth = nlenth + px->GetRoadLength();
  82. int bloksize = px->GetGeometryBlockCount();
  83. if(px->GetGeometryBlock(0)->GetGeometryAt(0)->GetGeomType() == 4)
  84. {
  85. GeometryParamPoly3 * p = (GeometryParamPoly3 *) px->GetGeometryBlock(0)->GetGeometryAt(0);
  86. double a = p->GetuA();
  87. a = p->GetuB();
  88. a = p->GetuC();
  89. a = p->GetuD();
  90. a = p->GetvA();
  91. }
  92. }
  93. // void Header::GetAllParams(unsigned short int &revMajor, unsigned short int &revMinor, string &name, float &version, string &date,
  94. // double &north, double &south, double &east,double &west,double &lat0,double &lon0, double & hdg0)
  95. unsigned short int revMajor,revMinor;
  96. std::string name,date;
  97. float version;
  98. double north,south,east,west,lat0,lon0,hdg0;
  99. if(mxodr.GetHeader() != 0)
  100. {
  101. mxodr.GetHeader()->GetAllParams(revMajor,revMinor,name,version,date,north,south,east,west,lat0,lon0,hdg0);
  102. glat0 = lat0;
  103. glon0 = lon0;
  104. }
  105. Road * proad1 = mxodr.GetRoad(0);
  106. givlog->info("road name is %s",proad1->GetRoadName().data());
  107. std::cout<<" road name is "<<proad1->GetRoadName()<<std::endl;
  108. gsrx.SetXODR(&mxodr);
  109. }
  110. class roadx
  111. {
  112. public:
  113. roadx * para;
  114. std::vector<roadx> child;
  115. int nlen;
  116. };
  117. #define EARTH_RADIUS 6370856.0
  118. //从1到2的距离和方向
  119. int CalcDisAngle(double lat1,double lon1,double lat2,double lon2,double * pLatDis,double * pLonDis,double * pDis,double * pangle)
  120. {
  121. double a,b;
  122. double LonDis,LatDis;
  123. double LonRadius;
  124. double Dis;
  125. double angle;
  126. if((lat1 == lat2)&&(lon1 == lon2))return -1;
  127. LonRadius = EARTH_RADIUS * cos(lat2/(180.0/M_PI));
  128. a = (EARTH_RADIUS * M_PI*2.0/360.0)/(100000.0);
  129. b = lat2 - lat1; b = b*100000.0;
  130. LatDis = a*b;
  131. a = (LonRadius * M_PI*2.0/360.0)/100000.0;
  132. b = lon2 - lon1; b = b*100000.0;
  133. LonDis = a*b;
  134. Dis = sqrt(LatDis*LatDis + LonDis *LonDis);
  135. angle = acos(fabs(LonDis)/Dis);
  136. angle = angle * 180.0/M_PI;
  137. if(LonDis > 0)
  138. {
  139. if(LatDis > 0)angle = 90.0 - angle;
  140. else angle= 90.0+angle;
  141. }
  142. else
  143. {
  144. if(LatDis > 0)angle = 270.0+angle;
  145. else angle = 270.0-angle;
  146. }
  147. if(pLatDis != 0)*pLatDis = LatDis;
  148. if(pLonDis != 0)*pLonDis = LonDis;
  149. if(pDis != 0)*pDis = Dis;
  150. if(pangle != 0)*pangle = angle;
  151. }
  152. //==========================================================
  153. //高斯投影由经纬度(Unit:DD)反算大地坐标(含带号,Unit:Metres)
  154. //void GaussProjCal(double longitude, double latitude, double *X, double *Y)
  155. //{
  156. // int ProjNo = 0; int ZoneWide; ////带宽
  157. // double longitude1, latitude1, longitude0, latitude0, X0, Y0, xval, yval;
  158. // double a, f, e2, ee, NN, T, C, A, M, iPI;
  159. // iPI = 0.0174532925199433; ////3.1415926535898/180.0;
  160. // ZoneWide = 6; ////6度带宽
  161. // a = 6378245.0; f = 1.0 / 298.3; //54年北京坐标系参数
  162. // ////a=6378140.0; f=1/298.257; //80年西安坐标系参数
  163. // ProjNo = (int)(longitude / ZoneWide);
  164. // longitude0 = ProjNo * ZoneWide + ZoneWide / 2;
  165. // longitude0 = longitude0 * iPI;
  166. // latitude0 = 0;
  167. // longitude1 = longitude * iPI; //经度转换为弧度
  168. // latitude1 = latitude * iPI; //纬度转换为弧度
  169. // e2 = 2 * f - f * f;
  170. // ee = e2 * (1.0 - e2);
  171. // NN = a / sqrt(1.0 - e2 * sin(latitude1)*sin(latitude1));
  172. // T = tan(latitude1)*tan(latitude1);
  173. // C = ee * cos(latitude1)*cos(latitude1);
  174. // A = (longitude1 - longitude0)*cos(latitude1);
  175. // M = a * ((1 - e2 / 4 - 3 * e2*e2 / 64 - 5 * e2*e2*e2 / 256)*latitude1 - (3 * e2 / 8 + 3 * e2*e2 / 32 + 45 * e2*e2
  176. // *e2 / 1024)*sin(2 * latitude1)
  177. // + (15 * e2*e2 / 256 + 45 * e2*e2*e2 / 1024)*sin(4 * latitude1) - (35 * e2*e2*e2 / 3072)*sin(6 * latitude1));
  178. // xval = NN * (A + (1 - T + C)*A*A*A / 6 + (5 - 18 * T + T * T + 72 * C - 58 * ee)*A*A*A*A*A / 120);
  179. // yval = M + NN * tan(latitude1)*(A*A / 2 + (5 - T + 9 * C + 4 * C*C)*A*A*A*A / 24
  180. // + (61 - 58 * T + T * T + 600 * C - 330 * ee)*A*A*A*A*A*A / 720);
  181. // X0 = 1000000L * (ProjNo + 1) + 500000L;
  182. // Y0 = 0;
  183. // xval = xval + X0; yval = yval + Y0;
  184. // *X = xval;
  185. // *Y = yval;
  186. //}
  187. #include <math.h>
  188. static void OffLngLat(double fLat0,double fLng0,double & fLat,double & fLng,double fHeading,double x,double y)
  189. {
  190. double fxdiff,fydiff;
  191. double xoff = y*(-1);
  192. double yoff = x;
  193. fxdiff = 0+xoff * cos(fHeading*M_PI/180.0)+ yoff*sin(fHeading*M_PI/180.0); //East
  194. fydiff = 0-xoff * sin(fHeading*M_PI/180.0)+ yoff*cos(fHeading*M_PI/180.0); //South
  195. double fEarthRadius = 6378245.0;
  196. double ns1d = fEarthRadius*2*M_PI/360.0;
  197. double fewRadius = fEarthRadius * cos(fLat0*M_PI/180.0);
  198. double ew1d = fewRadius * 2*M_PI/360.0;
  199. fLat = fLat0 + fydiff/ns1d;
  200. fLng = fLng0 + fxdiff/ew1d;
  201. }
  202. void CalcXY(const double lat0,const double lon0,const double hdg0,
  203. const double lat,const double lon,
  204. double & x,double & y)
  205. {
  206. double x0,y0;
  207. GaussProjCal(lon0,lat0,&x0,&y0);
  208. GaussProjCal(lon,lat,&x,&y);
  209. x = x - x0;
  210. y = y- y0;
  211. // double ang,dis;
  212. // CalcDisAngle(lat0,lon0,lat,lon,0,0,&dis,&ang);
  213. // double xang = hdg0 - ang;
  214. // while(xang<0)xang = xang + 360.0;
  215. // x = dis * cos(xang * M_PI/180.0);
  216. // y = dis * sin(xang * M_PI/180.0);
  217. }
  218. //void CalcLatLon(const double lat0,const double lon0,const double hdg0,
  219. // const double x,const double y,const double xyhdg,
  220. // double &lat,double & lon, double & hdg)
  221. //{
  222. // OffLngLat(lat0,lon0,lat,lon,hdg0,x,y);
  223. // hdg = hdg0 - xyhdg * 180.0/M_PI;
  224. // while(hdg < 0)hdg = hdg + 360;
  225. // while(hdg >= 360)hdg = hdg - 360;
  226. //}
  227. void CalcLatLon(const double lat0,const double lon0,
  228. const double x,const double y,
  229. double &lat,double & lon)
  230. {
  231. double x0,y0;
  232. GaussProjCal(lon0,lat0,&x0,&y0);
  233. double x_gps,y_gps;
  234. x_gps = x0+x;
  235. y_gps = y0+y;
  236. GaussProjInvCal(x_gps,y_gps,&lon,&lat);
  237. }
  238. void CalcLatLon(const double lat0,const double lon0,const double hdg0,
  239. const double x,const double y,const double xyhdg,
  240. double &lat,double & lon, double & hdg)
  241. {
  242. double x0,y0;
  243. GaussProjCal(lon0,lat0,&x0,&y0);
  244. double x_gps,y_gps;
  245. x_gps = x0+x;
  246. y_gps = y0+y;
  247. GaussProjInvCal(x_gps,y_gps,&lon,&lat);
  248. // hdg = hdg0 -xyhdg * 270/M_PI;
  249. hdg = 90 - xyhdg* 180.0/M_PI;
  250. // OffLngLat(lat0,lon0,lat,lon,hdg0,x,y);
  251. // hdg = hdg0 - xyhdg * 180.0/M_PI;
  252. while(hdg < 0)hdg = hdg + 360;
  253. while(hdg >= 360)hdg = hdg - 360;
  254. }
  255. class xodrobj
  256. {
  257. public:
  258. double flatsrc;
  259. double flonsrc;
  260. double fhgdsrc;
  261. double flat;
  262. double flon;
  263. int lane;
  264. };
  265. static xodrobj gsrc;
  266. void ShareMapGlobal(std::vector<PlanPoint> & xvectorPlan)
  267. {
  268. iv::map::mapglobal xglobal;
  269. unsigned int i;
  270. unsigned int nsize = static_cast<unsigned int >(xvectorPlan.size());
  271. for(i=0;i<nsize;i++)
  272. {
  273. iv::map::pointglobal * ppoint = xglobal.add_point();
  274. double gps_lon,gps_lat,gps_heading;
  275. CalcLatLon(glat0,glon0,ghead0,xvectorPlan[i].x,xvectorPlan[i].y,xvectorPlan[i].hdg,gps_lat,
  276. gps_lon,gps_heading);
  277. ppoint->set_gps_lat(gps_lat);
  278. ppoint->set_gps_lng(gps_lon);
  279. ppoint->set_ins_heading_angle(gps_heading);
  280. double gps_x,gps_y;
  281. GaussProjCal(gps_lon,gps_lat,&gps_x,&gps_y);
  282. ppoint->set_gps_x(gps_x);
  283. ppoint->set_gps_y(gps_y);
  284. ppoint->set_gps_z(0);
  285. ppoint->set_mfcurvature(xvectorPlan[i].mfCurvature);
  286. ppoint->set_mfdistolaneleft(xvectorPlan[i].mfDisToLaneLeft);
  287. ppoint->set_mfdistoroadleft(xvectorPlan[i].mfDisToRoadLeft);
  288. ppoint->set_mflanewidth(xvectorPlan[i].mWidth);
  289. ppoint->set_mfroadwidth(xvectorPlan[i].mfRoadWidth);
  290. ppoint->set_speed(xvectorPlan[i].speed);
  291. unsigned int nlanecount = static_cast<unsigned int>(xvectorPlan[i].mVectorLaneWidth.size());
  292. unsigned int j;
  293. for(j=0;j<nlanecount;j++)
  294. {
  295. ppoint->add_mfvectorlanewidth(xvectorPlan[i].mVectorLaneWidth[j]);
  296. }
  297. ppoint->set_mlanecount(xvectorPlan[i].mLaneCount);
  298. ppoint->set_mlanecur(xvectorPlan[i].mLaneCur);
  299. }
  300. int bytesize = static_cast<int>(xglobal.ByteSizeLong()) ;
  301. std::shared_ptr<char> pstr_ptr = std::shared_ptr<char>(new char[bytesize]);
  302. if(xglobal.SerializePartialToArray(pstr_ptr.get(),bytesize))
  303. {
  304. iv::modulecomm::ModuleSendMsg(gpamapglobal,pstr_ptr.get(),static_cast<unsigned int>(bytesize) );
  305. }
  306. else
  307. {
  308. std::cout<<" ShareMapGlobal Serialzie Fail."<<std::endl;
  309. }
  310. }
  311. void ShareMap(std::vector<iv::GPSData> navigation_data)
  312. {
  313. if(navigation_data.size()<1)return;
  314. iv::GPS_INS x;
  315. x = *(navigation_data.at(0));
  316. char * data = new char[sizeof(iv::GPS_INS)*navigation_data.size()];
  317. int gpssize = sizeof(iv::GPS_INS);
  318. int i;
  319. for(i=0;i<navigation_data.size();i++)
  320. {
  321. x = *(navigation_data.at(i));
  322. memcpy(data+i*gpssize,&x,gpssize);
  323. }
  324. iv::modulecomm::ModuleSendMsg(gpmap,data,navigation_data.size()*gpssize);
  325. int nsize = 100;
  326. int nstep = 1;
  327. if(navigation_data.size() < 100)
  328. {
  329. nsize = navigation_data.size();
  330. }
  331. else
  332. {
  333. nstep = navigation_data.size()/100;
  334. }
  335. iv::simpletrace psim[100];
  336. for(i=0;i<nsize;i++)
  337. {
  338. x = *(navigation_data.at(i*nstep));
  339. psim[i].gps_lat = x.gps_lat;
  340. psim[i].gps_lng = x.gps_lng;
  341. psim[i].gps_z = x.gps_z;
  342. psim[i].gps_x = x.gps_x;
  343. psim[i].gps_y = x.gps_y;
  344. psim[i].ins_heading_angle = x.ins_heading_angle;
  345. }
  346. if(navigation_data.size()>100)
  347. {
  348. int nlast = 99;
  349. x = *(navigation_data.at(navigation_data.size()-1));
  350. psim[nlast].gps_lat = x.gps_lat;
  351. psim[nlast].gps_lng = x.gps_lng;
  352. psim[nlast].gps_z = x.gps_z;
  353. psim[nlast].gps_x = x.gps_x;
  354. psim[nlast].gps_y = x.gps_y;
  355. psim[nlast].ins_heading_angle = x.ins_heading_angle;
  356. }
  357. iv::modulecomm::ModuleSendMsg(gpasimple,(char *)psim,nsize * sizeof(iv::simpletrace));
  358. delete data;
  359. }
  360. static void ToGPSTrace(std::vector<PlanPoint> xPlan)
  361. {
  362. // double x_src,y_src,x_dst,y_dst;
  363. // x_src = -26;y_src = 10;
  364. // x_dst = -50;y_dst = -220;
  365. int i;
  366. int nSize = xPlan.size();
  367. std::vector<iv::GPSData> mapdata;
  368. QFile xfile;
  369. QString strpath;
  370. strpath = getenv("HOME");
  371. strpath = strpath + "/map/maptrace.txt";
  372. xfile.setFileName(strpath);
  373. bool bFileOpen = xfile.open(QIODevice::ReadWrite);
  374. for(i=0;i<nSize;i++)
  375. {
  376. iv::GPSData data(new iv::GPS_INS);
  377. CalcLatLon(glat0,glon0,ghead0,xPlan[i].x,xPlan[i].y,xPlan[i].hdg,data->gps_lat,
  378. data->gps_lng,data->ins_heading_angle);
  379. data->index = i;
  380. data->speed = xPlan[i].speed;
  381. GaussProjCal(data->gps_lng,data->gps_lat,&data->gps_x,&data->gps_y);
  382. givlog->debug(" %d %11.7f %11.7f %11.3f ",i,data->gps_lat,
  383. data->gps_lng,data->ins_heading_angle);
  384. data->roadSum = xPlan[i].mnLaneTotal;
  385. data->roadMode = 0;
  386. data->roadOri = xPlan[i].mnLaneori;
  387. data->mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft;
  388. data->mfDisToRoadLeft = xPlan[i].mfDisToRoadLeft;
  389. data->mfLaneWidth = xPlan[i].mWidth;
  390. data->mfRoadWidth = xPlan[i].mfRoadWidth;
  391. data->mnLaneChangeMark = xPlan[i].lanmp;
  392. if(xPlan[i].lanmp == -1)data->roadMode = 15;
  393. if(xPlan[i].lanmp == 1)data->roadMode = 14;
  394. mapdata.push_back(data);
  395. char strline[255];
  396. snprintf(strline,255,"%d\t%11.7f\t%11.7f\t%d\t%d\t%11.3f\t%d\t%d\t%d\t%d\n",
  397. i,data->gps_lng,data->gps_lat,0,0,data->ins_heading_angle,0,0,0,0);
  398. if(bFileOpen) xfile.write(strline);
  399. // fout << gps_index << "\t" << data->gps_lng << "\t" << data->gps_lat << "\t" << ServiceCarStatus.location->speed_mode << "\t" << ServiceCarStatus.location->mode2 << "\t" << data->ins_heading_angle << "\t" << obs_modes << "\t" << speed_modes << "\t" << lane_num << "\t" << lane_status <<"\t" <<road_width <<std::endl;
  400. }
  401. if(bFileOpen)xfile.close();
  402. ShareMap(mapdata);
  403. }
  404. int avoidroadid[] = {10002,10019,10003,10098,10099,10063,10099,10100,10104,10110,10111};
  405. inline bool isboringroad(int nroadid)
  406. {
  407. int i;
  408. bool brtn = false;
  409. for(i=0;i<11;i++)
  410. {
  411. if(avoidroadid[i] == nroadid)
  412. {
  413. brtn = true;
  414. break;
  415. }
  416. }
  417. return brtn;
  418. }
  419. void CalcLaneSide(std::vector<PlanPoint> & xPlan)
  420. {
  421. const double fsidedis = 0.3;
  422. const int nChangePoint = 150;
  423. const int nStopPoint = 50;
  424. if(xPlan.size()<nChangePoint)return;
  425. int i;
  426. int nsize = xPlan.size();
  427. for(i=(nsize-1);i>=(nsize - nStopPoint);i--)
  428. {
  429. double fMove = xPlan[i].mfRoadWidth - xPlan[i].mfDisToRoadLeft - (gvehiclewidth/2.0 + fsidedis);
  430. // double fMove = xPlan[i].mWidth/2.0 - (gvehiclewidth/2.0 + fsidedis);
  431. double xold = xPlan[i].x;
  432. double yold = xPlan[i].y;
  433. xPlan[i].x = xold + fMove*cos(xPlan[i].hdg - M_PI/2.0);
  434. xPlan[i].y = yold + fMove*sin(xPlan[i].hdg - M_PI/2.0);
  435. xPlan[i].mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft + fMove;
  436. }
  437. for(i=(nsize-nStopPoint-1);i>=(nsize - nChangePoint);i--)
  438. {
  439. double fMove = xPlan[i].mfRoadWidth - xPlan[i].mfDisToRoadLeft - (gvehiclewidth/2.0 + fsidedis);
  440. // double fMove = xPlan[i].mWidth/2.0 - (gvehiclewidth/2.0 + fsidedis);
  441. double xold = xPlan[i].x;
  442. double yold = xPlan[i].y;
  443. double fRatio = 1.0 - ((nsize-nStopPoint) -i )*1.0/(nChangePoint-nStopPoint);
  444. xPlan[i].x = xold + fRatio*fMove*cos(xPlan[i].hdg - M_PI/2.0);
  445. xPlan[i].y = yold + fRatio*fMove*sin(xPlan[i].hdg - M_PI/2.0);
  446. xPlan[i].mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft + fRatio*fMove;
  447. }
  448. return;
  449. }
  450. void CalcSide(std::vector<PlanPoint> & xPlan)
  451. {
  452. const double fsidedis = 0.3;
  453. const int nChangePoint = 150;
  454. const int nStopPoint = 50;
  455. if(xPlan.size()<nChangePoint)return;
  456. bool bChange = true;
  457. int i;
  458. int nsize = xPlan.size();
  459. for(i=(nsize-1);i>=(nsize - nChangePoint);i--)
  460. {
  461. if(xPlan[i].mWidth<(2.0*(gvehiclewidth/2.0+fsidedis)))
  462. {
  463. std::cout<<" Because Lane is narrow, not change."<<std::endl;
  464. bChange = false;
  465. break;
  466. }
  467. }
  468. if(bChange == false)return;
  469. for(i=(nsize-1);i>=(nsize - nStopPoint);i--)
  470. {
  471. double fMove = xPlan[i].mWidth/2.0 - (gvehiclewidth/2.0 + fsidedis);
  472. double xold = xPlan[i].x;
  473. double yold = xPlan[i].y;
  474. xPlan[i].x = xold + fMove*cos(xPlan[i].hdg - M_PI/2.0);
  475. xPlan[i].y = yold + fMove*sin(xPlan[i].hdg - M_PI/2.0);
  476. xPlan[i].mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft + fMove;
  477. }
  478. for(i=(nsize-nStopPoint-1);i>=(nsize - nChangePoint);i--)
  479. {
  480. double fMove = xPlan[i].mWidth/2.0 - (gvehiclewidth/2.0 + fsidedis);
  481. double xold = xPlan[i].x;
  482. double yold = xPlan[i].y;
  483. double fRatio = 1.0 - ((nsize-nStopPoint) -i )*1.0/(nChangePoint-nStopPoint);
  484. xPlan[i].x = xold + fRatio*fMove*cos(xPlan[i].hdg - M_PI/2.0);
  485. xPlan[i].y = yold + fRatio*fMove*sin(xPlan[i].hdg - M_PI/2.0);
  486. xPlan[i].mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft + fRatio*fMove;
  487. }
  488. return;
  489. }
  490. void SetPlan(xodrobj xo)
  491. {
  492. double x_src,y_src,x_dst,y_dst;
  493. CalcXY(glat0,glon0,ghead0,xo.flatsrc,xo.flonsrc,x_src,y_src);
  494. CalcXY(glat0,glon0,ghead0,xo.flat,xo.flon,x_dst,y_dst);
  495. std::vector<PlanPoint> xPlan;
  496. double s;
  497. // x_src = -5;y_src = 6;
  498. // x_dst = -60;y_src = -150;
  499. int nRtn = MakePlan(gpxd,&mxodr,x_src,y_src,(90 - xo.fhgdsrc)*M_PI/180.0,x_dst,y_dst,s,30.0,100.0,xo.lane,xPlan);
  500. if(nRtn < 0)
  501. {
  502. qDebug("plan fail.");
  503. return;
  504. }
  505. int i;
  506. int nSize = xPlan.size();
  507. if(gbSideLaneEnable)
  508. {
  509. CalcLaneSide(xPlan);
  510. }
  511. else
  512. {
  513. if(gbSideEnable)
  514. {
  515. CalcSide(xPlan);
  516. }
  517. }
  518. if(nSize<1)
  519. {
  520. qDebug("plan fail.");
  521. return;
  522. }
  523. PlanPoint xLastPoint = xPlan[nSize -1];
  524. for(i=0;i<600;i++)
  525. {
  526. PlanPoint pp = xLastPoint;
  527. double fdis = 0.1*(i+1);
  528. pp.mS = pp.mS + i*0.1;
  529. pp.x = pp.x + fdis * cos(pp.hdg);
  530. pp.y = pp.y + fdis * sin(pp.hdg);
  531. pp.nSignal = 23;
  532. if(gbExtendMap)
  533. {
  534. xPlan.push_back(pp);
  535. }
  536. }
  537. iv::map::tracemap xtrace;
  538. nSize = xPlan.size();
  539. std::vector<iv::GPSData> mapdata;
  540. //maptrace
  541. QFile xfile;
  542. QString strpath;
  543. strpath = getenv("HOME");
  544. strpath = strpath + "/map/maptrace.txt";
  545. xfile.setFileName(strpath);
  546. xfile.open(QIODevice::ReadWrite);
  547. //maptrace_add
  548. QFile xfile_1;
  549. QString strpath_1;
  550. strpath_1 = getenv("HOME");
  551. strpath_1 = strpath_1 + "/map/mapadd.txt";
  552. xfile_1.setFileName(strpath_1);
  553. xfile_1.open(QIODevice::ReadWrite);
  554. for(i=0;i<nSize;i++)
  555. {
  556. iv::map::mappoint * pmappoint = xtrace.add_point();
  557. double gps_lon,gps_lat,gps_lon_avoidleft,gps_lat_avoidleft,gps_lat_avoidright,gps_lon_avoidright,gps_heading;
  558. CalcLatLon(glat0,glon0,ghead0,xPlan[i].x,xPlan[i].y,xPlan[i].hdg,gps_lat,
  559. gps_lon,gps_heading);
  560. CalcLatLon(glat0,glon0,xPlan[i].mx_left,xPlan[i].my_left,
  561. gps_lat_avoidleft,gps_lon_avoidleft);
  562. CalcLatLon(glat0,glon0,xPlan[i].mx_right,xPlan[i].my_right,
  563. gps_lat_avoidright,gps_lon_avoidright);
  564. pmappoint->set_gps_lat(gps_lat);
  565. pmappoint->set_gps_lat_avoidleft(gps_lat_avoidleft);
  566. pmappoint->set_gps_lat_avoidright(gps_lat_avoidright);
  567. pmappoint->set_gps_lng(gps_lon);
  568. pmappoint->set_gps_lat_avoidleft(gps_lat_avoidleft);
  569. pmappoint->set_gps_lng_avoidright(gps_lon_avoidright);
  570. pmappoint->set_ins_heading_angle(gps_heading);
  571. double gps_x,gps_y,gps_x_avoidleft,gps_y_avoidleft,gps_x_avoidright,gps_y_avoidright;
  572. GaussProjCal(gps_lon,gps_lat,&gps_x,&gps_y);
  573. GaussProjCal(gps_lon_avoidleft,gps_lat_avoidleft,&gps_x_avoidleft,&gps_y_avoidleft);
  574. GaussProjCal(gps_lon_avoidright,gps_lat_avoidright,&gps_x_avoidright,&gps_y_avoidright);
  575. pmappoint->set_gps_x(gps_x);
  576. pmappoint->set_gps_x_avoidleft(gps_x_avoidleft);
  577. pmappoint->set_gps_x_avoidright(gps_x_avoidright);
  578. pmappoint->set_gps_y(gps_y);
  579. pmappoint->set_gps_y_avoidleft(gps_y_avoidleft);
  580. pmappoint->set_gps_y_avoidright(gps_y_avoidright);
  581. pmappoint->set_speed(xPlan[i].speed);
  582. pmappoint->set_index(i);
  583. pmappoint->set_roadori(xPlan[i].mnLaneori);
  584. pmappoint->set_roadsum(xPlan[i].mnLaneTotal);
  585. pmappoint->set_mfdistolaneleft(xPlan[i].mfDisToLaneLeft);
  586. pmappoint->set_mfdistoroadleft(xPlan[i].mfDisToRoadLeft);
  587. pmappoint->set_mflanewidth(xPlan[i].mWidth);
  588. pmappoint->set_mfroadwidth(xPlan[i].mfRoadWidth);
  589. pmappoint->set_mbinlaneavoid(xPlan[i].bInlaneAvoid);
  590. iv::GPSData data(new iv::GPS_INS);
  591. data->roadMode = 0;
  592. data->gps_lat = gps_lat;
  593. data->gps_lat_avoidleft = gps_lat_avoidleft;
  594. data->gps_lat_avoidright = gps_lat_avoidright;
  595. data->gps_lng = gps_lon;
  596. data->gps_lng_avoidleft = gps_lon_avoidleft;
  597. data->gps_lng_avoidright = gps_lon_avoidright;
  598. data->ins_heading_angle = gps_heading;
  599. data->gps_x = gps_x;
  600. data->gps_x_avoidleft = gps_x_avoidleft;
  601. data->gps_x_avoidright = gps_x_avoidright;
  602. data->gps_y = gps_y;
  603. data->gps_y_avoidleft = gps_y_avoidleft;
  604. data->gps_y_avoidright = gps_y_avoidright;
  605. pmappoint->set_mbnoavoid(xPlan[i].mbNoavoid);
  606. pmappoint->set_mfcurvature(xPlan[i].mfCurvature);
  607. // CalcLatLon(glat0,glon0,ghead0,xPlan[i].x,xPlan[i].y,xPlan[i].hdg,data->gps_lat,
  608. // data->gps_lng,data->ins_heading_angle);
  609. // CalcLatLon(glat0,glon0,xPlan[i].mx_left,xPlan[i].my_left,
  610. // data->gps_lat_avoidleft,data->gps_lng_avoidleft);
  611. // CalcLatLon(glat0,glon0,xPlan[i].mx_right,xPlan[i].my_right,
  612. // data->gps_lat_avoidright,data->gps_lng_avoidright);
  613. data->index = i;
  614. data->speed = xPlan[i].speed;
  615. // ZBGaussProjCal(data->gps_lng,data->gps_lat,&data->gps_x,&data->gps_y);
  616. // GaussProjCal(data->gps_lng,data->gps_lat,&data->gps_x,&data->gps_y);
  617. // GaussProjCal(data->gps_lng_avoidleft,data->gps_lat_avoidleft,&data->gps_x_avoidleft,&data->gps_y_avoidleft);
  618. // GaussProjCal(data->gps_lng_avoidright,data->gps_lat_avoidright,&data->gps_x_avoidright,&data->gps_y_avoidright);
  619. givlog->verbose(" %d %11.7f %11.7f %11.3f ",i,data->gps_lat,
  620. data->gps_lng,data->ins_heading_angle);
  621. data->roadOri = xPlan[i].mnLaneori;
  622. data->roadSum = xPlan[i].mnLaneTotal;
  623. data->mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft;
  624. data->mfDisToRoadLeft = xPlan[i].mfDisToRoadLeft;
  625. data->mfLaneWidth = xPlan[i].mWidth;
  626. data->mfRoadWidth = xPlan[i].mfRoadWidth;
  627. data->mbInLaneAvoid = xPlan[i].bInlaneAvoid;
  628. if(xPlan[i].mbBoringRoad)
  629. {
  630. data->roadOri = 0;
  631. data->roadSum = 2;
  632. pmappoint->set_roadori(0);
  633. pmappoint->set_roadsum(2);
  634. }
  635. data->mbnoavoid = xPlan[i].mbNoavoid;
  636. if(data->mbnoavoid)
  637. {
  638. qDebug("no avoid i = %d",i);
  639. }
  640. data->mfCurvature = xPlan[i].mfCurvature;
  641. data->mode2 = xPlan[i].nSignal;
  642. if(data->mode2 == 3000)
  643. {
  644. int k;
  645. for(k=(mapdata.size()-1);k>(mapdata.size()-150);k--)
  646. {
  647. if(k<0)break;
  648. if((mapdata.at(k)->mode2 != -1)&&(mapdata.at(k)->mode2 !=3000))
  649. {
  650. continue;
  651. }
  652. mapdata.at(k)->mode2 = 3000;
  653. }
  654. }
  655. if(data->mode2 == 1000001)
  656. {
  657. int k;
  658. for(k=(mapdata.size()-1);k>(mapdata.size()-10);k--)
  659. {
  660. if(k<0)break;
  661. if((mapdata.at(k)->mode2 != -1)&&(mapdata.at(k)->mode2 !=1000001))
  662. {
  663. continue;
  664. }
  665. mapdata.at(k)->mode2 = 1000001;
  666. }
  667. }
  668. pmappoint->set_mode2(data->mode2);
  669. pmappoint->set_rel_x(xPlan[i].x);
  670. pmappoint->set_rel_y(xPlan[i].y);
  671. pmappoint->set_rel_z(0);
  672. pmappoint->set_rel_yaw(xPlan[i].hdg);
  673. pmappoint->set_laneid(-1);
  674. pmappoint->set_roadid(xPlan[i].nRoadID);
  675. #ifdef BOAVOID
  676. if(isboringroad(xPlan[i].nRoadID))
  677. {
  678. const int nrangeavoid = 300;
  679. if((i+(nrangeavoid + 10))<nSize)
  680. {
  681. double fhdg1 = xPlan[i].hdg;
  682. bool bavoid = true;
  683. // int k;
  684. // for(k=0;k<=10;k++)
  685. // {
  686. // double fhdg5 = xPlan[i+nrangeavoid*k/10].hdg;
  687. // double fhdgdiff1 = fhdg5 - fhdg1;
  688. // while(fhdgdiff1<0)fhdgdiff1 = fhdgdiff1 + 2.0*M_PI;
  689. // if((fhdgdiff1>(M_PI/3.0))&&(fhdgdiff1<(5.0*M_PI/3.0)))
  690. // {
  691. // bavoid = false;
  692. // break;
  693. // }
  694. // }
  695. if(bavoid)
  696. {
  697. data->roadSum = 2;
  698. data->roadOri = 0;
  699. }
  700. }
  701. else
  702. {
  703. int a = 1;
  704. a++;
  705. }
  706. }
  707. #endif
  708. mapdata.push_back(data);
  709. // char strline[255];
  710. // // snprintf(strline,255,"%d\t%11.7f\t%11.7f\t%d\t%11.3f\t%d\t%d\t%d\t%d\t%d\t%d\t%11.7f\n",
  711. // // i,data->gps_lng,data->gps_lat,0,data->ins_heading_angle,0,0,0,data->roadOri,data->roadSum,data->mode2,data->mfCurvature);
  712. // snprintf(strline,255,"%d\t%11.7f\t%11.7f\t%d\t%d\t%11.3f\t%d\t%d\t%d\t%d\t%d\n",
  713. // i,data->gps_lng,data->gps_lat,0,0,data->ins_heading_angle,0,0,data->roadSum,data->roadOri,data->mode2);
  714. // xfile.write(strline);
  715. }
  716. for(int j=0;j<nSize;j++)
  717. {
  718. char strline[255];
  719. snprintf(strline,255,"%d\t%11.7f\t%11.7f\t%d\t%d\t%11.3f\t%d\t%d\t%d\t%d\n",
  720. j,mapdata.at(j)->gps_lng,mapdata.at(j)->gps_lat,0,0,mapdata.at(j)->ins_heading_angle,0,0,mapdata.at(j)->roadSum,mapdata.at(j)->roadOri);
  721. xfile.write(strline);
  722. //mapttrace1
  723. char strline_1[255];
  724. snprintf(strline_1,255,"%d\t%11.7f\t%11.7f\t%d\t%d\t%11.3f\t%d\t%d\t%d\t%d\t%d\n",
  725. j,mapdata.at(j)->gps_lng,mapdata.at(j)->gps_lat,0,0,mapdata.at(j)->ins_heading_angle,0,0,mapdata.at(j)->roadSum,mapdata.at(j)->roadOri,mapdata.at(j)->mode2);
  726. xfile_1.write(strline_1);
  727. }
  728. xfile.close();
  729. xfile_1.close();
  730. ShareMap(mapdata);
  731. ShareMapGlobal(xPlan);
  732. int nnewmapsize = xtrace.ByteSize();
  733. std::shared_ptr<char> str_ptr = std::shared_ptr<char>(new char[nnewmapsize]);
  734. if(xtrace.SerializeToArray(str_ptr.get(),nnewmapsize))
  735. {
  736. iv::modulecomm::ModuleSendMsg(gpanewtrace ,str_ptr.get(),nnewmapsize);
  737. }
  738. else
  739. {
  740. std::cout<<" new trace map serialize fail."<<std::endl;
  741. }
  742. s = 1;
  743. }
  744. void MultiStationPlan(iv::v2x::v2x * pxv2x,double fsrclat,double fsrclon,double fsrcheading,int nlane)
  745. {
  746. std::vector<PlanPoint> xPlan;
  747. int i;
  748. double fLastHdg = 0;
  749. int ndeflane =nlane;
  750. for(i=0;i<pxv2x->stgps_size();i++)
  751. {
  752. double x_src,y_src,x_dst,y_dst;
  753. if(i==0)
  754. {
  755. CalcXY(glat0,glon0,ghead0,fsrclat,fsrclon,x_src,y_src);
  756. }
  757. else
  758. {
  759. CalcXY(glat0,glon0,ghead0,pxv2x->stgps(i-1).lat(),pxv2x->stgps(i-1).lon(),x_src,y_src);
  760. }
  761. CalcXY(glat0,glon0,ghead0,pxv2x->stgps(i).lat(),pxv2x->stgps(i).lon(),x_dst,y_dst);
  762. std::vector<PlanPoint> xPlanPart;
  763. double s;
  764. // x_src = -5;y_src = 6;
  765. // x_dst = -60;y_src = -150;
  766. int nRtn = -1;
  767. if(i==0)
  768. {
  769. nRtn = MakePlan(gpxd,&mxodr,x_src,y_src,(90 - fsrcheading)*M_PI/180.0,x_dst,y_dst,s,30.0,100.0,ndeflane,xPlanPart);
  770. }
  771. else
  772. {
  773. nRtn = MakePlan(gpxd,&mxodr,x_src,y_src,fLastHdg,x_dst,y_dst,s,30.0,100.0,ndeflane,xPlanPart);
  774. }
  775. if(nRtn < 0)
  776. {
  777. qDebug("plan fail.");
  778. return;
  779. }
  780. int j;
  781. for(j=0;j<xPlanPart.size();j++)xPlan.push_back(xPlanPart.at(j));
  782. fLastHdg = xPlanPart.at(xPlanPart.size()-1).hdg;
  783. }
  784. int nSize = xPlan.size();
  785. std::vector<iv::GPSData> mapdata;
  786. QFile xfile;
  787. QString strpath;
  788. strpath = getenv("HOME");
  789. strpath = strpath + "/map/maptrace.txt";
  790. xfile.setFileName(strpath);
  791. xfile.open(QIODevice::ReadWrite);
  792. for(i=0;i<nSize;i++)
  793. {
  794. iv::GPSData data(new iv::GPS_INS);
  795. CalcLatLon(glat0,glon0,ghead0,xPlan[i].x,xPlan[i].y,xPlan[i].hdg,data->gps_lat,
  796. data->gps_lng,data->ins_heading_angle);
  797. data->index = i;
  798. data->speed = xPlan[i].speed;
  799. // ZBGaussProjCal(data->gps_lng,data->gps_lat,&data->gps_x,&data->gps_y);
  800. GaussProjCal(data->gps_lng,data->gps_lat,&data->gps_x,&data->gps_y);
  801. givlog->verbose(" %d %11.7f %11.7f %11.3f ",i,data->gps_lat,
  802. data->gps_lng,data->ins_heading_angle);
  803. // data->roadSum = 1;
  804. // data->roadMode = 0;
  805. // data->roadOri = 0;
  806. // if(xPlan[i].lanmp == -1)data->roadMode = 15;
  807. // if(xPlan[i].lanmp == 1)data->roadMode = 14;
  808. data->roadOri = xPlan[i].mnLaneori;
  809. data->roadSum = xPlan[i].mnLaneTotal;
  810. data->mfDisToLaneLeft = xPlan[i].mfDisToLaneLeft;
  811. data->mfDisToRoadLeft = xPlan[i].mfDisToRoadLeft;
  812. data->mfLaneWidth = xPlan[i].mWidth;
  813. data->mfRoadWidth = xPlan[i].mfRoadWidth;
  814. data->mode2 = xPlan[i].nSignal;
  815. if(data->mode2 == 3000)
  816. {
  817. int k;
  818. for(k=(mapdata.size()-1);k>(mapdata.size()-150);k--)
  819. {
  820. if(k<0)break;
  821. mapdata.at(k)->mode2 = 3000;
  822. }
  823. }
  824. mapdata.push_back(data);
  825. char strline[255];
  826. snprintf(strline,255,"%d\t%11.7f\t%11.7f\t%d\t%d\t%11.3f\t%d\t%d\t%d\t%d\n",
  827. i,data->gps_lng,data->gps_lat,0,data->ins_heading_angle,0,0,0,0,0);
  828. xfile.write(strline);
  829. }
  830. xfile.close();
  831. ShareMap(mapdata);
  832. }
  833. void ListenCmd(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  834. {
  835. if(nSize<sizeof(xodrobj))
  836. {
  837. std::cout<<"ListenCmd small."<<std::endl;
  838. return;
  839. }
  840. xodrobj xo;
  841. memcpy(&xo,strdata,sizeof(xodrobj));
  842. givlog->debug("lat is %f", xo.flat);
  843. xo.fhgdsrc = gsrc.fhgdsrc;
  844. xo.flatsrc = gsrc.flatsrc;
  845. xo.flonsrc = gsrc.flonsrc;
  846. SetPlan(xo);
  847. }
  848. void ListenV2X(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  849. {
  850. iv::v2x::v2x xv2x;
  851. if(!xv2x.ParseFromArray(strdata,nSize))
  852. {
  853. givlog->warn("ListernV2X Parse Error.");
  854. std::cout<<"ListenV2X Parse Error."<<std::endl;
  855. return;
  856. }
  857. if(xv2x.stgps_size()<1)
  858. {
  859. givlog->debug("ListenV2X no gps station.");
  860. std::cout<<"ListenV2X no gps station."<<std::endl;
  861. return;
  862. }
  863. MultiStationPlan(&xv2x,gsrc.flatsrc,gsrc.flonsrc,gsrc.fhgdsrc,1);
  864. }
  865. void ListenSrc(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  866. {
  867. if(nSize<sizeof(xodrobj))
  868. {
  869. givlog->warn("ListenSrc small");
  870. std::cout<<"ListenSrc small."<<std::endl;
  871. return;
  872. }
  873. memcpy(&gsrc,strdata,sizeof(xodrobj));
  874. givlog->debug("src hdg is %f", gsrc.fhgdsrc);
  875. std::cout<<"src hdg is "<<gsrc.fhgdsrc<<std::endl;
  876. }
  877. void UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  878. {
  879. iv::gps::gpsimu xgpsimu;
  880. if(!xgpsimu.ParseFromArray(strdata,nSize))
  881. {
  882. givlog->warn("ADCIntelligentVehicle::UpdateGPSIMU parse error. nSize is %d",nSize);
  883. return;
  884. }
  885. xodrobj xo;
  886. xo.fhgdsrc = xgpsimu.heading();
  887. xo.flatsrc = xgpsimu.lat();
  888. xo.flonsrc = xgpsimu.lon();
  889. gsrc = xo;
  890. givlog->debug("src hdg is %f", gsrc.fhgdsrc);
  891. std::cout<<"src hdg is "<<gsrc.fhgdsrc<<std::endl;
  892. }
  893. void ExitFunc()
  894. {
  895. // gApp->quit();
  896. iv::modulecomm::Unregister(gpasimple);
  897. iv::modulecomm::Unregister(gpav2x);
  898. iv::modulecomm::Unregister(gpagps);
  899. iv::modulecomm::Unregister(gpasrc);
  900. iv::modulecomm::Unregister(gpmap);
  901. iv::modulecomm::Unregister(gpa);
  902. std::cout<<"driver_map_xodrload exit."<<std::endl;
  903. gApp->quit();
  904. std::this_thread::sleep_for(std::chrono::milliseconds(100));
  905. // std::this_thread::sleep_for(std::chrono::milliseconds(900));
  906. }
  907. void signal_handler(int sig)
  908. {
  909. if(sig == SIGINT)
  910. {
  911. ExitFunc();
  912. }
  913. }
  914. void ProcROIReq(std::shared_ptr<char> pstr_req,const int nreqsize,std::shared_ptr<char> & pstr_res,int & nressize)
  915. {
  916. (void)pstr_req;
  917. (void)nreqsize;
  918. std::shared_ptr<iv::roi::request> pstr_roireq = std::shared_ptr<iv::roi::request>(new iv::roi::request);
  919. if(pstr_roireq->ParseFromArray(pstr_req.get(),nreqsize))
  920. {
  921. std::shared_ptr<iv::roi::resultarray> pstr_roires;
  922. gsrx.GetROI(pstr_roireq,pstr_roires);
  923. int nbytesize = pstr_roires->ByteSize();
  924. pstr_res = std::shared_ptr<char>(new char[nbytesize]);
  925. if(pstr_roires->SerializeToArray(pstr_res.get(),nbytesize))
  926. {
  927. nressize = nbytesize;
  928. std::cout<<"return res."<<std::endl;
  929. return;
  930. }
  931. else
  932. {
  933. std::cout<<" ProcROIReq fail serizlizetoarray"<<std::endl;
  934. }
  935. }
  936. else
  937. {
  938. std::cout<<" ProcROIReq parse pstr_req fail."<<std::endl;
  939. return;
  940. }
  941. }
  942. int main(int argc, char *argv[])
  943. {
  944. showversion("driver_map_xodrload");
  945. QCoreApplication a(argc, argv);
  946. gApp = &a;
  947. RegisterIVBackTrace();
  948. gfault = new iv::Ivfault("driver_map_xodrload");
  949. givlog = new iv::Ivlog("driver_map_xodrload");
  950. std::string strmapth,strparapath;
  951. if(argc<3)
  952. {
  953. // strmapth = "./map.xodr";
  954. strmapth = getenv("HOME");
  955. strmapth = strmapth + "/map/map.xodr";
  956. // strmapth = "/home/yuchuli/1226.xodr";
  957. strparapath = "./driver_map_xodrload.xml";
  958. }
  959. else
  960. {
  961. strmapth = argv[1];
  962. strparapath = argv[2];
  963. }
  964. iv::xmlparam::Xmlparam xp(strparapath);
  965. xp.GetParam(std::string("he"),std::string("1"));
  966. std::string strlat0 = xp.GetParam("lat0","39");
  967. std::string strlon0 = xp.GetParam("lon0","117.0");
  968. std::string strhdg0 = xp.GetParam("hdg0","360.0");
  969. std::string strgpsmsg = xp.GetParam("gpsmsg","hcp2_gpsimu");
  970. std::string strv2xmsg = xp.GetParam("v2xmsg","v2x");
  971. std::string strvehiclewidth = xp.GetParam("vehiclewidth","2.0");
  972. std::string strextendmap = xp.GetParam("extendmap","false");
  973. std::string strsideenable = xp.GetParam("sideenable","false");
  974. std::string strsidelaneenable = xp.GetParam("sidelaneenable","false");
  975. glat0 = atof(strlat0.data());
  976. glon0 = atof(strlon0.data());
  977. ghead0 = atof(strhdg0.data());
  978. gvehiclewidth = atof(strvehiclewidth.data());
  979. if(strextendmap == "true")
  980. {
  981. gbExtendMap = true;
  982. }
  983. else
  984. {
  985. gbExtendMap = false;
  986. }
  987. if(strsideenable == "true")
  988. {
  989. gbSideEnable = true;
  990. }
  991. if(strsidelaneenable == "true")
  992. {
  993. gbSideLaneEnable = true;
  994. }
  995. LoadXODR(strmapth);
  996. iv::service::Server serviceroi("ServiceROI",ProcROIReq);
  997. (void)serviceroi;
  998. gpmap = iv::modulecomm::RegisterSend("tracemap",20000000,1);
  999. gpasimple = iv::modulecomm::RegisterSend("simpletrace",100000,1);
  1000. gpanewtrace = iv::modulecomm::RegisterSend("newtracemap",20000000,1);
  1001. gpamapglobal = iv::modulecomm::RegisterSend("mapglobal",20000000,1);
  1002. gpa = iv::modulecomm::RegisterRecv("xodrreq",ListenCmd);
  1003. gpasrc =iv::modulecomm::RegisterRecv("xodrsrc",ListenSrc);
  1004. gpagps = iv::modulecomm::RegisterRecv(strgpsmsg.data(),UpdateGPSIMU);
  1005. gpav2x = iv::modulecomm::RegisterRecv(strv2xmsg.data(),ListenV2X);
  1006. double x_src,y_src,x_dst,y_dst;
  1007. x_src = -26;y_src = 10;
  1008. x_dst = -50;y_dst = -220;
  1009. x_src = 0;y_src = 0;
  1010. x_dst = -23;y_dst = -18;
  1011. x_dst = 21;y_dst =-21;
  1012. x_dst =5;y_dst = 0;
  1013. x_src = -20; y_src = -1000;
  1014. x_dst = 900; y_dst = -630;
  1015. // x_dst = 450; y_dst = -640;
  1016. // x_dst = -190; y_dst = -690;
  1017. // x_src = 900; y_src = -610;
  1018. // x_dst = -100; y_dst = -680;
  1019. std::vector<PlanPoint> xPlan;
  1020. double s;
  1021. // int nRtn = MakePlan(gpxd,&mxodr,x_src,y_src,3.14,x_dst,y_dst,s,30.0,100.0,1,xPlan);
  1022. // ToGPSTrace(xPlan);
  1023. // double lat = 39.1443880;
  1024. // double lon = 117.0812543;
  1025. // xodrobj xo;
  1026. // xo.fhgdsrc = 340;
  1027. // xo.flatsrc = lat; xo.flonsrc = lon;
  1028. // xo.flat = 39.1490196;
  1029. // xo.flon = 117.0806979;
  1030. // xo.lane = 1;
  1031. // SetPlan(xo);
  1032. // void * pivexit = iv::ivexit::RegIVExitCall(ExitFunc);
  1033. signal(SIGINT,signal_handler);
  1034. int nrc = a.exec();
  1035. std::cout<<"driver_map_xodr app exit. code :"<<nrc<<std::endl;
  1036. return nrc;
  1037. }