From 114ff7096e89708ef8133f8f8d7e42882fd44abf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Tue, 26 Dec 2023 18:13:59 +0100 Subject: [PATCH 1/4] utils.py to include common code and fixed merge (#20) Signed-off-by: Alejandro Hernandez Cordero --- src/rqt_gauges_2/speedometer_gauge.py | 12 ++-- src/rqt_gauges_2/speedometer_widget.py | 59 +------------------ src/rqt_gauges_2/steering_wheel_widget.py | 59 +------------------ .../throttle_brake_pedals_widget.py | 59 +------------------ src/rqt_gauges_2/utils.py | 57 ++++++++++++++++++ 5 files changed, 66 insertions(+), 180 deletions(-) create mode 100644 src/rqt_gauges_2/utils.py diff --git a/src/rqt_gauges_2/speedometer_gauge.py b/src/rqt_gauges_2/speedometer_gauge.py index 509d88e..c860587 100644 --- a/src/rqt_gauges_2/speedometer_gauge.py +++ b/src/rqt_gauges_2/speedometer_gauge.py @@ -149,9 +149,9 @@ def setMinValue(self, min_value): # Modifies the minimum value of the gauge # Args: # min: Value to update the minimum value of the gauge. - if self.value < min: - self.value = min - if min >= self.maxValue: + if self.value < min_value: + self.value = min_value + if min_value >= self.maxValue: self.minValue = self.maxValue - 1 else: self.minValue = min_value @@ -162,9 +162,9 @@ def setMaxValue(self, max_value): # Modifies the maximum value of the gauge # Args: # max: Value to update the maximum value of the gauge. - if self.value > max: - self.value = max - if max <= self.minValue: + if self.value > max_value: + self.value = max_value + if max_value <= self.minValue: self.maxValue = self.minValue + 1 else: self.maxValue = max_value diff --git a/src/rqt_gauges_2/speedometer_widget.py b/src/rqt_gauges_2/speedometer_widget.py index 54b068b..b6acec4 100644 --- a/src/rqt_gauges_2/speedometer_widget.py +++ b/src/rqt_gauges_2/speedometer_widget.py @@ -7,64 +7,7 @@ from rosidl_runtime_py.utilities import get_message from rqt_py_common.topic_completer import TopicCompleter - -def get_topic_type(node, topic): - """ - Subroutine for getting the topic type. - - (nearly identical to rostopic._get_topic_type, except it returns rest of name instead of fn) - - :returns: topic type, real topic name, and rest of name referenced - if the topic points to a field within a topic, e.g. /rosout/msg, ``str, str, str`` - """ - val = node.get_topic_names_and_types() - matches = [(t, t_types) for t, t_types in val if t == topic or topic.startswith(t + '/')] - for t, t_types in matches: - for t_type in t_types: - if t_type == topic: - return t_type, None, None - for t_type in t_types: - if t_type != '*': - return t_type, t, topic[len(t):] - return None, None, None - - -def _array_eval(field_name, slot_num): - """ - Array evaluation. - - :param field_name: name of field to index into, ``str`` - :param slot_num: index of slot to return, ``str`` - :returns: fn(msg_field)->msg_field[slot_num] - """ - def fn(f): - return getattr(f, field_name).__getitem__(slot_num) - return fn - - -def _field_eval(field_name): - """ - Field evaluation. - - :param field_name: name of field to return, ``str`` - :returns: fn(msg_field)->msg_field.field_name - """ - def fn(f): - return getattr(f, field_name) - return fn - - -def generate_field_evals(fields): - evals = [] - fields = [f for f in fields.split('/') if f] - for f in fields: - if '[' in f: - field_name, rest = f.split('[') - slot_num = int(rest[:rest.find(']')]) - evals.append(_array_eval(field_name, slot_num)) - else: - evals.append(_field_eval(f)) - return evals +from .utils import generate_field_evals, get_topic_type class SpeedometerWidget(QWidget): diff --git a/src/rqt_gauges_2/steering_wheel_widget.py b/src/rqt_gauges_2/steering_wheel_widget.py index 1203ed7..2e751f4 100644 --- a/src/rqt_gauges_2/steering_wheel_widget.py +++ b/src/rqt_gauges_2/steering_wheel_widget.py @@ -7,64 +7,7 @@ from rosidl_runtime_py.utilities import get_message from rqt_py_common.topic_completer import TopicCompleter - -def get_topic_type(node, topic): - """ - Subroutine for getting the topic type. - - (nearly identical to rostopic._get_topic_type, except it returns rest of name instead of fn) - - :returns: topic type, real topic name, and rest of name referenced - if the topic points to a field within a topic, e.g. /rosout/msg, ``str, str, str`` - """ - val = node.get_topic_names_and_types() - matches = [(t, t_types) for t, t_types in val if t == topic or topic.startswith(t + '/')] - for t, t_types in matches: - for t_type in t_types: - if t_type == topic: - return t_type, None, None - for t_type in t_types: - if t_type != '*': - return t_type, t, topic[len(t):] - return None, None, None - - -def _array_eval(field_name, slot_num): - """ - Array Evaluation. - - :param field_name: name of field to index into, ``str`` - :param slot_num: index of slot to return, ``str`` - :returns: fn(msg_field)->msg_field[slot_num] - """ - def fn(f): - return getattr(f, field_name).__getitem__(slot_num) - return fn - - -def _field_eval(field_name): - """ - Field evaluation. - - :param field_name: name of field to return, ``str`` - :returns: fn(msg_field)->msg_field.field_name - """ - def fn(f): - return getattr(f, field_name) - return fn - - -def generate_field_evals(fields): - evals = [] - fields = [f for f in fields.split('/') if f] - for f in fields: - if '[' in f: - field_name, rest = f.split('[') - slot_num = int(rest[:rest.find(']')]) - evals.append(_array_eval(field_name, slot_num)) - else: - evals.append(_field_eval(f)) - return evals +from .utils import generate_field_evals, get_topic_type class SteeringWheelWidget(QWidget): diff --git a/src/rqt_gauges_2/throttle_brake_pedals_widget.py b/src/rqt_gauges_2/throttle_brake_pedals_widget.py index 38d5afb..29fee6d 100644 --- a/src/rqt_gauges_2/throttle_brake_pedals_widget.py +++ b/src/rqt_gauges_2/throttle_brake_pedals_widget.py @@ -7,64 +7,7 @@ from rosidl_runtime_py.utilities import get_message from rqt_py_common.topic_completer import TopicCompleter - -def get_topic_type(node, topic): - """ - Subroutine for getting the topic type. - - (nearly identical to rostopic._get_topic_type, except it returns rest of name instead of fn) - - :returns: topic type, real topic name, and rest of name referenced - if the topic points to a field within a topic, e.g. /rosout/msg, ``str, str, str`` - """ - val = node.get_topic_names_and_types() - matches = [(t, t_types) for t, t_types in val if t == topic or topic.startswith(t + '/')] - for t, t_types in matches: - for t_type in t_types: - if t_type == topic: - return t_type, None, None - for t_type in t_types: - if t_type != '*': - return t_type, t, topic[len(t):] - return None, None, None - - -def _array_eval(field_name, slot_num): - """ - Array Evaluation. - - :param field_name: name of field to index into, ``str`` - :param slot_num: index of slot to return, ``str`` - :returns: fn(msg_field)->msg_field[slot_num] - """ - def fn(f): - return getattr(f, field_name).__getitem__(slot_num) - return fn - - -def _field_eval(field_name): - """ - Field evaluation. - - :param field_name: name of field to return, ``str`` - :returns: fn(msg_field)->msg_field.field_name - """ - def fn(f): - return getattr(f, field_name) - return fn - - -def generate_field_evals(fields): - evals = [] - fields = [f for f in fields.split('/') if f] - for f in fields: - if '[' in f: - field_name, rest = f.split('[') - slot_num = int(rest[:rest.find(']')]) - evals.append(_array_eval(field_name, slot_num)) - else: - evals.append(_field_eval(f)) - return evals +from .utils import generate_field_evals, get_topic_type class ThrottleBrakePedalsWidget(QWidget): diff --git a/src/rqt_gauges_2/utils.py b/src/rqt_gauges_2/utils.py new file mode 100644 index 0000000..c3d0941 --- /dev/null +++ b/src/rqt_gauges_2/utils.py @@ -0,0 +1,57 @@ +def get_topic_type(node, topic): + """ + Subroutine for getting the topic type. + + (nearly identical to rostopic._get_topic_type, except it returns rest of name instead of fn) + + :returns: topic type, real topic name, and rest of name referenced + if the topic points to a field within a topic, e.g. /rosout/msg, ``str, str, str`` + """ + val = node.get_topic_names_and_types() + matches = [(t, t_types) for t, t_types in val if t == topic or topic.startswith(t + '/')] + for t, t_types in matches: + for t_type in t_types: + if t_type == topic: + return t_type, None, None + for t_type in t_types: + if t_type != '*': + return t_type, t, topic[len(t):] + return None, None, None + + +def _array_eval(field_name, slot_num): + """ + Array evaluation. + + :param field_name: name of field to index into, ``str`` + :param slot_num: index of slot to return, ``str`` + :returns: fn(msg_field)->msg_field[slot_num] + """ + def fn(f): + return getattr(f, field_name).__getitem__(slot_num) + return fn + + +def _field_eval(field_name): + """ + Field evaluation. + + :param field_name: name of field to return, ``str`` + :returns: fn(msg_field)->msg_field.field_name + """ + def fn(f): + return getattr(f, field_name) + return fn + + +def generate_field_evals(fields): + evals = [] + fields = [f for f in fields.split('/') if f] + for f in fields: + if '[' in f: + field_name, rest = f.split('[') + slot_num = int(rest[:rest.find(']')]) + evals.append(_array_eval(field_name, slot_num)) + else: + evals.append(_field_eval(f)) + return evals From 3b10255b0cb28c028017f036b1f9691a06e69aec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Wed, 27 Dec 2023 08:36:06 +0100 Subject: [PATCH 2/4] Fix some crashes (#21) Signed-off-by: Alejandro Hernandez Cordero --- src/rqt_gauges_2/speedometer_widget.py | 10 ++++++-- src/rqt_gauges_2/steering_wheel_gauge.py | 1 + src/rqt_gauges_2/steering_wheel_widget.py | 8 ++++++- .../throttle_brake_pedals_widget.py | 24 ++++++++++++------- src/rqt_gauges_2/utils.py | 24 ++++++++++++------- 5 files changed, 47 insertions(+), 20 deletions(-) diff --git a/src/rqt_gauges_2/speedometer_widget.py b/src/rqt_gauges_2/speedometer_widget.py index b6acec4..2e38db3 100644 --- a/src/rqt_gauges_2/speedometer_widget.py +++ b/src/rqt_gauges_2/speedometer_widget.py @@ -72,7 +72,7 @@ def updateSubscription(self): 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: + if topic_type is not None and self.field_evals 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( @@ -85,4 +85,10 @@ def speedometer_callback(self, msg): value = msg for f in self.field_evals: value = f(value) - self.speedometer_gauge.updateValue(float(value)) + if value is not None: + if type(value) == int or type(value) == float or type(value) == str: + self.speedometer_gauge.updateValue(float(value)) + else: + self.speedometer_gauge.updateValue(self.speedometer_gauge.minValue) + else: + self.speedometer_gauge.updateValue(self.speedometer_gauge.minValue) diff --git a/src/rqt_gauges_2/steering_wheel_gauge.py b/src/rqt_gauges_2/steering_wheel_gauge.py index 4735279..2d98356 100644 --- a/src/rqt_gauges_2/steering_wheel_gauge.py +++ b/src/rqt_gauges_2/steering_wheel_gauge.py @@ -98,6 +98,7 @@ def updateValue(self, value: float): # value: Value to update the gauge with. value = max(value, self.minValue) value = min(value, self.maxValue) + self.value = value self.repaint() def draw_background_circle(self): diff --git a/src/rqt_gauges_2/steering_wheel_widget.py b/src/rqt_gauges_2/steering_wheel_widget.py index 2e751f4..66631eb 100644 --- a/src/rqt_gauges_2/steering_wheel_widget.py +++ b/src/rqt_gauges_2/steering_wheel_widget.py @@ -54,4 +54,10 @@ def steering_wheel_callback(self, msg): value = msg for f in self.field_evals: value = f(value) - self.steering_wheel_gauge.updateValue(float(value)) + if value is not None: + if type(value) == int or type(value) == float or type(value) == str: + self.steering_wheel_gauge.updateValue(float(value)) + else: + self.steering_wheel_gauge.updateValue(0) + else: + self.steering_wheel_gauge.updateValue(0) diff --git a/src/rqt_gauges_2/throttle_brake_pedals_widget.py b/src/rqt_gauges_2/throttle_brake_pedals_widget.py index 29fee6d..7dffdb6 100644 --- a/src/rqt_gauges_2/throttle_brake_pedals_widget.py +++ b/src/rqt_gauges_2/throttle_brake_pedals_widget.py @@ -81,18 +81,26 @@ def throttle_callback(self, msg): value = msg for f in self.throttle_field_evals: value = f(value) - if value <= 1 and value >= 0: - self.throttle_pedal.setValue(int(value*100)) - self.throttle_label.setText(str(value)) + if value is not None and (type(value) == int or type(value) == float + or type(value) == str): + if value <= 1 and value >= 0: + self.throttle_pedal.setValue(int(value*100)) + self.throttle_label.setText(str(value)) + else: + print('The throttle pedal value is not between 0 and 1') else: - print('The throttle pedal value is not between 0 and 1') + 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 <= 1 and value >= 0: - self.brake_pedal.setValue(int(value*100)) - self.brake_label.setText(str(value)) + if value is not None and (type(value) == int or type(value) == float + or type(value) == str): + if value <= 1 and value >= 0: + self.brake_pedal.setValue(int(value*100)) + self.brake_label.setText(str(value)) + else: + print('The brake pedal value is not between 0 and 1') else: - print('The brake pedal value is not between 0 and 1') + print('The brake pedal value is not valid') diff --git a/src/rqt_gauges_2/utils.py b/src/rqt_gauges_2/utils.py index c3d0941..70a0ce9 100644 --- a/src/rqt_gauges_2/utils.py +++ b/src/rqt_gauges_2/utils.py @@ -40,18 +40,24 @@ def _field_eval(field_name): :returns: fn(msg_field)->msg_field.field_name """ def fn(f): - return getattr(f, field_name) + if (hasattr(f, field_name)): + return getattr(f, field_name) return fn def generate_field_evals(fields): evals = [] - fields = [f for f in fields.split('/') if f] - for f in fields: - if '[' in f: - field_name, rest = f.split('[') - slot_num = int(rest[:rest.find(']')]) - evals.append(_array_eval(field_name, slot_num)) - else: - evals.append(_field_eval(f)) + if fields is not None: + fields = [f for f in fields.split('/') if f] + for f in fields: + if '[' in f: + field_name, rest = f.split('[') + slot_num = int(rest[:rest.find(']')]) + value = _array_eval(field_name, slot_num) + if value is not None: + evals.append(value) + else: + value = _field_eval(f) + if value is not None: + evals.append(value) return evals From 180bd48c953438157f1ac6fdd74125db6c669572 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Wed, 27 Dec 2023 08:42:21 +0100 Subject: [PATCH 3/4] Fixed resize (#22) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Alejandro Hernández Cordero --- resource/speedometer.ui | 16 ++++++++++++++-- resource/steering_wheel.ui | 22 ++++++++++++++++++++-- resource/throttle_brake_pedals.ui | 16 ++++++++++++++-- 3 files changed, 48 insertions(+), 6 deletions(-) diff --git a/resource/speedometer.ui b/resource/speedometer.ui index d99773e..1233e69 100644 --- a/resource/speedometer.ui +++ b/resource/speedometer.ui @@ -6,10 +6,22 @@ 0 0 - 479 - 509 + 500 + 550 + + + 500 + 550 + + + + + 500 + 500 + + Speedometer diff --git a/resource/steering_wheel.ui b/resource/steering_wheel.ui index fd027b1..c874192 100644 --- a/resource/steering_wheel.ui +++ b/resource/steering_wheel.ui @@ -6,10 +6,22 @@ 0 0 - 448 - 510 + 500 + 550 + + + 500 + 550 + + + + + 500 + 550 + + SteeringWheel @@ -154,6 +166,12 @@ p, li { white-space: pre-wrap; } 401 + + + 500 + 550 + + diff --git a/resource/throttle_brake_pedals.ui b/resource/throttle_brake_pedals.ui index 4305edb..8f5ac7c 100644 --- a/resource/throttle_brake_pedals.ui +++ b/resource/throttle_brake_pedals.ui @@ -6,10 +6,22 @@ 0 0 - 452 - 510 + 500 + 550 + + + 500 + 550 + + + + + 500 + 550 + + ThrottleBrakePedals From f6d2055916e4274c6bcfa8b9f1203c69bac02755 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Hern=C3=A1ndez=20Cordero?= Date: Wed, 27 Dec 2023 08:53:20 +0100 Subject: [PATCH 4/4] Fixed steering wheel range (#24) Signed-off-by: Alejandro Hernandez Cordero --- img/steering_wheel.png | Bin 37826 -> 26955 bytes resource/steering_wheel.ui | 49 ++-------------------- src/rqt_gauges_2/steering_wheel_gauge.py | 18 +++++++- src/rqt_gauges_2/steering_wheel_widget.py | 16 ++++++- 4 files changed, 35 insertions(+), 48 deletions(-) diff --git a/img/steering_wheel.png b/img/steering_wheel.png index d49461003f3f57baa290defcbe6d025a8157692c..eb66f6d9574dc362867f0afe5df3d48bd472098c 100644 GIT binary patch literal 26955 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 literal 37826 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 diff --git a/resource/steering_wheel.ui b/resource/steering_wheel.ui index c874192..c9efb55 100644 --- a/resource/steering_wheel.ui +++ b/resource/steering_wheel.ui @@ -27,11 +27,11 @@ - false + true - 330 + 230 460 51 31 @@ -88,51 +88,10 @@ p, li { white-space: pre-wrap; } Topic: - - - false - - - - 140 - 460 - 51 - 31 - - - - <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"> -<html><head><meta name="qrichtext" content="1" /><style type="text/css"> -p, li { white-space: pre-wrap; } -</style></head><body style=" font-family:'Ubuntu'; font-size:11pt; font-weight:400; font-style:normal;"> -<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">-45</p></body></html> - - - - - - - - - 60 - 460 - 81 - 31 - - - - - 12 - - - - Min Angle: - - - 240 + 140 466 81 21 @@ -144,7 +103,7 @@ p, li { white-space: pre-wrap; } - Max Angle: + Angle: diff --git a/src/rqt_gauges_2/steering_wheel_gauge.py b/src/rqt_gauges_2/steering_wheel_gauge.py index 2d98356..4e49669 100644 --- a/src/rqt_gauges_2/steering_wheel_gauge.py +++ b/src/rqt_gauges_2/steering_wheel_gauge.py @@ -25,7 +25,6 @@ def __init__(self, parent=None): self.progress_width = 25 self.progress_rounded_cap = True self.progress_color = 0x39F030 - self.max_value = 45 self.circle_max_angle = 135 self.font_size = 40 self.scale_font_size = 15 @@ -101,6 +100,21 @@ def updateValue(self, value: float): self.value = value self.repaint() + def setMaxValue(self, max_value): + # Modifies the maximum value of the gauge + # Args: + # max: Value to update the maximum value of the gauge. + if self.value > max_value: + self.value = max_value + if max_value <= self.minValue: + self.maxValue = self.minValue + 1 + self.minValue = -self.maxValue + 1 + else: + self.maxValue = max_value + self.minValue = -max_value + + self.update() + def draw_background_circle(self): painter = QPainter() painter.begin(self) @@ -115,7 +129,7 @@ def paintEvent(self, event): width = self.width - self.progress_width height = self.height - self.progress_width margin = int(self.progress_width / 2) - value = int(self.value * self.circle_max_angle / self.max_value) + value = int(self.value * self.circle_max_angle / self.maxValue) # Draw Circle self.draw_background_circle() diff --git a/src/rqt_gauges_2/steering_wheel_widget.py b/src/rqt_gauges_2/steering_wheel_widget.py index 66631eb..5d296d1 100644 --- a/src/rqt_gauges_2/steering_wheel_widget.py +++ b/src/rqt_gauges_2/steering_wheel_widget.py @@ -1,7 +1,7 @@ import os from ament_index_python.resources import get_resource -from PyQt5.QtCore import pyqtSlot +from PyQt5.QtCore import pyqtSlot, Qt from PyQt5.QtWidgets import QWidget from python_qt_binding import loadUi from rosidl_runtime_py.utilities import get_message @@ -30,8 +30,22 @@ def __init__(self, node): self._topic_completer.update_topics(self.node) self.topic_to_subscribe.setCompleter(self._topic_completer) + # Objects Properties + self.max_value.setAlignment(Qt.AlignCenter) + + self.max_value.setPlaceholderText(str(self.steering_wheel_gauge.maxValue)) + + self.max_value.textChanged.connect(self.updateMaxValue) self.subscribe_button.pressed.connect(self.updateSubscription) + @pyqtSlot() + def updateMaxValue(self): + new_max_value = self.max_value.toPlainText() + if new_max_value.isnumeric(): + self.steering_wheel_gauge.setMaxValue(int(new_max_value)) + else: + self.steering_wheel_gauge.setMaxValue(45) + @pyqtSlot() def updateSubscription(self): if self.node.destroy_subscription(self.sub):