diff --git a/cartographer_grpc/handlers/run_final_optimization.h b/cartographer_grpc/handlers/run_final_optimization.h new file mode 100644 index 0000000..8e11124 --- /dev/null +++ b/cartographer_grpc/handlers/run_final_optimization.h @@ -0,0 +1,46 @@ +/* + * Copyright 2018 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_GRPC_HANDLERS_RUN_FINAL_OPTIMIZATION_H +#define CARTOGRAPHER_GRPC_HANDLERS_RUN_FINAL_OPTIMIZATION_H + +#include "cartographer/common/make_unique.h" +#include "cartographer/mapping/pose_graph.h" +#include "cartographer_grpc/framework/rpc_handler.h" +#include "cartographer_grpc/map_builder_server.h" +#include "cartographer_grpc/proto/map_builder_service.pb.h" +#include "google/protobuf/empty.pb.h" + +namespace cartographer_grpc { +namespace handlers { + +class RunFinalOptimizationHandler + : public framework::RpcHandler { + public: + void OnRequest(const google::protobuf::Empty& request) override { + GetContext() + ->map_builder() + .pose_graph() + ->RunFinalOptimization(); + Send(cartographer::common::make_unique()); + } +}; + +} // namespace handlers +} // namespace cartographer_grpc + +#endif // CARTOGRAPHER_GRPC_HANDLERS_RUN_FINAL_OPTIMIZATION_H diff --git a/cartographer_grpc/map_builder_server.cc b/cartographer_grpc/map_builder_server.cc index a1a74fd..d102dcc 100644 --- a/cartographer_grpc/map_builder_server.cc +++ b/cartographer_grpc/map_builder_server.cc @@ -31,6 +31,7 @@ #include "cartographer_grpc/handlers/get_trajectory_node_poses_handler.h" #include "cartographer_grpc/handlers/load_map_handler.h" #include "cartographer_grpc/handlers/receive_local_slam_results_handler.h" +#include "cartographer_grpc/handlers/run_final_optimization.h" #include "cartographer_grpc/proto/map_builder_service.grpc.pb.h" #include "glog/logging.h" @@ -253,6 +254,9 @@ MapBuilderServer::MapBuilderServer( server_builder .RegisterHandler( "LoadMap"); + server_builder.RegisterHandler( + "RunFinalOptimization"); grpc_server_ = server_builder.Build(); grpc_server_->SetExecutionContext( cartographer::common::make_unique(this)); diff --git a/cartographer_grpc/mapping/pose_graph_stub.cc b/cartographer_grpc/mapping/pose_graph_stub.cc index efa65c3..fe8ca55 100644 --- a/cartographer_grpc/mapping/pose_graph_stub.cc +++ b/cartographer_grpc/mapping/pose_graph_stub.cc @@ -26,7 +26,12 @@ PoseGraphStub::PoseGraphStub(std::shared_ptr client_channel, proto::MapBuilderService::Stub* stub) : client_channel_(client_channel), stub_(stub) {} -void PoseGraphStub::RunFinalOptimization() { LOG(FATAL) << "Not implemented"; } +void PoseGraphStub::RunFinalOptimization() { + grpc::ClientContext client_context; + google::protobuf::Empty request; + google::protobuf::Empty response; + CHECK(stub_->RunFinalOptimization(&client_context, request, &response).ok()); +} cartographer::mapping::MapById< cartographer::mapping::SubmapId, diff --git a/cartographer_grpc/proto/map_builder_service.proto b/cartographer_grpc/proto/map_builder_service.proto index fdf0a87..ac3d09d 100644 --- a/cartographer_grpc/proto/map_builder_service.proto +++ b/cartographer_grpc/proto/map_builder_service.proto @@ -192,6 +192,10 @@ service MapBuilderService { // Returns the list of constraints in the current optimization problem. rpc GetConstraints(google.protobuf.Empty) returns (GetConstraintsResponse); + // Requests a PoseGraph to call RunFinalOptimization. + rpc RunFinalOptimization(google.protobuf.Empty) + returns (google.protobuf.Empty); + // Adds map data in the order defined by ProtoStreamReader. rpc LoadMap(stream LoadMapRequest) returns (google.protobuf.Empty); }