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

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

3天内不再提示

ROS节点是什么 如何诞生的

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

** 一个节点的诞生**

在建立连接之前,首先要有节点。

节点就是一个独立的程序,它运行起来后就是一个普通的进程,与计算机中其它的进程并没有太大区别。

一个问题是:ROS中为什么把一个独立的程序称为“节点”

这是因为ROS沿用了计算机网络中“节点”的概念。

在一个网络中,例如互联网,每一个上网的计算机就是一个节点。前面我们看到的客户端、服务器这样的称呼,也是从计算机网络中借用的。

下面来看一下节点是如何诞生的。我们在第一次使用ROS时,一般都会照着官方教程编写一个talker和一个listener节点,以熟悉ROS的使用方法。

我们以talker为例,它的部分代码如下。

#include "ros/ros.h"
int main(int argc, char **argv)
{
  /* You must call one of the versions of ros::init() before using any other part of the ROS system. */
  ros::init(argc, argv, "talker");
  ros::NodeHandle n;

main函数里首先调用了init()函数初始化一个节点,该函数的定义在init.cpp文件中。

当我们的程序运行到init()函数时,一个节点就呱呱坠地了。

而且在出生的同时我们还顺道给他起好了名字,也就是"talker"。

名字是随便起的,但是起名是必须的。

我们进入init()函数里看看它做了什么,代码如下,看上去还是挺复杂的。它初始化了一个叫g_global_queue的数据,它的类型是CallbackQueuePtr。

这是个相当重要的类,叫“回调队列”,后面还会见到它。init()函数还调用了network、master、this_node、file_log、param这几个命名空间里的init初始化函数各自实现一些变量的初始化,这些变量都以g开头,例如g_host、g_uri,用来表明它们是全局变量。

其中,network::init完成节点主机名、IP地址等的初始化,master::init获取master的URI、主机号和端口号。

this_node::init定义节点的命名空间和节点的名字,没错,把我们给节点起的名字就存储在这里。file_log::init初始化日志文件的路径。

void init(const M_string& remappings, const std::string& name, uint32_t options)
{
  if (!g_atexit_registered) {
    g_atexit_registered = true;
    atexit(atexitCallback);
  }
  if (!g_global_queue) {
    g_global_queue.reset(new CallbackQueue);
  }
  if (!g_initialized) {
    g_init_options = options;
    g_ok = true;
    ROSCONSOLE_AUTOINIT;
    // Disable SIGPIPE
#ifndef WIN32
    signal(SIGPIPE, SIG_IGN);
#else
    WSADATA wsaData;
    WSAStartup(MAKEWORD(2, 0), &wsaData);
#endif
    check_ipv6_environment();
    network::init(remappings);
    master::init(remappings);
    // names:: namespace is initialized by this_node
    this_node::init(name, remappings, options);
    file_log::init(remappings);
    param::init(remappings);
    g_initialized = true;
  }
}

完成初始化以后,就进入下一步ros::NodeHandle n定义句柄。

我们再进入node_handle.cpp文件,发现构造函数NodeHandle::NodeHandle调用了自己的construct函数。然后,顺藤摸瓜找到construct函数,它里面又调用了ros::start()函数。

没错,我们又绕回到了init.cpp文件。

ros::start()函数主要实例化了几个重要的类,如下。

完成实例化后马上又调用了各自的start()函数,启动相应的动作。

这些都做完了以后就可以发布或订阅消息了。

一个节点的故事暂时就到这了。

TopicManager::instance()- >start();
ServiceManager::instance()- >start();
ConnectionManager::instance()- >start();
PollManager::instance()- >start();
XMLRPCManager::instance()- >start();
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 计算机
    +关注

    关注

    19

    文章

    7494

    浏览量

    87955
  • 节点
    +关注

    关注

    0

    文章

    218

    浏览量

    24429
  • 网络
    +关注

    关注

    14

    文章

    7565

    浏览量

    88788
  • ROS
    ROS
    +关注

    关注

    1

    文章

    278

    浏览量

    17010
收藏 人收藏

    评论

    相关推荐

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    SD启动卡插至评估板Micro SD卡槽。亦可通过SD升级卡或USB固化方式将系统固化至eMMC。 基于Python语言的通信演示 案例功能:基于Python语言,启动ROS节点发布与订阅消息,实现
    发表于 07-09 11:38

    在STM32上运行ROS节点——rosserial&stm32开发及调试方法 精选资料推荐

    rosserial+stm32开发及调试方法基本原理Ref: http://wiki.ros.org/rosserial简言之,rosserial提供一种嵌入式节点和运行在主控PC上
    发表于 08-24 06:19

    Autolabor ROS驱动模块的节点有何功能

    Autolabor ROS驱动模块包含哪些?Autolabor ROS驱动模块的节点有何功能?
    发表于 09-23 08:08

    搭建ARM+ROS的硬件载体之ROS的移植及测试方法

    roscore来启动运行ros节点必要的ROS Master和ROS parameter,运行情况如下所示。原作者:武汉万象奥科
    发表于 03-09 13:55

    ROS让机器人开发更便捷,基于RK3568J+Debian系统发布!

    。 基于Python语言的通信演示案例功能:基于Python语言,启动ROS节点发布与订阅消息,实现订阅消息节点与发布消息节点之间的实时通信。请将评估板上电启动,执行如下命令,配置评估
    发表于 11-30 16:01

    区块链超级节点诞生与现状分析

    超级节点,即在采用DPOS共识机制的公链中,经过持币用户投票选举产生、享受,并负责打包与生产区块的少数记账节点。这个概念在18年年初迅速在区块链行业走红,乃至于成为许多新兴公链的标配,但实际上它所代表的DPOS共识机制已经诞生
    发表于 02-14 13:33 1192次阅读

    一个机器人操作系统(ROS)节点系统

    电子发烧友网站提供《一个机器人操作系统(ROS)节点系统.zip》资料免费下载
    发表于 07-06 10:49 1次下载
    一个机器人操作系统(<b class='flag-5'>ROS</b>)<b class='flag-5'>节点</b>系统

    ROS中的序列化实现

    不是很多。 为什么ROS不使用现成的序列化工具或者库呢?可能ROS诞生的时候(2007年),有些序列化库可能还不存在(protobuf诞生于2008年),更有可能是
    的头像 发表于 09-14 17:26 912次阅读

    ROS是如何设计的 ROS客户端库

    实现通信的代码在ros_comm包中,如下。 其中clients文件夹一共有127个文件,看来是最大的包了。 现在我们来到了ROS最核心的地带。 客户端这个名词出现的有些突然,一个机器人操作系统里
    的头像 发表于 09-14 17:29 869次阅读
    <b class='flag-5'>ROS</b>是如何设计的 <b class='flag-5'>ROS</b>客户端库

    ROS中XMLRPC是什么

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

    ROS核心框架介绍

    ROS核心框架 对于第一个问题,我也没仔细研究过源码,核心代码基本由python和C++组成,运用了xmlrpc机制,每个运行的节点可以理解成一个进程。进程间通讯有些是共享内存的方式(比如
    的头像 发表于 11-21 18:07 994次阅读
    <b class='flag-5'>ROS</b>核心框架介绍

    ros的基本概念是什么

    基本概念: ROS是一个用于在不同进程间匿名的发布、订阅、传递信息的中间件。 ROS2系统的核心部分是ROS网络(ROS Graph)。 ROS
    的头像 发表于 11-27 11:21 1808次阅读

    利用 NVIDIA Isaac Transport for ROS 提升自定义 ROS 图形性能

    NVIDIA Isaac Transport for ROS(NITROS) 是随 ROS 2 Humble 加入的两项硬件加速功能——类型适配和类型协商。 类型适配 使 ROS 节点
    的头像 发表于 11-30 19:35 635次阅读
    利用 NVIDIA Isaac Transport for <b class='flag-5'>ROS</b> 提升自定义 <b class='flag-5'>ROS</b> 图形性能

    ROS通信接口机制介绍

    每一种通信种定义的接口,各种节点才能有机的联系到一起。 语言无关 为了保证每一个节点可以使用不同语言编程,ROS将这些接口的设计做成了和语言无关的。 比如这里看到的int32表示32位的整型数,int64表示64位的整型数,bo
    的头像 发表于 12-01 15:03 846次阅读
    <b class='flag-5'>ROS</b>通信接口机制介绍

    移动机器人与ROS操作系统原理与应用

    ROS1不同的是,ROS2诞生的目的就是为了让更多机器人使用,所以在设计上更加符合技术的发展方向,也运用了很多最近的技术框架。
    发表于 01-02 12:28 587次阅读
    移动机器人与<b class='flag-5'>ROS</b>操作系统原理与应用