mainwindow.cpp 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670
  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. iv::Ivlog *givlog;
  4. unsigned int gv2xEn = false;
  5. void ListenV2xStEn(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname)
  6. {
  7. // if(nSize < sizeof(iv::v2x::v2xStEn))
  8. // {
  9. // givlog->error("v2x","ListenV2xStEn size error %d",nSize,sizeof(iv::v2x::v2xStEn));
  10. // return;
  11. // }
  12. iv::v2x::v2xStEn xv2xStEnMsg;
  13. if(!xv2xStEnMsg.ParseFromArray(strdata,nSize))
  14. {
  15. givlog->error("iv::v2x::v2xStEn::ListenV2xStEn parse error");
  16. return;
  17. }
  18. gv2xEn = xv2xStEnMsg.v2xsten();
  19. givlog->info("v2x", "v2x enable st: %d", gv2xEn);
  20. }
  21. MainWindow::MainWindow(QWidget *parent) :
  22. QMainWindow(parent),
  23. ui(new Ui::MainWindow)
  24. {
  25. ui->setupUi(this);
  26. //Start Get init param
  27. QString strpath = QCoreApplication::applicationDirPath();
  28. qDebug()<<strpath;
  29. strpath = strpath + "/v2xTcpClient.xml";
  30. iv::xmlparam::Xmlparam xp(strpath.toStdString());
  31. std::string strCarVIN = xp.GetParam("carVIN","catarc001");
  32. mscarID = QString::fromStdString(strCarVIN);
  33. std::string strHostIP = xp.GetParam("hostIP","47.95.196.28");
  34. std::string strHostPort = xp.GetParam("hostPort","12123");
  35. std::string strStationCount = xp.GetParam("stationCount","20");
  36. int count = std::stoi(strStationCount,nullptr,10);
  37. StationGps location;
  38. for(int i = 0; i < count; i++)
  39. {
  40. std::string strLatName = "lat" + std::to_string(i);
  41. std::string strLonName = "lon" + std::to_string(i);
  42. std::string strLatValue = xp.GetParam(strLatName,"0");
  43. std::string strLonValue = xp.GetParam(strLonName,"0");
  44. location.lat = std::stod(strLatValue,0);
  45. location.lon = std::stod(strLonValue,0);
  46. std::cout<<strLatName<<strLonName<<" lat:"<<strLatValue<<" lon:"<<strLonValue<<location.lat<<" "<<location.lon<<std::endl;
  47. mstationGps.append(location);
  48. }//END get init param
  49. socket=new QTcpSocket();
  50. ui->lineEdit_ip->setText(QString::fromStdString(strHostIP));
  51. ui->lineEdit_port->setText(QString::fromStdString(strHostPort));
  52. ui->pushButton_connect->setEnabled(false);
  53. givlog = new iv::Ivlog("v2x");
  54. connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);
  55. connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);
  56. /* ShareMemory Register BEGIN */
  57. //ShareMem: v2x
  58. mpMemV2xSend = iv::modulecomm::RegisterSend("v2x",1000,3);
  59. //ShareMem: v2x使能状态
  60. iv::modulecomm::RegisterRecv("v2xStEn", ListenV2xStEn);
  61. //ShareMem: v2x使能状态请求
  62. mpMemV2xStSend = iv::modulecomm::RegisterSend("v2xStReq",1000,1);
  63. //ShareMem: 车辆地盘状态
  64. ModuleFun funchassis =std::bind(&MainWindow::UpdateChassis,this,std::placeholders::_1,\
  65. std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,\
  66. std::placeholders::_5);
  67. mpMemchassis = iv::modulecomm::RegisterRecvPlus("chassis",funchassis);
  68. //ShareMem: gps
  69. ModuleFun fungpsimu =std::bind(&MainWindow::UpdateGPSIMU,this,std::placeholders::_1, \
  70. std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
  71. mpMemGps = iv::modulecomm::RegisterRecvPlus("hcp2_gpsimu",fungpsimu);
  72. ModuleFun funlidarObs =std::bind(&MainWindow::UpdateLidarObs,this,std::placeholders::_1, \
  73. std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
  74. mpMemLidarObs = iv::modulecomm::RegisterRecvPlus("lidar_track",funlidarObs);
  75. ModuleFun funRadarObs =std::bind(&MainWindow::UpdateRadarObs,this,std::placeholders::_1, \
  76. std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
  77. mpMemRadarObs = iv::modulecomm::RegisterRecvPlus("radar",funRadarObs);
  78. /* ShareMemory Register END */
  79. shareV2xStReqMsg();
  80. //heart beat,jiaolili,20210207
  81. m_bEnablePlatform=false;
  82. m_bIsConnect=false;
  83. m_iHeartbeatCount=0;
  84. QTimer *timer = new QTimer(this);
  85. connect(timer,SIGNAL(timeout()),SLOT(heartBeat()));
  86. timer->start(200);
  87. ///////////////////////////////////////////
  88. }
  89. MainWindow::~MainWindow()
  90. {
  91. delete this->socket;
  92. delete ui;
  93. }
  94. void MainWindow::heartBeat()
  95. {
  96. if(gv2xEn) {
  97. if(!m_bEnablePlatform) {
  98. connectPlatform();
  99. }
  100. if(m_bIsConnect) {
  101. upDataStream();
  102. } else {
  103. connectPlatform();
  104. }
  105. } else {
  106. if(m_bEnablePlatform) {
  107. disconnectPlatform();
  108. }
  109. }
  110. m_bEnablePlatform = gv2xEn;
  111. }
  112. void MainWindow::upDataStream()
  113. {
  114. m_iHeartbeatCount++;
  115. if(m_iHeartbeatCount%4==0) {
  116. upVehicleStatus();
  117. return;
  118. }
  119. if(m_iHeartbeatCount%4==1) {
  120. upHardwareStatus();
  121. return;
  122. }
  123. if(m_iHeartbeatCount%4==2) {
  124. upObstacleDataStatus();
  125. return;
  126. }
  127. if(m_iHeartbeatCount%4==3) {
  128. upSoftwareStatus();
  129. return;
  130. }
  131. }
  132. void MainWindow::socket_Read_Data()
  133. {
  134. QByteArray buffer;
  135. //读取缓冲区数据
  136. buffer = socket->readAll();
  137. if(!buffer.isEmpty())
  138. {
  139. //QString str = QString::fromLocal8Bit(buffer);
  140. QString str = QString(buffer);
  141. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  142. QStringList list = str.split(",");
  143. int length=list.size();
  144. // if(str.contains("FFCC")) {
  145. // QString len=QString::number(length);
  146. // ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  147. // ui->textEdit_messages->insertPlainText("服务器消息:"+len+"\n");
  148. // }
  149. if(length>=4) {
  150. if(checkVehicle(list[2])) {
  151. ui->textEdit_messages->insertPlainText("服务器消息:"+str+"\n");
  152. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is ok!\n");
  153. int downstream_id =getDownStreamId(list[0]);
  154. switch (downstream_id) {
  155. case StopCommand:
  156. ProStopCommand(list[3]);
  157. break;
  158. case AutoPilotControl:
  159. if(length>4) {
  160. ProAutoPilotControl(list);
  161. }
  162. break;
  163. case StationCommand:
  164. ProStationCommand(list[3]);
  165. break;
  166. default:
  167. break;
  168. }
  169. } else {
  170. ui->textEdit_messages->insertPlainText("服务器消息:vehicle id is wrong!\n");
  171. }
  172. }
  173. }
  174. }
  175. //云平台急停指令
  176. void MainWindow::ProStopCommand(QString str)
  177. {
  178. int tmp;
  179. iv::v2x::v2x msgV2xProto;
  180. msgV2xProto.Clear();
  181. QStringList list=str.split("]");
  182. if(list.size()>0) {
  183. tmp = list[0].toInt();
  184. if(tmp==0) {
  185. msgV2xProto.set_emergencystop(0);
  186. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop cancel!\n");
  187. shareV2xProtoMsg(msgV2xProto);
  188. }
  189. else if(tmp==1) {
  190. msgV2xProto.set_emergencystop(1);
  191. ui->textEdit_messages->insertPlainText("服务器消息:vehicle emergency stop enable!\n");
  192. shareV2xProtoMsg(msgV2xProto);
  193. }
  194. }
  195. }
  196. //云平台工作模式&坐标索引指令
  197. void MainWindow::ProAutoPilotControl(QStringList list)
  198. {
  199. iv::v2x::v2x msgV2xProto;
  200. iv::v2x::stationsGPS *stGps;
  201. msgV2xProto.Clear();
  202. int tmp = list[3].toInt();
  203. int length=list.size();
  204. int stationId;
  205. if(tmp==1) {
  206. msgV2xProto.set_carmode(1);
  207. if(length>5) {
  208. QStringList tmp_list0=list[4].split("[");
  209. list[4]=tmp_list0[1];
  210. QStringList tmp_list1=list[length-1].split("]]");
  211. list[length-1]=tmp_list1[0];
  212. for(int i=4;i<length;i++) {
  213. stationId = list[i].toInt() - 1;
  214. msgV2xProto.add_stationid(stationId);
  215. stGps=msgV2xProto.add_stgps();
  216. stGps->set_lat(mstationGps.at(stationId).lat);
  217. stGps->set_lon(mstationGps.at(stationId).lon);
  218. ui->textEdit_messages->insertPlainText("服务器消息:car station has "+list[i]+"\n");
  219. }
  220. } else {
  221. ui->textEdit_messages->insertPlainText("服务器消息:car station at least 2!\n");
  222. }
  223. } else {
  224. msgV2xProto.set_carmode(0);
  225. ui->textEdit_messages->insertPlainText("服务器消息:car autoDrive mode cancle!\n");
  226. }
  227. shareV2xProtoMsg(msgV2xProto);
  228. }
  229. //云平台站点停止指令
  230. void MainWindow::ProStationCommand(QString str)
  231. {
  232. int tmp;
  233. iv::v2x::v2x msgV2xProto;
  234. msgV2xProto.Clear();
  235. QStringList list=str.split("]");
  236. if(list.size()>0) {
  237. tmp = list[0].toInt();
  238. if(tmp==0) {
  239. msgV2xProto.set_stationstop(1);//站点启动
  240. shareV2xProtoMsg(msgV2xProto);
  241. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station start!\n");
  242. }
  243. else if(tmp==1) {
  244. msgV2xProto.set_stationstop(0);//下一站停车
  245. shareV2xProtoMsg(msgV2xProto);
  246. ui->textEdit_messages->insertPlainText("服务器消息:vehicle station top!\n");
  247. }
  248. }
  249. }
  250. bool MainWindow::checkVehicle(QString str)
  251. {
  252. return true;
  253. }
  254. int MainWindow::getDownStreamId(QString str)
  255. {
  256. int downstream_id=-1;
  257. if(str.contains("FFAA")) {
  258. ui->textEdit_messages->insertPlainText("服务器消息:StopCommand!\n");
  259. downstream_id=1;
  260. return downstream_id;
  261. }
  262. if(str.contains("FFCC")) {
  263. ui->textEdit_messages->insertPlainText("服务器消息:AutoPilotControl!\n");
  264. downstream_id=2;
  265. return downstream_id;
  266. }
  267. if(str.contains("FFBB")) {
  268. ui->textEdit_messages->insertPlainText("服务器消息:StationCommand!\n");
  269. downstream_id=3;
  270. return downstream_id;
  271. }
  272. return downstream_id;
  273. }
  274. void MainWindow::socket_Disconnected()
  275. {
  276. //修改按键文字
  277. ui->pushButton_connect->setText("connect");
  278. ui->textEdit_messages->insertPlainText("服务器消息:Disconnected");
  279. }
  280. void MainWindow::connectPlatform()
  281. {
  282. QString IP;
  283. int port;
  284. //获取IP地址
  285. IP = ui->lineEdit_ip->text();
  286. //获取端口号
  287. port = ui->lineEdit_port->text().toInt();
  288. ui->textEdit_messages->setText("");
  289. ui->textEdit_messages->insertPlainText("正在连接"+ui->lineEdit_ip->text()+":"+ui->lineEdit_port->text()+"\n");
  290. //取消已有的连接
  291. socket->abort();
  292. //连接服务器
  293. socket->connectToHost(IP, port);
  294. //等待连接成功
  295. if(!socket->waitForConnected(30000)) {
  296. ui->textEdit_messages->insertPlainText("连接失败\n");
  297. return;
  298. }
  299. m_bIsConnect = true;
  300. ui->textEdit_messages->insertPlainText("连接成功\n");
  301. //修改按键文字
  302. ui->pushButton_connect->setText("disconnect");
  303. }
  304. void MainWindow::disconnectPlatform()
  305. {
  306. //断开连接
  307. ui->textEdit_messages->setText("断开连接\n");
  308. socket->disconnectFromHost();
  309. //修改按键文字
  310. ui->pushButton_connect->setText("connect");
  311. m_bIsConnect=false;
  312. }
  313. void MainWindow::on_pushButton_connect_clicked()
  314. {
  315. if(ui->pushButton_connect->text() == tr("connect"))
  316. {
  317. QString IP;
  318. int port;
  319. //获取IP地址
  320. IP = ui->lineEdit_ip->text();
  321. //获取端口号
  322. port = ui->lineEdit_port->text().toInt();
  323. ui->textEdit_messages->setText("");
  324. ui->textEdit_messages->insertPlainText("正在连接"+ui->lineEdit_ip->text()+":"+ui->lineEdit_port->text()+"\n");
  325. //取消已有的连接
  326. socket->abort();
  327. //连接服务器
  328. socket->connectToHost(IP, port);
  329. //等待连接成功
  330. if(!socket->waitForConnected(30000))
  331. {
  332. QMessageBox::warning(this,tr("消息"),tr("连接失败!请重新连接"),QMessageBox::Yes);
  333. ui->textEdit_messages->insertPlainText("连接失败\n");
  334. return;
  335. }
  336. ui->textEdit_messages->insertPlainText("连接成功\n");
  337. QMessageBox::information(this,tr("消息"),tr("连接成功"),QMessageBox::Yes);
  338. //修改按键文字
  339. ui->pushButton_connect->setText("disconnect");
  340. }
  341. else
  342. {
  343. //断开连接
  344. ui->textEdit_messages->setText("断开连接\n");
  345. socket->disconnectFromHost();
  346. //修改按键文字
  347. ui->pushButton_connect->setText("connect");
  348. }
  349. }
  350. void MainWindow::on_textEdit_messages_textChanged()
  351. {
  352. ui->textEdit_messages->moveCursor(QTextCursor::End);
  353. }
  354. QString MainWindow::getTimeStamp()
  355. {
  356. QDateTime time = QDateTime::currentDateTime();
  357. int current_timestamp=time.toTime_t();
  358. QString str=QString::number(current_timestamp);
  359. return str;
  360. }
  361. void MainWindow::shareV2xProtoMsg(iv::v2x::v2x msgV2xProto)
  362. {
  363. int nsize = msgV2xProto.ByteSize();
  364. char * strdata = new char[msgV2xProto.ByteSize()];
  365. if(msgV2xProto.SerializePartialToArray(strdata,nsize))
  366. {
  367. iv::modulecomm::ModuleSendMsg(mpMemV2xSend,strdata,nsize);
  368. }
  369. givlog->info("v2x","share v2x controll Msg");
  370. delete strdata;
  371. }
  372. //请求v2状态,是否接收v2x的控制,由ui发送
  373. void MainWindow::shareV2xStReqMsg()
  374. {
  375. iv::v2x::v2xStReq x;
  376. x.set_v2xstreq(1);
  377. int nsize = x.ByteSize();
  378. char * str = new char[nsize];
  379. if(x.SerializeToArray(str,nsize))
  380. {
  381. iv::modulecomm::ModuleSendMsg(mpMemV2xStSend,str,nsize);
  382. }
  383. else
  384. {
  385. givlog->error("v2x","send require error");
  386. }
  387. givlog->info("v2x","send st req");
  388. delete str;
  389. }
  390. void MainWindow::upVehicleStatus()
  391. {
  392. QString time_stamp=getTimeStamp();
  393. QString test="['CCFF',"+time_stamp+",'"+mscarID+"',"+QString::number(micarMode)+","+QString::number(mfspeed)+","+ \
  394. QString::number(mfsteerAngle)+","+ QString::number(miSOC)+","+ QString::number(micarError)+","+ \
  395. QString::number(mierrorNum)+","+QString::number(mflon)+","+ QString::number(mflat)+","+ \
  396. QString::number(mfheading)+"]";
  397. //QByteArray bytes = test.toUtf8();
  398. QByteArray bytes = test.toLatin1();
  399. socket->write(bytes);
  400. }
  401. void MainWindow::upHardwareStatus()
  402. {
  403. QString time_stamp=getTimeStamp();
  404. //QString test="['DDFF',"+time_stamp+",[0,0],[0,0],[0,0],[0,0],[0,0],[0,0],[[0,0],[0,0]],[2,0]]";
  405. QString test="['DDFF',"+time_stamp+",["+ \
  406. QString::number(mistRadar)+","+getHardwareType(mistRadar)+"],["+ \
  407. QString::number(mistLidar)+","+getHardwareType(mistLidar)+"],["+ \
  408. QString::number(mistSonic)+","+getHardwareType(mistSonic)+"],["+ \
  409. QString::number(mistCamera)+","+getHardwareType(mistCamera)+"],["+ \
  410. QString::number(mistmic)+","+getHardwareType(mistmic)+"],["+ \
  411. QString::number(mistGPS)+","+getHardwareType(mistGPS)+"],[["+ \
  412. QString::number(mistCanRadar)+","+getHardwareType(mistCanRadar)+"],["+ \
  413. QString::number(mistCanCar)+","+getHardwareType(mistCanCar)+"]],["+ \
  414. "2,0]]";
  415. //QByteArray bytes = test.toUtf8();
  416. QByteArray bytes = test.toLatin1();
  417. socket->write(bytes);
  418. }
  419. QString MainWindow::getHardwareType(int state)
  420. {
  421. QString type;
  422. int iType=-1;
  423. if(state==1) {
  424. iType=11;
  425. } else if(state==0) {
  426. iType=0;
  427. } else {
  428. ui->textEdit_messages->insertPlainText("ModelError消息:Hardware state get error!!!\n");
  429. }
  430. type=QString::number(iType);
  431. return type;
  432. }
  433. void MainWindow::upObstacleDataStatus()
  434. {
  435. QString time_stamp=getTimeStamp();
  436. //QString test="['EEFF',"+time_stamp+",[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]";
  437. QString test="['EEFF',"+time_stamp+ \
  438. getObstacleData(0)+getObstacleData(1)+ \
  439. +"]";
  440. //QByteArray bytes = test.toUtf8();
  441. QByteArray bytes = test.toLatin1();
  442. socket->write(bytes);
  443. }
  444. QString MainWindow::getObstacleData(int type)
  445. {
  446. QString message="";
  447. ObsInfo obs;
  448. int i;
  449. if(type==0) {
  450. for(i=0;i<miRadarObsCount;i++) {
  451. obs=mqRadarObsInfo[i];
  452. message += ",["+QString::number(obs.type)+","+QString::number(obs.lon,'f',9)+","+QString::number(obs.lat,'f',9)+"]";
  453. }
  454. } else if(type==1) {
  455. for(i=0;i<miLidarObsCount;i++) {
  456. obs=mqLidarObsInfo[i];
  457. message += ",["+QString::number(obs.type)+","+QString::number(obs.lon,'f',9)+","+QString::number(obs.lat,'f',9)+"]";
  458. }
  459. } else {
  460. ui->textEdit_messages->insertPlainText("ProcessError消息:Obstacle data type get error!!!\n");
  461. }
  462. ui->textEdit_messages->insertPlainText("Obstacle Message: "+message);
  463. return message;
  464. }
  465. void MainWindow::upSoftwareStatus()
  466. {
  467. QString time_stamp=getTimeStamp();
  468. QString test="['FFFF',"+time_stamp+",[1,10,1,10,1,10,1,10],[0,0,0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0]]";
  469. //QByteArray bytes = test.toUtf8();
  470. QByteArray bytes = test.toLatin1();
  471. socket->write(bytes);
  472. }
  473. void MainWindow::UpdateChassis(const char *strdata, const unsigned int nSize, const unsigned int index, const QDateTime *dt, const char *strmemname)
  474. {
  475. mistCanCar = 0;
  476. iv::chassis xchassis;
  477. static int ncount = 0;
  478. if(!xchassis.ParseFromArray(strdata,nSize))
  479. {
  480. std::cout<<"v2xTcpClient::UpdateChassis ParseFrom Array Error."<<std::endl;
  481. return;
  482. }
  483. if(xchassis.has_drivemode())
  484. {
  485. micarMode = xchassis.drivemode();
  486. }
  487. if(xchassis.has_vel())
  488. mfspeed = xchassis.vel();
  489. if(xchassis.has_angle_feedback())
  490. mfsteerAngle = xchassis.angle_feedback()/870.0*28;
  491. if((xchassis.has_soc()))
  492. {
  493. miSOC = xchassis.soc();
  494. }
  495. }
  496. //接收GPS数据
  497. void MainWindow::UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,\
  498. const QDateTime * dt,const char * strmemname)
  499. {
  500. iv::gps::gpsimu xgpsimu;
  501. if(!xgpsimu.ParseFromArray(strdata,nSize))
  502. {
  503. givlog->warn("ADCIntelligentVehicle::UpdateGPSIMU parse error. nSize is %d",nSize);
  504. return;
  505. }
  506. mflat = xgpsimu.lat();
  507. mflon = xgpsimu.lon();
  508. mfheading = xgpsimu.heading();
  509. mpdata.gps_lat = xgpsimu.lat();
  510. mpdata.gps_lng = xgpsimu.lon();
  511. mpdata.ins_heading_angle = xgpsimu.heading();
  512. mpdata.rtk_status = xgpsimu.rtk_state();
  513. mpdata.ins_status = xgpsimu.ins_state();
  514. mpdata.vel_D = xgpsimu.vd(); //地向速度,单位(米/秒)
  515. mpdata.vel_E = xgpsimu.ve(); //东向速度,单位(米/秒)
  516. mpdata.vel_N = xgpsimu.vn(); //北向速度,单位(米/秒)
  517. // mfspeed = sqrt(pow(data->vel_E,2)+pow(data->vel_N,2)) * 3.6; //double pow(double x, double y) 返回 x 的 y 次幂,即 xy。
  518. mistGPS = 0;
  519. }
  520. int toUnicode(const char* str)
  521. {
  522. return str[0] + (str[1] ? toUnicode(str + 1) : 0);
  523. }
  524. constexpr inline int U(const char* str)
  525. {
  526. return str[0] + (str[1] ? U(str + 1) : 0);
  527. }
  528. int GetTypeString(const char* obsType)
  529. {
  530. switch (toUnicode(obsType))
  531. {
  532. case U("unknown"):
  533. return 0;
  534. case U("car"):
  535. return 1;
  536. case U("bike"):
  537. return 5;
  538. case U("pedestrian"):
  539. return 3;
  540. default:
  541. return 0;
  542. }
  543. }
  544. void MainWindow::UpdateLidarObs(const char * strdata,const unsigned int nSize,const unsigned int index, \
  545. const QDateTime * dt,const char * strmemname)
  546. {
  547. // std::vector<iv::lidar::object> lidarobjvec;
  548. // strtolidarobj(lidarobjvec,strdata,nSize);
  549. mqLidarObsInfo.clear();
  550. iv::lidar::objectarray lidarobjvec;
  551. std::string in;
  552. in.append(strdata,nSize);
  553. lidarobjvec.ParseFromString(in);
  554. givlog->verbose("v2xLidarObs","obj size is %d ",lidarobjvec.obj_size());
  555. miLidarObsCount = lidarobjvec.obj_size();
  556. ObsInfo xobsInfo;
  557. double x,y;
  558. iv::GPS_INS gps_ins;
  559. for(int i = 0; i < miLidarObsCount; i++)
  560. {
  561. x = lidarobjvec.obj(i).centroid().x();
  562. y = lidarobjvec.obj(i).centroid().y();
  563. GaussProjCal(mpdata.gps_lng, mpdata.gps_lat, &mpdata.gps_x, &mpdata.gps_y);
  564. gps_ins = iv::decition::Coordinate_UnTransfer(x, y, mpdata);
  565. GaussProjInvCal(gps_ins.gps_x, gps_ins.gps_y, &gps_ins.gps_lng, &gps_ins.gps_lat);
  566. xobsInfo.lat = gps_ins.gps_lat;
  567. xobsInfo.lon = gps_ins.gps_lng;
  568. std::string str = lidarobjvec.obj(i).type_name();
  569. xobsInfo.type = GetTypeString(str.data());
  570. mqLidarObsInfo.append(xobsInfo);
  571. }
  572. mistLidar = 0;
  573. }
  574. void MainWindow::UpdateRadarObs(const char * strdata,const unsigned int nSize,const unsigned int index, \
  575. const QDateTime * dt,const char * strmemname)
  576. {
  577. mqRadarObsInfo.clear();
  578. static qint64 oldrecvtime;
  579. iv::radar::radarobjectarray xradararray;
  580. if(!xradararray.ParseFromArray(strdata,nSize))
  581. {
  582. givlog->warn("ADCIntelligentVehicle::UpdateRADAR Parse Error.");
  583. return;
  584. }
  585. // gIvlog->verbose("radar time is %ld",QDateTime::currentMSecsSinceEpoch());
  586. if((QDateTime::currentMSecsSinceEpoch() - oldrecvtime)>100)
  587. {
  588. givlog->warn("radar interval is more than 100ms. value is %ld",QDateTime::currentMSecsSinceEpoch() - oldrecvtime);
  589. }
  590. oldrecvtime = QDateTime::currentMSecsSinceEpoch();
  591. miRadarObsCount = xradararray.obj_size();
  592. givlog->verbose("radarobs count %ld",miRadarObsCount);
  593. ObsInfo xobsInfo;
  594. double x,y;
  595. iv::GPS_INS gps_ins;
  596. for(int i = 0; i < miRadarObsCount; i++)
  597. {
  598. x = xradararray.obj(i).x();
  599. y = xradararray.obj(i).y();
  600. GaussProjCal(mpdata.gps_lng, mpdata.gps_lat, &mpdata.gps_x, &mpdata.gps_y);
  601. gps_ins = iv::decition::Coordinate_UnTransfer(x, y, mpdata);
  602. GaussProjInvCal(gps_ins.gps_x, gps_ins.gps_y, &gps_ins.gps_lng, &gps_ins.gps_lat);
  603. xobsInfo.lat = gps_ins.gps_lat;
  604. xobsInfo.lon = gps_ins.gps_lng;
  605. xobsInfo.type = 0;
  606. mqRadarObsInfo.append(xobsInfo);
  607. }
  608. mistRadar = 0;
  609. mistCanRadar = 0;
  610. // mistLidar = 0;
  611. }