Skip to content

Commit eef1f64

Browse files
authored
Merge branch 'main' into feat/adapi-diagnostics
2 parents ee84885 + 54dfc05 commit eef1f64

34 files changed

+555
-429
lines changed

common/tier4_autoware_utils/include/tier4_autoware_utils/math/trigonometry.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,17 @@
1515
#ifndef TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
1616
#define TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_
1717

18+
#include <utility>
19+
1820
namespace tier4_autoware_utils
1921
{
2022

2123
float sin(float radian);
2224

2325
float cos(float radian);
2426

27+
std::pair<float, float> sin_and_cos(float radian);
28+
2529
} // namespace tier4_autoware_utils
2630

2731
#endif // TIER4_AUTOWARE_UTILS__MATH__TRIGONOMETRY_HPP_

common/tier4_autoware_utils/src/math/trigonometry.cpp

+23
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,27 @@ float cos(float radian)
4949
return sin(radian + static_cast<float>(tier4_autoware_utils::pi) / 2.f);
5050
}
5151

52+
std::pair<float, float> sin_and_cos(float radian)
53+
{
54+
constexpr float tmp =
55+
(180.f / static_cast<float>(tier4_autoware_utils::pi)) * (discrete_arcs_num_360 / 360.f);
56+
const float degree = radian * tmp;
57+
size_t idx =
58+
(static_cast<int>(std::round(degree)) % discrete_arcs_num_360 + discrete_arcs_num_360) %
59+
discrete_arcs_num_360;
60+
61+
if (idx < discrete_arcs_num_90) {
62+
return {g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
63+
} else if (discrete_arcs_num_90 <= idx && idx < 2 * discrete_arcs_num_90) {
64+
idx = 2 * discrete_arcs_num_90 - idx;
65+
return {g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
66+
} else if (2 * discrete_arcs_num_90 <= idx && idx < 3 * discrete_arcs_num_90) {
67+
idx = idx - 2 * discrete_arcs_num_90;
68+
return {-g_sin_table[idx], -g_sin_table[discrete_arcs_num_90 - idx]};
69+
} else { // 3 * discrete_arcs_num_90 <= idx && idx < 4 * discrete_arcs_num_90
70+
idx = 4 * discrete_arcs_num_90 - idx;
71+
return {-g_sin_table[idx], g_sin_table[discrete_arcs_num_90 - idx]};
72+
}
73+
}
74+
5275
} // namespace tier4_autoware_utils

common/tier4_autoware_utils/test/src/math/test_trigonometry.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,13 @@ TEST(trigonometry, cos)
4040
tier4_autoware_utils::cos(x * static_cast<float>(i))) < 10e-5);
4141
}
4242
}
43+
44+
TEST(trigonometry, sin_and_cos)
45+
{
46+
float x = 4.f * tier4_autoware_utils::pi / 128.f;
47+
for (int i = 0; i < 128; i++) {
48+
const auto sin_and_cos = tier4_autoware_utils::sin_and_cos(x * static_cast<float>(i));
49+
EXPECT_TRUE(std::abs(std::sin(x * static_cast<float>(i)) - sin_and_cos.first) < 10e-7);
50+
EXPECT_TRUE(std::abs(std::cos(x * static_cast<float>(i)) - sin_and_cos.second) < 10e-7);
51+
}
52+
}

evaluator/perception_online_evaluator/include/perception_online_evaluator/metrics/metric.hpp

-5
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020
#include <iostream>
2121
#include <string>
2222
#include <unordered_map>
23-
#include <variant>
2423
#include <vector>
2524

2625
namespace perception_diagnostics
@@ -37,11 +36,7 @@ enum class Metric {
3736
SIZE,
3837
};
3938

40-
// Each metric has a different return type. (statistic or just a one value etc).
41-
// To handle them all in the MetricsCalculator::calculate function, define MetricsMap as a variant
4239
using MetricStatMap = std::unordered_map<std::string, Stat<double>>;
43-
using MetricValueMap = std::unordered_map<std::string, double>;
44-
using MetricsMap = std::variant<MetricStatMap, MetricValueMap>;
4540

4641
struct PredictedPathDeviationMetrics
4742
{

evaluator/perception_online_evaluator/include/perception_online_evaluator/metrics_calculator.hpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class MetricsCalculator
9696
* @param [in] metric Metric enum value
9797
* @return map of string describing the requested metric and the calculated value
9898
*/
99-
std::optional<MetricsMap> calculate(const Metric & metric) const;
99+
std::optional<MetricStatMap> calculate(const Metric & metric) const;
100100

101101
/**
102102
* @brief set the dynamic objects used to calculate obstacle metrics
@@ -143,7 +143,7 @@ class MetricsCalculator
143143
PredictedPathDeviationMetrics calcPredictedPathDeviationMetrics(
144144
const PredictedObjects & objects, const double time_horizon) const;
145145
MetricStatMap calcYawRateMetrics(const ClassObjectsMap & class_objects_map) const;
146-
MetricValueMap calcObjectsCountMetrics() const;
146+
MetricStatMap calcObjectsCountMetrics() const;
147147

148148
bool hasPassedTime(const rclcpp::Time stamp) const;
149149
bool hasPassedTime(const std::string uuid, const rclcpp::Time stamp) const;

evaluator/perception_online_evaluator/include/perception_online_evaluator/perception_online_evaluator_node.hpp

-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,6 @@ class PerceptionOnlineEvaluatorNode : public rclcpp::Node
6161

6262
DiagnosticStatus generateDiagnosticStatus(
6363
const std::string metric, const Stat<double> & metric_stat) const;
64-
DiagnosticStatus generateDiagnosticStatus(
65-
const std::string metric, const double metric_value) const;
6664

6765
private:
6866
// Subscribers and publishers

evaluator/perception_online_evaluator/src/metrics_calculator.cpp

+9-7
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ namespace perception_diagnostics
2626
using object_recognition_utils::convertLabelToString;
2727
using tier4_autoware_utils::inverseTransformPoint;
2828

29-
std::optional<MetricsMap> MetricsCalculator::calculate(const Metric & metric) const
29+
std::optional<MetricStatMap> MetricsCalculator::calculate(const Metric & metric) const
3030
{
3131
// clang-format off
3232
const bool use_past_objects = metric == Metric::lateral_deviation ||
@@ -455,14 +455,15 @@ MetricStatMap MetricsCalculator::calcYawRateMetrics(const ClassObjectsMap & clas
455455
return metric_stat_map;
456456
}
457457

458-
MetricValueMap MetricsCalculator::calcObjectsCountMetrics() const
458+
MetricStatMap MetricsCalculator::calcObjectsCountMetrics() const
459459
{
460-
MetricValueMap metric_stat_map;
460+
MetricStatMap metric_stat_map;
461461
// calculate the average number of objects in the detection area in all past frames
462462
const auto overall_average_count = detection_counter_.getOverallAverageCount();
463463
for (const auto & [label, range_and_count] : overall_average_count) {
464464
for (const auto & [range, count] : range_and_count) {
465-
metric_stat_map["average_objects_count_" + convertLabelToString(label) + "_" + range] = count;
465+
metric_stat_map["average_objects_count_" + convertLabelToString(label) + "_" + range].add(
466+
count);
466467
}
467468
}
468469
// calculate the average number of objects in the detection area in the past
@@ -471,16 +472,17 @@ MetricValueMap MetricsCalculator::calcObjectsCountMetrics() const
471472
detection_counter_.getAverageCount(parameters_->objects_count_window_seconds);
472473
for (const auto & [label, range_and_count] : average_count) {
473474
for (const auto & [range, count] : range_and_count) {
474-
metric_stat_map
475-
["interval_average_objects_count_" + convertLabelToString(label) + "_" + range] = count;
475+
metric_stat_map["interval_average_objects_count_" + convertLabelToString(label) + "_" + range]
476+
.add(count);
476477
}
477478
}
478479

479480
// calculate the total number of objects in the detection area
480481
const auto total_count = detection_counter_.getTotalCount();
481482
for (const auto & [label, range_and_count] : total_count) {
482483
for (const auto & [range, count] : range_and_count) {
483-
metric_stat_map["total_objects_count_" + convertLabelToString(label) + "_" + range] = count;
484+
metric_stat_map["total_objects_count_" + convertLabelToString(label) + "_" + range].add(
485+
count);
484486
}
485487
}
486488

evaluator/perception_online_evaluator/src/perception_online_evaluator_node.cpp

+7-32
Original file line numberDiff line numberDiff line change
@@ -69,25 +69,16 @@ void PerceptionOnlineEvaluatorNode::publishMetrics()
6969

7070
// calculate metrics
7171
for (const Metric & metric : parameters_->metrics) {
72-
const auto metric_result = metrics_calculator_.calculate(Metric(metric));
73-
if (!metric_result.has_value()) {
72+
const auto metric_stat_map = metrics_calculator_.calculate(Metric(metric));
73+
if (!metric_stat_map.has_value()) {
7474
continue;
7575
}
7676

77-
std::visit(
78-
[&metrics_msg, this](auto && arg) {
79-
using T = std::decay_t<decltype(arg)>;
80-
for (const auto & [metric, value] : arg) {
81-
if constexpr (std::is_same_v<T, MetricStatMap>) {
82-
if (value.count() > 0) {
83-
metrics_msg.status.push_back(generateDiagnosticStatus(metric, value));
84-
}
85-
} else if constexpr (std::is_same_v<T, MetricValueMap>) {
86-
metrics_msg.status.push_back(generateDiagnosticStatus(metric, value));
87-
}
88-
}
89-
},
90-
metric_result.value());
77+
for (const auto & [metric, stat] : metric_stat_map.value()) {
78+
if (stat.count() > 0) {
79+
metrics_msg.status.push_back(generateDiagnosticStatus(metric, stat));
80+
}
81+
}
9182
}
9283

9384
// publish metrics
@@ -120,22 +111,6 @@ DiagnosticStatus PerceptionOnlineEvaluatorNode::generateDiagnosticStatus(
120111
return status;
121112
}
122113

123-
DiagnosticStatus PerceptionOnlineEvaluatorNode::generateDiagnosticStatus(
124-
const std::string metric, const double value) const
125-
{
126-
DiagnosticStatus status;
127-
128-
status.level = status.OK;
129-
status.name = metric;
130-
131-
diagnostic_msgs::msg::KeyValue key_value;
132-
key_value.key = "metric_value";
133-
key_value.value = std::to_string(value);
134-
status.values.push_back(key_value);
135-
136-
return status;
137-
}
138-
139114
void PerceptionOnlineEvaluatorNode::onObjects(const PredictedObjects::ConstSharedPtr objects_msg)
140115
{
141116
metrics_calculator_.setPredictedObjects(*objects_msg, *tf_buffer_);

evaluator/perception_online_evaluator/test/test_perception_online_evaluator_node.cpp

+1-13
Original file line numberDiff line numberDiff line change
@@ -141,19 +141,7 @@ class EvalTest : public ::testing::Test
141141
[=](const DiagnosticArray::ConstSharedPtr msg) {
142142
const auto it = std::find_if(msg->status.begin(), msg->status.end(), is_target_metric);
143143
if (it != msg->status.end()) {
144-
const auto mean_it = std::find_if(
145-
it->values.begin(), it->values.end(),
146-
[](const auto & key_value) { return key_value.key == "mean"; });
147-
if (mean_it != it->values.end()) {
148-
metric_value_ = boost::lexical_cast<double>(mean_it->value);
149-
} else {
150-
const auto metric_value_it = std::find_if(
151-
it->values.begin(), it->values.end(),
152-
[](const auto & key_value) { return key_value.key == "metric_value"; });
153-
if (metric_value_it != it->values.end()) {
154-
metric_value_ = boost::lexical_cast<double>(metric_value_it->value);
155-
}
156-
}
144+
metric_value_ = boost::lexical_cast<double>(it->values[2].value);
157145
metric_updated_ = true;
158146
}
159147
});

0 commit comments

Comments
 (0)