31namespace latency_statistic {
42 compensator_topic = FLAGS_compensator_topic;
43 perception_topic = FLAGS_perception_obstacle_topic;
44 prediction_topic = FLAGS_prediction_topic;
45 planning_topic = FLAGS_planning_trajectory_topic;
46 control_topic = FLAGS_control_command_topic;
55 auto metrics = std::make_shared<LatencyMetrics>();
56 apollo::common::util::FillHeader(
node_->Name(), metrics.get());
60 std::lock_guard<std::mutex> guard(lock_);
61 for (
auto it = latency_map_.begin(); it != latency_map_.end();) {
62 auto& lidar_timestamp = it->first;
64 it = latency_map_.erase(it);
67 auto& metric = it->second;
68 FillResult(lidar_timestamp, metric, &result);
72 CalculateLatency(result, metrics);
74 metric_writer_->Write(metrics);
78void LatencyStatisticComponent::FillResult(
const uint64_t& lidar_timestamp,
const Metric& metric,
Result* result) {
79 AINFO <<
"metric compensator: " << metric.
compensator <<
", lidar_timestamp: " << lidar_timestamp;
110void LatencyStatisticComponent::CalculateLatency(
const Result& result, std::shared_ptr<LatencyMetrics> metrics) {
112 auto lidar_compensator = metrics->mutable_lidar_compensator();
113 GetLatencyMetric(result.compensator_chain_list, lidar_compensator->mutable_chain_ms());
114 GetLatencyMetric(result.compensator_proc_list, lidar_compensator->mutable_proc_ms());
116 auto perception = metrics->mutable_perception();
117 GetLatencyMetric(result.perception_chain_list, perception->mutable_chain_ms());
118 GetLatencyMetric(result.perception_proc_list, perception->mutable_proc_ms());
120 auto prediction = metrics->mutable_prediction();
121 GetLatencyMetric(result.prediction_chain_list, prediction->mutable_chain_ms());
122 GetLatencyMetric(result.prediction_proc_list, prediction->mutable_proc_ms());
124 auto planning = metrics->mutable_planning();
125 GetLatencyMetric(result.planning_chain_list,
planning->mutable_chain_ms());
126 GetLatencyMetric(result.planning_proc_list,
planning->mutable_proc_ms());
128 auto control = metrics->mutable_control();
129 GetLatencyMetric(result.control_chain_list, control->mutable_chain_ms());
130 GetLatencyMetric(result.control_proc_list, control->mutable_proc_ms());
133void LatencyStatisticComponent::GetLatencyMetric(
const std::vector<uint64_t>& items, LatencyMetrics_Metric* metric) {
137 metric->set_sample_size(items.size());
139 uint64_t min = std::numeric_limits<uint64_t>::max();
142 for (
auto& item : items) {
149 uint64_t avg = sum / items.size();
150 metric->set_min(min);
151 metric->set_max(max);
152 metric->set_avg(avg);
155void LatencyStatisticComponent::CreateReaders() {
157 CreateReader<apollo::drivers::PointCloud>(compensator_topic);
159 CreateReader<apollo::perception::PerceptionObstacles>(perception_topic);
161 CreateReader<apollo::prediction::PredictionObstacles>(prediction_topic);
163 CreateReader<apollo::planning::ADCTrajectory>(planning_topic);
165 CreateReader<apollo::control::ControlCommand>(control_topic);
169void LatencyStatisticComponent::CreateReader(
const std::string& channel_name) {
170 node_->CreateReader<T>(channel_name, [
this, &channel_name](
const std::shared_ptr<T>& msg) {
171 if (!msg->has_header() || !msg->header().has_timestamp_sec() || !msg->header().has_lidar_timestamp()
172 || msg->header().lidar_timestamp() == 0) {
175 auto lidar_timestamp = msg->header().lidar_timestamp();
176 uint64_t
timestamp = cyber::Time(msg->header().timestamp_sec()).ToNanosecond();
177 std::lock_guard<std::mutex> guard(lock_);
178 if (latency_map_.find(lidar_timestamp) == latency_map_.end()) {
179 latency_map_.emplace(lidar_timestamp, Metric());
181 auto& metric = latency_map_.at(lidar_timestamp);
182 if (channel_name == compensator_topic) {
184 }
else if (channel_name == perception_topic) {
186 }
else if (channel_name == prediction_topic) {
188 }
else if (channel_name == planning_topic) {
190 }
else if (channel_name == control_topic) {