|
|
|
@ -24,6 +24,7 @@ extern const AP_HAL::HAL& hal;
@@ -24,6 +24,7 @@ extern const AP_HAL::HAL& hal;
|
|
|
|
|
#define BENEWAKE_FRAME_HEADER 0x59 |
|
|
|
|
#define BENEWAKE_FRAME_LENGTH 9 |
|
|
|
|
#define BENEWAKE_DIST_MAX_CM 32768 |
|
|
|
|
#define BENEWAKE_OUT_OF_RANGE_ADD_CM 100 |
|
|
|
|
|
|
|
|
|
// format of serial packets received from benewake lidar
|
|
|
|
|
//
|
|
|
|
@ -69,7 +70,7 @@ bool AP_RangeFinder_Benewake::detect(AP_SerialManager &serial_manager, uint8_t s
@@ -69,7 +70,7 @@ bool AP_RangeFinder_Benewake::detect(AP_SerialManager &serial_manager, uint8_t s
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// distance returned in reading_cm, signal_ok is set to true if sensor reports a strong signal
|
|
|
|
|
bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok) |
|
|
|
|
bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm) |
|
|
|
|
{ |
|
|
|
|
if (uart == nullptr) { |
|
|
|
|
return false; |
|
|
|
@ -77,7 +78,7 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
@@ -77,7 +78,7 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
|
|
|
|
|
|
|
|
|
|
float sum_cm = 0; |
|
|
|
|
uint16_t count = 0; |
|
|
|
|
bool dist_reliable = false; |
|
|
|
|
uint16_t count_out_of_range = 0; |
|
|
|
|
|
|
|
|
|
// read any available lines from the lidar
|
|
|
|
|
int16_t nbytes = uart->available(); |
|
|
|
@ -95,7 +96,6 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
@@ -95,7 +96,6 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
|
|
|
|
|
linebuf[linebuf_len++] = c; |
|
|
|
|
} else { |
|
|
|
|
linebuf_len = 0; |
|
|
|
|
dist_reliable = false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// add character to buffer
|
|
|
|
@ -109,8 +109,6 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
@@ -109,8 +109,6 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
|
|
|
|
|
} |
|
|
|
|
// if checksum matches extract contents
|
|
|
|
|
if ((uint8_t)(checksum & 0xFF) == linebuf[BENEWAKE_FRAME_LENGTH-1]) { |
|
|
|
|
// tell caller we are receiving packets
|
|
|
|
|
signal_ok = true; |
|
|
|
|
// calculate distance and add to sum
|
|
|
|
|
uint16_t dist = ((uint16_t)linebuf[3] << 8) | linebuf[2]; |
|
|
|
|
if (dist < BENEWAKE_DIST_MAX_CM) { |
|
|
|
@ -119,30 +117,45 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
@@ -119,30 +117,45 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
|
|
|
|
|
if (linebuf[6] == 0x02) { |
|
|
|
|
dist *= 0.1f; |
|
|
|
|
} |
|
|
|
|
// no signal byte from TFmini
|
|
|
|
|
dist_reliable = true; |
|
|
|
|
} else { |
|
|
|
|
// TF02 provides signal reliability (good = 7 or 8)
|
|
|
|
|
dist_reliable = (linebuf[6] >= 7); |
|
|
|
|
} |
|
|
|
|
if (dist_reliable) { |
|
|
|
|
// no signal byte from TFmini so add distance to sum
|
|
|
|
|
sum_cm += dist; |
|
|
|
|
count++; |
|
|
|
|
} else { |
|
|
|
|
// TF02 provides signal reliability (good = 7 or 8)
|
|
|
|
|
if (linebuf[6] >= 7) { |
|
|
|
|
// add distance to sum
|
|
|
|
|
sum_cm += dist; |
|
|
|
|
count++; |
|
|
|
|
} else { |
|
|
|
|
// this reading is out of range
|
|
|
|
|
count_out_of_range++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// this reading is out of range
|
|
|
|
|
count_out_of_range++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// clear buffer
|
|
|
|
|
linebuf_len = 0; |
|
|
|
|
dist_reliable = false; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (count == 0) { |
|
|
|
|
return false; |
|
|
|
|
if (count > 0) { |
|
|
|
|
// return average distance of readings
|
|
|
|
|
reading_cm = sum_cm / count; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (count_out_of_range > 0) { |
|
|
|
|
// if only out of range readings return max range + 1m
|
|
|
|
|
reading_cm = max_distance_cm() + BENEWAKE_OUT_OF_RANGE_ADD_CM; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
reading_cm = sum_cm / count; |
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
// no readings so return false
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
@ -150,16 +163,10 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
@@ -150,16 +163,10 @@ bool AP_RangeFinder_Benewake::get_reading(uint16_t &reading_cm, bool &signal_ok)
|
|
|
|
|
*/ |
|
|
|
|
void AP_RangeFinder_Benewake::update(void) |
|
|
|
|
{ |
|
|
|
|
bool signal_ok; |
|
|
|
|
if (get_reading(state.distance_cm, signal_ok)) { |
|
|
|
|
if (get_reading(state.distance_cm)) { |
|
|
|
|
// update range_valid state based on distance measured
|
|
|
|
|
state.last_reading_ms = AP_HAL::millis(); |
|
|
|
|
if (signal_ok) { |
|
|
|
|
update_status(); |
|
|
|
|
} else { |
|
|
|
|
// if signal is weak set status to out-of-range
|
|
|
|
|
set_status(RangeFinder::RangeFinder_OutOfRangeHigh); |
|
|
|
|
} |
|
|
|
|
update_status(); |
|
|
|
|
} else if (AP_HAL::millis() - state.last_reading_ms > 200) { |
|
|
|
|
set_status(RangeFinder::RangeFinder_NoData); |
|
|
|
|
} |
|
|
|
|