From d79ad805b16b8f175ce96d4555629351cfe82693 Mon Sep 17 00:00:00 2001 From: Shingo Kitagawa Date: Tue, 17 Nov 2020 02:43:42 +0900 Subject: [PATCH 1/2] add service_type and support Trigger for rqt service button --- .../src/jsk_rqt_plugins/button_general.py | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py b/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py index 548582bf3..fdc6c4618 100644 --- a/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py +++ b/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py @@ -26,6 +26,7 @@ from std_msgs.msg import Bool from std_msgs.msg import Time from std_srvs.srv import Empty +from std_srvs.srv import Trigger if LooseVersion(python_qt_binding.QT_BINDING_VERSION).version[0] >= 5: from python_qt_binding.QtWidgets import QAction @@ -183,8 +184,18 @@ def setupButtons(self, yaml_file): if button_data.has_key("name"): name = button_data['name'] button.setText(name) + if button_data.has_key('service_type'): + if button_data['service_type'] == 'Trigger': + service_type = Trigger + elif button_data['service_type'] == 'Empty': + service_type = Empty + else: + raise Exception("Unsupported service type: {}".format( + button_data['service_type'])) + else: + service_type = Empty button.clicked.connect( - self.buttonCallback(button_data['service'])) + self.buttonCallback(button_data['service'], service_type)) if self.button_type == "push": button.setToolButtonStyle( QtCore.Qt.ToolButtonTextUnderIcon) @@ -200,14 +211,14 @@ def setupButtons(self, yaml_file): self.layout.addWidget(group) self.setLayout(self.layout) - def buttonCallback(self, service_name): + def buttonCallback(self, service_name, service_type): """ return function as callback """ - return lambda x: self.buttonCallbackImpl(service_name) + return lambda x: self.buttonCallbackImpl(service_name, service_type) - def buttonCallbackImpl(self, service_name): - srv = rospy.ServiceProxy(service_name, Empty) + def buttonCallbackImpl(self, service_name, service_type=Empty): + srv = rospy.ServiceProxy(service_name, service_type) try: srv() except rospy.ServiceException as e: From 81beca7a99c18ead915e1e5942247e98954ace2b Mon Sep 17 00:00:00 2001 From: Shingo Kitagawa Date: Tue, 17 Nov 2020 14:35:33 +0900 Subject: [PATCH 2/2] show error when trigger response.success=False --- jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py b/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py index fdc6c4618..be1a0bcc7 100644 --- a/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py +++ b/jsk_rqt_plugins/src/jsk_rqt_plugins/button_general.py @@ -220,7 +220,13 @@ def buttonCallback(self, service_name, service_type): def buttonCallbackImpl(self, service_name, service_type=Empty): srv = rospy.ServiceProxy(service_name, service_type) try: - srv() + res = srv() + if hasattr(res, 'success'): + success = res.success + if not success: + self.showError( + "Succeeded to call {}, but service response is res.success=False" + .format(service_name)) except rospy.ServiceException as e: self.showError("Failed to call %s" % service_name)