0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

XMLRPC服务器如何启动

麦辣鸡腿堡 来源:古月居 作者:古月居 2023-09-14 17:56 次阅读

roscore调用了roslaunch.main,我们继续追踪,进到ros_comm-noetic-develtoolsroslaunchsrcroslaunch文件夹中,发现有个__init__.py文件,说明这个文件夹是一个python包,打开__init__.py文件找到def main(argv=sys.argv),这就是roscore调用的函数roslaunch.main的实现,如下(这里只保留主要的代码,不太重要的删掉了)。

def main(argv=sys.argv):
    options = None
    logger = None
    try:
        from . import rlutil
        parser = _get_optparse()
        
        (options, args) = parser.parse_args(argv[1:])
        args = rlutil.resolve_launch_arguments(args)
        write_pid_file(options.pid_fn, options.core, options.port)
        uuid = rlutil.get_or_generate_uuid(options.run_id, options.wait_for_master)
        configure_logging(uuid)
        # #3088: don't check disk usage on remote machines
        if not options.child_name and not options.skip_log_check:
            rlutil.check_log_disk_usage()


        logger = logging.getLogger('roslaunch')
        logger.info("roslaunch starting with args %s"%str(argv))
        logger.info("roslaunch env is %s"%os.environ)
            
        if options.child_name:
           # 这里没执行到,就不列出来了
        else:
            logger.info('starting in server mode')
            # #1491 change terminal name
            if not options.disable_title:
                rlutil.change_terminal_name(args, options.core)
            # Read roslaunch string from stdin when - is passed as launch filename.
            roslaunch_strs = []
            # This is a roslaunch parent, spin up parent server and launch processes.
            # args are the roslaunch files to load
            from . import parent as roslaunch_parent
            # force a port binding spec if we are running a core
            if options.core:
                options.port = options.port or DEFAULT_MASTER_PORT
            p = roslaunch_parent.ROSLaunchParent(uuid, args, roslaunch_strs=roslaunch_strs, is_core=options.core, port=options.port, local_only=options.local_only, verbose=options.verbose,  force_screen=options.force_screen, force_log=options.force_log, num_workers=options.num_workers, timeout=options.timeout, master_logger_level=options.master_logger_level, show_summary=not options.no_summary, force_required=options.force_required, sigint_timeout=options.sigint_timeout, sigterm_timeout=options.sigterm_timeout)
            p.start()
            p.spin()

roslaunch.main开启了日志,日志记录的信息可以帮我们了解main函数执行的顺序。

我们去Ubuntu的.ros/log/路径下,打开roslaunch-ubuntu-52246.log日志文件,内容如下。

图片

通过阅读日志我们发现,main函数首先检查日志文件夹磁盘占用情况,如果有剩余空间就继续往下运行。

然后把运行roscore的终端的标题给改了。

再调用ROSLaunchParent类中的函数,这大概就是main函数中最重要的地方了。

ROSLaunchParent类的定义是在同一路径下的parent.py文件中。为什么叫LaunchParent笔者也不清楚。

先不管它,我们再看日志,发现运行到了下面这个函数,它打算启动XMLRPC服务器端。

所以调用的顺序是:roslaunch_ init _.py文件中的main()函数调用parent.pystart()函数,start()函数调用自己类中的_start_infrastructure()函数,_start_infrastructure()函数调用自己类中的_start_server()函数,_start_server()函数再调用server.py中的start函数。

def _start_server(self):
        self.logger.info("starting parent XML-RPC server")
        self.server = roslaunch.server.ROSLaunchParentNode(self.config, self.pm)
        self.server.start()

我们再进到server.py文件中,找到ROSLaunchNode类,里面的start函数又调用了父类XmlRpcNode中的start函数。

class ROSLaunchNode(xmlrpc.XmlRpcNode):
    """
    Base XML-RPC server for roslaunch parent/child processes
    """
    def start(self):
        logger.info("starting roslaunch XML-RPC server")
        super(ROSLaunchNode, self).start()

我们来到ros_comm-noetic-develtoolsrosgraphsrcrosgraph路径,找到xmlrpc.py文件。找到class XmlRpcNode(object)类,再进入start(self)函数,发现它调用了自己类的run函数,run函数又调用了自己类中的_run函数,_run函数又调用了自己类中的_run_init()函数,在这里才调用了真正起作用的ThreadingXMLRPCServer类。

因为master节点是用python实现的,所以,需要有python版的XMLRPC库。

幸运的是,python有现成的XMLRPC库,叫SimpleXMLRPCServer。SimpleXMLRPCServer已经内置到python中了,无需安装。

所以,ThreadingXMLRPCServer类直接继承了SimpleXMLRPCServer,如下。

class ThreadingXMLRPCServer(socketserver.ThreadingMixIn, SimpleXMLRPCServer)
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 函数
    +关注

    关注

    3

    文章

    3911

    浏览量

    61335
  • MASTER
    +关注

    关注

    0

    文章

    79

    浏览量

    11163
  • ROS
    ROS
    +关注

    关注

    1

    文章

    272

    浏览量

    16698
收藏 人收藏

    评论

    相关推荐

    linux服务器和windows服务器

    Linux服务器和Windows服务器是目前应用最广泛的两种服务器操作系统。两者各有优劣,也适用于不同的应用场景。本文将 对Linux服务器和Windows
    发表于 02-22 15:46

    服务器技术基础

    服务器技术基础1.1 什么是服务器1.1.1 服务器的发展历史1.1.2 X86服务器的发展历史1.1.3 服务器的发展趋势1.2
    发表于 09-12 22:55

    服务器维护技巧

    的杀毒软件来控制病毒传播,同时,在网络杀毒软件的使用中,必须要定期或及时升级杀毒软件,并且每自动更新病毒库。 服务器维护技巧四:关闭不需要的服务和端口——服务器操作系统在安装时,会启动
    发表于 09-09 15:22

    labview Web服务器如何启动

    labview利用web服务器发布网页时,想在浏览中预览时无法启动web服务器
    发表于 04-12 07:59

    许可证服务器无法启动

    :flexnetls-nvidia.service-LSB:启动和停止FlexNet许可证服务器 已加载:已加载(/etc/init.d/flexnetls-nvidia;错误;供应商预设:已启用) 活动:失败(结果:退出
    发表于 09-18 16:15

    Linux下的形式启动和关闭服务器思路介绍

    最近用maven工程的形式打jar包写一个小型服务器,于是希望提供脚本的形式启动和关闭服务器
    发表于 07-12 06:09

    启动时的Web服务器问题

    背景:MPLAB X IDE v3.65,XC32 v1.44,PIC32MZ2048EFH100,Harmony v2.03b,LAN8720一切都与HTTP服务器配合得很好,但是在它工作之前,我
    发表于 03-09 09:01

    什么是服务器

    大数据_02【大数据基础知识】01 什么是服务器02 服务器类型03 存储磁盘(硬盘)01 什么是服务器服务器: 也称伺服,是一种高性能计
    发表于 07-16 07:35

    如何配置嵌入式服务器

    官方文档使用其他Web服务器许多Spring Boot启动器都包含默认的嵌入式容器。对于servlet堆栈应用程序,spring-boot-starter-web包括Tomcatsprin...
    发表于 10-27 08:35

    服务器与物理服务器的区别是什么?

    云计算服务器(又称云服务器或云主机,简称ECS),是云计算服务体系中的一项主机产品,该产品有效的解决了传统物理租机与VPS服务中,存在的管理难度大,业务扩展性弱的缺陷。物理
    发表于 12-09 09:56

    Tomcat服务器简介

    简介简介Tomcat服务器是一个开放源码的轻量级Web应用服务器,非常适合搭建微服务应用。Embedded Tomcat嵌入式Tomcat服务器则无需部署外置tomcat,开发者只需引
    发表于 12-16 08:24

    如何解决“无法启动GDB服务器”的问题?

    我正在尝试使用 CUBEIDE 对 STM32F103C8T6 进行编程。在解决了这么多错误之后,我现在遇到了这个错误“无法启动 GDB 服务器”,尝试了不同的端口号,并将调试概率从“OPEN OCD”更改为“GDB SERVER”,但无济于事。
    发表于 12-02 06:25

    用AT+CIPSERVER=1,80启动服务器时,可以启动UDP服务器吗?

    大家好, 我刚收到新的 esp 板,我发现有了新固件,我无法使用 AT 命令 AT+GMR 启动 UDP 服务器,给我的是: 代码:全选AT version:0.21.0.0 SDK version
    发表于 05-15 07:27

    ROS是如何实现XMLRPC

    XMLRPC的C++代码在下载后的ros_comm-noetic-develutilitiesxmlrpcpp路径下。 还好,整个工程不算太大。XMLRPC分成客户端和服务器端两大部分。 咱们先看
    的头像 发表于 09-14 17:45 518次阅读

    节点是如何调用XMLRPC

    节点间通过XMLRPC建立连接 在一个节点刚启动的时候,它并不知道其它节点的存在,更不知道它们在交谈什么,当然也就谈不上通信。 所以,它要先与master对话查询其它节点的状态,然后再与其它节点通信
    的头像 发表于 09-14 17:52 559次阅读
    节点是如何调用<b class='flag-5'>XMLRPC</b>的