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

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

3天内不再提示

节点是如何调用XMLRPC的

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

节点间通过XMLRPC建立连接

在一个节点刚启动的时候,它并不知道其它节点的存在,更不知道它们在交谈什么,当然也就谈不上通信

所以,它要先与master对话查询其它节点的状态,然后再与其它节点通信。

而节点与master对话使用的就是XMLRPC。

从这一点来看,master叫节点管理器确实名副其实,它是一个大管家,给刚出生的节点提供服务。

下面我们以两个节点:talker和listener为例,介绍其通过XMLRPC建立通信连接的过程,如下图所示。

图片

  1. talker注册

假设我们先启动talker。启动后,它通过1234端口使用XMLRPC向master注册自己的信息,包含所发布消息的话题名。master会将talker的注册信息加入注册列表中;

2.listener注册

listener启动后,同样通过XMLRPC向master注册自己的信息,包含需要订阅的话题名;

3.master进行匹配

master根据listener的订阅信息从注册列表中查找,如果没有找到匹配的发布者,则等待发布者的加入,如果找到匹配的发布者信息,则通过XMLRPC向listener发送talker的地址信息。

4.listener发送连接请求

listener接收到master发回的talker地址信息,尝试通过XMLRPC向talker发送连接请求,传输订阅的话题名、消息类型以及通信协议(TCP或者UDP);

5.talker确认连接请求

talker接收到listener发送的连接请求后,继续通过XMLRPC向listener确认连接信息,其中包含自身的TCP地址信息;

6.listener尝试与talker建立连接

listener接收到确认信息后,使用TCP尝试与talker建立网络连接。

7.talker向listener发布消息

成功建立连接后,talker开始向listener发送话题消息数据,master不再参与。

从上面的分析中可以发现,前五个步骤使用的通信协议都是XMLRPC,最后发布数据的过程才使用到TCP。

master只在节点建立连接的过程中起作用,但是并不参与节点之间最终的数据传输。

节点在请求建立连接时会通过master.cpp文件中的execute()函数调用XMLRPC库中的函数。

我们举个例子,加入talker节点要发布消息,它会调用topic_manager.cpp中的TopicManager::advertise()函数,在函数中会调用execute()函数,该部分代码如下。

XmlRpcValue args, result, payload;
  args[0] = this_node::getName();
  args[1] = ops.topic;
  args[2] = ops.datatype;
  args[3] = xmlrpc_manager_- >getServerURI();
  master::execute("registerPublisher", args, result, payload, true);

其中,registerPublisher就是一个远程过程调用的方法(或者叫函数)。节点通过这个远程过程调用向master注册,表示自己要发布发消息了。

你可能会问,registerPublisher方法在哪里被执行了呢?我们来到ros_comm-noetic-develtoolsrosmastersrcrosmaster路径下,打开master_api.py文件,然后搜索registerPublisher这个方法,就会找到对应的代码,如下。

匆匆扫一眼就知道,它在通知所有订阅这个消息的节点,让它们做好接收消息的准备。

你可能注意到了,这个被调用的XMLRPC是用python语言实现的。

也就是说,XMLRPC通信时只要报文的格式是一致的,不管C++还是python语言,都可以实现远程调用的功能。

def registerPublisher(self, caller_id, topic, topic_type, caller_api):
        try:
            self.ps_lock.acquire()
            self.reg_manager.register_publisher(topic, caller_id, caller_api)
            # don't let '*' type squash valid typing
            if topic_type != rosgraph.names.ANYTYPE or not topic in self.topics_types:
                self.topics_types[topic] = topic_type
            pub_uris = self.publishers.get_apis(topic)
            sub_uris = self.subscribers.get_apis(topic)
            self._notify_topic_subscribers(topic, pub_uris, sub_uris)
            mloginfo("+PUB [%s] %s %s",topic, caller_id, caller_api)
            sub_uris = self.subscribers.get_apis(topic)            
        finally:
            self.ps_lock.release()
        return 1, "Registered [%s] as publisher of [%s]"%(caller_id, topic), s
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 节点
    +关注

    关注

    0

    文章

    180

    浏览量

    23950
  • 管理器
    +关注

    关注

    0

    文章

    198

    浏览量

    18154
  • MASTER
    +关注

    关注

    0

    文章

    55

    浏览量

    11034
  • ROS
    ROS
    +关注

    关注

    0

    文章

    167

    浏览量

    16290
收藏 人收藏

    评论

    相关推荐

    属性节点调用节点的使用教程

    节点的使用表示有些不明白,但是其作用又是相当强大的,所以必须明白怎么使用属性节点以及如何调用的问题,下面就来为大家解迷。在获得对象的reference之后,就可以使用属性
    发表于 01-05 16:05

    调用库函数节点

    调用出来后的库函数节点,怎样配置其输入输出函数???
    发表于 05-13 16:35

    布尔控件触发调用节点

    调用节点的重新初始化为默认值?
    发表于 05-14 15:03

    通过vi调用节点调用vi的问题

    节点,打开前面板,运行vi等等。但是比如说我需要从用户登录界面,通过vi调用节点,打开某个试验界面,同时希望是淡入淡出的效果,也就是通过设置透明度来实现。可是开运行到节点的时候,会咔2、3
    发表于 08-23 21:41

    调用节点的求助

    调用节点调用方法的控件值的设置
    发表于 04-09 11:50

    属性节点调用节点的区别?

    节点调用节点的区别?
    发表于 11-21 12:00

    labview 调用节点找不到

    调用节点怎么找不到,好恼火
    发表于 02-22 20:29

    labview dll节点调用的问题

    调用节点的时候出现这种情况怎么解决?
    发表于 04-16 14:44

    labview的matlab节点能否调用互相调用的matlab程序

    节点能否调用互相调用的matlab程序
    发表于 07-09 19:54

    labview 调用DLL节点出错

    调用DLL节点出错提示 错误1517labview :(Hex 0x5ED)调用节点发生错误不知道哪位大神能帮忙解决一下回
    发表于 11-12 18:39

    属性节点调用节点的动态引用问题

    节点调用节点的引用问题,有静态引用,即如下图:也有先将各引用常量组织成数组,通过对数组的处理,动态的按程序
    发表于 09-07 14:39

    ROS中XMLRPC是什么

    XMLRPC是什么? 关于ROS节点建立连接的技术细节,官方文档说的非常简单,在这里ROS Technical Overview。没有基础的同学看这个介绍必然还是不懂。 在ROS中,节点节点之间
    的头像 发表于 09-14 17:40 343次阅读

    ROS是如何实现XMLRPC

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

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

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