car_status_data.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. #include "all_head.h"
  2. #include "p900.h"
  3. extern iv::Ivlog * givlog;
  4. extern iv::Ivfault *gfault;
  5. #define PI 3.14159265358979
  6. VehicleStatus front_car;
  7. //CarStatusData::CarStatusData(const char * strmap)
  8. //{
  9. // givlog->debug("GPS","[%s] map: %s",__func__,strmap);
  10. // qDebug()<<"map"<<strmap;
  11. //
  12. //}
  13. /**
  14. * @brief GaussProjCal
  15. * @param lon
  16. * @param lat
  17. * @param X
  18. * @param Y
  19. * iv::GPSData data(new iv::GPS_INS);
  20. * GaussProjCal(data->gps_lng, data->gps_lat, &data->gps_x, &data->gps_y);
  21. */
  22. void CarStatusData::GaussProjCal(double lon, double lat, double *X, double *Y)
  23. {
  24. // 1975 年国际椭球体长半轴 a, 第一离心率 e2, 第二离心率 ep2
  25. double a = 6378140.0;
  26. double e2 = 0.006694384999588;
  27. double ep2 = e2/(1-e2);
  28. // 原点所在经度
  29. double lon_origin = 6.0*int(lon/6) + 3.0;
  30. lon_origin *= PI / 180.0;
  31. double k0 = 0.9996;
  32. // 角度转弧度
  33. double lat1 = lat * PI / 180.0;
  34. double lon1 = lon * PI / 180.0;
  35. // 经线在该点处的曲率半径,
  36. double N = a / sqrt(1 - e2*sin(lat1)*sin(lat1));
  37. // 赤道到该点的经线长度近似值 M, 使用泰勒展开逐项积分然后取前四项.
  38. // 这个近似值是将 N 作为纬度 \phi 的函数展开为泰勒计数, 然后在区间 [0, lat1] 上积分得到的.
  39. // 首先计算前四项的系数 a1~a4.
  40. double a1 = 1 - e2/4 - (3*e2*e2)/64 - (5*e2*e2*e2)/256;
  41. double a2 = (3*e2)/8 + (3*e2*e2)/32 + (45*e2*e2*e2)/1024;
  42. double a3 = (15*e2*e2)/256 + (45*e2*e2*e2)/1024;
  43. double a4 = (35*e2*e2*e2)/3072;
  44. double M = a * (a1*lat1 - a2*sin(2*lat1) + a3*sin(4*lat1) - a4*sin(6*lat1));
  45. // 辅助量
  46. double T = tan(lat1)*tan(lat1);
  47. double C = ep2*cos(lat1)*cos(lat1);
  48. double A = (lon1 - lon_origin)*cos(lat1);
  49. *X = 500000.0 + k0 * N * (A + (1 - T + C)*(A*A*A)/6 + (5 - 18*T + T*T + 72*C - 58*ep2)*(A*A*A*A*A)/120);
  50. *Y = M + N * tan(lat1) * ((A*A)/2 +
  51. (5 - T + 9*C + 4*C*C)*(A*A*A*A)/24 +
  52. (61 - 58*T + T*T + 600*C - 330*ep2)*(A*A*A*A*A*A)/720);
  53. *Y *= k0;
  54. return;
  55. }
  56. bool CarStatusData::loadMapFromFile(std::string fileName)
  57. {
  58. std::ifstream fis(fileName);//获取文件
  59. std::string line;
  60. std::vector<std::string> des;
  61. givlog->debug("map","[%s] load map start: %s",__func__, fileName.data());
  62. if (fis.is_open() == false)
  63. {
  64. givlog->error("map","[%s]open map faile",__func__);
  65. return false;
  66. }
  67. try {
  68. navigation_data.clear();
  69. while (std::getline(fis, line)) {//开始一行一行的读数据
  70. boost::split(des, line, boost::is_any_of("\t"));
  71. if (des.size() < 10){
  72. throw "error";
  73. }
  74. iv::GPSData data(new iv::GPS_INS);
  75. data->index = atoi(des[0].c_str());
  76. data->gps_lng = atof(des[1].c_str());
  77. data->gps_lat = atof(des[2].c_str());
  78. data->speed_mode = atoi(des[3].c_str());
  79. data->mode2 = atoi(des[4].c_str());
  80. data->ins_heading_angle = atof(des[5].c_str());
  81. data->runMode = atoi(des[6].c_str());
  82. data->roadMode = atoi(des[7].c_str());
  83. data->roadSum = atoi(des[8].c_str());
  84. data->roadOri = atoi(des[9].c_str());
  85. GaussProjCal(data->gps_lng, data->gps_lat, &data->gps_x, &data->gps_y);
  86. if(data->roadMode==4){
  87. data->ins_heading_angle=data->ins_heading_angle+180;
  88. if(data->ins_heading_angle>=360)
  89. data->ins_heading_angle=data->ins_heading_angle-360;
  90. }
  91. navigation_data.push_back(data);
  92. }
  93. }
  94. catch (...) {
  95. fis.close();
  96. givlog->error("map","[%s] load fail,size error",__func__);
  97. return false;
  98. }
  99. givlog->info("map","[%s] load map success: %s",__func__, fileName.data());
  100. fis.close();
  101. mcurrent_index = 0;
  102. return true;
  103. }
  104. double CarStatusData::GetDistance(iv::GPS_INS p1, iv::GPS_INS p2)
  105. {
  106. return sqrt((p1.gps_x - p2.gps_x) * (p1.gps_x - p2.gps_x) + (p1.gps_y - p2.gps_y) * (p1.gps_y - p2.gps_y));
  107. }
  108. int CarStatusData::getNearestPointIndex(iv::GPS_INS rp, const std::vector<iv::GPSData> gpsMap)
  109. {
  110. int index = -1;
  111. double mindis = 40;
  112. int startIndex = 0; // startIndex = 0 则每一次都是遍历整条地图路线
  113. int endIndex = gpsMap.size() - 1;
  114. for (int j = startIndex; j < endIndex; j++)
  115. {
  116. int i = (j + gpsMap.size()) % gpsMap.size();
  117. double tmpdis = GetDistance(rp, (*gpsMap[i]));
  118. if (tmpdis < mindis )
  119. // if (tmpdis < mindis && (abs(rp.ins_heading_angle - (*gpsMap[i]).ins_heading_angle) < 80
  120. // || abs(rp.ins_heading_angle - (*gpsMap[i]).ins_heading_angle - 360) < 80
  121. // || abs(rp.ins_heading_angle - (*gpsMap[i]).ins_heading_angle + 360) < 80)
  122. // )
  123. {
  124. index = i;
  125. mindis = tmpdis;
  126. }
  127. }
  128. /*if (index == -1) {
  129. index = 0;
  130. }*/
  131. mcurrent_index = index;
  132. return index;
  133. }
  134. //void iv::CarStatus::getMapFromFile()
  135. //{
  136. //}
  137. uint16_t CarStatusData::getRate()
  138. {
  139. uint16_t rate;
  140. int max_index = 0;
  141. mmutex.lock();
  142. max_index = navigation_data.size();
  143. mmutex.unlock();
  144. rate = qRound(((double)(mcurrent_index)/(double)(max_index))*10000);
  145. givlog->verbose("sendData","[%s]max_index %d current_index %d,rate:%d",__func__, max_index, mcurrent_index,rate);
  146. return rate;
  147. }
  148. //return: cm
  149. uint16_t CarStatusData::getDis()
  150. {
  151. return mcurrent_index;
  152. }
  153. void CarStatusData::genrateCurrentGPSINS(iv::gps::gpsimu _proto_gpsimu)
  154. {
  155. mcurrent_GPS_INS.index = 0;
  156. mcurrent_GPS_INS.gps_lng = _proto_gpsimu.lon();
  157. mcurrent_GPS_INS.gps_lat = _proto_gpsimu.lat();
  158. mcurrent_GPS_INS.ins_heading_angle = _proto_gpsimu.heading();
  159. GaussProjCal(mcurrent_GPS_INS.gps_lng, mcurrent_GPS_INS.gps_lat, &mcurrent_GPS_INS.gps_x, &mcurrent_GPS_INS.gps_y);
  160. // if(mcurrent_GPS_INS->roadMode==4){
  161. // data->ins_heading_angle=data->ins_heading_angle+180;
  162. // if(data->ins_heading_angle>=360)
  163. // data->ins_heading_angle=data->ins_heading_angle-360;
  164. }
  165. void CarStatusData::frameDataInit(uint8_t _car_id)
  166. {
  167. memset(&mcar_state_frame, 0, 25);
  168. mcar_state_frame.frame.car_id = _car_id;
  169. mcar_state_frame.frame.head1 = 0xAA;
  170. mcar_state_frame.frame.head2 = 0x16;
  171. mcar_state_frame.frame.length = 0x18;
  172. mcar_state_frame.frame.map_index = 1;
  173. mcar_state_frame.frame.reserved2 = 0;
  174. mcar_state_frame.frame.reserved3 = 0;
  175. mcar_state_frame.frame.status_flag = 0;
  176. return;
  177. }
  178. QByteArray CarStatusData::fill_frame(iv::gps::gpsimu _proto_gpsimu)
  179. {
  180. QByteArray _send_data;
  181. // uint8_t car_id;
  182. int32_t lat,lon;
  183. int16_t head, speed, rate, dis,desired_speed;
  184. genrateCurrentGPSINS(_proto_gpsimu);
  185. mmutex.lock();
  186. getNearestPointIndex(mcurrent_GPS_INS,navigation_data);
  187. mmutex.unlock();
  188. lat = _proto_gpsimu.lat()*10000000;
  189. lon = _proto_gpsimu.lon()*10000000;
  190. speed = qRound(qSqrt(qPow(_proto_gpsimu.ve(),2)+qPow(_proto_gpsimu.vn(),2))*36);
  191. head = qRound(_proto_gpsimu.heading());
  192. rate = getRate();
  193. dis = getDis();
  194. givlog->verbose("sendData","[%s] lat:%d lon:%d speed:%d head:%d rate:%d dis:%d ",__func__, lat, lon, speed, head, rate, dis);
  195. if(CAR_TYPE==1)
  196. {
  197. front_car.vehicleSpeed=speed;
  198. front_car.vehicleProcess=rate;
  199. front_car.vehicleDistance=dis;
  200. desired_speed=back_car.vehicleDesiredSpeed;
  201. }else if(CAR_TYPE==2)
  202. {
  203. back_car.vehicleSpeed=speed;
  204. back_car.vehicleProcess=rate;
  205. back_car.vehicleDistance=dis;
  206. desired_speed=40; //用不到
  207. }
  208. mcar_state_frame.frame.lat1 = (lat & 0xFF000000) >> 24;
  209. mcar_state_frame.frame.lat2 = (lat & 0xFF0000) >> 16;
  210. mcar_state_frame.frame.lat3 = (lat & 0xFF00) >> 8;
  211. mcar_state_frame.frame.lat4 = (lat & 0xFF);
  212. mcar_state_frame.frame.lon1 = (lon & 0xFF000000) >> 24;
  213. mcar_state_frame.frame.lon2 = (lon & 0xFF0000) >> 16;
  214. mcar_state_frame.frame.lon3 = (lon & 0xFF00) >> 8;
  215. mcar_state_frame.frame.lon4 = (lon & 0xFF);
  216. mcar_state_frame.frame.speadH = (speed & 0xFF00) >> 8;
  217. mcar_state_frame.frame.speadL = (speed & 0xFF);
  218. mcar_state_frame.frame.posH = (head & 0xFF00) >> 8;
  219. mcar_state_frame.frame.posL = (head & 0xFF);
  220. mcar_state_frame.frame.disH = (dis & 0xFF00) >> 8;
  221. mcar_state_frame.frame.disL = (dis & 0xFF);
  222. mcar_state_frame.frame.rateH = (rate & 0xFF00) >> 8;
  223. mcar_state_frame.frame.rateL = (rate & 0xFF);
  224. mcar_state_frame.frame.reserved2 = (desired_speed & 0xFF00) >> 8;
  225. mcar_state_frame.frame.reserved3 = (desired_speed & 0xFF);
  226. mcar_state_frame.frame.status_flag =1 ;
  227. mcar_state_frame.frame.cksum = calSum(mcar_state_frame);
  228. //设置car status flag
  229. // mcar_state_frame.frame.status_flag = ;
  230. _send_data = initToQByteArray(mcar_state_frame.byte,25);
  231. return _send_data;
  232. }
  233. uint8_t CarStatusData::calSum(car_to_server_data _data)
  234. {
  235. uint8_t sum = 0;
  236. uint64_t sums = 0;
  237. for(int i = 0; i < 24; i++)
  238. {
  239. sums = sums + _data.byte[i];
  240. }
  241. sum = sums & 0xFF;
  242. return sum;
  243. }
  244. QByteArray CarStatusData::initToQByteArray(uint8_t _data[], int _len)
  245. {
  246. QByteArray _ba;
  247. _ba.resize(_len);
  248. for(int i = 0; i < _len; i++)
  249. {
  250. _ba[i] = _data[i];
  251. }
  252. return _ba;
  253. }
  254. //此函数作模拟测试使用:
  255. // 从map.txt中获取一个pgs点位作为车的当前位置
  256. QByteArray CarStatusData::test_use_map_gps(int index)
  257. {
  258. QByteArray _send_data;
  259. // uint8_t car_id;
  260. int32_t lat,lon;
  261. uint16_t head, speed, rate, dis;
  262. iv::GPS_INS virtual_gpsST;
  263. _send_data.clear();
  264. if(navigation_data.empty())
  265. return _send_data;
  266. mcurrent_index = index;
  267. virtual_gpsST = *navigation_data[index];
  268. lat = virtual_gpsST.gps_lat*10000000;
  269. lon = virtual_gpsST.gps_lng*10000000;
  270. speed = 100;
  271. head = qRound(virtual_gpsST.ins_heading_angle);
  272. rate = getRate();
  273. dis = getDis();
  274. mcar_state_frame.frame.lat1 = (lat & 0xFF000000) >> 24;
  275. mcar_state_frame.frame.lat2 = (lat & 0xFF0000) >> 16;
  276. mcar_state_frame.frame.lat3 = (lat & 0xFF00) >> 8;
  277. mcar_state_frame.frame.lat4 = (lat & 0xFF);
  278. mcar_state_frame.frame.lon1 = (lon & 0xFF000000) >> 24;
  279. mcar_state_frame.frame.lon1 = (lon & 0xFF0000) >> 16;
  280. mcar_state_frame.frame.lon1 = (lon & 0xFF00) >> 8;
  281. mcar_state_frame.frame.lon1 = (lon & 0xFF);
  282. mcar_state_frame.frame.speadH = (speed & 0xFF00) >> 8;
  283. mcar_state_frame.frame.speadL = (speed & 0xFF);
  284. mcar_state_frame.frame.posH = (head & 0xFF00) >> 8;
  285. mcar_state_frame.frame.posL = (head & 0xFF);
  286. mcar_state_frame.frame.disH = (dis & 0xFF00) >> 8;
  287. mcar_state_frame.frame.disL = (dis & 0xFF);
  288. mcar_state_frame.frame.rateH = (rate & 0xFF00) >> 8;
  289. mcar_state_frame.frame.rateL = (rate & 0xFF);
  290. mcar_state_frame.frame.cksum = calSum(mcar_state_frame);
  291. _send_data = initToQByteArray(mcar_state_frame.byte,25);
  292. givlog->debug("sendData","rate:%d index:%d,mcurrent index:%d",rate,index, mcurrent_index);
  293. // qDebug("virtual send test");
  294. // qDebug()<<_send_data.toHex();
  295. return _send_data;
  296. }