示例#1
0
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)))
示例#2
0
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))
示例#4
0
    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)))
示例#6
0
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))
示例#7
0
 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()
示例#9
0
 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)
示例#10
0
 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))
示例#11
0
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:])
示例#12
0
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:])
示例#14
0
    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())
示例#16
0
文件: ros.py 项目: FlorisE/rospit
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)))
示例#17
0
                % (
                    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(
示例#18
0
                    [' * %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]
示例#19
0
 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))
示例#20
0
        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