/* * 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_MAPPING_2D_SUBMAP_2D_H_ #define CARTOGRAPHER_MAPPING_2D_SUBMAP_2D_H_ #include #include #include "Eigen/Core" #include "cartographer/common/lua_parameter_dictionary.h" #include "cartographer/mapping/2d/grid_2d.h" #include "cartographer/mapping/2d/map_limits.h" #include "cartographer/mapping/proto/serialization.pb.h" #include "cartographer/mapping/proto/submap_visualization.pb.h" #include "cartographer/mapping/proto/submaps_options_2d.pb.h" #include "cartographer/mapping/range_data_inserter_interface.h" #include "cartographer/mapping/submaps.h" #include "cartographer/mapping/trajectory_node.h" #include "cartographer/mapping/value_conversion_tables.h" #include "cartographer/sensor/range_data.h" #include "cartographer/transform/rigid_transform.h" namespace cartographer { namespace mapping { proto::SubmapsOptions2D CreateSubmapsOptions2D( common::LuaParameterDictionary* parameter_dictionary); class Submap2D : public Submap { public: Submap2D(const Eigen::Vector2f& origin, std::unique_ptr grid, ValueConversionTables* conversion_tables); explicit Submap2D(const proto::Submap2D& proto, ValueConversionTables* conversion_tables); proto::Submap ToProto(bool include_grid_data) const override; void UpdateFromProto(const proto::Submap& proto) override; void ToResponseProto(const transform::Rigid3d& global_submap_pose, proto::SubmapQuery::Response* response) const override; const Grid2D* grid() const { return grid_.get(); } // Insert 'range_data' into this submap using 'range_data_inserter'. The // submap must not be finished yet. void InsertRangeData(const sensor::RangeData& range_data, const RangeDataInserterInterface* range_data_inserter); //... void InsertRangeDataNew(const sensor::RangeData& range_data, const RangeDataInserterInterface* range_data_inserter, const transform::Rigid3d local_pose_); void Finish(); private: std::unique_ptr grid_; ValueConversionTables* conversion_tables_; }; // The first active submap will be created on the insertion of the first range // data. Except during this initialization when no or only one single submap // exists, there are always two submaps into which range data is inserted: an // old submap that is used for matching, and a new one, which will be used for // matching next, that is being initialized. // // Once a certain number of range data have been inserted, the new submap is // considered initialized: the old submap is no longer changed, the "new" submap // is now the "old" submap and is used for scan-to-map matching. Moreover, a // "new" submap gets created. The "old" submap is forgotten by this object. class ActiveSubmaps2D { public: explicit ActiveSubmaps2D(const proto::SubmapsOptions2D& options); ActiveSubmaps2D(const ActiveSubmaps2D&) = delete; ActiveSubmaps2D& operator=(const ActiveSubmaps2D&) = delete; // Inserts 'range_data' into the Submap collection. std::vector> InsertRangeData( const sensor::RangeData& range_data); std::vector> submaps() const; private: std::unique_ptr CreateRangeDataInserter(); std::unique_ptr CreateGrid(const Eigen::Vector2f& origin); void FinishSubmap(); void AddSubmap(const Eigen::Vector2f& origin); const proto::SubmapsOptions2D options_; std::vector> submaps_; std::unique_ptr range_data_inserter_; ValueConversionTables conversion_tables_; }; } // namespace mapping } // namespace cartographer #endif // CARTOGRAPHER_MAPPING_2D_SUBMAP_2D_H_