Skip to content

Commit 2b50b61

Browse files
committed
SENS: SF45: Scale the measured distance with pitch and roll, under the assumption that the measured obstacles are vertical walls,
1 parent 6196135 commit 2b50b61

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

src/drivers/distance_sensor/lightware_sf45_serial/lightware_sf45_serial.cpp

+28
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,13 @@
3838
#include <termios.h>
3939
#include <lib/crc/crc.h>
4040
#include <lib/mathlib/mathlib.h>
41+
#include <matrix/matrix/math.hpp>
4142

4243
#include <float.h>
4344

4445
using namespace time_literals;
46+
using matrix::Quatf;
47+
using matrix::Vector3f;
4548

4649
/* Configuration Constants */
4750

@@ -649,11 +652,22 @@ void SF45LaserSerial::sf45_process_replies(float *distance_m)
649652
PX4_DEBUG("scaled_yaw: \t %d, \t current_bin: \t %d, \t distance: \t %8.4f\n", scaled_yaw, current_bin,
650653
(double)*distance_m);
651654

655+
if (_vehicle_attitude_sub.updated()) {
656+
vehicle_attitude_s vehicle_attitude;
657+
658+
if (_vehicle_attitude_sub.copy(&vehicle_attitude)) {
659+
_vehicle_attitude = Quatf(vehicle_attitude.q);
660+
}
661+
}
662+
663+
_scale_dist(*distance_m, scaled_yaw, _vehicle_attitude);
664+
652665
if (_current_bin_dist > _obstacle_distance.max_distance) {
653666
_current_bin_dist = _obstacle_distance.max_distance + 1; // As per ObstacleDistance.msg definition
654667
}
655668

656669
hrt_abstime now = hrt_absolute_time();
670+
657671
_handle_missed_bins(current_bin, _previous_bin, _current_bin_dist, now);
658672

659673
_publish_obstacle_msg(now);
@@ -727,6 +741,20 @@ void SF45LaserSerial::_handle_missed_bins(uint8_t current_bin, uint8_t previous_
727741
}
728742
}
729743
}
744+
void SF45LaserSerial::_scale_dist(float &distance, const int16_t &yaw, const matrix::Quatf &attitude)
745+
{
746+
const Quatf q_sensor(Quatf(cosf(yaw / 2.f), 0.f, 0.f, sinf(yaw / 2.f)));
747+
const Vector3f forward_vector(1.0f, 0.0f, 0.0f);
748+
749+
const Quatf q_sensor_rotation = attitude * q_sensor;
750+
751+
const Vector3f rotated_sensor_vector = q_sensor_rotation.rotateVector(forward_vector);
752+
753+
float sensor_dist_scale = rotated_sensor_vector.xy().norm();
754+
sensor_dist_scale = math::constrain(sensor_dist_scale, FLT_EPSILON, 1.0f); // limit it to the expected range.
755+
distance = distance * sensor_dist_scale;
756+
}
757+
730758
uint8_t SF45LaserSerial::sf45_convert_angle(const int16_t yaw)
731759
{
732760
uint8_t mapped_sector = 0;

src/drivers/distance_sensor/lightware_sf45_serial/lightware_sf45_serial.hpp

+5
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
#include <lib/perf/perf_counter.h>
5050

5151
#include <uORB/Publication.hpp>
52+
#include <uORB/Subscription.hpp>
5253
#include <uORB/topics/obstacle_distance.h>
54+
#include <uORB/topics/vehicle_attitude.h>
5355

5456
#include "sf45_commands.h"
5557

@@ -112,7 +114,9 @@ class SF45LaserSerial : public px4::ScheduledWorkItem
112114
bool _crc_valid{false};
113115

114116
void _handle_missed_bins(uint8_t current_bin, uint8_t previous_bin, uint16_t measurement, hrt_abstime now);
117+
void _scale_dist(float &distance, const int16_t &yaw, const matrix::Quatf &attitude);
115118
void _publish_obstacle_msg(hrt_abstime now);
119+
uORB::Subscription _vehicle_attitude_sub{ORB_ID(vehicle_attitude)};
116120
uint64_t _data_timestamps[BIN_COUNT];
117121

118122

@@ -141,6 +145,7 @@ class SF45LaserSerial : public px4::ScheduledWorkItem
141145
int32_t _orient_cfg{0};
142146
uint8_t _previous_bin{0};
143147
uint16_t _current_bin_dist{UINT16_MAX};
148+
matrix::Quatf _vehicle_attitude{};
144149

145150
// end of SF45/B data members
146151

0 commit comments

Comments
 (0)