dialoglanefromrtk.cpp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. #include "dialoglanefromrtk.h"
  2. #include "ui_dialoglanefromrtk.h"
  3. #include <QFileDialog>
  4. #include "xodrfunc.h"
  5. #include "geofit.h"
  6. extern double glon0 ;
  7. extern double glat0;
  8. DialogLaneFromRTK::DialogLaneFromRTK(Road * pRoad,OpenDrive * pxodr,QWidget *parent) :
  9. QDialog(parent),
  10. ui(new Ui::DialogLaneFromRTK)
  11. {
  12. ui->setupUi(this);
  13. mpRoad = pRoad;
  14. mpxodr = pxodr;
  15. mlon0 = glon0;
  16. mlat0 = glat0;
  17. ui->pushButton_CreateLane->setEnabled(false);
  18. }
  19. DialogLaneFromRTK::~DialogLaneFromRTK()
  20. {
  21. delete ui;
  22. }
  23. void DialogLaneFromRTK::on_pushButton_LoadData_clicked()
  24. {
  25. QString str = QFileDialog::getOpenFileName(this,tr("Open RTK Data"),"",tr("Lane File(*.csv)"));
  26. if(str.isEmpty())return;
  27. QFile xFile;
  28. xFile.setFileName(str);
  29. QFileInfo fi(str);
  30. // QString filename = fi.fileName();
  31. // if(filename.contains(".txt"))
  32. // {
  33. // filename = filename.left(filename.length() -4);
  34. // }
  35. ui->plainTextEdit->clear();
  36. mvectorrtkdata.clear();
  37. ui->plainTextEdit->appendPlainText(QString("Longitude\tLatitude\tHeight\trelx\trely"));
  38. mvectorrtkdata = DialogAddRoadFromRTK::loadrtkdata(str,mlon0,mlat0,mpxodr);
  39. if(mvectorrtkdata.size()>0)
  40. {
  41. unsigned int i;
  42. for(i=0;i<mvectorrtkdata.size();i++)
  43. {
  44. QString strline = QString::number(mvectorrtkdata.at(i).mflon,'f',7) + QString("\t")
  45. +QString::number(mvectorrtkdata.at(i).mflat,'f',7)+QString("\t")
  46. +QString::number(mvectorrtkdata.at(i).mheight,'f',4)+QString("\t")
  47. +QString::number(mvectorrtkdata.at(i).mfrelx,'f',2) + QString("\t")
  48. +QString::number(mvectorrtkdata.at(i).mfrely,'f',2) + QString("\t");
  49. ui->plainTextEdit->appendPlainText(strline);
  50. }
  51. ui->pushButton_CreateLane->setEnabled(true);
  52. }
  53. }
  54. namespace iv {
  55. struct rtklanedis
  56. {
  57. double fdis;
  58. double fhdgdir;
  59. double fs;
  60. double frealdis;
  61. double flanedis;
  62. };
  63. }
  64. void DialogLaneFromRTK::on_pushButton_CreateLane_clicked()
  65. {
  66. unsigned int i;
  67. Road * pRoad = 0;
  68. GeometryBlock * pgeob;
  69. double fdis,nearx,neary,hdg;
  70. double fs;
  71. int nlane;
  72. pRoad = mpRoad;
  73. std::vector<iv::rtklanedis> xvectorrktlanedis;
  74. for(i=0;i<mvectorrtkdata.size();i++)
  75. {
  76. // if(xodrfunc::GetNearPoint(mvectorrtkdata.at(i).mfrelx,mvectorrtkdata.at(i).mfrely,mpxodr,&pRoad,&pgeob,fdis,nearx,neary,hdg,100,&fs,&nlane,true) == 0)
  77. // {
  78. if(xodrfunc::GetNearPointAtRoad(mvectorrtkdata.at(i).mfrelx,mvectorrtkdata.at(i).mfrely,pRoad,&pgeob,fdis,nearx,neary,hdg,100,&fs,&nlane,true) == 0)
  79. {
  80. double fhdgdir = geofit::CalcHdg(nearx,neary,
  81. mvectorrtkdata.at(i).mfrelx,mvectorrtkdata.at(i).mfrely);
  82. fhdgdir = fhdgdir - hdg;
  83. while(fhdgdir<0)fhdgdir = fhdgdir + 2.0*M_PI;
  84. while(fhdgdir>=2.0*M_PI)fhdgdir = fhdgdir - 2.0*M_PI;
  85. iv::rtklanedis xlanedis;
  86. xlanedis.fdis = fdis;
  87. xlanedis.fhdgdir = fhdgdir;
  88. xlanedis.fs = fs;
  89. xvectorrktlanedis.push_back(xlanedis);
  90. qDebug("dis is %f dir is %f",fdis,fhdgdir);
  91. }
  92. }
  93. double favghdg = 0;
  94. if(xvectorrktlanedis.size() < 1)
  95. {
  96. QMessageBox::warning(this,"Warning","Data Error.Maybe these data is not this road.",QMessageBox::YesAll);
  97. return;
  98. }
  99. for(i=0;i<xvectorrktlanedis.size();i++)
  100. {
  101. favghdg = favghdg + xvectorrktlanedis.at(i).fhdgdir;
  102. }
  103. favghdg = favghdg/xvectorrktlanedis.size();
  104. double flanedir = M_PI*3.0/2.0;
  105. bool brightlane = true; //R
  106. int nidmark = -1;
  107. if(favghdg <M_PI)
  108. {
  109. brightlane = false;
  110. flanedir = M_PI/2.0;
  111. nidmark = 1;
  112. }
  113. for(i=0;i<xvectorrktlanedis.size();i++)
  114. {
  115. double fxdis = xvectorrktlanedis.at(i).fdis * cos(xvectorrktlanedis.at(i).fhdgdir - flanedir);
  116. qDebug("dis is %f dir is %f xdis is %f",xvectorrktlanedis.at(i).fdis,
  117. xvectorrktlanedis.at(i).fhdgdir,
  118. fxdis);
  119. xvectorrktlanedis.at(i).frealdis = fxdis;
  120. }
  121. LaneSection * pLS = 0;
  122. if(pRoad->GetLaneSectionCount() == 0)
  123. {
  124. pRoad->AddLaneSection(0);
  125. pLS = pRoad->GetLaneSection(0);
  126. for(i=0;i<xvectorrktlanedis.size();i++)
  127. {
  128. xvectorrktlanedis.at(i).flanedis = xvectorrktlanedis.at(i).frealdis;
  129. }
  130. }
  131. else
  132. {
  133. if(pRoad->GetLaneSectionCount() == 1)pLS = pRoad->GetLaneSection(0);
  134. else
  135. {
  136. unsigned int j;
  137. for(j=0;j<pRoad->GetLaneSectionCount();j++)
  138. {
  139. if(xvectorrktlanedis.at(0).fs>= pRoad->GetLaneSection(j)->GetS())
  140. {
  141. pLS = pRoad->GetLaneSection(j);
  142. break;
  143. }
  144. }
  145. }
  146. for(i=0;i<xvectorrktlanedis.size();i++)
  147. {
  148. if(pLS->GetLaneCount() > 0)
  149. {
  150. unsigned int j;
  151. for(j=0;j<pLS->GetLaneCount();j++)
  152. {
  153. if(pLS->GetLane(j)->GetId() * nidmark > 0)
  154. {
  155. Lane * pLane = pLS->GetLane(j);
  156. LaneWidth * pLaneWidth = 0;
  157. unsigned int k;
  158. for(k=0;k<(pLane->GetLaneWidthCount()-1);k++)
  159. {
  160. if(xvectorrktlanedis.at(i).fs > (pLane->GetLaneWidth(k+1)->GetS()+pLS->GetS()))
  161. {
  162. pLaneWidth = pLane->GetLaneWidth(k);
  163. break;
  164. }
  165. }
  166. if(pLaneWidth == 0)
  167. {
  168. if(pLane->GetLaneWidthCount()>0)
  169. {
  170. pLaneWidth = pLane->GetLaneWidth(0);
  171. }
  172. }
  173. if(pLaneWidth != 0)
  174. {
  175. double fss = xvectorrktlanedis.at(i).fs;
  176. fss = fss - pLS->GetS();
  177. xvectorrktlanedis.at(i).fs = fss;
  178. double fedis = pLaneWidth->GetA() + pLaneWidth->GetB() * fss
  179. +pLaneWidth->GetC()*fss*fss
  180. +pLaneWidth->GetD()*fss*fss*fss;
  181. xvectorrktlanedis.at(i).frealdis = xvectorrktlanedis.at(i).frealdis - fedis;
  182. }
  183. }
  184. }
  185. }
  186. }
  187. }
  188. double favgrealdis = 0;
  189. for(i=0;i<xvectorrktlanedis.size();i++)
  190. {
  191. favgrealdis = favgrealdis + xvectorrktlanedis.at(i).frealdis;
  192. }
  193. if(xvectorrktlanedis.size() > 0)favgrealdis = favgrealdis/xvectorrktlanedis.size();
  194. if(favgrealdis<0.1)
  195. {
  196. char strout[255];
  197. snprintf(strout,255,"lane average width is %f, very small,do you want Create Lane?",favgrealdis);
  198. int nrtn = QMessageBox::warning(this,"Warning",QString(strout),QMessageBox::Yes,QMessageBox::No);
  199. if(nrtn == QMessageBox::No)
  200. {
  201. return;
  202. }
  203. }
  204. Lane * pLane;
  205. if(brightlane)
  206. {
  207. pLS->AddLane(-1,(-1)*(pLS->GetRightLaneCount()+1),"driving",false);
  208. pLane = pLS->GetLastRightLane();
  209. }
  210. else
  211. {
  212. pLS->AddLane(1,(1)*(pLS->GetLeftLaneCount()+1),"driving",false);
  213. pLane = pLS->GetLastLeftLane();
  214. }
  215. int nrange = xvectorrktlanedis.size();
  216. if(nrange == 1)
  217. {
  218. pLane->AddWidthRecord(0,xvectorrktlanedis.at(0).frealdis,0,0,0);
  219. }
  220. else
  221. {
  222. VectorXd x_veh(nrange);
  223. VectorXd y_veh(nrange);
  224. unsigned int j;
  225. for(j=0;j<nrange;j++)
  226. {
  227. x_veh[j] = xvectorrktlanedis.at(j).fs;
  228. y_veh[j] = xvectorrktlanedis.at(j).frealdis;
  229. }
  230. int nnum = 3;
  231. if(nrange<4)nnum = nrange -1;
  232. VectorXd coeffs = polyfit(x_veh, y_veh, nnum);
  233. double a[4];
  234. for(j=0;j<4;j++)a[j] = 0;
  235. for(j=0;j<nnum;j++)a[j] = coeffs[j];
  236. pLane->AddWidthRecord(0,a[0],a[1],a[2],a[3]);
  237. }
  238. ui->pushButton_CreateLane->setEnabled(false);
  239. }