/* * Copyright 2016 The Cartographer Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifndef CARTOGRAPHER_SENSOR_POINT_CLOUD_H_ #define CARTOGRAPHER_SENSOR_POINT_CLOUD_H_ #include #include "Eigen/Core" #include "cartographer/sensor/proto/sensor.pb.h" #include "cartographer/sensor/rangefinder_point.h" #include "cartographer/transform/rigid_transform.h" #include "glog/logging.h" namespace cartographer { namespace sensor { // Stores 3D positions of points together with some additional data, e.g. // intensities. /** * @brief 点云结构, 包含雷达一帧数据的所有数据点 与 数据点对应的强度值 * */ class PointCloud { public: using PointType = RangefinderPoint; PointCloud(); explicit PointCloud(std::vector points); PointCloud(std::vector points, std::vector intensities); // Returns the number of points in the point cloud. size_t size() const; // Checks whether there are any points in the point cloud. bool empty() const; const std::vector& points() const; //....重载 std::vector& pointreturn(); const std::vector& intensities() const; const PointType& operator[](const size_t index) const; // Iterator over the points in the point cloud. using ConstIterator = std::vector::const_iterator; ConstIterator begin() const; ConstIterator end() const; //。。。void push_back(PointType value); void push_back(PointType value,float intensity); void push_back(PointType value); // Creates a PointCloud consisting of all the points for which `predicate` // returns true, together with the corresponding intensities. // 根据条件进行赋值 template PointCloud copy_if(UnaryPredicate predicate) const { std::vector points; std::vector intensities; // Note: benchmarks show that it is better to have this conditional outside // the loop. if (intensities_.empty()) { for (size_t index = 0; index < size(); ++index) { const PointType& point = points_[index]; // 表达式为true时才使用这个点 if (predicate(point)) { points.push_back(point); } } } else { for (size_t index = 0; index < size(); ++index) { const PointType& point = points_[index]; if (predicate(point)) { points.push_back(point); intensities.push_back(intensities_[index]); } } } return PointCloud(points, intensities); } private: // For 2D points, the third entry is 0.f. std::vector points_; // Intensities are optional. If non-empty, they must have the same size as // points. std::vector intensities_; }; // Stores 3D positions of points with their relative measurement time in the // fourth entry. Time is in seconds, increasing and relative to the moment when // the last point was acquired. So, the fourth entry for the last point is 0.f. // If timing is not available, all fourth entries are 0.f. For 2D points, the // third entry is 0.f (and the fourth entry is time). // 将点的3D位置及其相对测量时间存储在第四项中. // 时间以秒为单位, 相对于获取最后一点的时间增加. 因此, 最后一点的第四个条目是0.f. // 如果计时不可用, 则所有第四项均为0.f. 对于2D点, z坐标是0.f(第四项是时间). using TimedPointCloud = std::vector; // TODO(wohe): Retained for cartographer_ros. To be removed once it is no // longer used there. struct PointCloudWithIntensities { TimedPointCloud points; std::vector intensities; }; // Transforms 'point_cloud' according to 'transform'. PointCloud TransformPointCloud(const PointCloud& point_cloud, const transform::Rigid3f& transform); //... PointCloud TransformPointCloudNew(PointCloud& point_cloud, const transform::Rigid3f& transform); // ...Transforms 'point_cloud' according to 'transform'. PointCloudWithIntensities TransformTimedPointCloud(const PointCloudWithIntensities& point_cloud, const transform::Rigid3f& transform); TimedPointCloud TransformTimedPointCloud(const TimedPointCloud& point_cloud, const transform::Rigid3f& transform); // Returns a new point cloud without points that fall outside the region defined // by 'min_z' and 'max_z'. PointCloud CropPointCloud(const PointCloud& point_cloud, float min_z, float max_z); } // namespace sensor } // namespace cartographer #endif // CARTOGRAPHER_SENSOR_POINT_CLOUD_H_