def call_service_util(service_name, service_args, service_class=None): rospy.init_node('rosservice', anonymous=True, disable_signals=True) if service_class is None: service_class = get_service_class_by_name(service_name) request = service_class._request_class() try: now = rospy.get_rostime() keys = {'now': now, 'auto': std_msgs.msg.Header(stamp=now)} genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join( [' * %s (type %s)' % (a, type(a).__name__) for a in args]) else: return ' * %s (type %s)' % (args, type(args).__name__) raise ROSServiceException( "Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]" % (e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException as e: raise ROSServiceException(str(e)) except genpy.SerializationError as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type)))
def call_service_util(service_name, service_args, service_class=None): rospy.init_node('rosservice', anonymous=True, disable_signals=True) if service_class is None: service_class = get_service_class_by_name(service_name) request = service_class._request_class() try: now = rospy.get_rostime() keys = {'now': now, 'auto': std_msgs.msg.Header(stamp=now) } genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join([' * %s (type %s)'%(a, type(a).__name__) for a in args]) else: return ' * %s (type %s)'%(args, type(args).__name__) raise ROSServiceException("Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]"%(e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException as e: raise ROSServiceException(str(e)) except genpy.SerializationError as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type)))
def test_get_srv_text(self): d = get_test_path() srv_d = os.path.join(d, 'srv') with open(os.path.join(srv_d, 'RossrvA.srv'), 'r') as f: text = f.read() self.assertEquals(text, rosmsg.get_srv_text('test_ros/RossrvA', raw=False)) self.assertEquals(text, rosmsg.get_srv_text('test_ros/RossrvA', raw=True)) # std_msgs/empty / std_msgs/empty with open(os.path.join(srv_d, 'RossrvB.srv'), 'r') as f: text = f.read() self.assertEquals(text, rosmsg.get_srv_text('test_ros/RossrvB', raw=False)) self.assertEquals(text, rosmsg.get_srv_text('test_ros/RossrvB', raw=True))
def call_service(service_name, service_args, service_class=None): """ Call the specified service_name @param service_name: fully-resolved name of service to call @type service_name: str @param service_args: args to pass to service @type service_args: [any] @param service_class: (optional) service type class. If this argument is provided, it saves a probe call against the service @type service_class: Message class @return: service request, service response @rtype: Message, Message @raise ROSServiceException: if call command cannot be executed """ # can't use time w/o being a node. We could optimize this by # search for the now/auto keywords first import std_msgs.msg rospy.init_node('rosservice', anonymous=True) if service_class is None: service_class = get_service_class_by_name(service_name) request = service_class._request_class() try: now = rospy.get_rostime() keys = {'now': now, 'auto': std_msgs.msg.Header(stamp=now)} genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join( [' * %s (type %s)' % (a, type(a).__name__) for a in args]) else: return ' * %s (type %s)' % (args, type(args).__name__) raise ROSServiceException( "Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]" % (e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException as e: raise ROSServiceException(str(e)) except genpy.SerializationError as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type)))
def show(*args): # TODO: provide plugin? if not args: raise ValueError("show requires an argument") arg = args[0] if hasattr(arg, '_show'): return arg._show() # duck-type check for generated services elif isinstance(arg, type) and hasattr(arg, '_request_class') and hasattr(arg, '_response_class'): print rosmsg.get_srv_text(arg._type) # duck-type check for generated messages elif isinstance(arg, type) and hasattr(arg, '_slot_types'): print rosmsg.get_msg_text(arg._type) else: raise ValueError("unknown show arg: %s: %s"%(type(arg), arg))
def test_get_srv_text(self): d = get_test_path() srv_d = os.path.join(d, 'srv') test_srv_package = 'test_rosmaster' rospack = rospkg.RosPack() srv_raw_d = os.path.join(rospack.get_path(test_srv_package), 'srv') for t in ['RossrvA', 'RossrvB']: with open(os.path.join(srv_d, '%s.srv'%t), 'r') as f: text = f.read() with open(os.path.join(srv_raw_d, '%s.srv'%t), 'r') as f: text_raw = f.read() type_ = test_srv_package+'/'+t self.assertEquals(text, rosmsg.get_srv_text(type_, raw=False)) self.assertEquals(text_raw, rosmsg.get_srv_text(type_, raw=True))
def _rightclick_menu(self, event): menu = QMenu() text_action = QAction(self.tr('View Text'), menu) menu.addAction(text_action) raw_action = QAction(self.tr('View Raw'), menu) menu.addAction(raw_action) action = menu.exec_(event.globalPos()) if action == raw_action or action == text_action: selected = self.messages_tree.selectedIndexes() selected_type = selected[1].data() if selected_type[-2:] == '[]': selected_type = selected_type[:-2] browsetext = None try: if self._mode == rosmsg.MODE_MSG: browsetext = rosmsg.get_msg_text(selected_type, action == raw_action) elif self._mode == rosmsg.MODE_SRV: browsetext = rosmsg.get_srv_text(selected_type, action == raw_action) else: raise except rosmsg.ROSMsgException, e: QMessageBox.warning( self, self.tr('Warning'), self. tr('The selected item component does not have text to view.' )) if browsetext is not None: self._browsers.append(TextBrowseDialog(browsetext)) self._browsers[-1].show()
def __str__(self): if self._type is None: self._init_type() if self._type is None: return self._ns else: return rosmsg.get_srv_text(self._type._type)
def test_get_srv_text(self): d = get_test_path() srv_d = os.path.join(d, 'srv') test_srv_package = 'diagnostic_msgs' rospack = rospkg.RosPack() srv_raw_d = os.path.join(rospack.get_path(test_srv_package), 'srv') for t in ['AddDiagnostics', 'SelfTest']: with open(os.path.join(srv_d, '%s.srv'%t), 'r') as f: text = f.read() with open(os.path.join(srv_raw_d, '%s.srv'%t), 'r') as f: text_raw = f.read() type_ = test_srv_package+'/'+t self.assertEquals(text, rosmsg.get_srv_text(type_, raw=False)) self.assertEquals(text_raw, rosmsg.get_srv_text(type_, raw=True))
def get_srv_fields(srv_name, rospack=None): lines = rosmsg.get_srv_text(srv_name, False, rospack).splitlines() sep = '---' if sep not in lines: raise ValueError('bad srv definition') i = lines.index(sep) return get_fields(lines[:i]), get_fields(lines[i + 1:])
def call_service(service_name, service_args, service_class=None): """ Call the specified service_name @param service_name: fully-resolved name of service to call @type service_name: str @param service_args: args to pass to service @type service_args: [any] @param service_class: (optional) service type class. If this argument is provided, it saves a probe call against the service @type service_class: Message class @return: service request, service response @rtype: Message, Message @raise ROSServiceException: if call command cannot be executed """ # can't use time w/o being a node. We could optimize this by # search for the now/auto keywords first import std_msgs.msg rospy.init_node('rosservice', anonymous=True) if service_class is None: service_class = get_service_class_by_name(service_name) request = service_class._request_class() try: now = rospy.get_rostime() keys = { 'now': now, 'auto': std_msgs.msg.Header(stamp=now) } genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join([' * %s (type %s)'%(a, type(a).__name__) for a in args]) else: return ' * %s (type %s)'%(args, type(args).__name__) raise ROSServiceException("Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]"%(e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException as e: raise ROSServiceException(str(e)) except genpy.SerializationError as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type)))
def __init__(self, srv_name, rospack=None): # parse srv definition lines = rosmsg.get_srv_text(srv_name, False, rospack).splitlines() sep = '---' if sep not in lines: raise ValueError('bad srv definition') i = lines.index(sep) self.typespec = TypeSpec(srv_name) self.req = Fields(lines[:i]) self.resp = Fields(lines[i+1:])
def _rightclick_menu(self, event): """ :type event: QEvent """ # QTreeview.selectedIndexes() returns 0 when no node is selected. # This can happen when after booting no left-click has been made yet # (ie. looks like right-click doesn't count). These lines are the # workaround for that problem. selected = self._messages_tree.selectedIndexes() if len(selected) == 0: return menu = QMenu() text_action = QAction(self.tr('View Text'), menu) menu.addAction(text_action) raw_action = QAction(self.tr('View Raw'), menu) menu.addAction(raw_action) remove_action = QAction(self.tr('Remove message'), menu) menu.addAction(remove_action) action = menu.exec_(event.globalPos()) if action == raw_action or action == text_action: rospy.logdebug('_rightclick_menu selected={}'.format(selected)) selected_type = selected[1].data() if selected_type[-2:] == '[]': selected_type = selected_type[:-2] browsetext = None try: if (self._mode == rosmsg.MODE_MSG or self._mode == rosaction.MODE_ACTION): browsetext = rosmsg.get_msg_text(selected_type, action == raw_action) elif self._mode == rosmsg.MODE_SRV: browsetext = rosmsg.get_srv_text(selected_type, action == raw_action) else: raise except rosmsg.ROSMsgException as e: QMessageBox.warning( self, self.tr('Warning'), self.tr('The selected item component ' + 'does not have text to view.')) if browsetext is not None: self._browsers.append( TextBrowseDialog(browsetext, self._rospack)) self._browsers[-1].show() if action == remove_action: self._messages_tree.model().removeRow(selected[0].row())
def _rightclick_menu(self, event): """ :type event: QEvent """ # QTreeview.selectedIndexes() returns 0 when no node is selected. # This can happen when after booting no left-click has been made yet # (ie. looks like right-click doesn't count). These lines are the # workaround for that problem. selected = self._messages_tree.selectedIndexes() if len(selected) == 0: return menu = QMenu() text_action = QAction(self.tr('View Text'), menu) menu.addAction(text_action) raw_action = QAction(self.tr('View Raw'), menu) menu.addAction(raw_action) remove_action = QAction(self.tr('Remove message'), menu) menu.addAction(remove_action) action = menu.exec_(event.globalPos()) if action == raw_action or action == text_action: rospy.logdebug('_rightclick_menu selected={}'.format(selected)) selected_type = selected[1].data() if selected_type[-2:] == '[]': selected_type = selected_type[:-2] browsetext = None try: if (self._mode == rosmsg.MODE_MSG or self._mode == rosaction.MODE_ACTION): browsetext = rosmsg.get_msg_text(selected_type, action == raw_action) elif self._mode == rosmsg.MODE_SRV: browsetext = rosmsg.get_srv_text(selected_type, action == raw_action) else: raise except rosmsg.ROSMsgException as e: QMessageBox.warning(self, self.tr('Warning'), self.tr('The selected item component ' + 'does not have text to view.')) if browsetext is not None: self._browsers.append(TextBrowseDialog(browsetext, self._rospack)) self._browsers[-1].show() if action == remove_action: self._messages_tree.model().removeRow(selected[0].row())
def call_service(service_name, service_args): """ Call a service. Mostly extracted from rosservice. """ service_class = rosservice.get_service_class_by_name(service_name) request = service_class._request_class() try: now = rospy.get_rostime() keys = {'now': now, 'auto': std_msgs.msg.Header(stamp=now)} genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join( [' * %s (type %s)' % (a, type(a).__name__) for a in args]) else: return ' * %s (type %s)' % (args, type(args).__name__) raise rosservice.ROSServiceException( "Incompatible arguments to call service:\n%s\n" + "Provided arguments are:\n%s\n\n" + "Service arguments are: [%s]" % (e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException as e: raise rosservice.ROSServiceException(str(e)) except genpy.SerializationError as e: raise rosservice.ROSServiceException( "Unable to send request. One of the fields has an incorrect type:\n" + " %s\n\nsrv file:\n%s" % (e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException as e: raise rosservice.ROSServiceException( "Unable to send request. One of the fields has an incorrect type:\n" + " %s\n\nsrv file:\n%s" % (e, rosmsg.get_srv_text(service_class._type)))
% ( e, argsummary(service_args), roslib.message.get_printable_message_args(request))) try: return rospy.ServiceProxy( service_name, service_class)(request) except rospy.ServiceException, e: return str(e) except roslib.message.SerializationError, e: return ( "Unable to send request." " One of the fields has an incorrect type:\n" " %s\n\nsrv file:\n%s" % ( e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException, e: return ( "Unable to send request." " One of the fields has an incorrect type:\n" " %s\n\nsrv file:\n%s" % ( e, rosmsg.get_srv_text(service_class._type))) def _rosservice(self, args): parser = argparse.ArgumentParser(prog='/rosservice') subparsers = parser.add_subparsers(dest='cmd', help='sub-command') subparsers.add_parser('list', help='show services') subparsers.add_parser( 'call', help='call server: /rosservice call <service> [<args>]' ).add_argument(
[' * %s (type %s)' % (a, type(a).__name__) for a in args]) else: return ' * %s (type %s)' % (args, type(args).__name__) raise ROSServiceException( "Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]" % (e, argsummary(service_args), roslib.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException, e: raise ROSServiceException(str(e)) except roslib.message.SerializationError, e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException, e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) def _rosservice_call(service_name, service_args, verbose=False, service_class=None): """ Implements 'rosservice call' @param service_name: name of service to call @type service_name: str @param service_args: arguments to call service with @type service_args: [args]
def __doc__(self): return ("%s is of type %s,\n" "and has the following structure:\n" "%s\n") % (self._name, self.srv_class._type, rosmsg.get_srv_text(self.srv_class._type))
genpy.message.fill_message_args(request, service_args, keys=keys) except genpy.MessageException as e: def argsummary(args): if type(args) in [tuple, list]: return '\n'.join([' * %s (type %s)'%(a, type(a).__name__) for a in args]) else: return ' * %s (type %s)'%(args, type(args).__name__) raise ROSServiceException("Incompatible arguments to call service:\n%s\nProvided arguments are:\n%s\n\nService arguments are: [%s]"%(e, argsummary(service_args), genpy.message.get_printable_message_args(request))) try: return request, rospy.ServiceProxy(service_name, service_class)(request) except rospy.ServiceException, e: raise ROSServiceException(str(e)) except genpy.SerializationError as e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) except rospy.ROSSerializationException, e: raise ROSServiceException("Unable to send request. One of the fields has an incorrect type:\n"+\ " %s\n\nsrv file:\n%s"%(e, rosmsg.get_srv_text(service_class._type))) def _rosservice_call(service_name, service_args, verbose=False, service_class=None): """ Implements 'rosservice call' @param service_name: name of service to call @type service_name: str @param service_args: arguments to call service with @type service_args: [args] @param verbose: if True, print extra output @type verbose: bool @param service_class Message class: (optional) service type class. If this argument is provided, it saves a probe call against