Added metrics RealTimeRatio and CpuRealTimeRatio to 2d. (#1324)
Added the metrics RealTimeRatio and CpuRealTimeRatio also to local_trajectory_builder_2d. This is similar to[ PR 1275](https://github.com/googlecartographer/cartographer/pull/1275) and resolves a TODO.master
parent
fc78288ef8
commit
25f79cb6eb
|
@ -27,6 +27,8 @@ namespace cartographer {
|
||||||
namespace mapping {
|
namespace mapping {
|
||||||
|
|
||||||
static auto* kLocalSlamLatencyMetric = metrics::Gauge::Null();
|
static auto* kLocalSlamLatencyMetric = metrics::Gauge::Null();
|
||||||
|
static auto* kLocalSlamRealTimeRatio = metrics::Gauge::Null();
|
||||||
|
static auto* kLocalSlamCpuRealTimeRatio = metrics::Gauge::Null();
|
||||||
static auto* kRealTimeCorrelativeScanMatcherScoreMetric =
|
static auto* kRealTimeCorrelativeScanMatcherScoreMetric =
|
||||||
metrics::Histogram::Null();
|
metrics::Histogram::Null();
|
||||||
static auto* kCeresScanMatcherCostMetric = metrics::Histogram::Null();
|
static auto* kCeresScanMatcherCostMetric = metrics::Histogram::Null();
|
||||||
|
@ -184,6 +186,12 @@ LocalTrajectoryBuilder2D::AddRangeData(
|
||||||
++num_accumulated_;
|
++num_accumulated_;
|
||||||
|
|
||||||
if (num_accumulated_ >= options_.num_accumulated_range_data()) {
|
if (num_accumulated_ >= options_.num_accumulated_range_data()) {
|
||||||
|
const common::Time current_sensor_time = synchronized_data.time;
|
||||||
|
common::optional<common::Duration> sensor_duration;
|
||||||
|
if (last_sensor_time_.has_value()) {
|
||||||
|
sensor_duration = current_sensor_time - last_sensor_time_.value();
|
||||||
|
}
|
||||||
|
last_sensor_time_ = current_sensor_time;
|
||||||
num_accumulated_ = 0;
|
num_accumulated_ = 0;
|
||||||
const transform::Rigid3d gravity_alignment = transform::Rigid3d::Rotation(
|
const transform::Rigid3d gravity_alignment = transform::Rigid3d::Rotation(
|
||||||
extrapolator_->EstimateGravityOrientation(time));
|
extrapolator_->EstimateGravityOrientation(time));
|
||||||
|
@ -195,7 +203,7 @@ LocalTrajectoryBuilder2D::AddRangeData(
|
||||||
TransformToGravityAlignedFrameAndFilter(
|
TransformToGravityAlignedFrameAndFilter(
|
||||||
gravity_alignment.cast<float>() * range_data_poses.back().inverse(),
|
gravity_alignment.cast<float>() * range_data_poses.back().inverse(),
|
||||||
accumulated_range_data_),
|
accumulated_range_data_),
|
||||||
gravity_alignment);
|
gravity_alignment, sensor_duration);
|
||||||
}
|
}
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +212,8 @@ std::unique_ptr<LocalTrajectoryBuilder2D::MatchingResult>
|
||||||
LocalTrajectoryBuilder2D::AddAccumulatedRangeData(
|
LocalTrajectoryBuilder2D::AddAccumulatedRangeData(
|
||||||
const common::Time time,
|
const common::Time time,
|
||||||
const sensor::RangeData& gravity_aligned_range_data,
|
const sensor::RangeData& gravity_aligned_range_data,
|
||||||
const transform::Rigid3d& gravity_alignment) {
|
const transform::Rigid3d& gravity_alignment,
|
||||||
|
const common::optional<common::Duration>& sensor_duration) {
|
||||||
if (gravity_aligned_range_data.returns.empty()) {
|
if (gravity_aligned_range_data.returns.empty()) {
|
||||||
LOG(WARNING) << "Dropped empty horizontal range data.";
|
LOG(WARNING) << "Dropped empty horizontal range data.";
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
@ -240,13 +249,28 @@ LocalTrajectoryBuilder2D::AddAccumulatedRangeData(
|
||||||
std::unique_ptr<InsertionResult> insertion_result = InsertIntoSubmap(
|
std::unique_ptr<InsertionResult> insertion_result = InsertIntoSubmap(
|
||||||
time, range_data_in_local, filtered_gravity_aligned_point_cloud,
|
time, range_data_in_local, filtered_gravity_aligned_point_cloud,
|
||||||
pose_estimate, gravity_alignment.rotation());
|
pose_estimate, gravity_alignment.rotation());
|
||||||
const auto accumulation_stop = std::chrono::steady_clock::now();
|
|
||||||
if (last_accumulation_stop_.has_value()) {
|
const auto wall_time = std::chrono::steady_clock::now();
|
||||||
const auto accumulation_duration =
|
if (last_wall_time_.has_value()) {
|
||||||
accumulation_stop - last_accumulation_stop_.value();
|
const auto wall_time_duration = wall_time - last_wall_time_.value();
|
||||||
kLocalSlamLatencyMetric->Set(common::ToSeconds(accumulation_duration));
|
kLocalSlamLatencyMetric->Set(common::ToSeconds(wall_time_duration));
|
||||||
|
if (sensor_duration.has_value()) {
|
||||||
|
kLocalSlamRealTimeRatio->Set(common::ToSeconds(sensor_duration.value()) /
|
||||||
|
common::ToSeconds(wall_time_duration));
|
||||||
}
|
}
|
||||||
last_accumulation_stop_ = accumulation_stop;
|
}
|
||||||
|
const double thread_cpu_time_seconds = common::GetThreadCpuTimeSeconds();
|
||||||
|
if (last_thread_cpu_time_seconds_.has_value()) {
|
||||||
|
const double thread_cpu_duration_seconds =
|
||||||
|
thread_cpu_time_seconds - last_thread_cpu_time_seconds_.value();
|
||||||
|
if (sensor_duration.has_value()) {
|
||||||
|
kLocalSlamCpuRealTimeRatio->Set(
|
||||||
|
common::ToSeconds(sensor_duration.value()) /
|
||||||
|
thread_cpu_duration_seconds);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
last_wall_time_ = wall_time;
|
||||||
|
last_thread_cpu_time_seconds_ = thread_cpu_time_seconds;
|
||||||
return common::make_unique<MatchingResult>(
|
return common::make_unique<MatchingResult>(
|
||||||
MatchingResult{time, pose_estimate, std::move(range_data_in_local),
|
MatchingResult{time, pose_estimate, std::move(range_data_in_local),
|
||||||
std::move(insertion_result)});
|
std::move(insertion_result)});
|
||||||
|
@ -313,6 +337,15 @@ void LocalTrajectoryBuilder2D::RegisterMetrics(
|
||||||
"Duration from first incoming point cloud in accumulation to local slam "
|
"Duration from first incoming point cloud in accumulation to local slam "
|
||||||
"result");
|
"result");
|
||||||
kLocalSlamLatencyMetric = latency->Add({});
|
kLocalSlamLatencyMetric = latency->Add({});
|
||||||
|
auto* real_time_ratio = family_factory->NewGaugeFamily(
|
||||||
|
"mapping_2d_local_trajectory_builder_real_time_ratio",
|
||||||
|
"sensor duration / wall clock duration.");
|
||||||
|
kLocalSlamRealTimeRatio = real_time_ratio->Add({});
|
||||||
|
|
||||||
|
auto* cpu_real_time_ratio = family_factory->NewGaugeFamily(
|
||||||
|
"mapping_2d_local_trajectory_builder_cpu_real_time_ratio",
|
||||||
|
"sensor duration / cpu duration.");
|
||||||
|
kLocalSlamCpuRealTimeRatio = cpu_real_time_ratio->Add({});
|
||||||
auto score_boundaries = metrics::Histogram::FixedWidth(0.05, 20);
|
auto score_boundaries = metrics::Histogram::FixedWidth(0.05, 20);
|
||||||
auto* scores = family_factory->NewHistogramFamily(
|
auto* scores = family_factory->NewHistogramFamily(
|
||||||
"mapping_2d_local_trajectory_builder_scores", "Local scan matcher scores",
|
"mapping_2d_local_trajectory_builder_scores", "Local scan matcher scores",
|
||||||
|
|
|
@ -79,7 +79,8 @@ class LocalTrajectoryBuilder2D {
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<MatchingResult> AddAccumulatedRangeData(
|
std::unique_ptr<MatchingResult> AddAccumulatedRangeData(
|
||||||
common::Time time, const sensor::RangeData& gravity_aligned_range_data,
|
common::Time time, const sensor::RangeData& gravity_aligned_range_data,
|
||||||
const transform::Rigid3d& gravity_alignment);
|
const transform::Rigid3d& gravity_alignment,
|
||||||
|
const common::optional<common::Duration>& sensor_duration);
|
||||||
sensor::RangeData TransformToGravityAlignedFrameAndFilter(
|
sensor::RangeData TransformToGravityAlignedFrameAndFilter(
|
||||||
const transform::Rigid3f& transform_to_gravity_aligned_frame,
|
const transform::Rigid3f& transform_to_gravity_aligned_frame,
|
||||||
const sensor::RangeData& range_data) const;
|
const sensor::RangeData& range_data) const;
|
||||||
|
@ -110,8 +111,10 @@ class LocalTrajectoryBuilder2D {
|
||||||
|
|
||||||
int num_accumulated_ = 0;
|
int num_accumulated_ = 0;
|
||||||
sensor::RangeData accumulated_range_data_;
|
sensor::RangeData accumulated_range_data_;
|
||||||
common::optional<std::chrono::steady_clock::time_point>
|
|
||||||
last_accumulation_stop_;
|
common::optional<std::chrono::steady_clock::time_point> last_wall_time_;
|
||||||
|
common::optional<double> last_thread_cpu_time_seconds_;
|
||||||
|
common::optional<common::Time> last_sensor_time_;
|
||||||
|
|
||||||
RangeDataCollator range_data_collator_;
|
RangeDataCollator range_data_collator_;
|
||||||
};
|
};
|
||||||
|
|
|
@ -36,8 +36,6 @@ static auto* kLocalSlamLatencyMetric = metrics::Gauge::Null();
|
||||||
static auto* kLocalSlamVoxelFilterFraction = metrics::Gauge::Null();
|
static auto* kLocalSlamVoxelFilterFraction = metrics::Gauge::Null();
|
||||||
static auto* kLocalSlamScanMatcherFraction = metrics::Gauge::Null();
|
static auto* kLocalSlamScanMatcherFraction = metrics::Gauge::Null();
|
||||||
static auto* kLocalSlamInsertIntoSubmapFraction = metrics::Gauge::Null();
|
static auto* kLocalSlamInsertIntoSubmapFraction = metrics::Gauge::Null();
|
||||||
// TODO(spielawa): Add the following two metrics also to
|
|
||||||
// local_trajectory_builder_2d
|
|
||||||
static auto* kLocalSlamRealTimeRatio = metrics::Gauge::Null();
|
static auto* kLocalSlamRealTimeRatio = metrics::Gauge::Null();
|
||||||
static auto* kLocalSlamCpuRealTimeRatio = metrics::Gauge::Null();
|
static auto* kLocalSlamCpuRealTimeRatio = metrics::Gauge::Null();
|
||||||
static auto* kRealTimeCorrelativeScanMatcherScoreMetric =
|
static auto* kRealTimeCorrelativeScanMatcherScoreMetric =
|
||||||
|
|
Loading…
Reference in New Issue