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

    文章

    6075

    浏览量

    82697
  • 节点
    +关注

    关注

    0

    文章

    180

    浏览量

    23950
  • 网络
    +关注

    关注

    14

    文章

    6979

    浏览量

    86827
  • ROS
    ROS
    +关注

    关注

    0

    文章

    167

    浏览量

    16290
收藏 人收藏

    评论

    相关推荐

    ROS RIKIBOT基础--使用系列 第一章节】ROS机器人硬件系统 精选资料分享

    ROS控制器采用树莓派4B或者Jetson Nano,运行运行Ubuntu Mate18.04或Ubuntu18.04系统,具体型号有差异。系统安装有ROS机器人操作系统, ROS版本为Melodic版本,作为机器人端ROS节点控制器。树莓派4B对比3B+升级明显,主要功能包括高性
    发表于 07-30 06:59

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

    ros.org/rosserial简言之,rosserial提供一种嵌入式节点和运行在主控PC上
    发表于 08-24 06:19

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

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

    什么是ROS?如何学习ROS

    ROS?如何学习ROS
    发表于 11-11 07:21

    ROS简介

    ROS简介1、什么是ROS2、ROS产生、发展和壮大的原因和意义二、在Ubuntu系统中,安装对应版本的ROS软件1、确定Ubuntu配置2、添加ROS软件源3、添加密钥4、安装
    发表于 12-17 08:24

    什么是ROSROS产生、发展和壮大的原因和意义

    ROS)入门(嵌入式系统应用开发)一、ROS 基本问题1. 什么是 ROS2. ROS 产生、发展和壮大的原因和意义二、安装 ROS 及体验小海龟例子1. 安装 ROS一、
    发表于 12-17 06:08

    RT-Thread实时操作系统与ROS2是怎样进行通信的

    ROS 预先定义好的数据结构发送图像数据,发布出去的图像信息就可以在 /camera 这个话题下找到,所有订阅了这个话题的节点都会收到消息。相当于我们把消息发给报社,所有订了
    发表于 04-01 11:38

    怎样通过ROS Arduino程序去点亮LED灯呢

    ROS节点句柄,广播将要发布的主题,订阅想监听的主题。最后,在loop函数里,我们调用ros::spinOnce()函数,处理
    发表于 07-07 10:43

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

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

    ROS与STM32通信

    ROS与STM32通信2020.8.1主要内容制作ROS包,将控制命令传给STM32,并将接收到的数据作为话题进行发布STM32接收数据并将姿态数据传回给ROS接收:期望角速度、期望线速度返回:实际
    发表于 12-24 19:00 11次下载
    <b>ROS</b>与STM32通信

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

    ROS)节点系统.zip》资料免费下载
    发表于 07-06 10:49 0次下载
    一个机器人操作系统(<b>ROS</b>)<b>节点</b>系统

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

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

    ROS中的序列化实现

    ROS不使用现成的序列化工具或者库呢?可能ROS诞生的时候(2007年),有些序列化库可能还不存在(protobuf诞生于2008年),更有可能是ROS的创造者认为当时没有合适的工具
    的头像 发表于 09-14 17:26 289次阅读

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

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

    ROS中XMLRPC是什么

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