Add a gRPC version of SetLandmarkPose(). (#1068)
parent
75f899117a
commit
7b68844937
|
@ -24,6 +24,7 @@
|
||||||
#include "cartographer/cloud/internal/handlers/is_trajectory_finished_handler.h"
|
#include "cartographer/cloud/internal/handlers/is_trajectory_finished_handler.h"
|
||||||
#include "cartographer/cloud/internal/handlers/is_trajectory_frozen_handler.h"
|
#include "cartographer/cloud/internal/handlers/is_trajectory_frozen_handler.h"
|
||||||
#include "cartographer/cloud/internal/handlers/run_final_optimization_handler.h"
|
#include "cartographer/cloud/internal/handlers/run_final_optimization_handler.h"
|
||||||
|
#include "cartographer/cloud/internal/handlers/set_landmark_pose_handler.h"
|
||||||
#include "cartographer/mapping/pose_graph.h"
|
#include "cartographer/mapping/pose_graph.h"
|
||||||
#include "cartographer/transform/transform.h"
|
#include "cartographer/transform/transform.h"
|
||||||
#include "glog/logging.h"
|
#include "glog/logging.h"
|
||||||
|
@ -111,7 +112,13 @@ std::map<std::string, transform::Rigid3d> PoseGraphStub::GetLandmarkPoses() {
|
||||||
|
|
||||||
void PoseGraphStub::SetLandmarkPose(const std::string& landmark_id,
|
void PoseGraphStub::SetLandmarkPose(const std::string& landmark_id,
|
||||||
const transform::Rigid3d& global_pose) {
|
const transform::Rigid3d& global_pose) {
|
||||||
LOG(FATAL) << "Not implemented";
|
proto::SetLandmarkPoseRequest request;
|
||||||
|
request.mutable_landmark_pose()->set_landmark_id(landmark_id);
|
||||||
|
*request.mutable_landmark_pose()->mutable_global_pose() =
|
||||||
|
transform::ToProto(global_pose);
|
||||||
|
async_grpc::Client<handlers::SetLandmarkPoseSignature> client(
|
||||||
|
client_channel_);
|
||||||
|
CHECK(client.Write(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PoseGraphStub::IsTrajectoryFinished(int trajectory_id) {
|
bool PoseGraphStub::IsTrajectoryFinished(int trajectory_id) {
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
/*
|
||||||
|
* 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/set_landmark_pose_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/transform/transform.h"
|
||||||
|
#include "google/protobuf/empty.pb.h"
|
||||||
|
|
||||||
|
namespace cartographer {
|
||||||
|
namespace cloud {
|
||||||
|
namespace handlers {
|
||||||
|
|
||||||
|
void SetLandmarkPoseHandler::OnRequest(
|
||||||
|
const proto::SetLandmarkPoseRequest& request) {
|
||||||
|
GetContext<MapBuilderContextInterface>()
|
||||||
|
->map_builder()
|
||||||
|
.pose_graph()
|
||||||
|
->SetLandmarkPose(
|
||||||
|
request.landmark_pose().landmark_id(),
|
||||||
|
transform::ToRigid3(request.landmark_pose().global_pose()));
|
||||||
|
Send(common::make_unique<google::protobuf::Empty>());
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace handlers
|
||||||
|
} // namespace cloud
|
||||||
|
} // namespace cartographer
|
|
@ -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_ADD_SET_LANDMARK_POSE_HANDLER_H
|
||||||
|
#define CARTOGRAPHER_CLOUD_INTERNAL_HANDLERS_ADD_SET_LANDMARK_POSE_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(
|
||||||
|
SetLandmarkPoseSignature, proto::SetLandmarkPoseRequest,
|
||||||
|
google::protobuf::Empty,
|
||||||
|
"/cartographer.cloud.proto.MapBuilderService/SetLandmarkPose")
|
||||||
|
|
||||||
|
class SetLandmarkPoseHandler
|
||||||
|
: public async_grpc::RpcHandler<SetLandmarkPoseSignature> {
|
||||||
|
public:
|
||||||
|
void OnRequest(const proto::SetLandmarkPoseRequest &request) override;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace handlers
|
||||||
|
} // namespace cloud
|
||||||
|
} // namespace cartographer
|
||||||
|
|
||||||
|
#endif // CARTOGRAPHER_CLOUD_INTERNAL_HANDLERS_ADD_SET_LANDMARK_POSE_HANDLER_H
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* 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/set_landmark_pose_handler.h"
|
||||||
|
#include "cartographer/cloud/internal/testing/handler_test.h"
|
||||||
|
#include "cartographer/cloud/internal/testing/test_helpers.h"
|
||||||
|
#include "cartographer/transform/rigid_transform_test_helpers.h"
|
||||||
|
#include "google/protobuf/text_format.h"
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
namespace cartographer {
|
||||||
|
namespace cloud {
|
||||||
|
namespace handlers {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
const std::string kMessage = R"(
|
||||||
|
landmark_pose {
|
||||||
|
landmark_id: "landmark_1"
|
||||||
|
global_pose {
|
||||||
|
translation {
|
||||||
|
x: 1 y: 2 z: 3
|
||||||
|
}
|
||||||
|
rotation {
|
||||||
|
w: 4 x: 5 y: 6 z: 7
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})";
|
||||||
|
|
||||||
|
using SetLandmarkPoseHandlerTest =
|
||||||
|
testing::HandlerTest<SetLandmarkPoseSignature, SetLandmarkPoseHandler>;
|
||||||
|
|
||||||
|
TEST_F(SetLandmarkPoseHandlerTest, SetLandmarkPose) {
|
||||||
|
constexpr double kEps = 1e-10;
|
||||||
|
proto::SetLandmarkPoseRequest request;
|
||||||
|
EXPECT_TRUE(
|
||||||
|
google::protobuf::TextFormat::ParseFromString(kMessage, &request));
|
||||||
|
EXPECT_CALL(
|
||||||
|
*mock_pose_graph_,
|
||||||
|
SetLandmarkPose("landmark_1",
|
||||||
|
transform::IsNearly(
|
||||||
|
transform::Rigid3d(Eigen::Vector3d(1, 2, 3),
|
||||||
|
Eigen::Quaterniond(4, 5, 6, 7)),
|
||||||
|
kEps)));
|
||||||
|
test_server_->SendWrite(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
} // namespace handlers
|
||||||
|
} // namespace cloud
|
||||||
|
} // namespace cartographer
|
|
@ -35,6 +35,7 @@
|
||||||
#include "cartographer/cloud/internal/handlers/load_state_handler.h"
|
#include "cartographer/cloud/internal/handlers/load_state_handler.h"
|
||||||
#include "cartographer/cloud/internal/handlers/receive_local_slam_results_handler.h"
|
#include "cartographer/cloud/internal/handlers/receive_local_slam_results_handler.h"
|
||||||
#include "cartographer/cloud/internal/handlers/run_final_optimization_handler.h"
|
#include "cartographer/cloud/internal/handlers/run_final_optimization_handler.h"
|
||||||
|
#include "cartographer/cloud/internal/handlers/set_landmark_pose_handler.h"
|
||||||
#include "cartographer/cloud/internal/handlers/write_state_handler.h"
|
#include "cartographer/cloud/internal/handlers/write_state_handler.h"
|
||||||
#include "cartographer/cloud/internal/sensor/serialization.h"
|
#include "cartographer/cloud/internal/sensor/serialization.h"
|
||||||
#include "glog/logging.h"
|
#include "glog/logging.h"
|
||||||
|
@ -81,6 +82,7 @@ MapBuilderServer::MapBuilderServer(
|
||||||
server_builder.RegisterHandler<handlers::LoadStateHandler>();
|
server_builder.RegisterHandler<handlers::LoadStateHandler>();
|
||||||
server_builder.RegisterHandler<handlers::RunFinalOptimizationHandler>();
|
server_builder.RegisterHandler<handlers::RunFinalOptimizationHandler>();
|
||||||
server_builder.RegisterHandler<handlers::WriteStateHandler>();
|
server_builder.RegisterHandler<handlers::WriteStateHandler>();
|
||||||
|
server_builder.RegisterHandler<handlers::SetLandmarkPoseHandler>();
|
||||||
grpc_server_ = server_builder.Build();
|
grpc_server_ = server_builder.Build();
|
||||||
if (map_builder_server_options.map_builder_options()
|
if (map_builder_server_options.map_builder_options()
|
||||||
.use_trajectory_builder_2d()) {
|
.use_trajectory_builder_2d()) {
|
||||||
|
|
|
@ -126,13 +126,12 @@ message GetTrajectoryNodePosesResponse {
|
||||||
repeated TrajectoryNodePose node_poses = 1;
|
repeated TrajectoryNodePose node_poses = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message LandmarkPose {
|
message GetLandmarkPosesResponse {
|
||||||
string landmark_id = 1;
|
repeated cartographer.mapping.proto.PoseGraph.LandmarkPose landmark_poses = 1;
|
||||||
cartographer.transform.proto.Rigid3d global_pose = 2;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
message GetLandmarkPosesResponse {
|
message SetLandmarkPoseRequest {
|
||||||
repeated LandmarkPose landmark_poses = 1;
|
cartographer.mapping.proto.PoseGraph.LandmarkPose landmark_pose = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
message SubmapPose {
|
message SubmapPose {
|
||||||
|
@ -246,6 +245,9 @@ service MapBuilderService {
|
||||||
// Returns the list of constraints in the current optimization problem.
|
// Returns the list of constraints in the current optimization problem.
|
||||||
rpc GetConstraints(google.protobuf.Empty) returns (GetConstraintsResponse);
|
rpc GetConstraints(google.protobuf.Empty) returns (GetConstraintsResponse);
|
||||||
|
|
||||||
|
// Sets a pose for a landmark.
|
||||||
|
rpc SetLandmarkPose(SetLandmarkPoseRequest) returns (google.protobuf.Empty);
|
||||||
|
|
||||||
// Checks whether the trajectory is finished.
|
// Checks whether the trajectory is finished.
|
||||||
rpc IsTrajectoryFinished(IsTrajectoryFinishedRequest)
|
rpc IsTrajectoryFinished(IsTrajectoryFinishedRequest)
|
||||||
returns (IsTrajectoryFinishedResponse);
|
returns (IsTrajectoryFinishedResponse);
|
||||||
|
|
|
@ -129,7 +129,7 @@ TEST_F(PoseGraph3DTest, BasicSerialization) {
|
||||||
EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(
|
EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(
|
||||||
proto.trajectory(0), actual_proto.trajectory(0)));
|
proto.trajectory(0), actual_proto.trajectory(0)));
|
||||||
EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(
|
EXPECT_TRUE(google::protobuf::util::MessageDifferencer::Equals(
|
||||||
proto.landmarks(0), actual_proto.landmarks(0)));
|
proto.landmark_poses(0), actual_proto.landmark_poses(0)));
|
||||||
EXPECT_TRUE(
|
EXPECT_TRUE(
|
||||||
google::protobuf::util::MessageDifferencer::Equals(proto, actual_proto));
|
google::protobuf::util::MessageDifferencer::Equals(proto, actual_proto));
|
||||||
}
|
}
|
||||||
|
|
|
@ -120,9 +120,9 @@ proto::Trajectory* CreateTrajectoryIfNeeded(int trajectory_id,
|
||||||
return trajectory;
|
return trajectory;
|
||||||
}
|
}
|
||||||
|
|
||||||
proto::PoseGraph::Landmark CreateFakeLandmark(
|
proto::PoseGraph::LandmarkPose CreateFakeLandmark(
|
||||||
const std::string& landmark_id, const transform::Rigid3d& global_pose) {
|
const std::string& landmark_id, const transform::Rigid3d& global_pose) {
|
||||||
proto::PoseGraph::Landmark landmark;
|
proto::PoseGraph::LandmarkPose landmark;
|
||||||
landmark.set_landmark_id(landmark_id);
|
landmark.set_landmark_id(landmark_id);
|
||||||
*landmark.mutable_global_pose() = transform::ToProto(global_pose);
|
*landmark.mutable_global_pose() = transform::ToProto(global_pose);
|
||||||
return landmark;
|
return landmark;
|
||||||
|
@ -156,9 +156,9 @@ void AddToProtoGraph(const proto::PoseGraph::Constraint& constraint,
|
||||||
*pose_graph->add_constraint() = constraint;
|
*pose_graph->add_constraint() = constraint;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AddToProtoGraph(const proto::PoseGraph::Landmark& landmark,
|
void AddToProtoGraph(const proto::PoseGraph::LandmarkPose& landmark,
|
||||||
proto::PoseGraph* pose_graph) {
|
proto::PoseGraph* pose_graph) {
|
||||||
*pose_graph->add_landmarks() = landmark;
|
*pose_graph->add_landmark_poses() = landmark;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|
|
@ -43,7 +43,7 @@ proto::PoseGraph::Constraint CreateFakeConstraint(const proto::Node& node,
|
||||||
|
|
||||||
proto::Trajectory* CreateTrajectoryIfNeeded(int trajectory_id,
|
proto::Trajectory* CreateTrajectoryIfNeeded(int trajectory_id,
|
||||||
proto::PoseGraph* pose_graph);
|
proto::PoseGraph* pose_graph);
|
||||||
proto::PoseGraph::Landmark CreateFakeLandmark(
|
proto::PoseGraph::LandmarkPose CreateFakeLandmark(
|
||||||
const std::string& landmark_id, const transform::Rigid3d& global_pose);
|
const std::string& landmark_id, const transform::Rigid3d& global_pose);
|
||||||
|
|
||||||
void AddToProtoGraph(const proto::Node& node_data,
|
void AddToProtoGraph(const proto::Node& node_data,
|
||||||
|
@ -55,7 +55,7 @@ void AddToProtoGraph(const proto::Submap& submap_data,
|
||||||
void AddToProtoGraph(const proto::PoseGraph::Constraint& constraint,
|
void AddToProtoGraph(const proto::PoseGraph::Constraint& constraint,
|
||||||
proto::PoseGraph* pose_graph);
|
proto::PoseGraph* pose_graph);
|
||||||
|
|
||||||
void AddToProtoGraph(const proto::PoseGraph::Landmark& landmark_node,
|
void AddToProtoGraph(const proto::PoseGraph::LandmarkPose& landmark_node,
|
||||||
proto::PoseGraph* pose_graph);
|
proto::PoseGraph* pose_graph);
|
||||||
|
|
||||||
} // namespace test
|
} // namespace test
|
||||||
|
|
|
@ -369,7 +369,7 @@ void MapBuilder::LoadState(io::ProtoStreamReaderInterface* const reader,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set global poses of landmarks.
|
// Set global poses of landmarks.
|
||||||
for (const auto& landmark : pose_graph_proto.landmarks()) {
|
for (const auto& landmark : pose_graph_proto.landmark_poses()) {
|
||||||
pose_graph_->SetLandmarkPose(landmark.landmark_id(),
|
pose_graph_->SetLandmarkPose(landmark.landmark_id(),
|
||||||
transform::ToRigid3(landmark.global_pose()));
|
transform::ToRigid3(landmark.global_pose()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,9 +156,9 @@ proto::PoseGraph PoseGraph::ToProto() {
|
||||||
}
|
}
|
||||||
|
|
||||||
auto landmarks_copy = GetLandmarkPoses();
|
auto landmarks_copy = GetLandmarkPoses();
|
||||||
proto.mutable_landmarks()->Reserve(landmarks_copy.size());
|
proto.mutable_landmark_poses()->Reserve(landmarks_copy.size());
|
||||||
for (const auto& id_pose : landmarks_copy) {
|
for (const auto& id_pose : landmarks_copy) {
|
||||||
auto* landmark_proto = proto.add_landmarks();
|
auto* landmark_proto = proto.add_landmark_poses();
|
||||||
landmark_proto->set_landmark_id(id_pose.first);
|
landmark_proto->set_landmark_id(id_pose.first);
|
||||||
*landmark_proto->mutable_global_pose() = transform::ToProto(id_pose.second);
|
*landmark_proto->mutable_global_pose() = transform::ToProto(id_pose.second);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,12 +51,12 @@ message PoseGraph {
|
||||||
Tag tag = 5;
|
Tag tag = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
message Landmark {
|
message LandmarkPose {
|
||||||
string landmark_id = 1;
|
string landmark_id = 1;
|
||||||
transform.proto.Rigid3d global_pose = 2;
|
transform.proto.Rigid3d global_pose = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
repeated Constraint constraint = 2;
|
repeated Constraint constraint = 2;
|
||||||
repeated Trajectory trajectory = 4;
|
repeated Trajectory trajectory = 4;
|
||||||
repeated Landmark landmarks = 5;
|
repeated LandmarkPose landmark_poses = 5;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue