Skip to content
This repository was archived by the owner on Jul 16, 2025. It is now read-only.

Commit 408ae37

Browse files
author
fred-labs
authored
Update rviz plugin (#162)
1 parent 152eaa9 commit 408ae37

File tree

3 files changed

+63
-6
lines changed

3 files changed

+63
-6
lines changed

scenario_execution_rviz/README.md

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,7 @@ The following image shows a snapshot of the rviz plugin during a run of the [exa
99

1010
![tree_example.png](../docs/images/scenario_view_example.png)
1111

12-
### Known Issues
13-
14-
The Scenario View panel can not display the scenario's behavior tree if initialized while the robot navigation is already running.
12+
The plugin subscribes to `/scenario_execution/snapshots` by default. Double-click on the header to modify the topic.
1513

1614
### Icon Licence
1715

scenario_execution_rviz/src/scenario_view.cpp

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,17 @@
1616

1717
#include "scenario_view.h"
1818
#include "indicator_widget.h"
19-
19+
#include <QHeaderView>
20+
#include <QInputDialog>
2021
using std::placeholders::_1;
2122

2223
namespace scenario_execution_rviz {
2324

24-
ScenarioView::ScenarioView(QWidget *parent) : rviz_common::Panel(parent) {
25+
ScenarioView::ScenarioView(QWidget *parent)
26+
: rviz_common::Panel(parent), mInitTimer(this) {
27+
mInitTimer.setSingleShot(true);
28+
connect(&mInitTimer, &QTimer::timeout, this, &ScenarioView::setupConnection);
29+
2530
QVBoxLayout *layout = new QVBoxLayout;
2631

2732
QFormLayout *formLayout = new QFormLayout;
@@ -51,14 +56,58 @@ ScenarioView::ScenarioView(QWidget *parent) : rviz_common::Panel(parent) {
5156
SLOT(handleItemCollapsed(QTreeWidgetItem *)));
5257
connect(mScenarioView, SIGNAL(itemExpanded(QTreeWidgetItem *)), this,
5358
SLOT(handleItemExpanded(QTreeWidgetItem *)));
59+
connect(mScenarioView->header(), SIGNAL(sectionDoubleClicked(int)), this,
60+
SLOT(onHeaderDoubleClicked(int)));
61+
}
62+
63+
void ScenarioView::load(const rviz_common::Config &config) {
64+
rviz_common::Panel::load(config);
65+
QString topic;
66+
if (config.mapGetString("snapshot_topic", &topic)) {
67+
68+
if (mSnapshotTopic != topic) {
69+
mInitTimer.stop(); // stop init trigger
70+
mSnapshotTopic = topic;
71+
setupConnection();
72+
}
73+
}
74+
}
75+
76+
void ScenarioView::save(rviz_common::Config config) const {
77+
rviz_common::Panel::save(config);
78+
config.mapSetValue("snapshot_topic", mSnapshotTopic);
79+
}
80+
81+
void ScenarioView::onHeaderDoubleClicked(int idx) {
82+
(void)idx;
83+
bool ok;
84+
QString text = QInputDialog::getText(this, "Configuration", "Snapshot Topic",
85+
QLineEdit::Normal, mSnapshotTopic, &ok);
86+
if (ok && !text.isEmpty() && (mSnapshotTopic != text)) {
87+
mSnapshotTopic = text;
88+
setupConnection();
89+
Q_EMIT configChanged();
90+
}
5491
}
5592

5693
void ScenarioView::onInitialize() {
5794
_node = getDisplayContext()->getRosNodeAbstraction().lock()->get_raw_node();
95+
mSnapshotTopic = "/scenario_execution/snapshots";
96+
mInitTimer.start(250); // only executed if no config-load gets triggered.
97+
}
98+
99+
void ScenarioView::setupConnection() {
100+
if (mSnapshotTopic.isEmpty()) {
101+
return;
102+
}
103+
if (mBehaviorTreeSubscriber) {
104+
mBehaviorTreeSubscriber.reset();
105+
}
58106

107+
qDebug() << "Subscribing to" << mSnapshotTopic;
59108
mBehaviorTreeSubscriber =
60109
_node->create_subscription<py_trees_ros_interfaces::msg::BehaviourTree>(
61-
"/scenario_execution/snapshots", 10,
110+
mSnapshotTopic.toStdString().c_str(), 10,
62111
std::bind(&ScenarioView::behaviorTreeChanged, this, _1));
63112
}
64113

scenario_execution_rviz/src/scenario_view.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,9 +64,17 @@ class ScenarioView : public rviz_common::Panel {
6464
public:
6565
ScenarioView(QWidget *parent = 0);
6666

67+
virtual void load(const rviz_common::Config &config) override;
68+
virtual void save(rviz_common::Config config) const override;
69+
70+
Q_SIGNALS:
71+
void doubleClickedA(int index);
72+
6773
protected Q_SLOTS:
6874
void handleItemCollapsed(QTreeWidgetItem *collapsedItem);
6975
void handleItemExpanded(QTreeWidgetItem *expandedItem);
76+
void onHeaderDoubleClicked(int idx);
77+
void setupConnection();
7078

7179
protected:
7280
virtual void onInitialize() override;
@@ -93,6 +101,8 @@ protected Q_SLOTS:
93101
TreeModel *mTreeModel;
94102
bool treeWidgetBuilt = false;
95103
QMap<QString, bool> *collapsedStates;
104+
QString mSnapshotTopic;
105+
QTimer mInitTimer;
96106

97107
// icons
98108
QIcon runningIcon = QIcon(":/icons/chevron-right-o.png");

0 commit comments

Comments
 (0)