From c249a9901d0e339393ce9964b15365f0d32071d9 Mon Sep 17 00:00:00 2001 From: gaschler Date: Tue, 19 Jun 2018 16:59:17 +0200 Subject: [PATCH] Endpoints for DeleteTrajectory (#1207) [RFC=0023](https://github.com/googlecartographer/rfcs/blob/master/text/0023-delete-load.md) --- .../cloud/internal/client/pose_graph_stub.cc | 7 ++- .../cloud/internal/client_server_test.cc | 31 +++++++++++++ .../handlers/delete_trajectory_handler.cc | 41 ++++++++++++++++++ .../handlers/delete_trajectory_handler.h | 43 +++++++++++++++++++ .../cloud/internal/map_builder_server.cc | 2 + .../cloud/proto/map_builder_service.proto | 7 +++ 6 files changed, 130 insertions(+), 1 deletion(-) create mode 100644 cartographer/cloud/internal/handlers/delete_trajectory_handler.cc create mode 100644 cartographer/cloud/internal/handlers/delete_trajectory_handler.h diff --git a/cartographer/cloud/internal/client/pose_graph_stub.cc b/cartographer/cloud/internal/client/pose_graph_stub.cc index f1b9450..78ebd2a 100644 --- a/cartographer/cloud/internal/client/pose_graph_stub.cc +++ b/cartographer/cloud/internal/client/pose_graph_stub.cc @@ -16,6 +16,7 @@ #include "cartographer/cloud/internal/client/pose_graph_stub.h" #include "async_grpc/client.h" +#include "cartographer/cloud/internal/handlers/delete_trajectory_handler.h" #include "cartographer/cloud/internal/handlers/get_all_submap_poses.h" #include "cartographer/cloud/internal/handlers/get_constraints_handler.h" #include "cartographer/cloud/internal/handlers/get_landmark_poses_handler.h" @@ -136,7 +137,11 @@ void PoseGraphStub::SetLandmarkPose(const std::string& landmark_id, } void PoseGraphStub::DeleteTrajectory(int trajectory_id) { - LOG(FATAL) << "not implemented"; + proto::DeleteTrajectoryRequest request; + request.set_trajectory_id(trajectory_id); + async_grpc::Client client( + client_channel_); + CHECK(client.Write(request)); } bool PoseGraphStub::IsTrajectoryFinished(int trajectory_id) const { diff --git a/cartographer/cloud/internal/client_server_test.cc b/cartographer/cloud/internal/client_server_test.cc index bf7e572..a39bed6 100644 --- a/cartographer/cloud/internal/client_server_test.cc +++ b/cartographer/cloud/internal/client_server_test.cc @@ -318,6 +318,37 @@ TEST_F(ClientServerTest, LocalSlam2D) { server_->Shutdown(); } +TEST_F(ClientServerTest, LocalSlamAndDelete2D) { + InitializeRealServer(); + server_->Start(); + InitializeStub(); + int trajectory_id = + stub_->AddTrajectoryBuilder({kRangeSensorId}, trajectory_builder_options_, + local_slam_result_callback_); + TrajectoryBuilderInterface* trajectory_stub = + stub_->GetTrajectoryBuilder(trajectory_id); + const auto measurements = mapping::testing::GenerateFakeRangeMeasurements( + kTravelDistance, kDuration, kTimeStep); + for (const auto& measurement : measurements) { + trajectory_stub->AddSensorData(kRangeSensorId.id, measurement); + } + WaitForLocalSlamResults(measurements.size()); + stub_->pose_graph()->RunFinalOptimization(); + // TODO(gaschler): Enable after pending PR has merged. + // EXPECT_EQ(stub_->pose_graph()->GetTrajectoryStates().at(trajectory_id), + // PoseGraphInterface::TrajectoryState::ACTIVE); + EXPECT_GT(stub_->pose_graph()->GetAllSubmapPoses().size(), 0); + EXPECT_GT(stub_->pose_graph()->GetTrajectoryNodePoses().size(), 0); + stub_->FinishTrajectory(trajectory_id); + stub_->pose_graph()->DeleteTrajectory(trajectory_id); + stub_->pose_graph()->RunFinalOptimization(); + // EXPECT_EQ(stub_->pose_graph()->GetTrajectoryStates().at(trajectory_id), + // PoseGraphInterface::TrajectoryState::DELETED); + EXPECT_EQ(stub_->pose_graph()->GetAllSubmapPoses().size(), 0); + EXPECT_EQ(stub_->pose_graph()->GetTrajectoryNodePoses().size(), 0); + server_->Shutdown(); +} + TEST_F(ClientServerTest, GlobalSlam3D) { map_builder_server_options_.mutable_map_builder_options() ->set_use_trajectory_builder_2d(false); diff --git a/cartographer/cloud/internal/handlers/delete_trajectory_handler.cc b/cartographer/cloud/internal/handlers/delete_trajectory_handler.cc new file mode 100644 index 0000000..110daea --- /dev/null +++ b/cartographer/cloud/internal/handlers/delete_trajectory_handler.cc @@ -0,0 +1,41 @@ +/* + * 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. + */ + +#include "cartographer/cloud/internal/handlers/delete_trajectory_handler.h" + +#include "async_grpc/rpc_handler.h" +#include "cartographer/cloud/internal/map_builder_context_interface.h" +#include "cartographer/cloud/proto/map_builder_service.pb.h" +#include "cartographer/common/make_unique.h" +#include "google/protobuf/empty.pb.h" + +namespace cartographer { +namespace cloud { +namespace handlers { + +void DeleteTrajectoryHandler::OnRequest( + const proto::DeleteTrajectoryRequest& request) { + GetContext() + ->map_builder() + .pose_graph() + ->DeleteTrajectory(request.trajectory_id()); + // TODO(gaschler): Think if LocalSlamUploader needs to be notified. + Send(common::make_unique()); +} + +} // namespace handlers +} // namespace cloud +} // namespace cartographer diff --git a/cartographer/cloud/internal/handlers/delete_trajectory_handler.h b/cartographer/cloud/internal/handlers/delete_trajectory_handler.h new file mode 100644 index 0000000..d390940 --- /dev/null +++ b/cartographer/cloud/internal/handlers/delete_trajectory_handler.h @@ -0,0 +1,43 @@ +/* + * 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_CLOUD_INTERNAL_HANDLERS_DELETE_TRAJECTORY_HANDLER_H +#define CARTOGRAPHER_CLOUD_INTERNAL_HANDLERS_DELETE_TRAJECTORY_HANDLER_H + +#include "async_grpc/rpc_handler.h" +#include "cartographer/cloud/proto/map_builder_service.pb.h" +#include "google/protobuf/empty.pb.h" + +namespace cartographer { +namespace cloud { +namespace handlers { + +DEFINE_HANDLER_SIGNATURE( + DeleteTrajectorySignature, proto::DeleteTrajectoryRequest, + google::protobuf::Empty, + "/cartographer.cloud.proto.MapBuilderService/DeleteTrajectory") + +class DeleteTrajectoryHandler + : public async_grpc::RpcHandler { + public: + void OnRequest(const proto::DeleteTrajectoryRequest& request) override; +}; + +} // namespace handlers +} // namespace cloud +} // namespace cartographer + +#endif // CARTOGRAPHER_CLOUD_INTERNAL_HANDLERS_DELETE_TRAJECTORY_HANDLER_H diff --git a/cartographer/cloud/internal/map_builder_server.cc b/cartographer/cloud/internal/map_builder_server.cc index d135982..6752b4d 100644 --- a/cartographer/cloud/internal/map_builder_server.cc +++ b/cartographer/cloud/internal/map_builder_server.cc @@ -23,6 +23,7 @@ #include "cartographer/cloud/internal/handlers/add_rangefinder_data_handler.h" #include "cartographer/cloud/internal/handlers/add_sensor_data_batch_handler.h" #include "cartographer/cloud/internal/handlers/add_trajectory_handler.h" +#include "cartographer/cloud/internal/handlers/delete_trajectory_handler.h" #include "cartographer/cloud/internal/handlers/finish_trajectory_handler.h" #include "cartographer/cloud/internal/handlers/get_all_submap_poses.h" #include "cartographer/cloud/internal/handlers/get_constraints_handler.h" @@ -74,6 +75,7 @@ MapBuilderServer::MapBuilderServer( server_builder.RegisterHandler(); server_builder.RegisterHandler(); server_builder.RegisterHandler(); + server_builder.RegisterHandler(); server_builder .RegisterHandler(); server_builder.RegisterHandler(); diff --git a/cartographer/cloud/proto/map_builder_service.proto b/cartographer/cloud/proto/map_builder_service.proto index 07ab5ea..0b5d4b5 100644 --- a/cartographer/cloud/proto/map_builder_service.proto +++ b/cartographer/cloud/proto/map_builder_service.proto @@ -98,6 +98,10 @@ message FinishTrajectoryRequest { int32 trajectory_id = 1; } +message DeleteTrajectoryRequest { + int32 trajectory_id = 1; +} + message ReceiveLocalSlamResultsRequest { int32 trajectory_id = 1; } @@ -245,6 +249,9 @@ service MapBuilderService { // i.e. no further sensor data is expected. rpc FinishTrajectory(FinishTrajectoryRequest) returns (google.protobuf.Empty); + // Deletes a trajectory asynchronously. + rpc DeleteTrajectory(DeleteTrajectoryRequest) returns (google.protobuf.Empty); + // Retrieves a single submap. rpc GetSubmap(GetSubmapRequest) returns (GetSubmapResponse);