soft_obstacle.c 17 KB

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