1111
1212namespace ldlidar {
1313
14- constexpr uint16_t max_distance = 3000 ;
15- constexpr uint8_t min_intensity = 150 ;
14+ constexpr size_t FILTERED_DATA_COUNT = 360 ;
1615
1716uint64_t getSystemTimeStamp () {
1817 std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> tp =
@@ -23,20 +22,20 @@ uint64_t getSystemTimeStamp() {
2322
2423bool LDLidarDriver::is_ok_ = false ;
2524
26- LDLidarDriver::LDLidarDriver (uint16_t (*external_lidar_data)[2 ]):
25+ LDLidarDriver::LDLidarDriver (float (*external_lidar_data)[3 ]):
2726 lidar_data_ (external_lidar_data),
2827 external_data_ (external_lidar_data != nullptr )
2928{
3029 if (!external_data_) {
3130 // Allocate memory if external pointer is not provided
32- lidar_data_ = new uint16_t [NUM_ANGLES][ 2 ]();
31+ lidar_data_ = new float [MAX_DATA_COUNT][ 3 ]();
3332 }
3433
3534 commonInit ();
3635}
3736
38- LDLidarDriver::LDLidarDriver (nb::ndarray<uint16_t , nb::numpy, nb::shape<NUM_ANGLES, 2 >> external_lidar_points ):
39- lidar_data_ (reinterpret_cast <uint16_t (*)[2 ]>(external_lidar_points .data())),
37+ LDLidarDriver::LDLidarDriver (nb::ndarray<float , nb::numpy, nb::shape<MAX_DATA_COUNT, 3 >> external_lidar_raw_points ):
38+ lidar_data_ (reinterpret_cast <float (*)[3 ]>(external_lidar_raw_points .data())),
4039 external_data_ (true )
4140{
4241 if (!lidar_data_) {
@@ -53,6 +52,12 @@ void LDLidarDriver::commonInit() {
5352 lidar_status_ = LidarStatus::NORMAL;
5453 lidar_error_code_ = LIDAR_NO_ERROR;
5554 is_frame_ready_ = false ;
55+ data_write_lock_ = nullptr ;
56+ min_intensity_ = 0 ;
57+ min_distance_ = 0 ;
58+ max_distance_ = std::numeric_limits<uint16_t >::max ();
59+ min_angle_ = 0 ;
60+ max_angle_ = 360 ;
5661 timestamp_ = 0 ;
5762 speed_ = 0 ;
5863 is_poweron_comm_normal_ = false ;
@@ -340,34 +345,49 @@ void LDLidarDriver::setFrameReady() {
340345
341346void LDLidarDriver::setLaserScanData (Points2D &src) {
342347 std::lock_guard<std::mutex> lg (mutex_lock2_);
343- std::array<uint16_t , NUM_ANGLES> result_distances;
344- std::array<uint8_t , NUM_ANGLES> result_intensities;
345- std::array<std::vector<uint16_t >, NUM_ANGLES> tmp_distances;
346- std::array<std::vector<uint8_t >, NUM_ANGLES> tmp_intensities;
348+ std::array<std::vector<uint16_t >, FILTERED_DATA_COUNT> tmp_distances;
349+ std::array<std::vector<uint8_t >, FILTERED_DATA_COUNT> tmp_intensities;
347350
348351 // Build a list of points for each integer degree
352+ std::size_t count = 0 ;
353+
354+ // Compute mean of points list for each degree.
355+ if (data_write_lock_ != nullptr ) {
356+ data_write_lock_->startWriting ();
357+ }
358+
349359 for (const auto &point: src) {
350- if (point.intensity < min_intensity ) {
360+ if (point.intensity < min_intensity_ ) {
351361 continue ;
352362 }
353- size_t angle = (static_cast <size_t >(point.angle ) + NUM_ANGLES) % NUM_ANGLES;
354- tmp_distances[angle].push_back (point.distance );
355- tmp_intensities[angle].push_back (point.intensity );
356- }
357-
358- // Compute mean of points list for each degree.
359- for (size_t angle = 0 ; angle < NUM_ANGLES; angle++) {
360- const auto &distances = tmp_distances[angle];
361- const auto &intensities = tmp_intensities[angle];
362- size_t size = distances.size ();
363- if (size > 0 ) {
364- lidar_data_[angle][0 ] = std::accumulate (distances.begin (), distances.end (), 0 ) / size;
365- lidar_data_[angle][1 ] = std::accumulate (intensities.begin (), intensities.end (), 0 ) / size;
363+ if (point.distance < min_distance_) {
364+ continue ;
365+ }
366+ if (point.distance > max_distance_) {
367+ continue ;
366368 }
367- else {
368- lidar_data_[angle][0 ] = max_distance; // Mark as invalid
369- lidar_data_[angle][1 ] = 0 ; // Mark as invalid
369+
370+ double angle = 360 - point.angle ; // Lidar angle is inverted
371+
372+ // Skip excluded angles
373+ if (angle > min_angle_ && angle < max_angle_) {
374+ continue ;
370375 }
376+
377+ lidar_data_[count][0 ] = angle;
378+ lidar_data_[count][1 ] = point.distance ;
379+ lidar_data_[count][2 ] = point.intensity ;
380+ count++;
381+ }
382+
383+ // Mark as end of data
384+ lidar_data_[count][0 ] = -1.0 ;
385+ lidar_data_[count][1 ] = -1.0 ;
386+ lidar_data_[count][2 ] = -1.0 ;
387+
388+ if (data_write_lock_ != nullptr ) {
389+ data_write_lock_->finishWriting ();
390+ data_write_lock_->postUpdate ();
371391 }
372392}
373393
0 commit comments