Skip to content

Commit 0c782b5

Browse files
committed
fix(hesai): cut scans correctly in edge cases
1 parent 419ddd3 commit 0c782b5

File tree

3 files changed

+35
-20
lines changed

3 files changed

+35
-20
lines changed

nebula_decoders/include/nebula_decoders/nebula_decoders_hesai/decoders/angle_corrector.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class AngleCorrector
5252
/// @brief Returns whether the given block (azimuth) is the last in the current scan
5353
/// @param block_azimuth The current azimuth value in the sensor's angle resolution
5454
/// @return true if the current azimuth is the last in the current scan, false otherwise
55-
virtual bool blockCompletesScan(uint32_t block_azimuth) = 0;
55+
virtual bool blockCompletesScan(uint32_t block_azimuth, uint32_t last_azimuth) = 0;
5656
};
5757

5858
} // namespace drivers

nebula_decoders/include/nebula_decoders/nebula_decoders_hesai/decoders/angle_corrector_calibration_based.hpp

+21-14
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
#include <nebula_common/nebula_common.hpp>
2121

22+
#include <algorithm>
2223
#include <cmath>
2324
#include <cstdint>
2425
#include <memory>
@@ -43,7 +44,7 @@ class AngleCorrectorCalibrationBased : public AngleCorrector<HesaiCalibrationCon
4344
std::array<std::array<float, ChannelN>, MAX_AZIMUTH_LEN> azimuth_cos_{};
4445
std::array<std::array<float, ChannelN>, MAX_AZIMUTH_LEN> azimuth_sin_{};
4546

46-
uint32_t scan_cut_block_azimuth_{};
47+
const uint32_t scan_cut_block_azimuth_{};
4748

4849
public:
4950
AngleCorrectorCalibrationBased(
@@ -78,20 +79,17 @@ class AngleCorrectorCalibrationBased : public AngleCorrector<HesaiCalibrationCon
7879
}
7980
}
8081

81-
auto scan_cut_block_azimuth = static_cast<uint32_t>(rad2deg(scan_cut_azimuth_rad) * 10.0);
82-
while (true) {
83-
auto block_azimuth_rad = block_azimuth_rad_[scan_cut_block_azimuth];
84-
for (auto correction : azimuth_offset_rad_) {
85-
if (block_azimuth_rad + correction < scan_cut_azimuth_rad) {
86-
scan_cut_block_azimuth_++;
87-
break;
88-
}
89-
}
82+
auto min_azimuth_offset = -std::min(azimuth_offset_rad_);
9083

91-
break;
84+
auto cut_azimuth = std::ceil(rad2deg(scan_cut_azimuth_rad + min_azimuth_offset) * AngleUnit);
85+
if (cut_azimuth > MAX_AZIMUTH_LEN) {
86+
cut_azimuth -= MAX_AZIMUTH_LEN;
9287
}
9388

94-
scan_cut_block_azimuth_ = scan_cut_block_azimuth;
89+
scan_cut_block_azimuth_ = cut_azimuth;
90+
91+
std::cout << "Cut angle setting: " << rad2deg(scan_cut_azimuth_rad)
92+
<< " deg, calculated: " << scan_cut_block_azimuth_ / 100.0 << " deg" << std::endl;
9593
}
9694

9795
CorrectedAngleData getCorrectedAngleData(uint32_t block_azimuth, uint32_t channel_id) override
@@ -108,9 +106,18 @@ class AngleCorrectorCalibrationBased : public AngleCorrector<HesaiCalibrationCon
108106
elevation_cos_[channel_id]};
109107
}
110108

111-
bool blockCompletesScan(uint32_t current_azimuth) override
109+
bool blockCompletesScan(uint32_t current_azimuth, uint32_t last_azimuth) override
112110
{
113-
return current_azimuth == scan_cut_block_azimuth_;
111+
auto cut_azimuth = scan_cut_block_azimuth_;
112+
if (cut_azimuth < last_azimuth) {
113+
cut_azimuth += MAX_AZIMUTH_LEN;
114+
}
115+
116+
if (current_azimuth < last_azimuth) {
117+
current_azimuth += MAX_AZIMUTH_LEN;
118+
}
119+
120+
return current_azimuth >= cut_azimuth && last_azimuth < cut_azimuth;
114121
}
115122
};
116123

nebula_decoders/include/nebula_decoders/nebula_decoders_hesai/decoders/angle_corrector_correction_based.hpp

+13-5
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
#include "nebula_common/hesai/hesai_common.hpp"
1818
#include "nebula_decoders/nebula_decoders_hesai/decoders/angle_corrector.hpp"
1919

20-
#include <algorithm>
2120
#include <cstdint>
2221
#include <memory>
2322
#include <stdexcept>
@@ -126,11 +125,20 @@ class AngleCorrectorCorrectionBased : public AngleCorrector<HesaiCorrection>
126125
cos_[azimuth], sin_[elevation], cos_[elevation]};
127126
}
128127

129-
bool blockCompletesScan(uint32_t block_azimuth) override
128+
bool blockCompletesScan(uint32_t block_azimuth, uint32_t last_azimuth) override
130129
{
131-
auto begin = cut_azimuths_.cbegin();
132-
auto end = cut_azimuths_.cend();
133-
return std::find(begin, end, block_azimuth) != end;
130+
for (auto cut_azimuth : cut_azimuths_) {
131+
if (cut_azimuth < last_azimuth) {
132+
cut_azimuth += MAX_AZIMUTH_LENGTH;
133+
}
134+
135+
auto current_azimuth = block_azimuth;
136+
if (current_azimuth < last_azimuth) {
137+
current_azimuth += MAX_AZIMUTH_LENGTH;
138+
}
139+
140+
return current_azimuth >= cut_azimuth && last_azimuth < cut_azimuth;
141+
}
134142
}
135143
};
136144

0 commit comments

Comments
 (0)