00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
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
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 }
00161 }
00162 }