ROS2 Humble 笔记(十)多机分布式通讯 DDS 与宿主机和Docker容器

ROS2 Humble 笔记(十)多机分布式通讯 DDS 与宿主机和Docker容器

这篇博客是 B 站《古月·ROS2入门21讲》的第十三个视频的图文记录,主要介绍了 ROS2 的分布式通讯如何使用,此外还补充了一点是在同一个设备下 Docker 容器和宿主机之间的通讯如何配置。原始视频链接如下:

这一节的内容是 ROS2 和 ROS1 之间差异最大的体现,虽然前面的博客在具体实现甚至命令上已经和 ROS1 存在不同了,但其核心设计理念依旧一致。然而,这一节的分布式概念在 ROS1 中是完全不存在的。

【Note】:作者视频中使用了一个单独的树莓派硬件作为第二主机,但我手边没有该设备,只能用另一台笔记本进行演示

由于在机器人开发过程中 Docker 是很常用的工具,在一台设备中同时运行多个 Docker 容器是常规操作,每个容器中运行若干节点也是很常见的情况,因此尽管作者没有在视频中涉及到 Docker 相关的设置,我这里也进行了一段补充。


1. 多台硬件通讯

另一台笔记本硬件我使用的是 Intel x86 芯片的 ThinkPad X1,安装了 Ubuntu 22.04 系统与 ROS2 Humble

首先需要将两台设备放在同一个局域网内,即确保 IP 地址在一个网段下,并保证两台设备能相互 Ping 通,如果 Ping 不通可能是防火墙的问题,晚上有很多解决方案故此处不进行展开。

使用下面的命令查看设备的 IP 地址:

$ ifconfig|grep inet 
在这里插入图片描述

然后不用做任何配置,因为 ROS2 本身是自发现机制。

  • 在设备1上启动一个 talker:
$ ros2 run demo_nodes_cpp talker 
在这里插入图片描述
  • 在设备2上启动一个 listener:
$ ros2 run demo_nodes_cpp listener 

2. 分组通讯

如果在一个网段中所有设备都互通互联,那么依旧会对网络造成巨大的负担,况且有时候我们只是将设备放在了一个空间中,并不想让所有设备都相互通讯。因此 ROS2 引入了 分组 概念用来将不同设备以组的形式进行隔离。

在你想要划分同一个组设备的 ~/.bashrc 末尾添加相同的 ID 号:

$ exportROS_DOMAIN_ID=1
在这里插入图片描述

[可选] 3. Docker 宿主机与容器

3.1 拉取 ROS Humble 镜像

我将实验设备 Jetson Orin 作为宿主机,并在上面拉取了一个 ROS2 Humble 的镜像,该镜像是 Nvidia 在其 NGC 平台上发布的官方镜像,该平台上有很多现成的 Docker 可以拉,并且经过了严格的测试,能极大减轻你的配置压力。当然你也可以自己拉一个空白镜像然后手动安装 ROS。

在这里插入图片描述

这里拉取的是 nvcr.io/nvidia/isaac/ros:aarch64-ros2_humble_adc428c7077de4984a00b63c55903b0a 镜像,该镜像总大小 11.71 GB,等待拉取完成即可:

$ docker pull nvcr.io/nvidia/isaac/ros:aarch64-ros2_humble_adc428c7077de4984a00b63c55903b0a 
在这里插入图片描述

然后你就可以查看现有的容器:

$ docker images 
在这里插入图片描述

3.2 运行镜像

【Note】:由于 ROS2 本身的架构设计,当节点在不同设备上走的是 DDS 通讯,当节点都在同一个设备上则走的是共享内存;然而 Docker默认是不开启共享内存的,这样会造成以下两个现象:

  1. 宿主机和容器都可以看到对方节点与话题;
  2. 当 echo 话题时输出均为空;

这里提供两种最常见的解决方案:

[推荐] 开启共享内存

Docker 共享内存的开启需要用参数 -v /dev/shm:/dev/shm\ 进行指定,本质上就是让宿舍机和容器共用 /dev/shm 的目录,该目录是 ROS 共享内存数据存放的地方。

之所以推荐使用该方法是因为:这种操作是从本质上解决数据访问的问题,同时几乎不损耗通讯性能,ROS2 最大的特点就是在使用 DDS 的同时保证了通讯性能。

那么我最常用的 Docker 启动命令如下,参数非常多但都是必要的,这种配置几乎可以无缝访问宿主机的硬件、网络和图形界面

$ docker run -dit \ --net=host \ --ipc=host \ --pid=host \ --privileged \ -v /dev:/dev \ -v /dev/bus/usb:/dev/bus/usb \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY=$DISPLAY\ -v /etc/localtime:/etc/localtime:ro \ -v $(pwd):/workspace \ -v /dev/shm:/dev/shm\ --name demo \ nvcr.io/nvidia/isaac/ros:aarch64-ros2_humble_adc428c7077de4984a00b63c55903b0a \ /bin/bash 
  • --net=host:容器内使用宿主机的网络,而不是 Docker 自己的虚拟网络。这对于 ROS 2 的节点发现至关重要;
  • --ipc=host:共享宿主机的进程间通信资源(如共享内存);
  • --privileged:容器内可以访问宿主机的所有设备;
  • -v /dev:/dev:共享宿主机的设备文件,允许容器直接与摄像头、GPU、USB 设备等硬件通信;
  • -v /tmp/.X11-unix-e DISPLAY:共享宿主机的 X11 图形界面,允许你在容器内运行带 GUI 的程序(如 Rviz)并显示;
  • -v $(pwd):/workspace:挂载了当前目录,方便你在容器内访问和修改宿主机上的代码;
  • -v /dev/shm:/dev/shm:挂载共享内存目录,确保进程间通信顺畅;

[临时] 修改通讯方式

除了上面在运行容器的时候就指明共享内存的卷,还可以在正在运行的容器中以修改通讯方式的方式形式让宿舍机和容器正常传输数据,但这样做会有一定传输损耗,如果你的设备不多的话这些损耗可以忽略不计。

修改宿主机和容器的 ~/.bashrc 文件,在文件末尾添加以下环境变量,该环境变量的含义是在使用 FastDDS (ROS2默认通讯协议)时只以 UDPv4 形式运行,那么如果你的所有节点都在同一个硬件上,相当于所有数据又走了一圈网卡,而共享内存则直接访问文件。

exportFASTDDS_BUILTIN_TRANSPORTS=UDPv4 

【Note】:宿主机和容器内都要修改,否则依旧无法获取话题中的数据;

在这里插入图片描述

启动 Talker 和 Listener

在容器中启动一个 talker:

$ docker exec -it demo /bin/bash root@ubuntu:/# ros2 run demo_nodes_cpp talker
在这里插入图片描述

在宿主机上启动一个 listener:

$ ros2 run demo_nodes_cpp listener 
在这里插入图片描述

Read more

安装 启动 使用 Neo4j的超详细教程

安装 启动 使用 Neo4j的超详细教程

最近在做一个基于知识图谱的智能生成项目。需要用到Neo4j图数据库。写这篇文章记录一下Neo4j的安装及其使用。 一.Neo4j的安装 1.首先安装JDK,配环境变量。(参照网上教程,很多) Neo4j是基于Java的图形数据库,运行Neo4j需要启动JVM进程,因此必须安装JAVA SE的JDK。从Oracle官方网站下载 Java SE JDK。我使用的版本是JDK1.8 2.官网上安装neo4j。 官方网址:https://neo4j.com/deployment-center/  在官网上下载对应版本。Neo4j应用程序有如下主要的目录结构: bin目录:用于存储Neo4j的可执行程序; conf目录:用于控制Neo4j启动的配置文件; data目录:用于存储核心数据库文件; plugins目录:用于存储Neo4j的插件; 3.配置环境变量 创建主目录环境变量NEO4J_HOME,并把主目录设置为变量值。复制具体的neo4j文件地址作为变量值。 配置文档存储在conf目录下,Neo4j通过配置文件neo4j.conf控制服务器的工作。默认情况下,不需

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程

企业微信群机器人Webhook配置全攻略:从创建到发送消息的完整流程 在数字化办公日益普及的今天,企业微信作为国内领先的企业级通讯工具,其群机器人功能为团队协作带来了极大的便利。本文将手把手教你如何从零开始配置企业微信群机器人Webhook,实现自动化消息推送,提升团队沟通效率。 1. 准备工作与环境配置 在开始创建机器人之前,需要确保满足以下基本条件: * 企业微信账号:拥有有效的企业微信管理员或成员账号 * 群聊条件:至少包含3名成员的群聊(这是创建机器人的最低人数要求) * 网络环境:能够正常访问企业微信服务器 提示:如果是企业管理员,建议先在"企业微信管理后台"确认机器人功能是否已对企业开放。某些企业可能出于安全考虑会限制此功能。 2. 创建群机器人 2.1 添加机器人到群聊 1. 打开企业微信客户端,进入目标群聊 2. 点击右上角的群菜单按钮(通常显示为"..."或"⋮") 3. 选择"添加群机器人"选项 4.

Flowise物联网融合:与智能家居设备联动的应用设想

Flowise物联网融合:与智能家居设备联动的应用设想 1. Flowise:让AI工作流变得像搭积木一样简单 Flowise 是一个真正把“AI平民化”落地的工具。它不像传统开发那样需要写几十行 LangChain 代码、配置向量库、调试提示词模板,而是把所有这些能力打包成一个个可拖拽的节点——就像小时候玩乐高,你不需要懂塑料怎么合成,只要知道哪块该拼在哪,就能搭出一座城堡。 它诞生于2023年,短短一年就收获了45.6k GitHub Stars,MIT协议开源,意味着你可以放心把它用在公司内部系统里,甚至嵌入到客户交付的产品中,完全不用担心授权问题。最打动人的不是它的技术多炫酷,而是它真的“不挑人”:产品经理能搭出知识库问答机器人,运营同学能配出自动抓取竞品文案的Agent,连刚学Python两周的实习生,也能在5分钟内跑通一个本地大模型的RAG流程。 它的核心逻辑很朴素:把LangChain里那些抽象概念——比如LLM调用、文档切分、向量检索、工具调用——变成画布上看得见、摸得着的方块。你拖一个“Ollama LLM”节点,再拖一个“Chroma Vector

OpenClaw配置Bot接入飞书机器人+Kimi2.5

OpenClaw配置Bot接入飞书机器人+Kimi2.5

上一篇文章写了Ubuntu_24.04下安装OpenClaw的过程,这篇文档记录一下接入飞书机器+Kimi2.5。 准备工作 飞书 创建飞书机器人 访问飞书开放平台:https://open.feishu.cn/app,点击创建应用: 填写应用名称和描述后就直接创建: 复制App ID 和 App Secret 创建成功后,在“凭证与基础信息”中找到 App ID 和 App Secret,把这2个信息复制记录下来,后面需要配置到openclaw中 配置权限 点击【权限管理】→【开通权限】 或使用【批量导入/导出权限】,选择导入,输入以下内容,如下图 点击【下一步,确认新增权限】即可开通所需要的权限。 配置事件与回调 说明:这一步的配置需要先讲AppId和AppSecret配置到openclaw成功之后再设置订阅方式,