@@ -69,10 +69,12 @@ class LidarPacketHandler {
6969 LidarPacketHandler (const sensor::sensor_info& info,
7070 const std::vector<LidarScanProcessor>& handlers,
7171 const std::string& timestamp_mode,
72- int64_t ptp_utc_tai_offset)
72+ int64_t ptp_utc_tai_offset,
73+ float min_scan_valid_columns_ratio)
7374 : ring_buffer(LIDAR_SCAN_COUNT),
7475 lidar_scan_handlers{handlers},
75- ptp_utc_tai_offset_ (ptp_utc_tai_offset) {
76+ ptp_utc_tai_offset_ (ptp_utc_tai_offset),
77+ min_scan_valid_columns_ratio_ (min_scan_valid_columns_ratio) {
7678 // initialize lidar_scan processor and buffer
7779 scan_batcher = std::make_unique<ouster::ScanBatcher>(info);
7880
@@ -130,6 +132,19 @@ class LidarPacketHandler {
130132 *(mutexes[ring_buffer.write_head ()]));
131133 auto & lidar_scan = *lidar_scans[ring_buffer.write_head ()];
132134 result = lidar_handler (*this , pf, lidar_packet, lidar_scan);
135+ if (result) {
136+ // count the number of valid columns in the scan
137+ auto status = lidar_scan.status ();
138+ size_t valid_cols = std::count_if (status.data (), status.data () + status.size (),
139+ [](const uint32_t s) { return (s & 0x01 ); });
140+ if (valid_cols < static_cast <size_t >(min_scan_valid_columns_ratio_ * status.size ())) {
141+ RCLCPP_WARN_STREAM (rclcpp::get_logger (getName ()), " number of valid columns per scan "
142+ << valid_cols << " /" << status.size ()
143+ <<" which is below the ratio " << std::setprecision (4 ) << (100 * min_scan_valid_columns_ratio_)
144+ << " %, SKIPPING SCAN" );
145+ result = false ;
146+ }
147+ }
133148 }
134149 if (result) {
135150 ring_buffer.write ();
@@ -159,9 +174,11 @@ class LidarPacketHandler {
159174 static HandlerType create (
160175 const sensor::sensor_info& info,
161176 const std::vector<LidarScanProcessor>& handlers,
162- const std::string& timestamp_mode, int64_t ptp_utc_tai_offset) {
177+ const std::string& timestamp_mode, int64_t ptp_utc_tai_offset,
178+ float min_scan_valid_columns_ratio) {
163179 auto handler = std::make_shared<LidarPacketHandler>(
164- info, handlers, timestamp_mode, ptp_utc_tai_offset);
180+ info, handlers, timestamp_mode, ptp_utc_tai_offset,
181+ min_scan_valid_columns_ratio);
165182 return [handler](const sensor::LidarPacket& lidar_packet) {
166183 if (handler->lidar_packet_accumlator (lidar_packet)) {
167184 handler->ring_buffer_has_elements .notify_one ();
@@ -339,7 +356,7 @@ class LidarPacketHandler {
339356 private:
340357 std::unique_ptr<ouster::ScanBatcher> scan_batcher;
341358 const int LIDAR_SCAN_COUNT = 10 ;
342- const double THROTTLE_PERCENT = 0.7 ;
359+ const float THROTTLE_PERCENT = 0 .7f ;
343360 LockFreeRingBuffer ring_buffer;
344361 std::mutex ring_buffer_mutex;
345362 std::vector<std::unique_ptr<ouster::LidarScan>> lidar_scans;
@@ -368,6 +385,8 @@ class LidarPacketHandler {
368385 std::condition_variable ring_buffer_has_elements;
369386
370387 int64_t ptp_utc_tai_offset_;
388+
389+ float min_scan_valid_columns_ratio_ = 0 .0f ;
371390};
372391
373392} // namespace ouster_ros
0 commit comments