|
|
|
@ -58,7 +58,7 @@ void AP_Proximity_NanaRadar_MR72::update(void)
@@ -58,7 +58,7 @@ void AP_Proximity_NanaRadar_MR72::update(void)
|
|
|
|
|
|
|
|
|
|
// process incoming messages
|
|
|
|
|
read_sensor_data(); |
|
|
|
|
|
|
|
|
|
data_process(); |
|
|
|
|
// check for timeout and set health status
|
|
|
|
|
if ((_last_distance_received_ms == 0) || (AP_HAL::millis() - _last_distance_received_ms > PROXIMITY_TRTOWER_TIMEOUT_MS)) { |
|
|
|
|
set_status(AP_Proximity::Status::NoData); |
|
|
|
@ -89,7 +89,12 @@ bool AP_Proximity_NanaRadar_MR72::read_sensor_data()
@@ -89,7 +89,12 @@ bool AP_Proximity_NanaRadar_MR72::read_sensor_data()
|
|
|
|
|
while (nbytes-- > 0) { |
|
|
|
|
// uint8_t c = uart->read();
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "getc 0x%02x",c);
|
|
|
|
|
if (uart->read() == Head1) |
|
|
|
|
if(decode(uart->read())){ |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, " ");
|
|
|
|
|
; |
|
|
|
|
} |
|
|
|
|
// if (uart->read() == Head1)
|
|
|
|
|
if (0) |
|
|
|
|
{ //判断数据包帧头0x54
|
|
|
|
|
buffer[0] = Head1; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "getc 0x%02x",buffer[0]);
|
|
|
|
@ -123,14 +128,165 @@ bool AP_Proximity_NanaRadar_MR72::read_sensor_data()
@@ -123,14 +128,165 @@ bool AP_Proximity_NanaRadar_MR72::read_sensor_data()
|
|
|
|
|
} |
|
|
|
|
return (message_count > 0); |
|
|
|
|
} |
|
|
|
|
bool AP_Proximity_NanaRadar_MR72::decode(int16_t c) |
|
|
|
|
{ |
|
|
|
|
bool ret = false; |
|
|
|
|
static uint8_t decode_state; |
|
|
|
|
static uint8_t data_len = 0; |
|
|
|
|
static int8_t data_cnt; |
|
|
|
|
static int16_t value_b[8]; |
|
|
|
|
int16_t temp = c; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "ccc:%02x ",c);
|
|
|
|
|
switch (decode_state) |
|
|
|
|
{ |
|
|
|
|
case 0: |
|
|
|
|
if(temp == 0xAA) |
|
|
|
|
decode_state = 1; |
|
|
|
|
break; |
|
|
|
|
case 1: |
|
|
|
|
if(temp == 0xAA){ |
|
|
|
|
decode_state = 2; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "%d:%02x ",decode_state,temp);
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
decode_state = 0; |
|
|
|
|
break; |
|
|
|
|
case 2: |
|
|
|
|
if(temp == 0x0c){ |
|
|
|
|
decode_state = 3; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "%d:%02x ",decode_state,temp);
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
decode_state = 0; |
|
|
|
|
break; |
|
|
|
|
case 3: |
|
|
|
|
if(temp == 0x07){ |
|
|
|
|
decode_state = 4; |
|
|
|
|
data_len = 8; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "%d:%02x ",decode_state,temp);
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
decode_state = 0; |
|
|
|
|
break; |
|
|
|
|
case 4: |
|
|
|
|
data_cnt = 8 - data_len; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "%d: c[%d] = %02x, ",decode_state,data_cnt,temp);
|
|
|
|
|
if(data_cnt < 7){{ |
|
|
|
|
value_b[data_cnt] = temp; |
|
|
|
|
data_len -= 1; |
|
|
|
|
} |
|
|
|
|
}else{ |
|
|
|
|
decode_state = 5; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 5: |
|
|
|
|
if(temp == 0x55){ |
|
|
|
|
decode_state = 6; |
|
|
|
|
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "%d:%02x ",decode_state,temp);
|
|
|
|
|
} |
|
|
|
|
else |
|
|
|
|
decode_state = 0; |
|
|
|
|
break; |
|
|
|
|
case 6: |
|
|
|
|
|
|
|
|
|
if(temp == 0x55){ |
|
|
|
|
mr72_c_data.time_ms = AP_HAL::millis(); |
|
|
|
|
mr72_c_data.index = value_b[0]; |
|
|
|
|
mr72_c_data.range_f = (value_b[2] * 256 + value_b[3]) * 0.01; |
|
|
|
|
mr72_c_data.range = UINT16_VALUE(value_b[2], value_b[3]); |
|
|
|
|
mr72_c_data.azimuth = (value_b[1] * 256 + value_b[4]) * 0.01 - 90; |
|
|
|
|
mr72_c_data.vrel = (value_b[5] * 256 + value_b[6]) * 0.05 - 35; |
|
|
|
|
mr72_c_data.rollcount = value_b[5] & 0x03; |
|
|
|
|
mr72_c_data.rcs = value_b[7] * 0.5 - 50; |
|
|
|
|
ret = true; |
|
|
|
|
if(fabs(last_range - mr72_c_data.range) > 0.5){ |
|
|
|
|
bool had_index = false; |
|
|
|
|
for(uint8_t i=0; i<range_index; i++){ |
|
|
|
|
if(index_arr[i] == mr72_c_data.index){ |
|
|
|
|
had_index = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
last_range = mr72_c_data.range; |
|
|
|
|
if(range_index < 8 && !had_index){ |
|
|
|
|
range_arr[range_index] = mr72_c_data.range; |
|
|
|
|
index_arr[range_index] = mr72_c_data.index; |
|
|
|
|
range_index +=1; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "t:%d, i:%d, r:%.2f ",mr72_c_data.time_ms,mr72_c_data.index,mr72_c_data.range_f);
|
|
|
|
|
}
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}else{ |
|
|
|
|
; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "-- err:%d:%02x ",decode_state,temp);
|
|
|
|
|
} |
|
|
|
|
decode_state = 0; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void AP_Proximity_NanaRadar_MR72::data_process(void){ |
|
|
|
|
|
|
|
|
|
if(mr72_c_data.time_ms - last_time_ms > 20 && AP_HAL::millis() - last_time_ms > 100){ |
|
|
|
|
|
|
|
|
|
if(last_time_ms != mr72_c_data.time_ms){ |
|
|
|
|
last_time_ms = mr72_c_data.time_ms; |
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "a:%d , %d, %d, %d, %d, %d, %d, %d",range_arr[0],range_arr[1],range_arr[2],range_arr[3],range_arr[4],range_arr[5],range_arr[6],range_arr[7]);
|
|
|
|
|
sortA1(range_arr,8); |
|
|
|
|
update_sector_data(315, range_arr[0]); // d8
|
|
|
|
|
update_sector_data(0, range_arr[1]); // d1
|
|
|
|
|
update_sector_data(45, range_arr[2]); // d8
|
|
|
|
|
update_sector_data(90, range_arr[3]); // d7
|
|
|
|
|
update_sector_data(135, range_arr[4]); // d6
|
|
|
|
|
update_sector_data(180, range_arr[5]); // d5
|
|
|
|
|
update_sector_data(225, range_arr[6]); // d4
|
|
|
|
|
update_sector_data(270, range_arr[7]); // d3
|
|
|
|
|
// update_sector_data(315, UINT16_VALUE(buffer[16], buffer[17])); // d2
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "b:%d , %d, %d, %d, %d, %d, %d, %d",range_arr[0],range_arr[1],range_arr[2],range_arr[3],range_arr[4],range_arr[5],range_arr[6],range_arr[7]);
|
|
|
|
|
|
|
|
|
|
// gcs().send_text(MAV_SEVERITY_INFO, "a:%.2f,b:%.2f,c:%.2f",range_arr[1]/100.0,range_arr[1]/100.0,range_arr[2]/100.0);
|
|
|
|
|
// memset(range_arr,4000,8);
|
|
|
|
|
for (uint8_t i = 0; i < 8; i++) |
|
|
|
|
{ |
|
|
|
|
range_arr[i] = 4000; |
|
|
|
|
index_arr[i] = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
range_index = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
void AP_Proximity_NanaRadar_MR72::sortA1(uint16_t a[], uint8_t length){ |
|
|
|
|
uint8_t i, j; |
|
|
|
|
float temp; |
|
|
|
|
for(i = 0; i < length; ++i){ |
|
|
|
|
for(j = i + 1; j < length; ++j){ |
|
|
|
|
a[i] = a[i] == 0? 4000:a[i]; |
|
|
|
|
a[j] = a[j] == 0? 4000:a[j]; |
|
|
|
|
if(a[j] < a[i]){ //如果后一个元素小于前一个元素则交换
|
|
|
|
|
temp = a[i]; |
|
|
|
|
a[i] = a[j]; |
|
|
|
|
a[j] = temp; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
// process reply
|
|
|
|
|
void AP_Proximity_NanaRadar_MR72::update_sector_data(int16_t angle_deg, uint16_t distance_cm) |
|
|
|
|
{ |
|
|
|
|
uint8_t sector; |
|
|
|
|
if (convert_angle_to_sector(angle_deg, sector)) { |
|
|
|
|
_angle[sector] = angle_deg; |
|
|
|
|
_distance[sector] = ((float) distance_cm) / 100; |
|
|
|
|
_distance[sector] = ((float) distance_cm) / 100.0; |
|
|
|
|
_distance_valid[sector] = distance_cm != 0xffff; |
|
|
|
|
_last_distance_received_ms = AP_HAL::millis(); |
|
|
|
|
// update boundary used for avoidance
|
|
|
|
|