| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584 |
- #include "soft_obstacle.h"
- #include "soft_device.h"
- #include "string.h"
- #include "usart_data_handle.h"
- #include "main_task.h"
- #include "soft_can.h"
- #include "math.h"
- #include "stdlib.h"
- uavr_obs uavr11_info = {.get_radar_sensi = 50};
- uavr_obs uavr12_info= {.get_radar_sensi = 50};
- uavr_obs mimo_f_info = {.signal_qulity = 0};
- uavr_obs mimo_b_info = {.signal_qulity = 0};
- _dev_par DM_4DRADARMAG;
- /**
- * @file can_recv_mocib_F_obstacle
- * @brief 莫之比前避障解析
- * @param none
- * @details
- * @author Zhang Sir
- **/
- void can_recv_mocib_F_obstacle(uint8_t *data)
- {
- uavr11_info.distance_x= (data[0] << 8) + data[1] - 32768;
- uavr11_info.distance_y = (data[2] << 8) + data[3];
- uavr11_info.Link.connect_status = COMP_NORMAL;
- uavr11_info.Link.recv_time = HAL_GetTick();
- }
- /**
- * @file can_recv_mocib_B_obstacle
- * @brief 莫之比后避障障解析
- * @param none
- * @details
- * @author Zhang Sir
- **/
- void can_recv_mocib_B_obstacle(uint8_t *data)
- {
- uavr12_info.distance_x = (data[0] << 8) + data[1] - 32768;
- uavr12_info.distance_y = (data[2] << 8) + data[3];
- uavr12_info.Link.connect_status = COMP_NORMAL;
- uavr12_info.Link.recv_time = HAL_GetTick();
- }
- /**
- * @file can_recv_enzhao_obstacle
- * @brief 恩曌单避障解析
- * @param none
- * @details
- * @author Zhang Sir
- **/
- void can_recv_mimo_signal_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
- {
- uint16_t frame_header = 0;
- memcpy(&frame_header,&data[0],2);
- if(frame_header == 0x5AA5 && data[2] == 0x04)
- {
- switch (cellCanID)
- {
- case CAN_MIMO_FOBS_SIG:
- mimo_f_info.distance_y = data[3] + data[4] * 256;
- mimo_f_info.signal_qulity = data[5];
- mimo_f_info.Link.recv_time = HAL_GetTick();
- mimo_f_info.Link.connect_status = COMP_NORMAL;
- Dev.Radar.facid_F = FAC_MIMO_RF;
- break;
- case CAN_MIMO_BOBS_SIG:
- mimo_b_info.distance_y = data[3] + data[4] * 256;
- mimo_b_info.signal_qulity = data[5];
-
- mimo_b_info.Link.recv_time = HAL_GetTick();
- mimo_b_info.Link.connect_status = COMP_NORMAL;
- Dev.Radar.facid_B = FAC_MIMO_RB;
- break;
- default:
- break;
- }
- }
- }
- mimo_360info mimo360_info[MIMO_360_TotalSect];
- mimo_360status mimo360_status = {.get_TotalSect_flag = true};
- Connect_check mimo_360_info;
- void mimo360_sort(mimo_360info *arr,uint16_t length)
- {
- if ( length < 2 )
- {
- return;
- }
- uint16_t num = 0, num1 = 0;
- mimo_360info tmp;
- for ( num = length - 1; num >= 1; num-- )
- {
- for ( num1 = 0; num1 <= num - 1; num1++ )
- {
- if ( ( ( arr + num1 )->dis0 ) > ( ( arr + num1 + 1 )->dis0 ) )
- {
- tmp = *( arr + num1 );
- *( arr + num1 ) = *( arr + num1 + 1 );
- *( arr + num1 + 1 ) = tmp;
- }
- }
- }
- }
- uint16_t test_index = 0;
- uint16_t compelte = 0;
- uint8_t radar360_proflag = 0;
- mimo_360_cont fmu_360info;
- void can_recv_mocib_new360_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
- {
- mimo_360_info.connect_status = COMP_NORMAL;
- mimo_360_info.recv_time = HAL_GetTick();
- switch (cellCanID)
- {
- case CAN_360MIMO_1ID:
- memcpy(&mimo360_status,&data[0],8);
- mimo360_status.index = 0;
-
- if(mimo360_status.nTarget == 0)
- {
- fmu_360info.total_tar = 0;
- memset(&fmu_360info.data[0],0,sizeof(mimo_360_data));
- }
-
- break;
- case CAN_360MIMO_2ID:
- if(mimo360_status.nTarget <= MIMO_360_TotalSect && mimo360_status.nTarget > 0)
- {
- for(uint8_t i = 0;i < 2;i++)
- {
- if(i == 0)
- {
- memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[0],sizeof(mimo_360info));
- }
- else
- {
- memcpy(&mimo360_info[mimo360_status.index].sectId0,&data[4],sizeof(mimo_360info));
- }
- if(mimo360_status.nTarget - 1 == mimo360_status.index && radar360_proflag == 0)
- {
- //mimo360_sort(&mimo360_info[0],mimo360_status.nTarget);
- fmu_360info.TotalSect = mimo360_status.TotalSect;
- fmu_360info.total_tar = mimo360_status.nTarget;
- for(uint8_t j = 0;j < mimo360_status.nTarget;j++)
- {
- fmu_360info.data[j].sec_angle = mimo360_info[j].sectId0 * 360 / mimo360_status.TotalSect;
- fmu_360info.data[j].distance = mimo360_info[j].dis0 * mimo360_status.RangeRes/100; //cm
- fmu_360info.data[j].rcs0 = mimo360_info[j].rcs0;
- fmu_360info.data[j].el0 = mimo360_info[j].el0 * 0.5;
- }
- }
- mimo360_status.index++;
- }
- }
- break;
- default:
- break;
- }
- }
- //避障处理函数, 减少扫地的情况
- int Fobs_delay_time = 0;
- uint8_t Fobs_angle[3] = {0};
- uint8_t Fobs_time = 0;
- bool Fobs_handle_function(void)
- {
- if(planep.lock_status == STA_LOCK)
- {
- return true;
- }
- if(terrain_is_link == true)
- {
- //仿地雷达连接的情况下检测9度以下
- if(planep.pitch_angle > -1300)
- {
- //从小到大赋值
- if(Fobs_angle[2] != 0)
- {
- Fobs_time = Fobs_angle[2];
- }
- else if (Fobs_angle[1] != 0)
- {
- Fobs_time = Fobs_angle[1];
- }
- else if (Fobs_angle[0] != 0)
- {
- Fobs_time = Fobs_angle[0];
- }
- else{
- Fobs_time = 0;
- }
- if(HAL_GetTick() - Fobs_delay_time > 1000 + Fobs_time * 100)
- {
- memset(&Fobs_angle[0],0,3);
- return true;
- }
- }
- else
- {
- if(planep.pitch_angle < -1500)
- {
- Fobs_angle[2] = 1;//15;
- }
- else if(planep.pitch_angle < -1350)
- {
- Fobs_angle[1] = 1;//10;
- }
- else
- {
- Fobs_angle[0] = 1;//5;
- }
- Fobs_delay_time = HAL_GetTick();
- return false;
- }
- }
- else
- {
- //无仿地或高于2m 12度
- if(planep.pitch_angle > -1300)
- {
- if(Fobs_angle[2] != 0)
- {
- Fobs_time = Fobs_angle[2];
- }
- else if (Fobs_angle[1] != 0)
- {
- Fobs_time = Fobs_angle[1];
- }
- else if (Fobs_angle[0] != 0)
- {
- Fobs_time = Fobs_angle[0];
- }
- else{
- Fobs_time = 0;
- }
- if(HAL_GetTick() - Fobs_delay_time > 500 + Fobs_time * 100)
- {
- memset(&Fobs_angle[0],0,3);
- return true;
- }
- }
- else
- {
- if(planep.pitch_angle > -1300)
- {
- Fobs_angle[0] = 1;//5;
- }
- else if(planep.pitch_angle > -1500)
- {
- Fobs_angle[1] = 1;//10;
- }
- else
- {
- Fobs_angle[2] = 1;//15;
- }
- Fobs_delay_time = HAL_GetTick();
- return false;
- }
- }
- return false;
- }
- int Bobs_delay_time = 0;
- uint8_t Bobs_angle[3] = {0};
- uint8_t Bobs_time = 0;
- bool Bobs_handle_function(void)
- {
- if(planep.lock_status == STA_LOCK)
- {
- return true;
- }
- if(terrain_is_link == true)
- {
- //仿地雷达连接的情况下检测9度以下,增加延时到2.5s
- if(planep.pitch_angle < 1300)
- {
- if(Bobs_angle[2] != 0)
- {
- Bobs_time = Bobs_angle[2];
- }
- else if (Bobs_angle[1] != 0)
- {
- Bobs_time = Bobs_angle[1];
- }
- else if (Bobs_angle[0] != 0)
- {
- Bobs_time = Bobs_angle[0];
- }
- else{
- Bobs_time = 0;
- }
- if(HAL_GetTick() - Bobs_delay_time > 500 + Bobs_time * 100)
- {
- memset(&Bobs_angle[0],0,3);
- return true;
- }
- }
- else
- {
- if(planep.pitch_angle > 1500)
- {
- Bobs_angle[2] = 1;//15;
- }
- else if(planep.pitch_angle > 1350)
- {
- Bobs_angle[1] = 1;//10;
- }
- else
- {
- Bobs_angle[0] = 1;//5;
- }
- Bobs_delay_time = HAL_GetTick();
- return false;
- }
- }
- else
- {
- //无仿地或高于2m 12度
- if(planep.pitch_angle < 1300)
- {
- if(Bobs_angle[2] != 0)
- {
- Bobs_time = Bobs_angle[2];
- }
- else if (Bobs_angle[1] != 0)
- {
- Bobs_time = Bobs_angle[1];
- }
- else if (Bobs_angle[0] != 0)
- {
- Bobs_time = Bobs_angle[0];
- }
- else{
- Bobs_time = 0;
- }
- if(HAL_GetTick() - Bobs_delay_time > 1000 + Bobs_time * 100)
- {
- memset(&Bobs_angle[0],0,3);
- return true;
- }
- }
- else
- {
- if(planep.pitch_angle > 1500)
- {
- Bobs_angle[2] = 1;//15;
- }
- else if(planep.pitch_angle > 1350)
- {
- Bobs_angle[1] = 1;//10;
- }
- else
- {
- Bobs_angle[0] = 1;//5;
- }
- Bobs_delay_time = HAL_GetTick();
- return false;
- }
- }
- return false;
- }
- /**
- * @file can_recv_enzhao_obstacle
- * @brief 恩曌多点避障解析
- * @param none
- * @details
- * @author Zhang Sir
- **/
- /*****************************恩曌雷达排序************************/
- void mimomocib_buf_sort( mimo_part_radar *arr, uint16_t length )
- {
- if ( length < 2 )
- {
- return;
- }
- uint16_t num = 0, num1 = 0;
- mimo_part_radar tmp;
- for ( num = length - 1; num >= 1; num-- )
- {
- for ( num1 = 0; num1 <= num - 1; num1++ )
- {
- if ( ( ( arr + num1 )->Distance ) > ( ( arr + num1 + 1 )->Distance ) )
- {
- tmp = *( arr + num1 );
- *( arr + num1 ) = *( arr + num1 + 1 );
- *( arr + num1 + 1 ) = tmp;
- }
- }
- }
- }
- mimo_part_radar F_radar[3];
- mimo_part_radar B_radar[3];
- uint8_t recv_comF_flag = 0,recv_comB_flag = 0;
- void can_recv_enzhao_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
- {
- switch (cellCanID)
- {
- case CAN_MIMO_FOBS_ID1:
- memcpy(&F_radar[0], data, 8);
- recv_comF_flag = recv_comF_flag | 1;
- Dev.Part_Fradar_Link.connect_status = COMP_NORMAL;
- Dev.Part_Fradar_Link.recv_time = HAL_GetTick();
- Dev.Part_radarF.facid = FAC_MIMO_RF;
- break;
- case CAN_MIMO_FOBS_ID2:
- memcpy(&F_radar[1], data, 8);
- recv_comF_flag = recv_comF_flag | 2;
- break;
- case CAN_MIMO_FOBS_ID3:
- memcpy(&F_radar[2], data, 8);
- recv_comF_flag = recv_comF_flag | 4;
- break;
- case CAN_MIMO_BOBS_ID1:
- memcpy(&B_radar[0], data, 8);
- recv_comB_flag = recv_comB_flag | 1;
- Dev.Part_Bradar_Link.connect_status = COMP_NORMAL;
- Dev.Part_Bradar_Link.recv_time = HAL_GetTick();
- Dev.Part_radarB.facid = FAC_MIMO_RB;
- break;
- case CAN_MIMO_BOBS_ID2:
- memcpy(&B_radar[1], data, 8);
- recv_comB_flag = recv_comB_flag | 2;
- break;
- case CAN_MIMO_BOBS_ID3:
- memcpy(&B_radar[2], data, 8);
- recv_comB_flag = recv_comB_flag | 4;
- break;
- default:
- break;
- }
- if(recv_comF_flag == 7)
- {
- recv_comF_flag = 0;
- mimomocib_buf_sort(&F_radar[0], 3);
- for (uint8_t i = 0; i < 3; i++)
- {
- //X轴小于4M内数据
- if (/*(abs(F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ F_radar[i].Distance > 0)
- {
- mimo_f_info.distance_x = F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD);
- mimo_f_info.distance_y = F_radar[i].Distance * 0.05f * 100 * cos(F_radar[i].Amuzith * 0.1f / RAD);
- break;
- }
- if(i == 2)
- {
- mimo_f_info.distance_x = 0;
- mimo_f_info.distance_y = 0;
- }
- }
- mimo_f_info.Link.connect_status = COMP_NORMAL;
- mimo_f_info.Link.recv_time = HAL_GetTick();
- }
-
- if(recv_comB_flag == 7)
- {
- recv_comB_flag = 0;
- mimomocib_buf_sort(&B_radar[0], 3);
- for (uint8_t i = 0; i < 3; i++)
- {
- //X轴小于4M内数据
- if (/*(abs(B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ B_radar[i].Distance > 0)
- {
- mimo_b_info.distance_x = B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD);
- mimo_b_info.distance_y = B_radar[i].Distance * 0.05f * 100 * cos(B_radar[i].Amuzith * 0.1f / RAD);
- break;
- }
- if(i == 2)
- {
- mimo_b_info.distance_x = 0;
- mimo_b_info.distance_y = 0;
- }
- }
- mimo_b_info.Link.recv_time = HAL_GetTick();
- mimo_b_info.Link.connect_status = COMP_NORMAL;
- }
- }
- void can_recv_mocib_obstacle(uint32_t cellCanID, uint8_t data[], uint8_t len)
- {
- switch (cellCanID)
- {
- case CAN_UAVRH_FOBS_ID1:
- memcpy(&F_radar[0], data, 8);
- recv_comF_flag = recv_comF_flag | 1;
- Dev.Part_Fradar_Link.connect_status = COMP_NORMAL;
- Dev.Part_Fradar_Link.recv_time = HAL_GetTick();
- Dev.Part_radarF.facid = FAC_MOCIB_RF;
- break;
- case CAN_UAVRH_FOBS_ID2:
- memcpy(&F_radar[1], data, 8);
- recv_comF_flag = recv_comF_flag | 2;
- break;
- case CAN_UAVRH_FOBS_ID3:
- memcpy(&F_radar[2], data, 8);
- recv_comF_flag = recv_comF_flag | 4;
- break;
- case CAN_UAVRH_BOBS_ID1:
- memcpy(&B_radar[0], data, 8);
- recv_comB_flag = recv_comB_flag | 1;
- Dev.Part_Bradar_Link.connect_status = COMP_NORMAL;
- Dev.Part_Bradar_Link.recv_time = HAL_GetTick();
- Dev.Part_radarB.facid = FAC_MOCIB_RB;
- break;
- case CAN_UAVRH_BOBS_ID2:
- memcpy(&B_radar[1], data, 8);
- recv_comB_flag = recv_comB_flag | 2;
- break;
- case CAN_UAVRH_BOBS_ID3:
- memcpy(&B_radar[2], data, 8);
- recv_comB_flag = recv_comB_flag | 4;
- break;
- default:
- break;
- }
- if(recv_comF_flag == 7)
- {
- recv_comF_flag = 0;
- mimomocib_buf_sort(&F_radar[0], 3);
- for (uint8_t i = 0; i < 3; i++)
- {
- //X轴小于4M内数据
- if (/*(abs(F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ F_radar[i].Distance > 0)
- {
- uavr11_info.distance_x = F_radar[i].Distance * 0.05f * 100 * sin(F_radar[i].Amuzith * 0.1f / RAD);
- uavr11_info.distance_y = F_radar[i].Distance * 0.05f * 100 * cos(F_radar[i].Amuzith * 0.1f / RAD);
- break;
- }
- if(i == 2)
- {
- uavr11_info.distance_x = 0;
- uavr11_info.distance_y = 0;
- }
- }
- uavr11_info.Link.connect_status = COMP_NORMAL;
- uavr11_info.Link.recv_time = HAL_GetTick();
- }
-
- if(recv_comB_flag == 7)
- {
- recv_comB_flag = 0;
- mimomocib_buf_sort(&B_radar[0], 3);
- for (uint8_t i = 0; i < 3; i++)
- {
- //X轴小于4M内数据
- if (/*(abs(B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD)) < 400) &&*/ B_radar[i].Distance > 0)
- {
- uavr12_info.distance_x = B_radar[i].Distance * 0.05f * 100 * sin(B_radar[i].Amuzith * 0.1f / RAD);
- uavr12_info.distance_y = B_radar[i].Distance * 0.05f * 100 * cos(B_radar[i].Amuzith * 0.1f / RAD);
- break;
- }
- if(i == 2)
- {
- uavr12_info.distance_x = 0;
- uavr12_info.distance_y = 0;
- }
- }
- uavr12_info.Link.recv_time = HAL_GetTick();
- uavr12_info.Link.connect_status = COMP_NORMAL;
- }
- }
|