From d80f9d34e8585f99215adabff9edf21c17e772fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Ag=C3=BCero?= Date: Mon, 19 Feb 2024 22:33:09 +0100 Subject: [PATCH] Bar gauge (#32) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Carlos Agüero --- README.md | 6 +- img/ThrottleBrakePedal.png | Bin 19688 -> 0 bytes img/bar.png | Bin 0 -> 11357 bytes plugin.xml | 6 +- ...{throttle_brake_pedals.ui => bar_gauge.ui} | 456 +----------------- setup.py | 2 +- src/rqt_gauges/bar_gauge.py | 16 + src/rqt_gauges/bar_gauge_widget.py | 93 ++++ src/rqt_gauges/throttle_brake_pedals.py | 16 - .../throttle_brake_pedals_widget.py | 147 ------ 10 files changed, 133 insertions(+), 609 deletions(-) delete mode 100644 img/ThrottleBrakePedal.png create mode 100644 img/bar.png rename resource/{throttle_brake_pedals.ui => bar_gauge.ui} (50%) create mode 100644 src/rqt_gauges/bar_gauge.py create mode 100644 src/rqt_gauges/bar_gauge_widget.py delete mode 100644 src/rqt_gauges/throttle_brake_pedals.py delete mode 100644 src/rqt_gauges/throttle_brake_pedals_widget.py diff --git a/README.md b/README.md index e04fa77..0b832df 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ - Speedometer - Steering wheel position - - Brake and throttle + - Bar **Note**: This package is still not released in any ros distribution. @@ -50,10 +50,10 @@ Go to the following path on the menu tab: Plugins -> Visualization -> -### Brake and throttle +### Bar
- +
## Standalone Plugin diff --git a/img/ThrottleBrakePedal.png b/img/ThrottleBrakePedal.png deleted file mode 100644 index 15f46267242e9905c09033f39c97daff84ac6481..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19688 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 diff --git a/img/bar.png b/img/bar.png new file mode 100644 index 0000000000000000000000000000000000000000..010116710f2fbf6bdf048c526f7d1843fe480cc8 GIT binary patch literal 11357 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 F{{jf8(7ONt literal 0 HcmV?d00001 diff --git a/plugin.xml b/plugin.xml index 3fc2e9e..4184172 100644 --- a/plugin.xml +++ b/plugin.xml @@ -29,9 +29,9 @@ Gauges visualization tool. - + - A Visualization tool that shows how much of the throttle and brake pedals are being pressed (0-1). + A bar visualization tool. @@ -39,7 +39,7 @@ folder Plugins related to visualization. - + utilities-system-monitor Gauges visualization tool. diff --git a/resource/throttle_brake_pedals.ui b/resource/bar_gauge.ui similarity index 50% rename from resource/throttle_brake_pedals.ui rename to resource/bar_gauge.ui index 7d58483..b4bcd9b 100644 --- a/resource/throttle_brake_pedals.ui +++ b/resource/bar_gauge.ui @@ -1,24 +1,24 @@ - ThrottleBrakePedals - + BarGauge + 0 0 - 500 + 250 550 - 500 + 250 550 - 500 + 250 550 @@ -26,9 +26,9 @@ true - ThrottleBrakePedals + BarGauge - + 10 @@ -43,24 +43,24 @@ - Throttle: + Topic: - + - 80 + 60 20 - 131 + 170 31 - + - 70 - 70 + 90 + 75 81 31 @@ -69,7 +69,7 @@ Subscribe - + 110 @@ -158,97 +158,7 @@ %f% - - - - 340 - 126 - 51 - 301 - - - - - - - - - 239 - 41 - 41 - - - - - - - - - 239 - 41 - 41 - - - - - - - - - 145 - 145 - 145 - - - - - - - - 0 - - - false - - - Qt::Vertical - - - QProgressBar::TopToBottom - - - - - - 310 - 20 - 131 - 31 - - - - - - - - - - 250 - 20 - 61 - 31 - - - - - 12 - - - - Brake: - - - + 0 @@ -269,53 +179,7 @@ Qt::AlignCenter - - - - 230 - 436 - 231 - 61 - - - - - 25 - - - - 0.0 - - - Qt::AlignCenter - - - - - - 310 - 70 - 81 - 31 - - - - Subscribe - - - - - - 220 - 10 - 20 - 501 - - - - Qt::Vertical - - + @@ -615,292 +479,6 @@ Qt::Horizontal - - - - 330 - 390 - 16 - 16 - - - - Qt::Horizontal - - - - - - 315 - 410 - 21 - 31 - - - - 0 - - - - - - 330 - 290 - 16 - 31 - - - - Qt::Horizontal - - - - - - 330 - 140 - 16 - 31 - - - - Qt::Horizontal - - - - - - 310 - 200 - 21 - 21 - - - - 0.7 - - - - - - 310 - 380 - 21 - 31 - - - - 0.1 - - - - - - 310 - 170 - 21 - 21 - - - - 0.8 - - - - - - 310 - 260 - 31 - 21 - - - - 0.5 - - - - - - 310 - 350 - 21 - 21 - - - - 0.2 - - - - - - 310 - 230 - 21 - 21 - - - - 0.6 - - - - - - 310 - 290 - 21 - 21 - - - - 0.4 - - - - - - 330 - 350 - 16 - 31 - - - - Qt::Horizontal - - - - - - 330 - 170 - 16 - 31 - - - - Qt::Horizontal - - - - - - 330 - 420 - 16 - 16 - - - - Qt::Horizontal - - - - - - 310 - 140 - 21 - 21 - - - - 0.9 - - - - - - 330 - 260 - 16 - 31 - - - - Qt::Horizontal - - - - - - 310 - 320 - 21 - 21 - - - - 0.3 - - - - - - 330 - 116 - 16 - 20 - - - - Qt::Horizontal - - - - - - 330 - 230 - 16 - 31 - - - - Qt::Horizontal - - - - - - 330 - 320 - 16 - 31 - - - - Qt::Horizontal - - - - - - 316 - 109 - 20 - 31 - - - - 1 - - - - - - 330 - 200 - 16 - 31 - - - - Qt::Horizontal - - diff --git a/setup.py b/setup.py index 7d38105..2da88d0 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ ('share/' + package_name + '/resource', ['resource/steering_wheel.ui']), ('share/' + package_name + '/resource', - ['resource/throttle_brake_pedals.ui']), + ['resource/bar_gauge.ui']), ('share/' + package_name, ['package.xml']), ('share/' + package_name, ['plugin.xml']), ], diff --git a/src/rqt_gauges/bar_gauge.py b/src/rqt_gauges/bar_gauge.py new file mode 100644 index 0000000..1d395bc --- /dev/null +++ b/src/rqt_gauges/bar_gauge.py @@ -0,0 +1,16 @@ +from qt_gui.plugin import Plugin + +from .bar_gauge_widget import BarGaugeWidget + + +class BarGauge(Plugin): + + def __init__(self, context): + super().__init__(context) + self.setObjectName('BarGauge') + + self._context = context + self._node = context.node + + self._widget = BarGaugeWidget(self._node) + context.add_widget(self._widget) diff --git a/src/rqt_gauges/bar_gauge_widget.py b/src/rqt_gauges/bar_gauge_widget.py new file mode 100644 index 0000000..ce06504 --- /dev/null +++ b/src/rqt_gauges/bar_gauge_widget.py @@ -0,0 +1,93 @@ +import os + +from ament_index_python.resources import get_resource +from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt +from PyQt5.QtWidgets import QWidget +from python_qt_binding import loadUi +from rosidl_runtime_py.utilities import get_message +from rqt_py_common.topic_completer import TopicCompleter + +from .utils import generate_field_evals, get_topic_type + + +class BarGaugeWidget(QWidget): + + updateValueSignal = pyqtSignal(int, int) + + def __init__(self, node): + super().__init__() + self.setObjectName('BarGauge_widget') + + self.node = node + self.sub = None + + _, package_path = get_resource('packages', 'rqt_gauges') + ui_file = os.path.join(package_path, 'share', + 'rqt_gauges', 'resource', 'bar_gauge.ui') + loadUi(ui_file, self) + + # Topic Completer + self.topic_to_subscribe.setNode(self.node) + self._topic_completer = TopicCompleter(self.topic_to_subscribe) + self._topic_completer.update_topics(self.node) + self.topic_to_subscribe.setCompleter(self._topic_completer) + + # Signals Connection + self.subscribe.pressed.connect(self.updateSubscription) + self.updateValueSignal.connect(self.updateValue) + + def dragEnterEvent(self, event): + event.accept() + + def dropEvent(self, event): + if event.mimeData().hasText(): + topic_name = str(event.mimeData().text()) + else: + droped_item = event.source().selectedItems()[0] + topic_name = str(droped_item.data(0, Qt.UserRole)) + + self.topic_to_subscribe.setText(topic_name) + self.updateSubscription() + + event.accept() + + @pyqtSlot() + def updateSubscription(self): + if self.node.destroy_subscription(self.sub): + print('Previous subscription deleted') + else: + print('There was no previous subscription') + topic_path = self.topic_to_subscribe.text() + topic_type, topic_name, fields = get_topic_type(self.node, topic_path) + self.field_evals = generate_field_evals(fields) + if topic_type is not None: + print('Subscribing to:', topic_name, 'Type:', topic_type, 'Field:', fields) + data_class = get_message(topic_type) + self.sub = self.node.create_subscription( + data_class, + topic_name, + self.callback, + 10) + + @pyqtSlot(int, int) + def updateValue(self, value, raw_value): + self.bar_gauge.setValue(value) + self.value_label.setText(str(raw_value / 100.0)) + + def callback(self, msg): + value = msg + for f in self.field_evals: + value = f(value) + if value is not None and (type(value) == int or type(value) == float + or type(value) == str): + raw_value = int(value*100) + if value < 0: + value = 0 + print('The value is not between 0 and 1') + elif value > 1: + value = 1 + print('The value is not between 0 and 1') + + self.updateValueSignal.emit(int(value*100), raw_value) + else: + print('The value is not valid') diff --git a/src/rqt_gauges/throttle_brake_pedals.py b/src/rqt_gauges/throttle_brake_pedals.py deleted file mode 100644 index aac4695..0000000 --- a/src/rqt_gauges/throttle_brake_pedals.py +++ /dev/null @@ -1,16 +0,0 @@ -from qt_gui.plugin import Plugin - -from .throttle_brake_pedals_widget import ThrottleBrakePedalsWidget - - -class ThrottleBrakePedals(Plugin): - - def __init__(self, context): - super().__init__(context) - self.setObjectName('ThrottleBrakePedals') - - self._context = context - self._node = context.node - - self._widget = ThrottleBrakePedalsWidget(self._node) - context.add_widget(self._widget) diff --git a/src/rqt_gauges/throttle_brake_pedals_widget.py b/src/rqt_gauges/throttle_brake_pedals_widget.py deleted file mode 100644 index c12827c..0000000 --- a/src/rqt_gauges/throttle_brake_pedals_widget.py +++ /dev/null @@ -1,147 +0,0 @@ -import os - -from ament_index_python.resources import get_resource -from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt -from PyQt5.QtWidgets import QWidget -from python_qt_binding import loadUi -from rosidl_runtime_py.utilities import get_message -from rqt_py_common.topic_completer import TopicCompleter - -from .utils import generate_field_evals, get_topic_type - - -class ThrottleBrakePedalsWidget(QWidget): - - updateThrottleValueSignal = pyqtSignal(int, int) - updateBrakeValueSignal = pyqtSignal(int, int) - - def __init__(self, node): - super().__init__() - self.setObjectName('ThrottleBrakePedals_widget') - - self.node = node - self.throttle_sub = None - self.brake_sub = None - - _, package_path = get_resource('packages', 'rqt_gauges') - ui_file = os.path.join(package_path, 'share', - 'rqt_gauges', 'resource', 'throttle_brake_pedals.ui') - loadUi(ui_file, self) - - # Throttle Topic Completer - self.throttle_topic_to_subscribe.setNode(self.node) - self._throttle_topic_completer = TopicCompleter(self.throttle_topic_to_subscribe) - self._throttle_topic_completer.update_topics(self.node) - self.throttle_topic_to_subscribe.setCompleter(self._throttle_topic_completer) - - # Brake Topic Completer - self.brake_topic_to_subscribe.setNode(self.node) - self._brake_topic_completer = TopicCompleter(self.brake_topic_to_subscribe) - self._brake_topic_completer.update_topics(self.node) - self.brake_topic_to_subscribe.setCompleter(self._brake_topic_completer) - - # Signals Connection - self.throttle_subscribe.pressed.connect(self.throttleUpdateSubscription) - self.brake_subscribe.pressed.connect(self.brakeUpdateSubscription) - self.updateThrottleValueSignal.connect(self.updateThrottle) - self.updateBrakeValueSignal.connect(self.updateBrake) - - def dragEnterEvent(self, event): - event.accept() - - def dropEvent(self, event): - if event.mimeData().hasText(): - topic_name = str(event.mimeData().text()) - else: - droped_item = event.source().selectedItems()[0] - topic_name = str(droped_item.data(0, Qt.UserRole)) - - if (event.pos().x() < self.size().width() / 2): - self.throttle_topic_to_subscribe.setText(topic_name) - self.throttleUpdateSubscription() - else: - self.brake_topic_to_subscribe.setText(topic_name) - self.brakeUpdateSubscription() - event.accept() - - @pyqtSlot() - def throttleUpdateSubscription(self): - if self.node.destroy_subscription(self.throttle_sub): - print('Previous subscription deleted') - else: - print('There was no previous subscription') - topic_path = self.throttle_topic_to_subscribe.text() - topic_type, topic_name, fields = get_topic_type(self.node, topic_path) - self.throttle_field_evals = generate_field_evals(fields) - if topic_type is not None: - print('Subscribing to:', topic_name, 'Type:', topic_type, 'Field:', fields) - data_class = get_message(topic_type) - self.throttle_sub = self.node.create_subscription( - data_class, - topic_name, - self.throttle_callback, - 10) - - @pyqtSlot(int, int) - def updateThrottle(self, value, raw_value): - self.throttle_pedal.setValue(value) - self.throttle_label.setText(str(raw_value / 100.0)) - - @pyqtSlot(int, int) - def updateBrake(self, value, raw_value): - self.brake_pedal.setValue(value) - self.brake_label.setText(str(raw_value / 100.0)) - - @pyqtSlot() - def brakeUpdateSubscription(self): - if self.node.destroy_subscription(self.brake_sub): - print('Previous subscription deleted') - else: - print('There was no previous subscription') - topic_path = self.brake_topic_to_subscribe.text() - topic_type, topic_name, fields = get_topic_type(self.node, topic_path) - self.brake_field_evals = generate_field_evals(fields) - if topic_type is not None: - print('Subscribing to:', topic_name, 'Type:', topic_type, 'Field:', fields) - data_class = get_message(topic_type) - self.brake_sub = self.node.create_subscription( - data_class, - topic_name, - self.brake_callback, - 10) - - def throttle_callback(self, msg): - value = msg - for f in self.throttle_field_evals: - value = f(value) - if value is not None and (type(value) == int or type(value) == float - or type(value) == str): - raw_value = int(value*100) - if value < 0: - value = 0 - print('The throttle pedal value is not between 0 and 1') - elif value > 1: - value = 1 - print('The throttle pedal value is not between 0 and 1') - - self.updateThrottleValueSignal.emit(int(value*100), raw_value) - else: - print('The throttle pedal value is not valid') - - def brake_callback(self, msg): - value = msg - for f in self.brake_field_evals: - value = f(value) - if value is not None and (type(value) == int or type(value) == float - or type(value) == str): - raw_value = int(value*100) - if value < 0: - value = 0 - print('The brake pedal value is not between 0 and 1') - elif value > 1: - value = 1 - print('The brake pedal value is not between 0 and 1') - - self.updateBrakeValueSignal.emit(int(value*100), raw_value) - else: - print('The brake pedal value is not valid')