ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

2023-05-16

        在ROS1中由主节点(master)负责其它从节点的通信,在同一局域网内通过设置主节点地址也可以实现多机通讯,但是这种多机通讯网络存在一个严重的问题,那就是所有从节点强依赖于主节点,一旦运行主节点的设备离线,整个网络就完全瘫痪了,在ROS2中取消了主节点,通讯系统是基于DDS(Data Distribution Service)实现的,具有实时性、嵌入式、分布式、支持多操作系统等特性,下文我们将简单介绍ROS2多机通讯的配置方式。

        ROS2本身就是一个分布式通信框架,局域网内多台机器上的节点默认即可实现互相通信,而实际控制节点是否可以互相通信是通过域ID(ROS_DOMAIN_ID)来控制的,同一域内的ROS2节点之间可以自由发现和发送消息,而不同域内的ROS2节点之间则不能。所有ROS2节点默认使用域 ID 0,所以默认即可互相通信,关于域ID的设置,我们需要了解以下概念:

1)ROS2底层通讯机制基于DDS实现,而DDS是基于UDP/IP或者TCP/IP网络通信协议实现的;

2)无论是TCP还是UDP网络协议,在通讯时都需要指定一个网络端口;

3)网络端口是一个16位的无符号整数,也就是说网络端口最大就是65535;

4)ROS2节点发现机制是基于局域网组播实现的,一收一发需要两个端口,ROS2节点间通信是基于局域网单播实现的,一收一发又需要两个端口,组播端口域内节点共享,单播端口节点私有;

5)DDS协议约定以7400为起始端口,每个域默认占用250个端口,所以局域网内域的数量最多为(65535-7400)/250=232个,所以域ID取值范围为0-231;

6)DDS协议约定每个域端口段内,第1、2个端口是域内组播端口,第11、12个端口是域内第一个节点的单播端口,第12、13个端口是域内第二个节点的单播端口,以此类推,第239、240个端口是域内第120个节点的单播端口;

由以上叙述可以推断出以下结论:

1)ROS_DOMAIN_ID为0的域有以下设定:

  • 组播端口为7400,7401
  • 第1个节点单播端口是7410,7411
  • 第2个节点单播端口是7412,7413
  • ......
  • 第120个节点的单播端口是7648,7649

2)ROS_DOMAIN_ID为1的域有以下设定:

  • 组播端口为7650,7651
  • 第1个节点单播端口是7660,7661
  • 第2个节点单播端口是7662,7663
  • ......
  • 第120个节点的单播端口是7898,7899

        由以上结论,我们可以发现,如果ID为0的域内有第121个节点,该节点单播端口将会与域1的组播端口冲突,所以我们在使用的过程中,要注意节点数量超过120的情况,如果节点数量超了,向上相邻的域就不可用了。

        除了相邻域的冲突问题,还有与系统设定冲突问题也需要注意,不同的操作系统默认会预留一些端口段做为临时端口使用(详细内容请参考官方文档),为了防止端口冲突,这些预留端口在ROS2中也需要避开,避开的结果就是在linux系统中可用域ID为0-101和215-232,在windows和macOS中可用域ID是0-166,为了多平台兼容通讯,我们一般域ID使用0-101,而101域后半段的端口被系统预留,所以101域节点数上限为54个。

        在多机通讯需求中,如果只有一个组,我们可以默认使用域ID为0即可,如果要修改默认域ID,在linux终端执行以下命令(设定ROS_DOMAIN_ID为5):

$ export ROS_DOMAIN_ID=5

执行后,该终端内启动的节点被分配到ID为5的域内,如果该机器内所有节点都需要分配到同一个域内,则可以通过以下命令统一设定域ID:

$ echo "export ROS_DOMAIN_ID=5" >> ~/.bashrc

重启终端,所有终端内启动的节点都默认分配到ID为5的域内。

windows和macOS系统设定请参考官网说明。

我们还利用官方demo来测试一下,开启3个终端,其中两个终端分别设定ROS_DOMAIN_ID为5和6,都启动listener节点,另1个终端设定ROS_DOMAIN_ID为5,启动talker节点:

图中可见,域ID相同的节点间可以互相通讯,ID不同的节点之间消息是不通的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS2学习笔记(二)-- 多机通讯原理简介及配置方法 的相关文章

  • 利用 imu_utils 标定 imu

    目录 前言 一 安装 imu utils 二 编译出现的错误 三 操作步骤 四 结果 前言 记录利用 imu utils 标定 imu xff0c 最近在使用imu做导航 xff0c 要对imu进行标定 xff0c 使用标定得到的加速度的噪
  • 卡尔曼滤波(利用C++编写,ROS下实现)

    提示 xff1a 利用C 43 43 来编写卡尔曼滤波 xff0c 更能比较简单 xff0c 主要是提供一个思路 xff0c 大家可以在这个上面进行修改 附上一个小例题 xff0c 这个卡尔曼滤波适合这个小例题 目录 前言 二 编程部分 1
  • window10安装双系统ubuntu18.04

    win10安装ubuntu18 04 xff0c 有几点需要注意 xff0c 先罗列一下 BIOS模式 硬盘数 我觉得这两个是最烦的所以先重点标记一下 xff01 xff01 xff01 xff08 此教程只适合BIOS为UEFI xff0
  • PX4 OffBoard Control

    终于还是走上了这一步 xff0c 对飞控下手 xff0c 可以说是一张白纸了 记录一下学习的过程方便以后的查阅 目录 一 ubuntu18 04配置px4编译环境及mavros环境 二 PX4的OffBoard控制 1 搭建功能包 2 编写
  • 2021年电子竞赛四天三夜征程—-信号失真度测量装置(A题)

    2021大学生电子设计大赛 1 前言2 正文3 精彩片段分享4 信号失真度测量装置 xff08 A题 xff09 试题 1 前言 个人博客主页 ID Eterlove 一笔一画 xff0c 记录我的学习生活 xff01 站在巨人的肩上Sta
  • 【ROS】在回调函数中发布消息

    在ROS中 xff0c 想在回调函数中发布消息 xff0c 有两个思路 xff1a xff08 1 xff09 把函数写成类的形式 xff0c 把需要的一些变量在类中声明为全局变量 推荐 xff0c 模块化好 xff08 2 xff09 在
  • C语言-结构体对齐

    详细说明参考博客 1条消息 C语言结构体对齐 xff0c 超详细 xff0c 超易懂 haozigegie的博客 CSDN博客 1条消息 pragma pack详解 OuJiang2021的博客 CSDN博客 pragma pack 以下个
  • PowerShell 远程执行任务的方法和步骤

    PowerShell 远程执行任务的方法步骤 1 查看WinRM服务 Get Service WinRM 如果为关闭状态 xff0c 以管理员权限启动PowerShell窗口 xff0c 执行命令 Enable PSRemoting For
  • 电影网站推荐

    http www amobbs com thread 5599359 1 1 html 作者 solisgood 几年前当我还是一个小白的时候 xff0c 在网上常常会看到一些教人找电影的攻略 xff0c 他们推荐的无非是电影天堂 电影FM
  • Qt调用opencv实现yolov3对视频进行目标检测

    欢迎加QQ学习交流群309798848 依赖 xff1a 支持CUDA的opencv4 3 0 xff0c demo cfg xff0c demo final weights xff0c demo names demo cfg xff0c
  • Vim/VSCode/安装GO语言依赖工具

    由于vscode对go语言的支持还是hin不错滴 xff0c 所以我日常学习go都用vscode xff0c 但这货有个毛病 xff0c 各种lint 补全 nav 调试都依赖go语言的其他扩展工具 xff0c 如果安装补全 xff0c 会
  • 解决chrome添加扩展时的报错:“此项内容已下载并添加到Chrome中”

    chrome是google家的服务 xff0c 下个扩展也是要折腾一番 xff0c 网络质量更是不能保证 xff0c 所以下点东西时不时会出错 这次在下一个扩展的时候发现装了好久还是显示 正在检查 xff0c 遂手动刷新了一下页面 xff0
  • Manjaro终端无法输入中文,亲测有效

    span class token function export span GTK IM MODULE span class token operator 61 span fcitx span class token function ex
  • sh: 1: vue-cli-service: Permission denied

    看报错日志 xff0c 权限被拒绝 进入node modules bin 34 ll 34 查看一下会发现该文件 vue cli service 34 并没有可执行权限 chmod R 755
  • Linux系统Fcitx中文输入法开机启动方法

    Linux系统Fcitx中文输入法开机启动方法 在GNOME下的启动在KDE下的启动 Debian FC Ubuntu的默认中文输入法都是SCIM xff0c 其实也挺好用的 xff0c 有点类似windows下微软拼音输入法 xff0c
  • linux sftp文件上传与下载

    何为sftp sftp是Secure File Transfer Protocol的缩写 xff0c 安全文件传送协议 可以为传输文件提供一种安全的加密方法 回到顶部 连接 linux下直接在终端中输入 xff1a sftp usernam
  • win10专业版 原版安装教程

    WINDOWS10 的安装很是辛酸 xff0c 折腾了很久 xff0c 写下教程 xff0c 以防以后再入坑 Notes 不建议安装Ghost版 xff0c 会有许多问题 xff0c 电脑升级内存条后 xff0c 发现电脑有时候莫名奇妙蓝屏
  • Qt面试以及常用类继承关系图

    关于Qt的事件 事件的产生 xff1a 产生来源有timer事件外设的事件 xff08 mouseMoveEvent xff09 timer事件 xff0c 滚轮事件 xff0c 界面重绘制事件等等事件的接受与处理 xff1a QObjec
  • 无人驾驶虚拟仿真(四)--通过ROS系统控制小车行走

    简介 xff1a 实现键盘控制虚拟仿真小车移动 xff0c w s a d 空格 xff0c 对应向前 向后 向左 向右 急停切换功能 xff0c q键退出 1 创建key control节点 进入工作空间源码目录 xff1a cd myr
  • 云台控制协议

    PELCO D与PELCO P协议 PELCO D 数据格式 xff1a 1位起始位 8位数据 1位停止位 xff0c 无校验位 波特率 xff1a 2400B S 命令格式 xff1a 字节1 字节2 字节3 字节4 字节5 字节6 字节

随机推荐

  • 继承中子类与父类构造\析构的调用和顺序

    1 子类被构造的时候会先调用父类的构造函数 2 子类析构的时候先析构子类后析构父类 3 如果直接用子类构造一个父类的对象 删除这个父类的对象不会调用子类的析构函数 xff0c 这就是引入虚析构函数的原因 xff01
  • 28335GPIO及外部中断配置介绍

    弄了两周终于把28335的启动流程 寄存器及中断向量表的映射方法 内存的划分等有了一个全面的了解 xff0c 今天看到久违的LED灯的闪烁 xff0c 顿扫阴霾 特在此总结下28335GPIO及外部中断配置介绍 其实对于一个微控制器 xff
  • DSP28335与AD7606通过SPI的串行数据交互

    弄了三天的DSP28335与AD7606的通信终于实现了 最终的方案是通过DSP28335控制AD7606的采样 xff0c 采集的数据通过SPI串口发送给28335 xff0c 然后28335通过串口发送给上位机显示 其实程序第一天就写好
  • 利用28335的epwm产生spwm波的总结

    一 SPWM设计简介 设计的内容是产生倍频的SPWM波 xff0c 也即是用的是同一个调制波 xff0c 两个桥臂上的载波相差180度 产生spwm时 xff0c 利用TB产生载波 xff0c 也即是三角波 xff08 计数方式采用增减模式
  • 段错误总结

    最近试着写了华为编程大赛的程序 xff0c 出现较多的一个问题是段错误 xff0c 由此看来对指针与边界的处理还不熟练 网上有些总结的很不错 xff0c 因此结合网上资料整理下 xff08 下面的还有些地方没有深究 xff0c 有时间继续深
  • 启发式算法总结

    下面是一些学习到的算法 xff0c 有些没有具体用到 xff0c 所以只是概念的解释 xff0c 方便自己以后回忆 一 粒子群算法 1 1基本思想 粒子群算法是模拟群体智能所建立起来的一种优化算法 xff0c 粒子群算法可以用鸟类在一个空间
  • 线程、进程通信再总结

    下面这个部分摘抄自网上 xff0c 谢谢贡献的作者 一 进程间的通信方式 管道 pipe xff1a 管道是一种半双工的通信方式 xff0c 数据只能单向流动 xff0c 而且只能在具有亲缘关系的进程间使用 进程的亲缘关系通常是指父子进程关
  • 结构体类型的动态数组操作

    链接 xff1a https www nowcoder com questionTerminal 6fc9a928c7654b0fbc37d16b8bd29ff9 来源 xff1a 牛客网 假如我们有3种月饼 xff0c 其库存量分别为18
  • 基于Linkit 7697的红绿灯控制系统

    1 硬件准备 LinkIt 7697 1 xff0c 继电器模块 1 xff0c 面包板 1 xff0c RGB LED灯 1 xff08 共阳极 xff0c 工作电流20mA xff0c 红灯压降2 2 2V xff0c 绿灯蓝灯压降3
  • 利用背包问题解决的双核处理问题

    一种双核CPU的两个核能够同时的处理任务 xff0c 现在有n个已知数据量的任务需要交给CPU处理 xff0c 假设已知CPU的每个核1秒可以处理1kb xff0c 每个核同时只能处理一项任务 n个任务可以按照任意顺序放入CPU进行处理 x
  • 简单整蛊室友,只需几行bat病毒代码

    为了让整蛊更方便 xff0c 不能搞什么花里胡哨 xff0c 所有直接使用bat代码来编写 首先新建1个txt文件 xff0c 更改为任意名称 xff0c 但后缀名必须更改为bat或com 然后右键编辑 再输入以下代码 xff1a star
  • 四轴飞行器,PID调节过程心得记录

    初次接触四轴 xff0c 编写四轴的姿态PID控制部分 xff0c xff0c 横滚俯仰是把遥控器的杆量转换为目标角度 xff0c 然后目标角度PID运算转换为目标角速度 xff0c 然后目标角速度PID运算转换为电机输出量 xff0c x
  • 天地飞接收机输出信号解析

    今天测试了下天地飞8通道的接收机的pwm输出 接收机的输出信号 xff0c 可以按照50HZ的pwm信号来解析 xff0c 在stm32中 xff0c 使用外部高地电平触发中断的方式 xff0c 来记录一个脉宽的时间 用示波器实际查看信号的
  • Linux-TCP之深入浅出send和recv

    概念 先明确一个概念 xff1a 每个TCP socket在内核中都有一个发送缓冲区和一个接收缓冲区 xff0c TCP的全双工的工作模式以及TCP的滑动窗口便是依赖于这两个独立的buffer以及此buffer的填充状态 接收缓冲区把数据缓
  • popen使用方法及场景

    1 popen的应用场景 popen应用于执行shell命令 xff0c 并读取此命令的返值 xff0c 或者与执行的命令进行交互 2 popen的实现 popen 函数通过创建一个管道 xff0c 调用fork 产生一个子进程 xff0c
  • sscanf函数使用详解

    一 描述 sscanf通常被用来解析并转换字符串 xff0c 其格式定义灵活多变 xff0c 可以实现很强大的字符串解析功能 sscanf的原型 include lt stdio h gt int sscanf const char str
  • Linux通过系统函数设置系统时间

    一 描述 通过settimeofday 函数来设置系统时间 xff0c 这个函数设置的精度可以精确到微秒 include lt time h gt int settimeofday const struct timeval tv const
  • 用Eclipse完成C语言编程的几个简单步骤

    Eclipse是一款被广泛应用的开发工具 xff0c 最初它是为编写Java程序而设计的 xff0c 但由于它良好的架构并作为开源软件来发行 xff0c 有很多的公司和个人以它为基础开发了插件 xff0c 使得Eclipse有了越来越丰富的
  • 最适合程序员转行的10大职业

    三十而立 xff0c 源自 论语 为政 xff0c 说的是人到了30岁就应该去面对生活中的一切困难 而对于软件开发领域的从业者来说 xff0c 30岁 xff0c 却是一道槛 30岁以后 xff0c 适合程序员的工作到底是什么 专家和大家一
  • ROS2学习笔记(二)-- 多机通讯原理简介及配置方法

    在ROS1中由主节点 master 负责其它从节点的通信 xff0c 在同一局域网内通过设置主节点地址也可以实现多机通讯 xff0c 但是这种多机通讯网络存在一个严重的问题 xff0c 那就是所有从节点强依赖于主节点 xff0c 一旦运行主