mirror of
https://gitee.com/mirrors_PX4/PX4-Autopilot.git
synced 2026-11-04 01:11:36 +08:00
LidarLite: Added collect phase to PWM
This commit is contained in:
@@ -94,6 +94,7 @@ protected:
|
|||||||
uint32_t getMeasureTicks() const;
|
uint32_t getMeasureTicks() const;
|
||||||
|
|
||||||
virtual int measure() = 0;
|
virtual int measure() = 0;
|
||||||
|
virtual int collect() = 0;
|
||||||
|
|
||||||
virtual int reset_sensor() = 0;
|
virtual int reset_sensor() = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ static const int ERROR = -1;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
LidarLitePWM::LidarLitePWM() :
|
LidarLitePWM::LidarLitePWM() :
|
||||||
|
_terminateRequested(false),
|
||||||
_pwmSub(-1),
|
_pwmSub(-1),
|
||||||
_pwm{},
|
_pwm{},
|
||||||
_rangePub(-1),
|
_rangePub(-1),
|
||||||
@@ -74,6 +75,8 @@ int LidarLitePWM::init()
|
|||||||
void LidarLitePWM::print_info()
|
void LidarLitePWM::print_info()
|
||||||
{
|
{
|
||||||
printf("poll interval: %u ticks\n", getMeasureTicks());
|
printf("poll interval: %u ticks\n", getMeasureTicks());
|
||||||
|
printf("distance: %ucm (0x%04x)\n",
|
||||||
|
(unsigned)_range.distance, (unsigned)_range.distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LidarLitePWM::print_registers()
|
void LidarLitePWM::print_registers()
|
||||||
@@ -83,33 +86,57 @@ void LidarLitePWM::print_registers()
|
|||||||
|
|
||||||
void LidarLitePWM::start()
|
void LidarLitePWM::start()
|
||||||
{
|
{
|
||||||
//TODO: start measurement task
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LidarLitePWM::stop()
|
void LidarLitePWM::stop()
|
||||||
{
|
{
|
||||||
//TODO: stop measurement task
|
//TODO: stop measurement task
|
||||||
|
_terminateRequested = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int LidarLitePWM::measure()
|
int LidarLitePWM::measure()
|
||||||
{
|
{
|
||||||
bool update;
|
int result = OK;
|
||||||
orb_check(_pwmSub, &update);
|
|
||||||
|
|
||||||
if(update) {
|
_range.error_count = _pwm.error_count;
|
||||||
orb_copy(ORB_ID(pwm_input), _pwmSub, &_pwm);
|
_range.maximum_distance = get_maximum_distance();
|
||||||
|
_range.minimum_distance = get_minimum_distance();
|
||||||
|
_range.distance = _pwm.pulse_width / 1000.0f; //10 usec = 1 cm distance for LIDAR-Lite
|
||||||
|
_range.distance_vector[0] = _range.distance;
|
||||||
|
_range.just_updated = 0;
|
||||||
|
_range.valid = true;
|
||||||
|
|
||||||
_range.timestamp = hrt_absolute_time();
|
//TODO: due to a bug in older versions of the LidarLite firmware, we have to reset sensor on (distance == 0)
|
||||||
_range.error_count = _pwm.error_count;
|
if(_range.distance <= 0.0f) {
|
||||||
_range.valid = true;
|
_range.valid = false;
|
||||||
_range.maximum_distance = get_maximum_distance();
|
_range.error_count++;
|
||||||
_range.minimum_distance = get_minimum_distance();
|
result = ERROR;
|
||||||
_range.distance = _pwm.pulse_width / 1000.0f; //10 usec = 1 cm distance for LIDAR-Lite
|
|
||||||
_range.distance_vector[0] = _range.distance;
|
|
||||||
_range.just_updated = 0;
|
|
||||||
|
|
||||||
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return OK;
|
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
int LidarLitePWM::collect()
|
||||||
|
{
|
||||||
|
//Check PWM
|
||||||
|
bool update;
|
||||||
|
orb_check(_pwmSub, &update);
|
||||||
|
if(update) {
|
||||||
|
orb_copy(ORB_ID(pwm_input), _pwmSub, &_pwm);
|
||||||
|
_range.timestamp = hrt_absolute_time();
|
||||||
|
return OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
//Timeout readings after 0.2 seconds and mark as invalid
|
||||||
|
if(hrt_absolute_time() - _range.timestamp > LL40LS_CONVERSION_TIMEOUT*2) {
|
||||||
|
_range.timestamp = hrt_absolute_time();
|
||||||
|
_range.valid = false;
|
||||||
|
orb_publish(ORB_ID(sensor_range_finder), _rangePub, &_range);
|
||||||
|
return ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
return EAGAIN;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,12 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
int measure() override;
|
int measure() override;
|
||||||
|
|
||||||
|
int collect() override;
|
||||||
|
|
||||||
|
void task_main_trampoline(int argc, char *argv[]);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool _terminateRequested;
|
||||||
int _pwmSub;
|
int _pwmSub;
|
||||||
pwm_input_s _pwm;
|
pwm_input_s _pwm;
|
||||||
orb_advert_t _rangePub;
|
orb_advert_t _rangePub;
|
||||||
|
|||||||
Reference in New Issue
Block a user