ROS 跨机通信与 Docker 多机环境搭建
ROS 跨机通信与 Docker 多机环境搭建笔记一、跨机通信概述在无人驾驶、大型服务机器人等场景中ROS 常运行在多台计算设备上协作完成任务。ROS 支持分布式计算但整个分布式系统中只有一个 Master 节点。所有节点通过将ROS_MASTER_URI指向 Master 所在设备进行通信。需要通过设置ROS_HOSTNAME和ROS_MASTER_URI可添加到~/.bashrc中来配置网络。二、创建多机环境以 Docker 为例创建 Docker 环境在 Docker 容器中启动 Master在宿主机上启动小海龟turtlesim节点三、Dockerfile 示例ROS Noetic在catkin_ws/docker/下创建DockerfileFROM ros:noetic-ros-base-focal RUN apt-get update apt-get install -y --no-install-recommends \ ros-noetic-robot1.5.0-1* \ rm -rf /var/lib/apt/lists/* EXPOSE 11311镜像来源https://hub.docker.com/_/ros四、Docker 命令操作cddocker# 构建镜像sudodockerbuild-tros:robot.# 启动并进入容器sudodockerrun-tiros:robot /bin/bash# 在容器中安装网络工具sudoaptupdatesudoaptinstallnet-toolslsof# 启动已有容器sudodockerstartcontainer_id# 进入已启动容器sudodockerattachcontainer_id五、容器内操作启动 Master# 加载 ROS 环境source/opt/ros/noetic/setup.bash# 启动 roscore 后台运行roscore# 查看 11311 端口占用情况lsof-i:11311示例输出rosmaster 455 root 4u IPv4 *:11311 (LISTEN) rosmaster 455 root 7u TCP ... (ESTABLISHED) rosout 465 root 3u TCP ... (ESTABLISHED)六、宿主机配置与通信编辑~/.bashrc添加以下内容exportROS_HOSTNAMEdocker_rosexportROS_MASTER_URIhttp://docker_ros:11311exportTURTLEBOT3_MODELburger注意ROS_HOSTNAME必须设置为容器的主机名或可解析的地址如docker_ros否则可能出现通信失败例如ping node http://docker_ros:43575/ ... failed!七、注意事项确保宿主机能解析docker_ros主机名可通过/etc/hosts或 Docker 网络配置。容器和宿主机之间网络互通是 ROS 多机通信的基础。Master 启动后其他节点需通过ROS_MASTER_URI指向正确的 IP 和端口默认 11311。八、通信失败排查记录1. 错误现象在宿主机上启动小海龟节点后出现如下错误ping node http://docker_ros:43575/ ... failed! Communication with node[http://docker_ros:43575/] failed!即使已在/etc/hosts中添加了容器 IP 与主机名的映射如172.17.0.2 docker_ros仍然报错contacting node http://docker_ros:41171/ ... failed!这表明宿主机虽然能解析主机名但 ROS 节点之间的通信仍然失败。2. 常见原因容器内roscore启动时监听了127.0.0.1未监听容器外部 IP。容器内节点注册的ROS_HOSTNAME或ROS_IP设置不当导致发布的 URI 无法被宿主机访问。防火墙或网络策略阻止了端口访问默认 11311。容器内ROS_MASTER_URI指向错误例如仍指向localhost而宿主机需指向容器 IP。九、解决方案方案一使用容器 IP 直接通信推荐在容器内设置 ROS_IP 为容器 IP进入容器后执行exportROS_IP172.17.0.2# 替换为容器实际 IP或写入~/.bashrc以便持久化。在宿主机设置 ROS_MASTER_URI 为容器 IPexportROS_MASTER_URIhttp://172.17.0.2:11311注意此时宿主机不需要设置ROS_HOSTNAME或可注释掉。验证连通性宿主机上ping172.17.0.2 telnet172.17.0.211311# 检查端口是否可达方案二使用主机名并确保双向解析宿主机 hosts 文件已做172.17.0.2 docker_ros容器内 hosts 文件需要确保容器内也能解析docker_ros为自身 IP。可在启动容器时添加--add-host参数sudodockerrun-ti--add-host docker_ros:172.17.0.2 ros:robot /bin/bash或在容器内手动编辑/etc/hosts。容器内设置 ROS_HOSTNAMEexportROS_HOSTNAMEdocker_ros同时确保ROS_MASTER_URI指向docker_ros:11311。检查 roscore 监听地址roscore 默认监听0.0.0.0所有接口若启动时出现异常可手动指定roscore-p11311或使用环境变量ROS_IP覆盖。方案三使用 Docker 主机网络模式最简单启动容器时使用--nethost使容器直接使用宿主机网络栈此时 IP 就是宿主机 IP配置最简单。sudodockerrun-ti--nethost ros:robot /bin/bash容器内exportROS_MASTER_URIhttp://localhost:11311exportROS_HOSTNAMElocalhost# 或宿主机实际 IProscore宿主机exportROS_MASTER_URIhttp://127.0.0.1:11311# 启动小海龟节点rosrun turtlesim turtlesim_node十、调试命令汇总目的命令查看容器 IPip addr show或hostname -I测试网络连通性ping docker_ros测试端口是否监听lsof -i:11311容器内查看节点注册信息rosnode list和rosnode info node查看环境变量env | grep ROS临时设置环境变量export VARvalue编辑 hosts 文件sudo vim /etc/hosts宿主机容器内需有权限或启动时指定--add-host十一、注意事项每次修改环境变量后需重新加载source ~/.bashrc或重新打开终端。容器内若使用sudo启动 roscore可能导致环境变量丢失建议直接以 root 运行。若使用docker run -ti启动容器后直接执行roscore终端会被占用可加后台运行或另开终端进入容器。检查防火墙sudo ufw status若开启则允许 11311 端口。十二、支持用命令查看文件内容cat ~/.bashrc或gedit ~/.bashrc查看 hosts 文件cat /etc/hosts通过以上步骤就能够解决跨机通信失败的问题顺利实现 Docker 容器与宿主机之间的 ROS 节点通信。完整的实践流程一个完整的、可直接操作的配置流程实现宿主机启动小海龟界面Docker容器内用键盘控制它运动。Phase 3: 数据传输Phase 2: 连接协商Phase 1: 节点注册1. XML-RPC注册发布者2. XML-RPC注册订阅者3. XML-RPC请求发布者信息4. XML-RPC返回发布者地址5. TCP请求建立连接6. TCP确认连接7. TCP/UDP发布速度指令键盘节点容器内roscoreMaster小海龟节点宿主机宿主机 ↔ Docker容器 ROS通信完整配置流程一、整体架构说明角色位置运行内容IP/主机名Master 控制节点Docker容器内roscore 键盘控制节点 (turtle_teleop_key)容器IP172.17.0.2示例显示节点宿主机小海龟界面 (turtlesim_node)宿主机IP192.168.x.x通信方向容器内的键盘节点发布速度话题 → 宿主机的小海龟节点订阅并执行二、详细配置步骤步骤1构建ROS Docker镜像已完成可跳过如果你之前已经构建了镜像可以直接使用如果没有执行cd~/catkin_ws/dockersudodockerbuild-tros:robot.步骤2启动容器并配置网络关键这里必须使用 host 网络模式否则通信会非常麻烦# 使用host网络模式启动容器sudodockerrun-it--nethost\--nameros_master\ros:robot\/bin/bash为什么用host模式容器直接使用宿主机的网络栈IP就是宿主机IP避免了复杂的网络配置和通信失败问题。步骤3容器内启动 roscore进入容器后# 加载ROS环境source/opt/ros/noetic/setup.bash# 启动roscore默认监听所有接口roscore验证roscore是否正常运行# 查看11311端口监听状态lsof-i:11311应该看到rosmaster监听*:11311表示监听所有网络接口。步骤4宿主机配置环境变量新开一个终端不要用容器内的编辑~/.bashrcgedit ~/.bashrc在文件末尾添加# ROS多机通信配置exportROS_MASTER_URIhttp://127.0.0.1:11311# 注意不需要设置ROS_HOSTNAME使用IP通信最稳定保存后生效source~/.bashrc步骤5宿主机启动小海龟界面# 启动小海龟节点会自动连接容器内的masterrosrun turtlesim turtlesim_node如果成功会弹出蓝色背景的小海龟窗口。步骤6容器内启动键盘控制节点回到容器内的终端启动键盘控制# 确保已经source过source/opt/ros/noetic/setup.bash# 启动键盘控制节点rosrun turtlesim turtle_teleop_key步骤7开始控制鼠标点击键盘控制节点的终端窗口使其获得焦点使用键盘的方向键↑↓←→控制小海龟移动你应该能看到宿主机窗口中的小海龟随之移动三、如果通信失败排查指南现象1宿主机启动小海龟时报错ERROR: Unable to communicate with master ...解决方法# 检查容器内roscore是否真的在运行# 在容器内执行psaux|greproscore# 检查端口是否可达在宿主机执行telnet127.0.0.111311现象2节点都能启动但键盘控制无效解决方法# 1. 查看话题列表容器内执行rostopic list# 应该能看到 /turtle1/cmd_vel# 2. 查看话题发布者容器内执行rostopic info /turtle1/cmd_vel# 应该显示有一个发布者键盘节点# 3. 查看话题订阅者宿主机新开终端执行rostopic info /turtle1/cmd_vel# 应该显示有一个订阅者turtlesim节点现象3使用非host网络模式时的配置备选方案如果你必须使用bridge模式需要额外配置容器内# 查看容器IPipaddr show# 假设是 172.17.0.2# 设置环境变量exportROS_IP172.17.0.2exportROS_MASTER_URIhttp://172.17.0.2:11311宿主机# 编辑/etc/hosts添加172.17.0.2 docker_ros# 设置环境变量exportROS_MASTER_URIhttp://docker_ros:11311四、验证命令汇总验证内容命令执行位置查看所有节点rosnode list任意终端查看话题列表rostopic list任意终端查看话题数据rostopic echo /turtle1/pose宿主机新终端手动发布速度rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist {linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {z: 1.0}}容器内新终端五、注意事项总结环境变量一致性所有节点必须连接到同一个ROS_MASTER_URI网络可达性使用ping和telnet验证网络和端口图形界面显示如果你需要在容器内显示图形启动容器时需添加-v/tmp/.X11-unix:/tmp/.X11-unix-eDISPLAY$DISPLAY防火墙如果使用非host模式且跨设备通信确保11311端口开放按照这个流程你应该能顺利实现宿主机显示、容器内控制的小海龟分布式运行。如果遇到具体问题可以告诉我错误现象我帮你进一步排查。简介其实就是三个要点。网络是否通畅使用 ping 或者 lsof 工具检查网络。网络通畅则在所有叶子结点所在机器上配置 roscore 所在的 ip 地址echoexport ROS_MASTER_URIhttp://10.***.**.*:11311~/.bashrcsource~/.bashrc或者在容器启动的时候设置 --nethost这样连 ROS_MASTER_URI 也不需要配置给容器图像显示授权点击这里

相关新闻

【WIN开发】Windows Socket初步(UDP)

【WIN开发】Windows Socket初步(UDP)

一、UDP是什么? UDP 寄明信片 写上地址(IP端口)就扔出去不保证对方一定能收到不保证顺序但速度很快! 对比TCP(打电话)特性TCP(打电话)UDP(寄明信片)连接要先…

2026/7/4 22:51:00 阅读更多 →
代理协议深度解析:HTTP与SOCKS5如何科学选型?

代理协议深度解析:HTTP与SOCKS5如何科学选型?

在爬虫、跨境多账号运营、自动化测试、流量调度等场景中,一个高频问题始终困扰着开发者:“我该用HTTP代理还是SOCKS5?”很多人将选型简化为“哪个更快”或“哪个支持HTTPS”,却忽略了更本质的问题:代理协议工作在网络栈…

2026/7/3 3:19:08 阅读更多 →
780MHz频段天线模块选购指南与应用方案解析

780MHz频段天线模块选购指南与应用方案解析

随着物联网 (IoT) 和无线通信技术的快速发展,780MHz频段作为中国特定的Sub-GHz频段,已成为智慧城市、工业物联网、智能农业等领域的重要通信频段之一。本文将围绕780MHz频段天线模块的选购指南与应用方案进行深入解析,结合权威性数据平台的市…

2026/7/3 11:59:40 阅读更多 →

最新新闻

PTK密钥传递攻击:Kerberos AES密钥横向移动实战与防御

PTK密钥传递攻击:Kerberos AES密钥横向移动实战与防御

1. 项目概述:深入理解PTK密钥传递攻击在渗透测试和红队评估的实战中,横向移动是攻破内网、扩大战果的关键环节。除了大家熟知的哈希传递(PTH),还有一种相对“低调”但威力不减的攻击手法——密钥传递攻击,也…

2026/7/5 6:33:53 阅读更多 →
为什么18KV绝缘鞋越来越受欢迎?真正原因曝光!

为什么18KV绝缘鞋越来越受欢迎?真正原因曝光!

近年来,无论是在建筑工地、工厂维修、电力安装还是设备检修等行业,越来越多人开始关注18KV绝缘鞋。 以前,很多人选择工作鞋时,更关注耐穿、价格或舒适度;如今,不少从业人员更愿意了解鞋子的绝缘、防滑、防…

2026/7/5 6:33:53 阅读更多 →
真人克隆口播小程序开发全攻略:AI数字人系统源码架构解析

真人克隆口播小程序开发全攻略:AI数字人系统源码架构解析

随着生成式AI不断发展,"真人克隆口播"正在成为短视频、自媒体、电商、知识付费等行业的新生产力。过去,一条视频需要真人出镜、反复拍摄、后期剪辑,如今借助AI数字人技术,只需录制少量素材,即可快速生成高度…

2026/7/5 6:31:52 阅读更多 →
抖音内容高效采集工具:如何用开源方案解决批量下载与管理的技术挑战

抖音内容高效采集工具:如何用开源方案解决批量下载与管理的技术挑战

抖音内容高效采集工具:如何用开源方案解决批量下载与管理的技术挑战 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser f…

2026/7/5 6:29:52 阅读更多 →
JMeter-Bzm-Plugins进阶指南:从安装部署到性能调优实战

JMeter-Bzm-Plugins进阶指南:从安装部署到性能调优实战

1. 项目概述:为什么Bzm-Plugins是JMeter进阶的必经之路如果你已经用了一段时间的JMeter,从录制几个简单的HTTP请求,到学会使用CSV参数化、正则表达式提取器,再到搭建分布式压测环境,你可能会觉得这个工具已经玩得差不多…

2026/7/5 6:27:51 阅读更多 →
包装线跨品牌通讯:EtherCAT 转 ProfiNet 网关实现 NJ501 读取 1734-AENT 计数与温度

包装线跨品牌通讯:EtherCAT 转 ProfiNet 网关实现 NJ501 读取 1734-AENT 计数与温度

一、项目背景与挑战某食品包装企业新建一条高速枕式包装生产线,用于糕点、面包等食品的自动化包装,产线要求稳定运行、数据实时采集、包装精度与效率同步提升。该生产线采用欧姆龙NJ501型EtherCAT主站PLC作为核心控制器,负责协调包装机、输送…

2026/7/5 6:25:51 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻