Make LocalTrajectoryBuilder optional. (#799)

This is to prepare for the cloud-based mapping case where the robot is running cartographer in pure-localization mode and the cloud instance only solves the global problem. In that case a `LocalTrajectoryBuilder` need to be instantiated in for the cloud instance.
master
Christoph Schütte 2018-01-09 16:54:30 +01:00 committed by Wally B. Feed
parent 8165da873f
commit 8c7c4e3d2a
2 changed files with 35 additions and 17 deletions

View File

@ -28,13 +28,15 @@ template <typename LocalTrajectoryBuilder,
typename LocalTrajectoryBuilderOptions, typename PoseGraph> typename LocalTrajectoryBuilderOptions, typename PoseGraph>
class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface { class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface {
public: public:
// Passing a 'nullptr' for 'local_trajectory_builder' is acceptable, but no
// 'TimedPointCloudData' may be added in that case.
GlobalTrajectoryBuilder( GlobalTrajectoryBuilder(
const LocalTrajectoryBuilderOptions& options, const int trajectory_id, std::unique_ptr<LocalTrajectoryBuilder> local_trajectory_builder,
PoseGraph* const pose_graph, const int trajectory_id, PoseGraph* const pose_graph,
const LocalSlamResultCallback& local_slam_result_callback) const LocalSlamResultCallback& local_slam_result_callback)
: trajectory_id_(trajectory_id), : trajectory_id_(trajectory_id),
pose_graph_(pose_graph), pose_graph_(pose_graph),
local_trajectory_builder_(options), local_trajectory_builder_(std::move(local_trajectory_builder)),
local_slam_result_callback_(local_slam_result_callback) {} local_slam_result_callback_(local_slam_result_callback) {}
~GlobalTrajectoryBuilder() override {} ~GlobalTrajectoryBuilder() override {}
@ -44,8 +46,10 @@ class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface {
void AddSensorData( void AddSensorData(
const std::string& sensor_id, const std::string& sensor_id,
const sensor::TimedPointCloudData& timed_point_cloud_data) override { const sensor::TimedPointCloudData& timed_point_cloud_data) override {
CHECK(local_trajectory_builder_)
<< "Cannot add TimedPointCloudData without a LocalTrajectoryBuilder.";
std::unique_ptr<typename LocalTrajectoryBuilder::MatchingResult> std::unique_ptr<typename LocalTrajectoryBuilder::MatchingResult>
matching_result = local_trajectory_builder_.AddRangeData( matching_result = local_trajectory_builder_->AddRangeData(
timed_point_cloud_data.time, timed_point_cloud_data.time,
sensor::TimedRangeData{timed_point_cloud_data.origin, sensor::TimedRangeData{timed_point_cloud_data.origin,
timed_point_cloud_data.ranges, timed_point_cloud_data.ranges,
@ -71,14 +75,18 @@ class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface {
void AddSensorData(const std::string& sensor_id, void AddSensorData(const std::string& sensor_id,
const sensor::ImuData& imu_data) override { const sensor::ImuData& imu_data) override {
local_trajectory_builder_.AddImuData(imu_data); if (local_trajectory_builder_) {
local_trajectory_builder_->AddImuData(imu_data);
}
pose_graph_->AddImuData(trajectory_id_, imu_data); pose_graph_->AddImuData(trajectory_id_, imu_data);
} }
void AddSensorData(const std::string& sensor_id, void AddSensorData(const std::string& sensor_id,
const sensor::OdometryData& odometry_data) override { const sensor::OdometryData& odometry_data) override {
CHECK(odometry_data.pose.IsValid()) << odometry_data.pose; CHECK(odometry_data.pose.IsValid()) << odometry_data.pose;
local_trajectory_builder_.AddOdometryData(odometry_data); if (local_trajectory_builder_) {
local_trajectory_builder_->AddOdometryData(odometry_data);
}
pose_graph_->AddOdometryData(trajectory_id_, odometry_data); pose_graph_->AddOdometryData(trajectory_id_, odometry_data);
} }
@ -95,7 +103,7 @@ class GlobalTrajectoryBuilder : public mapping::TrajectoryBuilderInterface {
private: private:
const int trajectory_id_; const int trajectory_id_;
PoseGraph* const pose_graph_; PoseGraph* const pose_graph_;
LocalTrajectoryBuilder local_trajectory_builder_; std::unique_ptr<LocalTrajectoryBuilder> local_trajectory_builder_;
LocalSlamResultCallback local_slam_result_callback_; LocalSlamResultCallback local_slam_result_callback_;
}; };

View File

@ -75,29 +75,39 @@ int MapBuilder::AddTrajectoryBuilder(
LocalSlamResultCallback local_slam_result_callback) { LocalSlamResultCallback local_slam_result_callback) {
const int trajectory_id = trajectory_builders_.size(); const int trajectory_id = trajectory_builders_.size();
if (options_.use_trajectory_builder_3d()) { if (options_.use_trajectory_builder_3d()) {
CHECK(trajectory_options.has_trajectory_builder_3d_options()); std::unique_ptr<mapping_3d::LocalTrajectoryBuilder>
local_trajectory_builder;
if (trajectory_options.has_trajectory_builder_3d_options()) {
local_trajectory_builder =
common::make_unique<mapping_3d::LocalTrajectoryBuilder>(
trajectory_options.trajectory_builder_3d_options());
}
trajectory_builders_.push_back( trajectory_builders_.push_back(
common::make_unique<CollatedTrajectoryBuilder>( common::make_unique<CollatedTrajectoryBuilder>(
&sensor_collator_, trajectory_id, expected_sensor_ids, &sensor_collator_, trajectory_id, expected_sensor_ids,
common::make_unique<mapping::GlobalTrajectoryBuilder< common::make_unique<mapping::GlobalTrajectoryBuilder<
mapping_3d::LocalTrajectoryBuilder, mapping_3d::LocalTrajectoryBuilder,
mapping_3d::proto::LocalTrajectoryBuilderOptions, mapping_3d::proto::LocalTrajectoryBuilderOptions,
mapping_3d::PoseGraph>>( mapping_3d::PoseGraph>>(std::move(local_trajectory_builder),
trajectory_options.trajectory_builder_3d_options(), trajectory_id, pose_graph_3d_.get(),
trajectory_id, pose_graph_3d_.get(), local_slam_result_callback)));
local_slam_result_callback)));
} else { } else {
CHECK(trajectory_options.has_trajectory_builder_2d_options()); std::unique_ptr<mapping_2d::LocalTrajectoryBuilder>
local_trajectory_builder;
if (trajectory_options.has_trajectory_builder_2d_options()) {
local_trajectory_builder =
common::make_unique<mapping_2d::LocalTrajectoryBuilder>(
trajectory_options.trajectory_builder_2d_options());
}
trajectory_builders_.push_back( trajectory_builders_.push_back(
common::make_unique<CollatedTrajectoryBuilder>( common::make_unique<CollatedTrajectoryBuilder>(
&sensor_collator_, trajectory_id, expected_sensor_ids, &sensor_collator_, trajectory_id, expected_sensor_ids,
common::make_unique<mapping::GlobalTrajectoryBuilder< common::make_unique<mapping::GlobalTrajectoryBuilder<
mapping_2d::LocalTrajectoryBuilder, mapping_2d::LocalTrajectoryBuilder,
mapping_2d::proto::LocalTrajectoryBuilderOptions, mapping_2d::proto::LocalTrajectoryBuilderOptions,
mapping_2d::PoseGraph>>( mapping_2d::PoseGraph>>(std::move(local_trajectory_builder),
trajectory_options.trajectory_builder_2d_options(), trajectory_id, pose_graph_2d_.get(),
trajectory_id, pose_graph_2d_.get(), local_slam_result_callback)));
local_slam_result_callback)));
} }
if (trajectory_options.pure_localization()) { if (trajectory_options.pure_localization()) {
constexpr int kSubmapsToKeep = 3; constexpr int kSubmapsToKeep = 3;