0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

XMLRPC服務(wù)器如何啟動(dòng)

麥辣雞腿堡 ? 來(lái)源:古月居 ? 作者:古月居 ? 2023-09-14 17:56 ? 次閱讀

roscore調(diào)用了roslaunch.main,我們繼續(xù)追蹤,進(jìn)到ros_comm-noetic-develtoolsroslaunchsrcroslaunch文件夾中,發(fā)現(xiàn)有個(gè)__init__.py文件,說(shuō)明這個(gè)文件夾是一個(gè)python包,打開(kāi)__init__.py文件找到def main(argv=sys.argv),這就是roscore調(diào)用的函數(shù)roslaunch.main的實(shí)現(xiàn),如下(這里只保留主要的代碼,不太重要的刪掉了)。

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:
           # 這里沒(méi)執(zhí)行到,就不列出來(lái)了
        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開(kāi)啟了日志,日志記錄的信息可以幫我們了解main函數(shù)執(zhí)行的順序。

我們?nèi)buntu的.ros/log/路徑下,打開(kāi)roslaunch-ubuntu-52246.log日志文件,內(nèi)容如下。

圖片

通過(guò)閱讀日志我們發(fā)現(xiàn),main函數(shù)首先檢查日志文件夾磁盤(pán)占用情況,如果有剩余空間就繼續(xù)往下運(yùn)行。

然后把運(yùn)行roscore的終端的標(biāo)題給改了。

再調(diào)用ROSLaunchParent類中的函數(shù),這大概就是main函數(shù)中最重要的地方了。

ROSLaunchParent類的定義是在同一路徑下的parent.py文件中。為什么叫LaunchParent筆者也不清楚。

先不管它,我們?cè)倏慈罩?,發(fā)現(xiàn)運(yùn)行到了下面這個(gè)函數(shù),它打算啟動(dòng)XMLRPC服務(wù)器端。

所以調(diào)用的順序是:roslaunch_ init _.py文件中的main()函數(shù)調(diào)用parent.pystart()函數(shù),start()函數(shù)調(diào)用自己類中的_start_infrastructure()函數(shù),_start_infrastructure()函數(shù)調(diào)用自己類中的_start_server()函數(shù),_start_server()函數(shù)再調(diào)用server.py中的start函數(shù)。

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

我們?cè)龠M(jìn)到server.py文件中,找到ROSLaunchNode類,里面的start函數(shù)又調(diào)用了父類XmlRpcNode中的start函數(shù)。

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()

我們來(lái)到ros_comm-noetic-develtoolsrosgraphsrcrosgraph路徑,找到xmlrpc.py文件。找到class XmlRpcNode(object)類,再進(jìn)入start(self)函數(shù),發(fā)現(xiàn)它調(diào)用了自己類的run函數(shù),run函數(shù)又調(diào)用了自己類中的_run函數(shù),_run函數(shù)又調(diào)用了自己類中的_run_init()函數(shù),在這里才調(diào)用了真正起作用的ThreadingXMLRPCServer類。

因?yàn)閙aster節(jié)點(diǎn)是用python實(shí)現(xiàn)的,所以,需要有python版的XMLRPC庫(kù)。

幸運(yùn)的是,python有現(xiàn)成的XMLRPC庫(kù),叫SimpleXMLRPCServer。SimpleXMLRPCServer已經(jīng)內(nèi)置到python中了,無(wú)需安裝。

所以,ThreadingXMLRPCServer類直接繼承了SimpleXMLRPCServer,如下。

class ThreadingXMLRPCServer(socketserver.ThreadingMixIn, SimpleXMLRPCServer)
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4237

    瀏覽量

    61969
  • MASTER
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    11220
  • ROS
    ROS
    +關(guān)注

    關(guān)注

    1

    文章

    276

    瀏覽量

    16887
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是服務(wù)器虛擬化?私人云服務(wù)器

    什么是 服務(wù)器虛擬化 ? 服務(wù)器虛擬化是一種將物理服務(wù)器轉(zhuǎn)化為虛擬服務(wù)器的過(guò)程,使得多個(gè)虛擬服務(wù)器可以在同一臺(tái)物理
    的頭像 發(fā)表于 08-08 10:44 ?1137次閱讀

    labview Web服務(wù)器如何啟動(dòng)?

    labview利用web服務(wù)器發(fā)布網(wǎng)頁(yè)時(shí),想在瀏覽中預(yù)覽時(shí)無(wú)法啟動(dòng)web服務(wù)器
    發(fā)表于 04-12 07:59

    許可證服務(wù)器無(wú)法啟動(dòng)

    :flexnetls-nvidia.service-LSB:啟動(dòng)和停止FlexNet許可證服務(wù)器 已加載:已加載(/etc/init.d/flexnetls-nvidia;錯(cuò)誤;供應(yīng)商預(yù)設(shè):已啟用) 活動(dòng):失?。ńY(jié)果:退出
    發(fā)表于 09-18 16:15

    Linux下的形式啟動(dòng)和關(guān)閉服務(wù)器思路介紹

    最近用maven工程的形式打jar包寫(xiě)一個(gè)小型服務(wù)器,于是希望提供腳本的形式啟動(dòng)和關(guān)閉服務(wù)器。
    發(fā)表于 07-12 06:09

    啟動(dòng)時(shí)的Web服務(wù)器問(wèn)題

    背景:MPLAB X IDE v3.65,XC32 v1.44,PIC32MZ2048EFH100,Harmony v2.03b,LAN8720一切都與HTTP服務(wù)器配合得很好,但是在它工作之前,我
    發(fā)表于 03-09 09:01

    Tomcat服務(wù)器簡(jiǎn)介

    簡(jiǎn)介簡(jiǎn)介Tomcat服務(wù)器是一個(gè)開(kāi)放源碼的輕量級(jí)Web應(yīng)用服務(wù)器,非常適合搭建微服務(wù)應(yīng)用。Embedded Tomcat嵌入式Tomcat服務(wù)器則無(wú)需部署外置tomcat,開(kāi)發(fā)者只需引
    發(fā)表于 12-16 08:24

    如何解決“無(wú)法啟動(dòng)GDB服務(wù)器”的問(wèn)題?

    我正在嘗試使用 CUBEIDE 對(duì) STM32F103C8T6 進(jìn)行編程。在解決了這么多錯(cuò)誤之后,我現(xiàn)在遇到了這個(gè)錯(cuò)誤“無(wú)法啟動(dòng) GDB 服務(wù)器”,嘗試了不同的端口號(hào),并將調(diào)試概率從“OPEN OCD”更改為“GDB SERVER”,但無(wú)濟(jì)于事。
    發(fā)表于 12-02 06:25

    用AT+CIPSERVER=1,80啟動(dòng)服務(wù)器時(shí),可以啟動(dòng)UDP服務(wù)器嗎?

    大家好, 我剛收到新的 esp 板,我發(fā)現(xiàn)有了新固件,我無(wú)法使用 AT 命令 AT+GMR 啟動(dòng) UDP 服務(wù)器,給我的是: 代碼:全選AT version:0.21.0.0 SDK version
    發(fā)表于 05-15 07:27

    服務(wù)器,服務(wù)器的作用是什么?

    服務(wù)器,服務(wù)器的作用是什么? 戴爾服務(wù)器服務(wù)器指一個(gè)管理資源并為用戶提供服務(wù)的計(jì)算機(jī)軟件,通常分為文件
    發(fā)表于 04-06 17:18 ?2.8w次閱讀

    存儲(chǔ)服務(wù)器怎么配置_存儲(chǔ)服務(wù)器的作用

    安裝目錄默認(rèn)為:IVM S-4200 NiVM S-4200 Storage ) , 打開(kāi)存儲(chǔ)服務(wù)器。在電腦右下角任務(wù)欄中顯示,表示服務(wù)器啟動(dòng)成功。
    發(fā)表于 05-06 15:18 ?5107次閱讀

    如何重新啟動(dòng)Linux服務(wù)器

    使用個(gè)人電腦工作的時(shí)候,可能會(huì)因?yàn)楦鞣N原因而關(guān)閉機(jī)器。對(duì)于 Linux 初學(xué)者來(lái)說(shuō),與電源相關(guān)(關(guān)機(jī)、重啟等)的任務(wù)總是最后才想到如何去實(shí)現(xiàn)的,所以有可能對(duì)于如何重新啟動(dòng)遠(yuǎn)程服務(wù)器不太了解。今天我們介紹一些可以用來(lái)通過(guò)終端來(lái)重新啟動(dòng)
    的頭像 發(fā)表于 05-14 16:03 ?2351次閱讀

    ROS是如何實(shí)現(xiàn)XMLRPC

    XMLRPC的C++代碼在下載后的ros_comm-noetic-develutilitiesxmlrpcpp路徑下。 還好,整個(gè)工程不算太大。XMLRPC分成客戶端和服務(wù)器端兩大部分。 咱們先看
    的頭像 發(fā)表于 09-14 17:45 ?625次閱讀

    節(jié)點(diǎn)是如何調(diào)用XMLRPC

    。 而節(jié)點(diǎn)與master對(duì)話使用的就是XMLRPC。 從這一點(diǎn)來(lái)看,master叫節(jié)點(diǎn)管理確實(shí)名副其實(shí),它是一個(gè)大管家,給剛出生的節(jié)點(diǎn)提供服務(wù)。 下面我們以兩個(gè)節(jié)點(diǎn):talker和listener為例,介紹其通過(guò)
    的頭像 發(fā)表于 09-14 17:52 ?687次閱讀
    節(jié)點(diǎn)是如何調(diào)用<b class='flag-5'>XMLRPC</b>的

    ROS中節(jié)點(diǎn)管理master是如何被啟動(dòng)

    我們來(lái)看看節(jié)點(diǎn)管理master是如何被啟動(dòng)的,再回到parent.pystart()函數(shù),如下。 我們發(fā)現(xiàn)它啟動(dòng)XMLRPC服務(wù)器后,接
    的頭像 發(fā)表于 09-14 18:03 ?1447次閱讀

    服務(wù)器數(shù)據(jù)恢復(fù)—非正常關(guān)機(jī)導(dǎo)致服務(wù)器文件丟失的數(shù)據(jù)恢復(fù)案例

    ;分析: 服務(wù)器在運(yùn)行過(guò)程中自動(dòng)關(guān)機(jī)且無(wú)法啟動(dòng),服務(wù)器管理員對(duì)服務(wù)器進(jìn)行修復(fù)后成功啟動(dòng)服務(wù)器
    的頭像 發(fā)表于 01-19 13:42 ?328次閱讀