Skip to content

Commit aa84a5e

Browse files
authored
feat(tier4_metrics_rviz_plugin): switch visualization target topic (autowarefoundation#6571)
Signed-off-by: kosuke55 <kosuke.tnp@gmail.com>
1 parent d57e97e commit aa84a5e

File tree

2 files changed

+90
-16
lines changed

2 files changed

+90
-16
lines changed

evaluator/tier4_metrics_rviz_plugin/src/metrics_visualize_panel.cpp

+72-13
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ MetricsVisualizePanel::MetricsVisualizePanel(QWidget * parent)
3030
: rviz_common::Panel(parent), grid_(new QGridLayout())
3131
{
3232
setLayout(grid_);
33+
topic_selector_ = new QComboBox();
34+
for (const auto & topic : topics_) {
35+
topic_selector_->addItem(QString::fromStdString(topic));
36+
}
37+
grid_->addWidget(topic_selector_, 0, 0, 1, -1);
38+
connect(topic_selector_, SIGNAL(currentIndexChanged(int)), this, SLOT(onTopicChanged()));
3339
}
3440

3541
void MetricsVisualizePanel::onInitialize()
@@ -38,14 +44,53 @@ void MetricsVisualizePanel::onInitialize()
3844

3945
raw_node_ = this->getDisplayContext()->getRosNodeAbstraction().lock()->get_raw_node();
4046

41-
sub_ = raw_node_->create_subscription<DiagnosticArray>(
42-
"/diagnostic/planning_evaluator/metrics", rclcpp::QoS{1},
43-
std::bind(&MetricsVisualizePanel::onMetrics, this, _1));
47+
for (const auto & topic_name : topics_) {
48+
const auto callback = [this, topic_name](const DiagnosticArray::ConstSharedPtr msg) {
49+
this->onMetrics(msg, topic_name);
50+
};
51+
const auto subscription =
52+
raw_node_->create_subscription<DiagnosticArray>(topic_name, rclcpp::QoS{1}, callback);
53+
subscriptions_[topic_name] = subscription;
54+
}
4455

4556
const auto period = std::chrono::milliseconds(static_cast<int64_t>(1e3 / 10));
4657
timer_ = raw_node_->create_wall_timer(period, [&]() { onTimer(); });
4758
}
4859

60+
void MetricsVisualizePanel::updateWidgetVisibility(
61+
const std::string & target_topic, const bool show)
62+
{
63+
for (const auto & [topic_name, metric_widgets_pair] : topic_widgets_map_) {
64+
const bool is_target_topic = (topic_name == target_topic);
65+
if ((!is_target_topic && show) || (is_target_topic && !show)) {
66+
continue;
67+
}
68+
for (const auto & [metric, widgets] : metric_widgets_pair) {
69+
widgets.first->setVisible(show);
70+
widgets.second->setVisible(show);
71+
}
72+
}
73+
}
74+
75+
void MetricsVisualizePanel::showCurrentTopicWidgets()
76+
{
77+
const std::string current_topic = topic_selector_->currentText().toStdString();
78+
updateWidgetVisibility(current_topic, true);
79+
}
80+
81+
void MetricsVisualizePanel::hideInactiveTopicWidgets()
82+
{
83+
const std::string current_topic = topic_selector_->currentText().toStdString();
84+
updateWidgetVisibility(current_topic, false);
85+
}
86+
87+
void MetricsVisualizePanel::onTopicChanged()
88+
{
89+
std::lock_guard<std::mutex> message_lock(mutex_);
90+
hideInactiveTopicWidgets();
91+
showCurrentTopicWidgets();
92+
}
93+
4994
void MetricsVisualizePanel::onTimer()
5095
{
5196
std::lock_guard<std::mutex> message_lock(mutex_);
@@ -56,24 +101,38 @@ void MetricsVisualizePanel::onTimer()
56101
}
57102
}
58103

59-
void MetricsVisualizePanel::onMetrics(const DiagnosticArray::ConstSharedPtr msg)
104+
void MetricsVisualizePanel::onMetrics(
105+
const DiagnosticArray::ConstSharedPtr & msg, const std::string & topic_name)
60106
{
61107
std::lock_guard<std::mutex> message_lock(mutex_);
62108

63109
const auto time = msg->header.stamp.sec + msg->header.stamp.nanosec * 1e-9;
64-
65110
constexpr size_t GRAPH_COL_SIZE = 5;
66-
for (size_t i = 0; i < msg->status.size(); ++i) {
67-
const auto & status = msg->status.at(i);
68111

112+
for (const auto & status : msg->status) {
113+
const size_t num_current_metrics = topic_widgets_map_[topic_name].size();
69114
if (metrics_.count(status.name) == 0) {
70-
auto metric = Metric(status);
115+
const auto metric = Metric(status);
71116
metrics_.emplace(status.name, metric);
72-
grid_->addWidget(metric.getTable(), i / GRAPH_COL_SIZE * 2, i % GRAPH_COL_SIZE);
73-
grid_->setRowStretch(i / GRAPH_COL_SIZE * 2, false);
74-
grid_->addWidget(metric.getChartView(), i / GRAPH_COL_SIZE * 2 + 1, i % GRAPH_COL_SIZE);
75-
grid_->setRowStretch(i / GRAPH_COL_SIZE * 2 + 1, true);
76-
grid_->setColumnStretch(i % GRAPH_COL_SIZE, true);
117+
118+
// Calculate grid position
119+
const size_t row = num_current_metrics / GRAPH_COL_SIZE * 2 +
120+
1; // start from 1 to leave space for the topic selector
121+
const size_t col = num_current_metrics % GRAPH_COL_SIZE;
122+
123+
// Get the widgets from the metric
124+
const auto tableWidget = metric.getTable();
125+
const auto chartViewWidget = metric.getChartView();
126+
127+
// Add the widgets to the grid layout
128+
grid_->addWidget(tableWidget, row, col);
129+
grid_->setRowStretch(row, false);
130+
grid_->addWidget(chartViewWidget, row + 1, col);
131+
grid_->setRowStretch(row + 1, true);
132+
grid_->setColumnStretch(col, true);
133+
134+
// Also add the widgets to the graph_widgets_ vector for easy removal later
135+
topic_widgets_map_[topic_name][status.name] = std::make_pair(tableWidget, chartViewWidget);
77136
}
78137

79138
metrics_.at(status.name).updateData(time, status);

evaluator/tier4_metrics_rviz_plugin/src/metrics_visualize_panel.hpp

+18-3
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
#ifndef Q_MOC_RUN
2020
#include <QChartView>
2121
#include <QColor>
22+
#include <QComboBox>
2223
#include <QGridLayout>
2324
#include <QHeaderView>
2425
#include <QLabel>
@@ -36,7 +37,8 @@
3637
#include <limits>
3738
#include <string>
3839
#include <unordered_map>
39-
40+
#include <utility>
41+
#include <vector>
4042
namespace rviz_plugins
4143
{
4244

@@ -186,19 +188,32 @@ class MetricsVisualizePanel : public rviz_common::Panel
186188
void onInitialize() override;
187189

188190
private Q_SLOTS:
191+
void onTopicChanged();
189192

190193
private:
191194
rclcpp::Node::SharedPtr raw_node_;
192195
rclcpp::TimerBase::SharedPtr timer_;
193-
rclcpp::Subscription<DiagnosticArray>::SharedPtr sub_;
196+
std::unordered_map<std::string, rclcpp::Subscription<DiagnosticArray>::SharedPtr> subscriptions_;
197+
std::vector<std::string> topics_ = {
198+
"/diagnostic/planning_evaluator/metrics", "/diagnostic/perception_online_evaluator/metrics"};
194199

195200
void onTimer();
196-
void onMetrics(const DiagnosticArray::ConstSharedPtr msg);
201+
void onMetrics(const DiagnosticArray::ConstSharedPtr & msg, const std::string & topic_name);
197202

198203
QGridLayout * grid_;
204+
QComboBox * topic_selector_;
205+
206+
// <topic_name, <metric_name, <table, chart>>>
207+
std::unordered_map<
208+
std::string, std::unordered_map<std::string, std::pair<QTableWidget *, QChartView *>>>
209+
topic_widgets_map_;
199210

200211
std::mutex mutex_;
201212
std::unordered_map<std::string, Metric> metrics_;
213+
214+
void updateWidgetVisibility(const std::string & target_topic, const bool show);
215+
void showCurrentTopicWidgets();
216+
void hideInactiveTopicWidgets();
202217
};
203218
} // namespace rviz_plugins
204219

0 commit comments

Comments
 (0)