add_sensor_data_batch_handler.cc
Go to the documentation of this file.
00001 /*
00002  * Copyright 2018 The Cartographer Authors
00003  *
00004  * Licensed under the Apache License, Version 2.0 (the "License");
00005  * you may not use this file except in compliance with the License.
00006  * You may obtain a copy of the License at
00007  *
00008  *      http://www.apache.org/licenses/LICENSE-2.0
00009  *
00010  * Unless required by applicable law or agreed to in writing, software
00011  * distributed under the License is distributed on an "AS IS" BASIS,
00012  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00013  * See the License for the specific language governing permissions and
00014  * limitations under the License.
00015  */
00016 
00017 #include "cartographer/cloud/internal/handlers/add_sensor_data_batch_handler.h"
00018 
00019 #include "absl/memory/memory.h"
00020 #include "async_grpc/rpc_handler.h"
00021 #include "cartographer/cloud/internal/map_builder_context_interface.h"
00022 #include "cartographer/cloud/proto/map_builder_service.pb.h"
00023 #include "cartographer/mapping/local_slam_result_data.h"
00024 #include "cartographer/metrics/counter.h"
00025 #include "cartographer/sensor/internal/dispatchable.h"
00026 #include "cartographer/sensor/timed_point_cloud_data.h"
00027 #include "google/protobuf/empty.pb.h"
00028 
00029 namespace cartographer {
00030 namespace cloud {
00031 namespace handlers {
00032 
00033 metrics::Family<metrics::Counter>*
00034     AddSensorDataBatchHandler::counter_metrics_family_ =
00035         metrics::Family<metrics::Counter>::Null();
00036 
00037 void AddSensorDataBatchHandler::OnRequest(
00038     const proto::AddSensorDataBatchRequest& request) {
00039   for (const proto::SensorData& sensor_data : request.sensor_data()) {
00040     if (!GetContext<MapBuilderContextInterface>()->CheckClientIdForTrajectory(
00041             sensor_data.sensor_metadata().client_id(),
00042             sensor_data.sensor_metadata().trajectory_id())) {
00043       LOG(ERROR) << "Unknown trajectory with ID "
00044                  << sensor_data.sensor_metadata().trajectory_id()
00045                  << " and client_id "
00046                  << sensor_data.sensor_metadata().client_id();
00047       Finish(::grpc::Status(::grpc::NOT_FOUND, "Unknown trajectory"));
00048       return;
00049     }
00050     ClientMetrics* const metrics =
00051         GetOrCreateClientMetrics(sensor_data.sensor_metadata().client_id(),
00052                                  sensor_data.sensor_metadata().trajectory_id());
00053     switch (sensor_data.sensor_data_case()) {
00054       case proto::SensorData::kOdometryData:
00055         GetUnsynchronizedContext<MapBuilderContextInterface>()
00056             ->EnqueueSensorData(
00057                 sensor_data.sensor_metadata().trajectory_id(),
00058                 sensor::MakeDispatchable(
00059                     sensor_data.sensor_metadata().sensor_id(),
00060                     sensor::FromProto(sensor_data.odometry_data())));
00061         metrics->odometry_sensor_counter->Increment();
00062         break;
00063       case proto::SensorData::kImuData:
00064         GetUnsynchronizedContext<MapBuilderContextInterface>()
00065             ->EnqueueSensorData(sensor_data.sensor_metadata().trajectory_id(),
00066                                 sensor::MakeDispatchable(
00067                                     sensor_data.sensor_metadata().sensor_id(),
00068                                     sensor::FromProto(sensor_data.imu_data())));
00069         metrics->imu_sensor_counter->Increment();
00070         break;
00071       case proto::SensorData::kTimedPointCloudData:
00072         GetUnsynchronizedContext<MapBuilderContextInterface>()
00073             ->EnqueueSensorData(
00074                 sensor_data.sensor_metadata().trajectory_id(),
00075                 sensor::MakeDispatchable(
00076                     sensor_data.sensor_metadata().sensor_id(),
00077                     sensor::FromProto(sensor_data.timed_point_cloud_data())));
00078         metrics->timed_point_cloud_counter->Increment();
00079         break;
00080       case proto::SensorData::kFixedFramePoseData:
00081         GetUnsynchronizedContext<MapBuilderContextInterface>()
00082             ->EnqueueSensorData(
00083                 sensor_data.sensor_metadata().trajectory_id(),
00084                 sensor::MakeDispatchable(
00085                     sensor_data.sensor_metadata().sensor_id(),
00086                     sensor::FromProto(sensor_data.fixed_frame_pose_data())));
00087         metrics->fixed_frame_pose_counter->Increment();
00088         break;
00089       case proto::SensorData::kLandmarkData:
00090         GetUnsynchronizedContext<MapBuilderContextInterface>()
00091             ->EnqueueSensorData(
00092                 sensor_data.sensor_metadata().trajectory_id(),
00093                 sensor::MakeDispatchable(
00094                     sensor_data.sensor_metadata().sensor_id(),
00095                     sensor::FromProto(sensor_data.landmark_data())));
00096         metrics->landmark_counter->Increment();
00097         break;
00098       case proto::SensorData::kLocalSlamResultData:
00099         GetContext<MapBuilderContextInterface>()->EnqueueLocalSlamResultData(
00100             sensor_data.sensor_metadata().trajectory_id(),
00101             sensor_data.sensor_metadata().sensor_id(),
00102             sensor_data.local_slam_result_data());
00103         metrics->local_slam_result_counter->Increment();
00104         break;
00105       default:
00106         LOG(FATAL) << "Unknown sensor data type: "
00107                    << sensor_data.sensor_data_case();
00108     }
00109   }
00110   Send(absl::make_unique<google::protobuf::Empty>());
00111 }
00112 
00113 void AddSensorDataBatchHandler::RegisterMetrics(
00114     metrics::FamilyFactory* family_factory) {
00115   counter_metrics_family_ = family_factory->NewCounterFamily(
00116       "cartographer_sensor_data_total", "Sensor data received");
00117 }
00118 
00119 AddSensorDataBatchHandler::ClientMetrics*
00120 AddSensorDataBatchHandler::GetOrCreateClientMetrics(
00121     const std::string& client_id, int trajectory_id) {
00122   const std::string map_key = client_id + std::to_string(trajectory_id);
00123   auto client_metric_map_itr = client_metric_map_.find(map_key);
00124   if (client_metric_map_itr != client_metric_map_.end()) {
00125     return client_metric_map_itr->second.get();
00126   }
00127 
00128   auto new_metrics = absl::make_unique<ClientMetrics>();
00129   new_metrics->odometry_sensor_counter = counter_metrics_family_->Add(
00130       {{"client_id", client_id},
00131        {"trajectory_id", std::to_string(trajectory_id)},
00132        {"sensor", "odometry"}});
00133   new_metrics->imu_sensor_counter = counter_metrics_family_->Add(
00134       {{"client_id", client_id},
00135        {"trajectory_id", std::to_string(trajectory_id)},
00136        {"sensor", "imu"}});
00137   new_metrics->fixed_frame_pose_counter = counter_metrics_family_->Add(
00138       {{"client_id", client_id},
00139        {"trajectory_id", std::to_string(trajectory_id)},
00140        {"sensor", "fixed_frame_pose"}});
00141   new_metrics->landmark_counter = counter_metrics_family_->Add(
00142       {{"client_id", client_id},
00143        {"trajectory_id", std::to_string(trajectory_id)},
00144        {"sensor", "landmark"}});
00145   new_metrics->local_slam_result_counter = counter_metrics_family_->Add(
00146       {{"client_id", client_id},
00147        {"trajectory_id", std::to_string(trajectory_id)},
00148        {"sensor", "local_slam_result"}});
00149   new_metrics->timed_point_cloud_counter = counter_metrics_family_->Add(
00150       {{"client_id", client_id},
00151        {"trajectory_id", std::to_string(trajectory_id)},
00152        {"sensor", "timed_point_cloud"}});
00153 
00154   // Obtain pointer before ownership is transferred.
00155   auto* new_metrics_ptr = new_metrics.get();
00156   client_metric_map_[map_key] = std::move(new_metrics);
00157   return new_metrics_ptr;
00158 }
00159 
00160 }  // namespace handlers
00161 }  // namespace cloud
00162 }  // namespace cartographer


cartographer
Author(s): The Cartographer Authors
autogenerated on Thu May 9 2019 02:27:35