From 33fcc1a3de069df3ba395b0890ae8c51f85529bc Mon Sep 17 00:00:00 2001 From: gaschler Date: Mon, 23 Jul 2018 16:42:44 +0200 Subject: [PATCH] Set client_id in LoadState(FromFile) (#1320) --- cartographer/cloud/client/map_builder_stub.cc | 6 ++++++ cartographer/cloud/internal/client_server_test.cc | 10 +++++++++- .../internal/handlers/load_state_from_file_handler.cc | 4 ++++ .../cloud/internal/handlers/load_state_handler.cc | 7 +++++++ .../cloud/internal/handlers/load_state_handler.h | 1 + cartographer/cloud/proto/map_builder_service.proto | 2 ++ 6 files changed, 29 insertions(+), 1 deletion(-) diff --git a/cartographer/cloud/client/map_builder_stub.cc b/cartographer/cloud/client/map_builder_stub.cc index 0f216ef..e99521e 100644 --- a/cartographer/cloud/client/map_builder_stub.cc +++ b/cartographer/cloud/client/map_builder_stub.cc @@ -148,6 +148,11 @@ std::map MapBuilderStub::LoadState( LOG(FATAL) << "Not implemented"; } async_grpc::Client client(client_channel_); + { + proto::LoadStateRequest request; + request.set_client_id(client_id_); + CHECK(client.Write(request)); + } io::ProtoStreamDeserializer deserializer(reader); // Request with the SerializationHeader proto is sent first. @@ -188,6 +193,7 @@ std::map MapBuilderStub::LoadStateFromFile( const std::string& filename) { proto::LoadStateFromFileRequest request; request.set_file_path(filename); + request.set_client_id(client_id_); async_grpc::Client client( client_channel_); CHECK(client.Write(request)); diff --git a/cartographer/cloud/internal/client_server_test.cc b/cartographer/cloud/internal/client_server_test.cc index 58c0ff8..05f54a3 100644 --- a/cartographer/cloud/internal/client_server_test.cc +++ b/cartographer/cloud/internal/client_server_test.cc @@ -529,7 +529,7 @@ TEST_F(ClientServerTest, LocalSlam2DUplinkServerRestarting) { server_->WaitForShutdown(); } -TEST_F(ClientServerTest, LoadState) { +TEST_F(ClientServerTest, LoadStateAndDelete) { InitializeRealServer(); server_->Start(); InitializeStub(); @@ -553,9 +553,17 @@ TEST_F(ClientServerTest, LoadState) { int expected_trajectory_id = 0; EXPECT_EQ(trajectory_remapping.size(), 1); EXPECT_EQ(trajectory_remapping.at(0), expected_trajectory_id); + stub_->pose_graph()->RunFinalOptimization(); EXPECT_TRUE(stub_->pose_graph()->IsTrajectoryFrozen(expected_trajectory_id)); EXPECT_FALSE( stub_->pose_graph()->IsTrajectoryFinished(expected_trajectory_id)); + for (const auto& entry : trajectory_remapping) { + int trajectory_id = entry.second; + stub_->pose_graph()->DeleteTrajectory(trajectory_id); + stub_->pose_graph()->RunFinalOptimization(); + EXPECT_EQ(stub_->pose_graph()->GetTrajectoryStates().at(trajectory_id), + PoseGraphInterface::TrajectoryState::DELETED); + } server_->Shutdown(); } diff --git a/cartographer/cloud/internal/handlers/load_state_from_file_handler.cc b/cartographer/cloud/internal/handlers/load_state_from_file_handler.cc index 4319e7c..863ceed 100644 --- a/cartographer/cloud/internal/handlers/load_state_from_file_handler.cc +++ b/cartographer/cloud/internal/handlers/load_state_from_file_handler.cc @@ -33,6 +33,10 @@ void LoadStateFromFileHandler::OnRequest( auto trajectory_remapping = GetContext()->map_builder().LoadStateFromFile( request.file_path()); + for (const auto& entry : trajectory_remapping) { + GetContext()->RegisterClientIdForTrajectory( + request.client_id(), entry.second); + } auto response = common::make_unique(); *response->mutable_trajectory_remapping() = ToProto(trajectory_remapping); Send(std::move(response)); diff --git a/cartographer/cloud/internal/handlers/load_state_handler.cc b/cartographer/cloud/internal/handlers/load_state_handler.cc index 4696b7d..9b925fe 100644 --- a/cartographer/cloud/internal/handlers/load_state_handler.cc +++ b/cartographer/cloud/internal/handlers/load_state_handler.cc @@ -34,6 +34,9 @@ void LoadStateHandler::OnRequest(const proto::LoadStateRequest& request) { case proto::LoadStateRequest::kSerializationHeader: reader_.AddProto(request.serialization_header()); break; + case proto::LoadStateRequest::kClientId: + client_id_ = request.client_id(); + break; default: LOG(FATAL) << "Unhandled proto::LoadStateRequest case."; } @@ -43,6 +46,10 @@ void LoadStateHandler::OnReadsDone() { auto trajectory_remapping = GetContext()->map_builder().LoadState( &reader_, true); + for (const auto& entry : trajectory_remapping) { + GetContext()->RegisterClientIdForTrajectory( + client_id_, entry.second); + } auto response = common::make_unique(); *response->mutable_trajectory_remapping() = ToProto(trajectory_remapping); Send(std::move(response)); diff --git a/cartographer/cloud/internal/handlers/load_state_handler.h b/cartographer/cloud/internal/handlers/load_state_handler.h index 0d55aff..f466ee1 100644 --- a/cartographer/cloud/internal/handlers/load_state_handler.h +++ b/cartographer/cloud/internal/handlers/load_state_handler.h @@ -37,6 +37,7 @@ class LoadStateHandler : public async_grpc::RpcHandler { private: io::InMemoryProtoStreamReader reader_; + std::string client_id_; }; } // namespace handlers diff --git a/cartographer/cloud/proto/map_builder_service.proto b/cartographer/cloud/proto/map_builder_service.proto index 761078a..4d62cc8 100644 --- a/cartographer/cloud/proto/map_builder_service.proto +++ b/cartographer/cloud/proto/map_builder_service.proto @@ -144,6 +144,7 @@ message LoadStateRequest { oneof state_chunk { cartographer.mapping.proto.SerializedData serialized_data = 1; cartographer.mapping.proto.SerializationHeader serialization_header = 2; + string client_id = 3; } } @@ -158,6 +159,7 @@ message LoadStateResponse { message LoadStateFromFileRequest { string file_path = 1; + string client_id = 2; } message LoadStateFromFileResponse {