main.cpp 33 KB

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