voidSensorBridge::HandleLaserScan( const std::string& sensor_id, const carto::common::Time time, const std::string& frame_id, const carto::sensor::PointCloudWithIntensities& points) { if (points.points.empty()) return; CHECK_LE(points.points.back()[3], 0); //最后一个点云数据的时间小于等于0 for (int i = 0; i != num_subdivisions_per_laser_scan_; ++i) { constsize_t start_index = points.points.size() * i / num_subdivisions_per_laser_scan_; constsize_t end_index = points.points.size() * (i + 1) / num_subdivisions_per_laser_scan_; // 每一小段 carto::sensor::TimedPointCloud subdivision( points.points.begin() + start_index, points.points.begin() + end_index); if (start_index == end_index) { continue; } // 参考分段中最后一个数据的时间,调整其他数据的时间 constdouble time_to_subdivision_end = subdivision.back()[3]; // subdivision_time is the end of the measurement so sensor::Collator will // send all other sensor data first. // 先确认当前的数据没有过时,如果分段的时间落后于记录值,将抛弃所对应的数据 const carto::common::Time subdivision_time = time + carto::common::FromSeconds(time_to_subdivision_end); auto it = sensor_to_previous_subdivision_time_.find(sensor_id); if (it != sensor_to_previous_subdivision_time_.end() && it->second >= subdivision_time) { LOG(WARNING) << "Ignored subdivision of a LaserScan message from sensor " << sensor_id << " because previous subdivision time " << it->second << " is not before current subdivision time " << subdivision_time; continue; } sensor_to_previous_subdivision_time_[sensor_id] = subdivision_time; for (Eigen::Vector4f& point : subdivision) { point[3] -= time_to_subdivision_end; } CHECK_EQ(subdivision.back()[3], 0); // 将分段数据喂给Cartographer HandleRangefinder(sensor_id, subdivision_time, frame_id, subdivision); } }