sideparkcalc.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658
  1. #include "sideparkcalc.h"
  2. #include "math.h"
  3. #include <iostream>
  4. SideParkCalc::SideParkCalc(double x,double y,double hdg,double fRadius,double MaxWheel ,double MaxAngle ,double fLastDirectDis )
  5. {
  6. mfRaidus = fRadius;
  7. mfMaxWheel = MaxWheel;
  8. mfMaxAngle = MaxAngle * M_PI/180.0;
  9. mfLastDirectDis = fLastDirectDis;
  10. mx = x;
  11. my = y;
  12. mhdg = hdg;
  13. normalhdg(mhdg);
  14. mSideParkType = SideParkType::NoSolution;
  15. }
  16. void SideParkCalc::CalcPark()
  17. {
  18. if(mx< 0.5)
  19. {
  20. return;
  21. }
  22. if(fabs(mhdg) > M_PI/6.0)
  23. {
  24. return;
  25. }
  26. SideParkMode parkmode = CalcParkMode();
  27. if(parkmode == SideParkMode::ParkAtRight)
  28. {
  29. ParkAtRightCalc();
  30. }
  31. else
  32. ParkAtLeftCalc();
  33. }
  34. SideParkMode SideParkCalc::CalcParkMode()
  35. {
  36. if(my>=0)return SideParkMode::ParkAtRight;
  37. return SideParkMode::ParkAtLeft;
  38. }
  39. void SideParkCalc::ParkAtRightCalc()
  40. {
  41. if(mhdg<=0.0)
  42. {
  43. ParkAtRightCalc_Model1();
  44. }
  45. else
  46. {
  47. ParkAtRightCalc_Model2();
  48. }
  49. }
  50. void SideParkCalc::ParkAtRightCalc_Model1()
  51. {
  52. double dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4,dx5,dy5,dx6,dy6;
  53. dy6 = 0;
  54. dx6 = mfLastDirectDis;
  55. // double fMaxdx5 = mfRaidus * sin(mfMaxAngle );
  56. double fMaxdy5 = mfRaidus *(1.0 - cos(mfMaxAngle));
  57. // double fMaxdx3 = fMaxdx5;
  58. // double fMaxdy3 = fMaxdy5;
  59. dx2 = mfRaidus * sin(fabs(mhdg));
  60. dy2 = mfRaidus * (1 - cos(fabs(mhdg)));
  61. double fang ;//= mfMaxAngle;
  62. if((my+dy2) >= (2*fMaxdy5) )
  63. {
  64. fang = mfMaxAngle;
  65. }
  66. else
  67. {
  68. fang = acos(1.0 - (my+dy2)/(2.0*mfRaidus)) ;
  69. }
  70. dx5 = mfRaidus * sin(fang);
  71. dy5 = mfRaidus * (1.0 - cos(fang));
  72. dx3 = dx5;
  73. dy3 = dy5;
  74. double thetax = mx - dx6 - dx3 - dx5 - dx2;
  75. if(fabs(tan(fabs(mhdg )) + tan(fang ))<0.0001)
  76. {
  77. std::cout<<" divide error."<<std::endl;
  78. return;
  79. }
  80. dx4 = (my + thetax * tan(fabs(mhdg)) +dy2 - dy3 - dy5)/(tan(fabs(mhdg )) + tan(fang ));
  81. dx1 = thetax - dx4;
  82. dy1 = dx1 * tan(fabs(mhdg));
  83. dy4 = my + dy1 +dy2 -dy3-dy5;
  84. std::cout<<" compute. "<<std::endl;
  85. if(dx1>(-0.1)&&(dx4>(-0.1)))
  86. {
  87. mSideParkType = SideParkType::FiveStep;
  88. mvectorWheel.push_back(0.0);
  89. mvectorWheel.push_back(mfMaxWheel * (-1.0));
  90. mvectorWheel.push_back(0.0);
  91. mvectorWheel.push_back(mfMaxWheel);
  92. mvectorWheel.push_back(0.0);
  93. double x1,x2,y1,y2,x3,y3,x4,y4,hdg1,hdg2,hdg3,hdg4,flen1,flen2,flen3,flen4,flen5;
  94. x4 = dx6;y4 = dy6;hdg4 = 0;flen5 = x4;
  95. x3 = x4 + dx5;y3 = y4 + dy5;hdg3 = fang;flen4 = fabs(fang) *mfRaidus;
  96. hdg2 = hdg3;
  97. if(dx4>0.01)
  98. {
  99. x2 = x3 + dx4;y2 = y3 + dy4;
  100. flen3 = sqrt(pow(x2 - x3,2) + pow(y2 - y3,2));
  101. }
  102. else
  103. {
  104. x2 = x3;y2 = y3;flen3 = 0;
  105. }
  106. flen2 = mfRaidus * (fang - mhdg);
  107. x1 = mx - dx1;
  108. y1 = my + dy1;
  109. hdg1 = mhdg;
  110. flen1 = sqrt(pow(dx1,2) + pow(dy1,2));
  111. mvectorlen.push_back(flen1);
  112. mvectorlen.push_back(flen2);
  113. mvectorlen.push_back(flen3);
  114. mvectorlen.push_back(flen4);
  115. mvectorlen.push_back(flen5);
  116. mfTotalLen = flen1 + flen2 + flen3 + flen4 + flen5;
  117. mvectorpoint.push_back(iv::SideParkPoint(x1,y1,hdg1));
  118. mvectorpoint.push_back(iv::SideParkPoint(x2,y2,hdg2));
  119. mvectorpoint.push_back(iv::SideParkPoint(x3,y3,hdg3));
  120. mvectorpoint.push_back(iv::SideParkPoint(x4,y4,hdg4));
  121. }
  122. // if((my+dy2) > (2*fMaxdy3) )
  123. // {
  124. // dy3 = fMaxdy3;
  125. // dx3 = fMaxdx3;
  126. // dx5 = fMaxdx5;
  127. // dy5 = fMaxdy5;
  128. // double thetax = mx - dx6 - fMaxdx3 - fMaxdx5 - dx2;
  129. // dx4 = (my + thetax * tan(fabs(mhdg)) +dy2 - fMaxdy3 - fMaxdy5)/(tan(fabs(mhdg ) + tan(mfMaxAngle )));
  130. // dx1 = thetax - dx4;
  131. // dy1 = dx1 * tan(fabs(mhdg));
  132. // dy4 = my + dy1 + dy2 -dy3-dy5;
  133. // std::cout<<" compute. "<<std::endl;
  134. // }
  135. // else
  136. // {
  137. // double fang = acos(1.0 - (my+dy2)/(2.0*mfRaidus)) ;
  138. // dx5 = mfRaidus * sin(fang);
  139. // dy5 = mfRaidus * (1.0 - cos(fang));
  140. // dx3 = dx5;
  141. // dy3 = dy5;
  142. // double thetax = mx - dx6 - dx3 - dx5 - dx2;
  143. // dx4 = (my + thetax * tan(fabs(mhdg)) +dy2 - dy3 - dy5)/(tan(fabs(mhdg ) + tan(fang )));
  144. // dx1 = thetax - dx4;
  145. // dy1 = dx1 * tan(fabs(mhdg));
  146. // dy4 = my + dy1 +dy2 -dy3-dy5;
  147. // std::cout<<" compute. "<<std::endl;
  148. // }
  149. }
  150. void SideParkCalc::ParkAtRightCalc_Model2()
  151. {
  152. double dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4,dx5,dy5;
  153. dy5 = 0;
  154. dx5 = mfLastDirectDis;
  155. bool bFirstCalc = true;
  156. double dx2fix = mfRaidus * sin(mhdg);
  157. double dy2fix = mfRaidus * (1.0 - cos(mhdg));
  158. double fMaxdy4 = mfRaidus *(1.0 - cos(mfMaxAngle));
  159. double fang ;
  160. if((my+dy2fix) >= (2*fMaxdy4) )
  161. {
  162. fang = mfMaxAngle;
  163. }
  164. else
  165. {
  166. fang = acos(1.0 - (my+dy2fix)/(2.0*mfRaidus)) ;
  167. }
  168. TwoCalc:
  169. dx4 = mfRaidus * sin(fang);
  170. dy4 = mfRaidus * (1.0 - cos(fang));
  171. dx2 = dx4 - dx2fix;
  172. dy2 = dy4 - dy2fix;
  173. double thetax = mx - dx2 -dx4 -dx5;
  174. double k1 = tan(mhdg);
  175. double k3 = tan(fang);
  176. if(fabs(k1-k3)<0.001)
  177. {
  178. dy1 = 0;
  179. dx1 = 0;
  180. dy3 = my - dy2 - dy4;
  181. if(k3 > 0.001)
  182. {
  183. dx3 = dy3/k3;
  184. }
  185. else
  186. {
  187. dx3 = 0;
  188. }
  189. if(fabs(mx - dx1 - dx2 -dx3 -dx4 - dx5) > 0.1)
  190. {
  191. std::cout<<" no solve"<<std::endl;
  192. return;
  193. }
  194. }
  195. else
  196. {
  197. dx3 = (my - dy2 - dy4 - k1 * thetax)/(k3 - k1);
  198. dy3 = k3 * dx3;
  199. dx1 = thetax - dx3;
  200. dy1 = k1 * dx1;
  201. }
  202. if((dx3<-0.1) || (dx1<-0.1))
  203. {
  204. if((dx1>0.5)&&(bFirstCalc))
  205. {
  206. double x_b = mx - mfLastDirectDis;
  207. double y_b = my - 0;
  208. double k = tan(mhdg);
  209. double C = (2 * mfRaidus - dy2fix + k * x_b - y_b )/(2*mfRaidus);
  210. double a = 1 +k*k;
  211. double b = 2*k*C *(-1.0);
  212. double c = C*C-1;
  213. double d = b*b - 4*a*c;
  214. if(d >= 0)
  215. {
  216. double xr1,xr2;
  217. xr1 = (-b + sqrt(d))/(2*a);
  218. xr2 = (-b - sqrt(d))/(2*a);
  219. double fa = 0;
  220. if((xr1>=0)&&(xr1<1))
  221. {
  222. fa = asin(xr1);
  223. }
  224. else
  225. {
  226. if((xr2>=0)&&(xr2<1))
  227. {
  228. fa = asin(xr2);
  229. }
  230. }
  231. if((fa>0.001) && (fa<mfMaxAngle))
  232. {
  233. fang = fa;
  234. bFirstCalc = false;
  235. goto TwoCalc;
  236. }
  237. }
  238. }
  239. else
  240. {
  241. if(cos(mhdg)> 0.001)
  242. {
  243. double fR = my/(1 - cos(mhdg));
  244. double Rx = mx - fR*sin(mhdg);
  245. if((Rx>0.3) && (fR >= mfRaidus))
  246. {
  247. mSideParkType = SideParkType::TwoStep;
  248. mvectorWheel.push_back(mfMaxWheel * mfRaidus/fR);
  249. mvectorWheel.push_back(0.0);
  250. double flen1,flen2;
  251. flen2 = Rx;
  252. flen1 = fR*fabs(mhdg);
  253. mvectorlen.push_back(flen1);
  254. mvectorlen.push_back(flen2);
  255. mfTotalLen = flen1 + flen2;
  256. mvectorpoint.push_back(iv::SideParkPoint(Rx,0,0));
  257. std::cout<<" Have One Step soluton."<<std::endl;
  258. }
  259. }
  260. }
  261. }
  262. else
  263. {
  264. mSideParkType = SideParkType::FiveStep;
  265. mvectorWheel.push_back(0.0);
  266. mvectorWheel.push_back(mfMaxWheel * (-1.0));
  267. mvectorWheel.push_back(0.0);
  268. mvectorWheel.push_back(mfMaxWheel);
  269. mvectorWheel.push_back(0.0);
  270. double x1,x2,y1,y2,x3,y3,x4,y4,hdg1,hdg2,hdg3,hdg4,flen1,flen2,flen3,flen4,flen5;
  271. x4 = dx5;y4 = dy5;hdg4 = 0;flen5 = x4;
  272. x3 = x4 + dx4;y3 = y4 + dy4;hdg3 = fang;flen4 = fabs(fang) *mfRaidus;
  273. hdg2 = hdg3;
  274. if(dx3>0.1)
  275. {
  276. x2 = x3 + dx3;y2 = y3 + dy3;
  277. flen3 = sqrt(pow(x2 - x3,2) + pow(y2 - y3,2));
  278. }
  279. else
  280. {
  281. x2 = x3;y2 = y3;flen3 = 0;
  282. }
  283. flen2 = mfRaidus * (fang - mhdg);
  284. x1 = mx - dx1;
  285. y1 = my - dy1;
  286. hdg1 = mhdg;
  287. flen1 = sqrt(pow(dx1,2) + pow(dy1,2));
  288. mvectorlen.push_back(flen1);
  289. mvectorlen.push_back(flen2);
  290. mvectorlen.push_back(flen3);
  291. mvectorlen.push_back(flen4);
  292. mvectorlen.push_back(flen5);
  293. mfTotalLen = flen1 + flen2 + flen3 + flen4 + flen5;
  294. mvectorpoint.push_back(iv::SideParkPoint(x1,y1,hdg1));
  295. mvectorpoint.push_back(iv::SideParkPoint(x2,y2,hdg2));
  296. mvectorpoint.push_back(iv::SideParkPoint(x3,y3,hdg3));
  297. mvectorpoint.push_back(iv::SideParkPoint(x4,y4,hdg4));
  298. std::cout<<" have compute."<<std::endl;
  299. }
  300. std::cout<<" compute. "<<std::endl;
  301. }
  302. void SideParkCalc::ParkAtLeftCalc()
  303. {
  304. if(mhdg>=0.0)
  305. {
  306. ParkAtLeftCalc_Model1();
  307. }
  308. else
  309. {
  310. ParkAtLeftCalc_Model2();
  311. }
  312. }
  313. void SideParkCalc::ParkAtLeftCalc_Model1()
  314. {
  315. double dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4,dx5,dy5,dx6,dy6;
  316. dy6 = 0;
  317. dx6 = mfLastDirectDis;
  318. double fMaxdy5 = mfRaidus *(1.0 - cos(mfMaxAngle));
  319. dx2 = mfRaidus * sin(fabs(mhdg));
  320. dy2 = mfRaidus * (1 - cos(fabs(mhdg)));
  321. // double x = mx;
  322. double y = fabs(my);
  323. double fang ;//= mfMaxAngle;
  324. if((y+dy2) >= (2*fMaxdy5) )
  325. {
  326. fang = mfMaxAngle;
  327. }
  328. else
  329. {
  330. fang = acos(1.0 - (y+dy2)/(2.0*mfRaidus)) ;
  331. }
  332. dx5 = mfRaidus * sin(fang);
  333. dy5 = mfRaidus * (1.0 - cos(fang));
  334. dx3 = dx5;
  335. dy3 = dy5;
  336. double thetax = mx - dx6 - dx3 - dx5 - dx2;
  337. if(fabs(tan(fabs(mhdg )) + tan(fang ))<0.0001)
  338. {
  339. std::cout<<" divide error."<<std::endl;
  340. return;
  341. }
  342. dx4 = (y + thetax * tan(fabs(mhdg)) +dy2 - dy3 - dy5)/(tan(fabs(mhdg )) + tan(fang ));
  343. dx1 = thetax - dx4;
  344. dy1 = dx1 * tan(fabs(mhdg));
  345. dy4 = y + dy1 +dy2 -dy3-dy5;
  346. std::cout<<" compute. "<<std::endl;
  347. if(dx1>(-0.1)&&(dx4>(-0.1)))
  348. {
  349. mSideParkType = SideParkType::FiveStep;
  350. mvectorWheel.push_back(0.0);
  351. mvectorWheel.push_back(mfMaxWheel * (1.0));
  352. mvectorWheel.push_back(0.0);
  353. mvectorWheel.push_back(mfMaxWheel * (-1.0));
  354. mvectorWheel.push_back(0.0);
  355. double x1,x2,y1,y2,x3,y3,x4,y4,hdg1,hdg2,hdg3,hdg4,flen1,flen2,flen3,flen4,flen5;
  356. x4 = dx6;y4 = dy6;hdg4 = 0;flen5 = x4;
  357. x3 = x4 + dx5;y3 = y4 - dy5;hdg3 = fang * (-1);flen4 = fabs(fang) *mfRaidus;
  358. hdg2 = hdg3;
  359. if(dx4>0.1)
  360. {
  361. x2 = x3 + dx4;y2 = y3 - dy4;
  362. flen3 = sqrt(pow(x2 - x3,2) + pow(y2 - y3,2));
  363. }
  364. else
  365. {
  366. x2 = x3;y2 = y3;flen3 = 0;
  367. }
  368. flen2 = mfRaidus * (mhdg + fang);
  369. x1 = mx - dx1;
  370. y1 = my - dy1;
  371. hdg1 = mhdg;
  372. flen1 = sqrt(pow(dx1,2) + pow(dy1,2));
  373. mvectorlen.push_back(flen1);
  374. mvectorlen.push_back(flen2);
  375. mvectorlen.push_back(flen3);
  376. mvectorlen.push_back(flen4);
  377. mvectorlen.push_back(flen5);
  378. mfTotalLen = flen1 + flen2 + flen3 + flen4 + flen5;
  379. mvectorpoint.push_back(iv::SideParkPoint(x1,y1,hdg1));
  380. mvectorpoint.push_back(iv::SideParkPoint(x2,y2,hdg2));
  381. mvectorpoint.push_back(iv::SideParkPoint(x3,y3,hdg3));
  382. mvectorpoint.push_back(iv::SideParkPoint(x4,y4,hdg4));
  383. }
  384. }
  385. void SideParkCalc::ParkAtLeftCalc_Model2()
  386. {
  387. double dx1,dy1,dx2,dy2,dx3,dy3,dx4,dy4,dx5,dy5;
  388. dy5 = 0;
  389. dx5 = mfLastDirectDis;
  390. bool bFirstCalc = true;
  391. double dx2fix = mfRaidus * sin(fabs(mhdg));
  392. double dy2fix = mfRaidus * (1.0 - cos(fabs(mhdg)));
  393. double fMaxdy4 = mfRaidus *(1.0 - cos(mfMaxAngle));
  394. double fang ;
  395. double y = fabs(my);
  396. if((y+dy2fix) >= (2*fMaxdy4) )
  397. {
  398. fang = mfMaxAngle;
  399. }
  400. else
  401. {
  402. fang = acos(1.0 - (y+dy2fix)/(2.0*mfRaidus)) ;
  403. }
  404. TwoCalc:
  405. dx4 = mfRaidus * sin(fang);
  406. dy4 = mfRaidus * (1.0 - cos(fang));
  407. dx2 = dx4 - dx2fix;
  408. dy2 = dy4 - dy2fix;
  409. double thetax = mx - dx2 -dx4 -dx5;
  410. double k1 = tan(fabs(mhdg));
  411. double k3 = tan(fang);
  412. if(fabs(k1-k3)<0.001)
  413. {
  414. dy1 = 0;
  415. dx1 = 0;
  416. dy3 = y - dy2 - dy4;
  417. if(k3 > 0.001)
  418. {
  419. dx3 = dy3/k3;
  420. }
  421. else
  422. {
  423. dx3 = 0;
  424. }
  425. if(fabs(mx - dx1 - dx2 - dx3 -dx4 - dx5) > 0.1)
  426. {
  427. std::cout<<" no solve"<<std::endl;
  428. return;
  429. }
  430. }
  431. else
  432. {
  433. dx3 = (y - dy2 - dy4 - k1 * thetax)/(k3 - k1);
  434. dy3 = k3 * dx3;
  435. dx1 = thetax - dx3;
  436. dy1 = k1 * dx1;
  437. }
  438. if((dx3<-0.1) || (dx1<-0.1))
  439. {
  440. if((dx1>0.5)&&(bFirstCalc))
  441. {
  442. double x_b = mx - mfLastDirectDis;
  443. double y_b = y - 0;
  444. double k = tan(fabs(mhdg));
  445. double C = (2 * mfRaidus - dy2fix + k * x_b - y_b )/(2*mfRaidus);
  446. double a = 1 +k*k;
  447. double b = 2*k*C *(-1.0);
  448. double c = C*C-1;
  449. double d = b*b - 4*a*c;
  450. if(d >= 0)
  451. {
  452. double xr1,xr2;
  453. xr1 = (-b + sqrt(d))/(2*a);
  454. xr2 = (-b - sqrt(d))/(2*a);
  455. double fa = 0;
  456. if((xr1>=0)&&(xr1<1))
  457. {
  458. fa = asin(xr1);
  459. }
  460. else
  461. {
  462. if((xr2>=0)&&(xr2<1))
  463. {
  464. fa = asin(xr2);
  465. }
  466. }
  467. if((fa>0.001) && (fa<mfMaxAngle))
  468. {
  469. fang = fa;
  470. bFirstCalc = false;
  471. goto TwoCalc;
  472. }
  473. }
  474. }
  475. else
  476. {
  477. if(cos(fabs(mhdg))> 0.001)
  478. {
  479. double fR = y/(1 - cos(fabs(mhdg)));
  480. double Rx = mx - fR*sin(fabs(mhdg));
  481. if((Rx>0.3) && (fR >= mfRaidus))
  482. {
  483. std::cout<<" Have One Step soluton."<<std::endl;
  484. mSideParkType = SideParkType::TwoStep;
  485. mvectorWheel.push_back((-1.0*mfMaxWheel * mfRaidus/fR));
  486. mvectorWheel.push_back(0.0);
  487. double flen1,flen2;
  488. flen2 = Rx;
  489. flen1 = fR*fabs(mhdg);
  490. mvectorlen.push_back(flen1);
  491. mvectorlen.push_back(flen2);
  492. mfTotalLen = flen1 + flen2;
  493. mvectorpoint.push_back(iv::SideParkPoint(Rx,0,0));
  494. std::cout<<" Have One Step soluton."<<std::endl;
  495. }
  496. }
  497. }
  498. }
  499. else
  500. {
  501. mSideParkType = SideParkType::FiveStep;
  502. mvectorWheel.push_back(0.0);
  503. mvectorWheel.push_back(mfMaxWheel * (1.0));
  504. mvectorWheel.push_back(0.0);
  505. mvectorWheel.push_back(mfMaxWheel *(-1.0));
  506. mvectorWheel.push_back(0.0);
  507. double x1,x2,y1,y2,x3,y3,x4,y4,hdg1,hdg2,hdg3,hdg4,flen1,flen2,flen3,flen4,flen5;
  508. x4 = dx5;y4 = dy5 * (-1.0);hdg4 = 0;flen5 = x4;
  509. x3 = x4 + dx4;y3 = y4 - dy4;hdg3 = fang * (-1.0);flen4 = fabs(fang) *mfRaidus;
  510. hdg2 = hdg3;
  511. if(dx3>0.1)
  512. {
  513. x2 = x3 + dx3;y2 = y3 - dy3;
  514. flen3 = sqrt(pow(x2 - x3,2) + pow(y2 - y3,2));
  515. }
  516. else
  517. {
  518. x2 = x3;y2 = y3;flen3 = 0;
  519. }
  520. flen2 = mfRaidus * (fang + mhdg);
  521. x1 = mx - dx1;
  522. y1 = my + dy1;
  523. hdg1 = mhdg;
  524. flen1 = sqrt(pow(dx1,2) + pow(dy1,2));
  525. mvectorlen.push_back(flen1);
  526. mvectorlen.push_back(flen2);
  527. mvectorlen.push_back(flen3);
  528. mvectorlen.push_back(flen4);
  529. mvectorlen.push_back(flen5);
  530. mfTotalLen = flen1 + flen2 + flen3 + flen4 + flen5;
  531. mvectorpoint.push_back(iv::SideParkPoint(x1,y1,hdg1));
  532. mvectorpoint.push_back(iv::SideParkPoint(x2,y2,hdg2));
  533. mvectorpoint.push_back(iv::SideParkPoint(x3,y3,hdg3));
  534. mvectorpoint.push_back(iv::SideParkPoint(x4,y4,hdg4));
  535. std::cout<<" have compute."<<std::endl;
  536. }
  537. std::cout<<" compute. "<<std::endl;
  538. }
  539. void SideParkCalc::normalhdg(double & fhdg)
  540. {
  541. while(fhdg > M_PI)fhdg = fhdg - 2.0*M_PI;
  542. while(fhdg <= (-M_PI))fhdg = fhdg + 2.0*M_PI;
  543. }
  544. SideParkType SideParkCalc::GetSolution(std::vector<iv::SideParkPoint> & xvectorpoint,std::vector<double> & xvectorWheel,std::vector<double> & xvectorlen,double & fTotalLen)
  545. {
  546. if(mSideParkType == SideParkType::NoSolution)
  547. {
  548. return SideParkType::NoSolution;
  549. }
  550. xvectorpoint = mvectorpoint;
  551. xvectorWheel = mvectorWheel;
  552. xvectorlen = mvectorlen;
  553. fTotalLen = mfTotalLen;
  554. return mSideParkType;
  555. }