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[663];
47 angle_1.
bytes[1] = difop_ptr[662];
50 angle_2.
bytes[0] = difop_ptr[665];
51 angle_2.
bytes[1] = difop_ptr[664];
54 angle_3.
bytes[0] = difop_ptr[667];
55 angle_3.
bytes[1] = difop_ptr[666];
58 angle_4.
bytes[0] = difop_ptr[669];
59 angle_4.
bytes[1] = difop_ptr[668];
61 packets_size = scan_msg->firing_pkts_size();
63 for (
size_t i = 0; i < packets_size; ++i) {
64 Unpack(
static_cast<int>(i),
65 scan_msg->firing_pkts(
static_cast<int>(i)),
71 if (out_msg->point().empty()) {
77 out_msg->set_width(out_msg->point_size());
84void LslidarCH16Parser::Unpack(
87 std::shared_ptr<PointCloud> pc) {
89 uint64_t packet_end_time;
90 double z_sin_altitude = 0.0;
91 double z_cos_altitude = 0.0;
95 packet_end_time = pkt.
stamp();
97 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
108 point_distance.
bytes[3] = 0;
109 firings[point_idx].
distance =
static_cast<double>(point_distance.
uint)
110 / 256.0 * DISTANCE_RESOLUTION;
114 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
115 LaserCorrection& corrections
120 firings[point_idx].distance
121 = firings[point_idx].distance + corrections.dist_correction;
128 double cos_azimuth_half = cos(firings[point_idx].azimuth * 0.5);
132 z_sin_altitude = sin_scan_laser_altitude
134 + 2 * cos_azimuth_half
135 * sin_scan_mirror_altitude
138 z_sin_altitude = sin_scan_laser_altitude
140 + 2 * cos_azimuth_half
142 [firings[point_idx].vertical_line % 4]
146 z_cos_altitude = sqrt(1 - z_sin_altitude * z_sin_altitude);
148 x = firings[point_idx].
distance * z_cos_altitude
149 * cos(firings[point_idx].azimuth);
150 y = firings[point_idx].
distance * z_cos_altitude
151 * sin(firings[point_idx].azimuth);
152 z = firings[point_idx].
distance * z_sin_altitude;
156 = packet_end_time - 1665 * (POINTS_PER_PACKET - point_idx - 1);
157 if (time_last < point_time && time_last > 0) {
158 point_time = time_last + 1665;
160 time_last = point_time;
162 PointXYZIT* point = pc->add_point();
163 point->set_timestamp(point_time / 1000000000.0);
164 point->set_intensity(firings[point_idx].intensity);
168 firings[point_idx].vertical_line,
170 firings[point_idx].distance,
172 firings[point_idx].azimuth,
181 point->set_timestamp(point_time);
182 point->set_intensity(0);
194 cloud->set_width(width);
195 int height = cloud->point_size() / cloud->width();
196 cloud->set_height(height);
198 std::shared_ptr<PointCloud> cloud_origin = std::make_shared<PointCloud>();
199 cloud_origin->CopyFrom(*cloud);
201 for (
int i = 0; i < width; ++i) {
204 for (
int j = 0; j < height; ++j) {
207 int target_index = j * width + i;
208 int origin_index = j * width + col;
209 cloud->mutable_point(target_index)
210 ->CopyFrom(cloud_origin->point(origin_index));
std::map< int, LaserCorrection > laser_corrections_
LslidarCH16Parser(const Config &config)
void Order(std::shared_ptr< apollo::drivers::PointCloud > cloud)
void GeneratePointcloud(const std::shared_ptr< LslidarScan > &scan_msg, const std::shared_ptr< apollo::drivers::PointCloud > &out_msg)
Set up for data processing.
Lslidar data conversion class
void ComputeCoords2(int Laser_ring, int Type, const float &raw_distance, LaserCorrection *corrections, const double rotation, PointXYZIT *point)
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
Point points[POINTS_PER_PACKET]
used for unpacking the first two data bytes in a block