25 LslidarParser(config), previous_packet_stamp_(0), gps_base_usec_(0) {}
28 const std::shared_ptr<LslidarScan>& scan_msg,
29 const std::shared_ptr<PointCloud>& out_msg) {
31 out_msg->mutable_header()->set_timestamp_sec(
32 scan_msg->basetime() / 1000000000.0);
33 out_msg->mutable_header()->set_module_name(
34 scan_msg->header().module_name());
35 out_msg->mutable_header()->set_frame_id(scan_msg->header().frame_id());
36 out_msg->set_height(1);
37 out_msg->set_measurement_time(scan_msg->basetime() / 1000000000.0);
38 out_msg->mutable_header()->set_sequence_num(
39 scan_msg->header().sequence_num());
40 gps_base_usec_ = scan_msg->basetime();
42 const unsigned char* difop_ptr
43 = (
const unsigned char*)scan_msg->difop_pkts(0).data().c_str();
45 two_bytes angle_1, angle_2, angle_3, angle_4;
46 angle_1.
bytes[0] = difop_ptr[243];
47 angle_1.
bytes[1] = difop_ptr[242];
50 angle_2.
bytes[0] = difop_ptr[245];
51 angle_2.
bytes[1] = difop_ptr[244];
54 angle_3.
bytes[0] = difop_ptr[247];
55 angle_3.
bytes[1] = difop_ptr[246];
58 angle_4.
bytes[0] = difop_ptr[249];
59 angle_4.
bytes[1] = difop_ptr[248];
62 packets_size = scan_msg->firing_pkts_size();
64 for (
size_t i = 0; i < packets_size; ++i) {
65 Unpack(
static_cast<int>(i),
66 scan_msg->firing_pkts(
static_cast<int>(i)),
72 AINFO <<
"packets_size :" << packets_size;
73 if (out_msg->point().empty()) {
79 out_msg->set_width(out_msg->point_size());
86void LslidarCH128X1Parser::Unpack(
89 std::shared_ptr<PointCloud> pc) {
92 uint64_t packet_end_time;
93 double z_sin_altitude = 0.0;
94 double z_cos_altitude = 0.0;
95 double sinTheta_1[128] = {0};
96 double cosTheta_1[128] = {0};
97 double sinTheta_2[128] = {0};
98 double cosTheta_2[128] = {0};
100 for (
int i = 0; i < 128; i++) {
101 sinTheta_1[i] = sin(big_angle[i / 4] * M_PI / 180);
102 cosTheta_1[i] = cos(big_angle[i / 4] * M_PI / 180);
106 sinTheta_2[i] = sin((i % 4) * (-0.17) * M_PI / 180);
107 cosTheta_2[i] = cos((i % 4) * (-0.17) * M_PI / 180);
114 const RawPacket* raw = (
const RawPacket*)pkt.
data().c_str();
116 packet_end_time = pkt.
stamp();
119 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
120 firings[point_idx].
vertical_line = raw->points[point_idx].vertical_line;
121 two_bytes point_amuzith;
122 point_amuzith.bytes[0] = raw->points[point_idx].azimuth_2;
123 point_amuzith.bytes[1] = raw->points[point_idx].azimuth_1;
125 =
static_cast<double>(point_amuzith.uint) * 0.01 *
DEG_TO_RAD;
126 four_bytes point_distance;
127 point_distance.bytes[0] = raw->points[point_idx].distance_3;
128 point_distance.bytes[1] = raw->points[point_idx].distance_2;
129 point_distance.bytes[2] = raw->points[point_idx].distance_1;
130 point_distance.bytes[3] = 0;
131 firings[point_idx].
distance =
static_cast<double>(point_distance.uint)
132 * DISTANCE_RESOLUTION2;
133 firings[point_idx].
intensity = raw->points[point_idx].intensity;
136 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
137 LaserCorrection& corrections
142 firings[point_idx].distance
143 = firings[point_idx].distance + corrections.dist_correction;
151 *
cos(firings[point_idx].azimuth / 2.0)
155 z_sin_altitude = sinTheta_1[firings[point_idx].vertical_line]
156 + 2 * _R_ * sinTheta_2[firings[point_idx].vertical_line];
158 z_cos_altitude = sqrt(1 - pow(z_sin_altitude, 2));
159 x = firings[point_idx].distance * z_cos_altitude
160 *
cos(firings[point_idx].azimuth);
161 y = firings[point_idx].distance * z_cos_altitude
162 *
sin(firings[point_idx].azimuth);
163 z = firings[point_idx].distance * z_sin_altitude;
173 - (POINTS_PER_PACKET - point_idx - 1)
175 / (POINTS_PER_PACKET);
180 PointXYZIT* point = pc->add_point();
181 point->set_timestamp(point_time);
182 point->set_intensity(firings[point_idx].intensity);
186 firings[point_idx].vertical_line,
188 firings[point_idx].distance,
190 firings[point_idx].azimuth,
200 point->set_timestamp(point_time);
201 point->set_intensity(0);
std::map< int, LaserCorrection > laser_corrections_
void Order(std::shared_ptr< PointCloud > cloud)
LslidarCH128X1Parser(const Config &config)
void GeneratePointcloud(const std::shared_ptr< LslidarScan > &scan_msg, const std::shared_ptr< PointCloud > &out_msg)
Lslidar data conversion class
uint64_t current_packet_time
void ComputeCoords2(int Laser_ring, int Type, const float &raw_distance, LaserCorrection *corrections, const double rotation, PointXYZIT *point)
uint64_t previous_packet_time
These classes Unpack raw Lslidar LIDAR packets into several useful formats.
optional float bottom_left_y
optional float top_right_x
optional float top_right_y
optional bool calibration
optional float bottom_left_x
used for unpacking the first two data bytes in a block