soft_obstacle.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. #include "soft_obstacle.h"
  2. #include "soft_device.h"
  3. #include "string.h"
  4. #include "usart_data_handle.h"
  5. #include "main_task.h"
  6. #include "soft_can.h"
  7. #include "math.h"
  8. #include "stdlib.h"
  9. uavr_obs uavr11_info = {.get_radar_sensi = 50};
  10. uavr_obs uavr12_info= {.get_radar_sensi = 50};
  11. uavr_obs mimo_f_info = {.signal_qulity = 0};
  12. uavr_obs mimo_b_info = {.signal_qulity = 0};
  13. /**
  14. * @file can_recv_mocib_F_obstacle
  15. * @brief 莫之比前避障解析
  16. * @param none
  17. * @details
  18. * @author Zhang Sir
  19. **/
  20. void can_recv_mocib_F_obstacle(uint8_t *data)
  21. {
  22. uavr11_info.distance_x= (data[0] << 8) + data[1] - 32768;
  23. uavr11_info.distance_y = (data[2] << 8) + data[3];
  24. uavr11_info.Link.connect_status = COMP_NORMAL;
  25. uavr11_info.Link.recv_time = HAL_GetTick();
  26. }
  27. /**
  28. * @file can_recv_mocib_B_obstacle
  29. * @brief 莫之比后避障障解析
  30. * @param none
  31. * @details
  32. * @author Zhang Sir
  33. **/
  34. void can_recv_mocib_B_obstacle(uint8_t *data)
  35. {
  36. uavr12_info.distance_x = (data[0] << 8) + data[1] - 32768;
  37. uavr12_info.distance_y = (data[2] << 8) + data[3];
  38. uavr12_info.Link.connect_status = COMP_NORMAL;
  39. uavr12_info.Link.recv_time = HAL_GetTick();
  40. }
  41. /**
  42. * @file can_recv_enzhao_obstacle
  43. * @brief 恩曌单避障解析
  44. * @param none
  45. * @details
  46. * @author Zhang Sir
  47. **/
  48. void can_recv_mimo_signal_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  49. {
  50. uint16_t frame_header = 0;
  51. memcpy(&frame_header,&data[0],2);
  52. if(frame_header == 0x5AA5 && data[2] == 0x04)
  53. {
  54. switch (cellCanID)
  55. {
  56. case CAN_MIMO_FOBS_SIG:
  57. mimo_f_info.distance_y = data[3] + data[4] * 256;
  58. mimo_f_info.signal_qulity = data[5];
  59. mimo_f_info.Link.recv_time = HAL_GetTick();
  60. mimo_f_info.Link.connect_status = COMP_NORMAL;
  61. Dev.Radar.facid_F = FAC_MIMO_RF;
  62. break;
  63. case CAN_MIMO_BOBS_SIG:
  64. mimo_b_info.distance_y = data[3] + data[4] * 256;
  65. mimo_b_info.signal_qulity = data[5];
  66. mimo_b_info.Link.recv_time = HAL_GetTick();
  67. mimo_b_info.Link.connect_status = COMP_NORMAL;
  68. Dev.Radar.facid_B = FAC_MIMO_RB;
  69. break;
  70. default:
  71. break;
  72. }
  73. }
  74. }
  75. mimo_360info mimo360_info[MIMO_360_TotalSect];
  76. mimo_360status mimo360_status = {.get_TotalSect_flag = true};
  77. Connect_check mimo_360_info;
  78. void mimo360_sort(mimo_360info *arr,uint16_t length)
  79. {
  80. if ( length < 2 )
  81. {
  82. return;
  83. }
  84. uint16_t num = 0, num1 = 0;
  85. mimo_360info tmp;
  86. for ( num = length - 1; num >= 1; num-- )
  87. {
  88. for ( num1 = 0; num1 <= num - 1; num1++ )
  89. {
  90. if ( ( ( arr + num1 )->dis0 ) > ( ( arr + num1 + 1 )->dis0 ) )
  91. {
  92. tmp = *( arr + num1 );
  93. *( arr + num1 ) = *( arr + num1 + 1 );
  94. *( arr + num1 + 1 ) = tmp;
  95. }
  96. }
  97. }
  98. }
  99. uint16_t test_index = 0;
  100. uint16_t compelte = 0;
  101. uint8_t radar360_proflag = 0;
  102. mimo_360_cont fmu_360info;
  103. void can_recv_mocib_new360_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  104. {
  105. mimo_360_info.connect_status = COMP_NORMAL;
  106. mimo_360_info.recv_time = HAL_GetTick();
  107. switch (cellCanID)
  108. {
  109. case CAN_360MIMO_1ID:
  110. memcpy(&mimo360_status,&data[0],8);
  111. mimo360_status.index = 0;
  112. if(mimo360_status.nTarget == 0)
  113. {
  114. fmu_360info.total_tar = 0;
  115. memset(&fmu_360info.data[0],0,sizeof(mimo_360_data));
  116. }
  117. break;
  118. case CAN_360MIMO_2ID:
  119. if(mimo360_status.nTarget <= MIMO_360_TotalSect && mimo360_status.nTarget > 0)
  120. {
  121. for(uint8_t i = 0;i < 2;i++)
  122. {
  123. if(i == 0)
  124. {
  125. memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[0],sizeof(mimo_360info));
  126. }
  127. else
  128. {
  129. memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[4],sizeof(mimo_360info));
  130. }
  131. if(mimo360_status.nTarget - 1 == mimo360_status.index && radar360_proflag == 0)
  132. {
  133. //mimo360_sort(&mimo360_info[0],mimo360_status.nTarget);
  134. fmu_360info.TotalSect = mimo360_status.TotalSect;
  135. fmu_360info.total_tar = mimo360_status.nTarget;
  136. for(uint8_t j = 0;j < mimo360_status.nTarget;j++)
  137. {
  138. fmu_360info.data[j].sec_angle = mimo360_info[j].sectId0 * 360 / mimo360_status.TotalSect;
  139. fmu_360info.data[j].distance = mimo360_info[j].dis0 * mimo360_status.RangeRes/100; //cm
  140. fmu_360info.data[j].rcs0 = mimo360_info[j].rcs0;
  141. fmu_360info.data[j].el0 = mimo360_info[j].el0 * 0.5;
  142. }
  143. }
  144. mimo360_status.index++;
  145. }
  146. }
  147. break;
  148. default:
  149. break;
  150. }
  151. }
  152. //避障处理函数, 减少扫地的情况
  153. int Fobs_delay_time = 0;
  154. uint8_t Fobs_angle[3] = {0};
  155. uint8_t Fobs_time = 0;
  156. bool Fobs_handle_function(void)
  157. {
  158. if(planep.lock_status == STA_LOCK)
  159. {
  160. return true;
  161. }
  162. if(terrain_is_link == true)
  163. {
  164. //仿地雷达连接的情况下检测9度以下
  165. if(planep.pitch_angle > -1300)
  166. {
  167. //从小到大赋值
  168. if(Fobs_angle[2] != 0)
  169. {
  170. Fobs_time = Fobs_angle[2];
  171. }
  172. else if (Fobs_angle[1] != 0)
  173. {
  174. Fobs_time = Fobs_angle[1];
  175. }
  176. else if (Fobs_angle[0] != 0)
  177. {
  178. Fobs_time = Fobs_angle[0];
  179. }
  180. else{
  181. Fobs_time = 0;
  182. }
  183. if(HAL_GetTick() - Fobs_delay_time > 1000 + Fobs_time * 100)
  184. {
  185. memset(&Fobs_angle[0],0,3);
  186. return true;
  187. }
  188. }
  189. else
  190. {
  191. if(planep.pitch_angle < -1500)
  192. {
  193. Fobs_angle[2] = 1;//15;
  194. }
  195. else if(planep.pitch_angle < -1350)
  196. {
  197. Fobs_angle[1] = 1;//10;
  198. }
  199. else
  200. {
  201. Fobs_angle[0] = 1;//5;
  202. }
  203. Fobs_delay_time = HAL_GetTick();
  204. return false;
  205. }
  206. }
  207. else
  208. {
  209. //无仿地或高于2m 12度
  210. if(planep.pitch_angle > -1300)
  211. {
  212. if(Fobs_angle[2] != 0)
  213. {
  214. Fobs_time = Fobs_angle[2];
  215. }
  216. else if (Fobs_angle[1] != 0)
  217. {
  218. Fobs_time = Fobs_angle[1];
  219. }
  220. else if (Fobs_angle[0] != 0)
  221. {
  222. Fobs_time = Fobs_angle[0];
  223. }
  224. else{
  225. Fobs_time = 0;
  226. }
  227. if(HAL_GetTick() - Fobs_delay_time > 500 + Fobs_time * 100)
  228. {
  229. memset(&Fobs_angle[0],0,3);
  230. return true;
  231. }
  232. }
  233. else
  234. {
  235. if(planep.pitch_angle > -1300)
  236. {
  237. Fobs_angle[0] = 1;//5;
  238. }
  239. else if(planep.pitch_angle > -1500)
  240. {
  241. Fobs_angle[1] = 1;//10;
  242. }
  243. else
  244. {
  245. Fobs_angle[2] = 1;//15;
  246. }
  247. Fobs_delay_time = HAL_GetTick();
  248. return false;
  249. }
  250. }
  251. return false;
  252. }
  253. int Bobs_delay_time = 0;
  254. uint8_t Bobs_angle[3] = {0};
  255. uint8_t Bobs_time = 0;
  256. bool Bobs_handle_function(void)
  257. {
  258. if(planep.lock_status == STA_LOCK)
  259. {
  260. return true;
  261. }
  262. if(terrain_is_link == true)
  263. {
  264. //仿地雷达连接的情况下检测9度以下,增加延时到2.5s
  265. if(planep.pitch_angle < 1300)
  266. {
  267. if(Bobs_angle[2] != 0)
  268. {
  269. Bobs_time = Bobs_angle[2];
  270. }
  271. else if (Bobs_angle[1] != 0)
  272. {
  273. Bobs_time = Bobs_angle[1];
  274. }
  275. else if (Bobs_angle[0] != 0)
  276. {
  277. Bobs_time = Bobs_angle[0];
  278. }
  279. else{
  280. Bobs_time = 0;
  281. }
  282. if(HAL_GetTick() - Bobs_delay_time > 500 + Bobs_time * 100)
  283. {
  284. memset(&Bobs_angle[0],0,3);
  285. return true;
  286. }
  287. }
  288. else
  289. {
  290. if(planep.pitch_angle > 1500)
  291. {
  292. Bobs_angle[2] = 1;//15;
  293. }
  294. else if(planep.pitch_angle > 1350)
  295. {
  296. Bobs_angle[1] = 1;//10;
  297. }
  298. else
  299. {
  300. Bobs_angle[0] = 1;//5;
  301. }
  302. Bobs_delay_time = HAL_GetTick();
  303. return false;
  304. }
  305. }
  306. else
  307. {
  308. //无仿地或高于2m 12度
  309. if(planep.pitch_angle < 1300)
  310. {
  311. if(Bobs_angle[2] != 0)
  312. {
  313. Bobs_time = Bobs_angle[2];
  314. }
  315. else if (Bobs_angle[1] != 0)
  316. {
  317. Bobs_time = Bobs_angle[1];
  318. }
  319. else if (Bobs_angle[0] != 0)
  320. {
  321. Bobs_time = Bobs_angle[0];
  322. }
  323. else{
  324. Bobs_time = 0;
  325. }
  326. if(HAL_GetTick() - Bobs_delay_time > 1000 + Bobs_time * 100)
  327. {
  328. memset(&Bobs_angle[0],0,3);
  329. return true;
  330. }
  331. }
  332. else
  333. {
  334. if(planep.pitch_angle > 1500)
  335. {
  336. Bobs_angle[2] = 1;//15;
  337. }
  338. else if(planep.pitch_angle > 1350)
  339. {
  340. Bobs_angle[1] = 1;//10;
  341. }
  342. else
  343. {
  344. Bobs_angle[0] = 1;//5;
  345. }
  346. Bobs_delay_time = HAL_GetTick();
  347. return false;
  348. }
  349. }
  350. return false;
  351. }
  352. /**
  353. * @file can_recv_enzhao_obstacle
  354. * @brief 恩曌多点避障解析
  355. * @param none
  356. * @details
  357. * @author Zhang Sir
  358. **/
  359. /*****************************恩曌雷达排序************************/
  360. void mimo_buf_sort( mimo_part_radar *arr, uint16_t length )
  361. {
  362. if ( length < 2 )
  363. {
  364. return;
  365. }
  366. uint16_t num = 0, num1 = 0;
  367. mimo_part_radar tmp;
  368. for ( num = length - 1; num >= 1; num-- )
  369. {
  370. for ( num1 = 0; num1 <= num - 1; num1++ )
  371. {
  372. if ( ( ( arr + num1 )->Distance ) > ( ( arr + num1 + 1 )->Distance ) )
  373. {
  374. tmp = *( arr + num1 );
  375. *( arr + num1 ) = *( arr + num1 + 1 );
  376. *( arr + num1 + 1 ) = tmp;
  377. }
  378. }
  379. }
  380. }
  381. mimo_part_radar F_radar[3];
  382. mimo_part_radar B_radar[3];
  383. uint8_t recv_comF_flag = 0,recv_comB_flag = 0;
  384. void can_recv_enzhao_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
  385. {
  386. switch (cellCanID)
  387. {
  388. case CAN_MIMO_FOBS_ID1:
  389. memcpy(&F_radar[0], data, 8);
  390. recv_comF_flag = recv_comF_flag | 1;
  391. Dev.Part_Fradar_Link.connect_status = COMP_NORMAL;
  392. Dev.Part_Fradar_Link.recv_time = HAL_GetTick();
  393. Dev.Part_radarF.facid = FAC_MIMO_RF;
  394. break;
  395. case CAN_MIMO_FOBS_ID2:
  396. memcpy(&F_radar[1], data, 8);
  397. recv_comF_flag = recv_comF_flag | 2;
  398. break;
  399. case CAN_MIMO_FOBS_ID3:
  400. memcpy(&F_radar[2], data, 8);
  401. recv_comF_flag = recv_comF_flag | 4;
  402. break;
  403. case CAN_MIMO_BOBS_ID1:
  404. memcpy(&B_radar[0], data, 8);
  405. recv_comB_flag = recv_comB_flag | 1;
  406. Dev.Part_Bradar_Link.connect_status = COMP_NORMAL;
  407. Dev.Part_Bradar_Link.recv_time = HAL_GetTick();
  408. Dev.Part_radarB.facid = FAC_MIMO_RB;
  409. break;
  410. case CAN_MIMO_BOBS_ID2:
  411. memcpy(&B_radar[1], data, 8);
  412. recv_comB_flag = recv_comB_flag | 2;
  413. break;
  414. case CAN_MIMO_BOBS_ID3:
  415. memcpy(&B_radar[2], data, 8);
  416. recv_comB_flag = recv_comB_flag | 4;
  417. break;
  418. default:
  419. break;
  420. }
  421. if(recv_comF_flag == 7)
  422. {
  423. recv_comF_flag = 0;
  424. mimo_buf_sort(&F_radar[0], 3);
  425. for (uint8_t i = 0; i < 3; i++)
  426. {
  427. //X轴小于4M内数据
  428. if (/*(abs(F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ F_radar[i].Distance > 0)
  429. {
  430. mimo_f_info.distance_x = F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD);
  431. mimo_f_info.distance_y = F_radar[i].Distance * 0.05f * 100 * cos(F_radar[i].Amuzith * 0.1f / RAD);
  432. break;
  433. }
  434. if(i == 2)
  435. {
  436. mimo_f_info.distance_x = 0;
  437. mimo_f_info.distance_y = 0;
  438. }
  439. }
  440. mimo_f_info.Link.connect_status = COMP_NORMAL;
  441. mimo_f_info.Link.recv_time = HAL_GetTick();
  442. }
  443. if(recv_comB_flag == 7)
  444. {
  445. recv_comB_flag = 0;
  446. mimo_buf_sort(&B_radar[0], 3);
  447. for (uint8_t i = 0; i < 3; i++)
  448. {
  449. //X轴小于4M内数据
  450. if (/*(abs(B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ B_radar[i].Distance > 0)
  451. {
  452. mimo_b_info.distance_x = B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD);
  453. mimo_b_info.distance_y = B_radar[i].Distance * 0.05f * 100 * cos(B_radar[i].Amuzith * 0.1f / RAD);
  454. break;
  455. }
  456. if(i == 2)
  457. {
  458. mimo_b_info.distance_x = 0;
  459. mimo_b_info.distance_y = 0;
  460. }
  461. }
  462. mimo_b_info.Link.recv_time = HAL_GetTick();
  463. mimo_b_info.Link.connect_status = COMP_NORMAL;
  464. }
  465. }