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

    文章

    4350

    浏览量

    63066
  • MASTER
    +关注

    关注

    0

    文章

    104

    浏览量

    11366
  • ROS
    ROS
    +关注

    关注

    1

    文章

    281

    浏览量

    17145
收藏 人收藏

    评论

    相关推荐

    什么是服务器虚拟化?私人云服务器

    什么是 服务器虚拟化 ? 服务器虚拟化是一种将物理服务器转化为虚拟服务器的过程,使得多个虚拟服务器可以在同一台物理
    的头像 发表于 08-08 10:44 1470次阅读

    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

    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

    服务器,服务器的作用是什么?

    服务器,服务器的作用是什么? 戴尔服务器服务器指一个管理资源并为用户提供服务的计算机软件,通常分为文件
    发表于 04-06 17:18 2.8w次阅读

    存储服务器怎么配置_存储服务器的作用

    安装目录默认为:IVM S-4200 NiVM S-4200 Storage ) , 打开存储服务器。在电脑右下角任务栏中显示,表示服务器启动成功。
    发表于 05-06 15:18 5344次阅读

    如何重新启动Linux服务器

    使用个人电脑工作的时候,可能会因为各种原因而关闭机器。对于 Linux 初学者来说,与电源相关(关机、重启等)的任务总是最后才想到如何去实现的,所以有可能对于如何重新启动远程服务器不太了解。今天我们介绍一些可以用来通过终端来重新启动
    的头像 发表于 05-14 16:03 2562次阅读

    ROS是如何实现XMLRPC

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

    节点是如何调用XMLRPC

    。 而节点与master对话使用的就是XMLRPC。 从这一点来看,master叫节点管理确实名副其实,它是一个大管家,给刚出生的节点提供服务。 下面我们以两个节点:talker和listener为例,介绍其通过
    的头像 发表于 09-14 17:52 817次阅读
    节点是如何调用<b class='flag-5'>XMLRPC</b>的

    ROS中节点管理master是如何被启动

    我们来看看节点管理master是如何被启动的,再回到parent.pystart()函数,如下。 我们发现它启动XMLRPC服务器后,接
    的头像 发表于 09-14 18:03 1771次阅读

    服务器数据恢复—非正常关机导致服务器文件丢失的数据恢复案例

    ;分析: 服务器在运行过程中自动关机且无法启动服务器管理员对服务器进行修复后成功启动服务器
    的头像 发表于 01-19 13:42 627次阅读