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 packets_size = scan_msg->firing_pkts_size();
44 for (
size_t i = 0; i < packets_size; ++i) {
45 Unpack(
static_cast<int>(i),
46 scan_msg->firing_pkts(
static_cast<int>(i)),
52 if (out_msg->point().empty()) {
58 out_msg->set_width(out_msg->point_size());
65void LslidarCH64Parser::Unpack(
68 std::shared_ptr<PointCloud> pc) {
71 uint64_t packet_end_time;
72 double z_sin_altitude = 0.0;
73 double z_cos_altitude = 0.0;
77 packet_end_time = pkt.
stamp();
79 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
90 point_distance.
bytes[3] = 0;
91 firings[point_idx].
distance =
static_cast<double>(point_distance.
uint)
92 * DISTANCE_RESOLUTION2;
96 for (
size_t point_idx = 0; point_idx < POINTS_PER_PACKET; point_idx++) {
97 LaserCorrection& corrections
102 firings[point_idx].distance
103 = firings[point_idx].distance + corrections.dist_correction;
112 if (line_num % 8 == 0 || line_num % 8 == 1 || line_num % 8 == 2
113 || line_num % 8 == 3) {
117 * cos(firings[point_idx].azimuth / 2
122 line_num % 8 == 4 || line_num % 8 == 5 || line_num % 8 == 6
123 || line_num % 8 == 7) {
127 * cos(firings[point_idx].azimuth / 2
132 z_cos_altitude = sqrt(1 - z_sin_altitude * z_sin_altitude);
133 x = firings[point_idx].
distance * z_cos_altitude
134 * cos(firings[point_idx].azimuth);
135 y = firings[point_idx].
distance * z_cos_altitude
136 * sin(firings[point_idx].azimuth);
137 z = firings[point_idx].
distance * z_sin_altitude;
141 = packet_end_time - 1726 * (POINTS_PER_PACKET - point_idx - 1);
142 if (time_last < point_time && time_last > 0) {
143 point_time = time_last + 1726;
145 time_last = point_time;
147 PointXYZIT* point = pc->add_point();
148 point->set_timestamp(point_time);
149 point->set_intensity(firings[point_idx].intensity);
153 firings[point_idx].vertical_line,
155 firings[point_idx].distance,
157 firings[point_idx].azimuth,
167 point->set_timestamp(point_time);
168 point->set_intensity(0);
std::map< int, LaserCorrection > laser_corrections_
void GeneratePointcloud(const std::shared_ptr< LslidarScan > &scan_msg, const std::shared_ptr< apollo::drivers::PointCloud > &out_msg)
Set up for data processing.
LslidarCH64Parser(const Config &config)
void Order(std::shared_ptr< apollo::drivers::PointCloud > cloud)
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