当前位置: 首页 > news >正文

二、ROS2完成Docker容器和宿主机通信,使用ros2 topic list看到,但是无法echo

文章目录

  • 1. 问题描述
  • 2. 问题分析:权限不一致
  • 3. 解决方法
    • 3.1 方法1:修改docker容器用户权限(推荐)
    • 3.2 方法2:修改宿主机权限
  • 4. 参考资料

1. 问题描述

我使用docker创建了一个容器,运行命令如下:

docker run -it --rm   --net=host   --ipc=host  --pid=host   -v /dev:/dev   -v /tmp/.X11-unix:/tmp/.X11-unix   -e DISPLAY=$DISPLAY   -v /etc/localtime:/etc/localtime:ro   --name ros2_jazzy_dev   srb:v1.1

在容器中运行:

ros2 run demo_nodes_cpp talker

在宿主机中运行:

ros2 run demo_nodes_cpp listener

运行之后,可以在宿主机使用ros2 topic list命令查询到相关话题,但是使用ros2 topic echo /chatter没有输出。

2. 问题分析:权限不一致

在运行的过程中,ROS2使用了共享内存机制,会共享内存 dev/shm(共享内存目录) ,如果容器和主机权限不一致,则会导致无法通信(我的代码中,docker容器是root,宿主机是普通用户),虽然可以查询到相关话题,但是订阅后没有消息输出。比如,docker容器创建了一个共享内存,其所有者为docker容器用户root,当宿主机去访问的时候,由于用户不同,没有权限访问,也就无法进行信息传递。所以,如果想要容器和宿主机正确通信,需要设置相同的权限。

  • 判断ros2是否使用了共享内存
ls /dev/shm
lsof | grep /dev/shm

3. 解决方法

3.1 方法1:修改docker容器用户权限(推荐)

加入--user $(id -u):$(id -g)命令,使容器和宿主机是同一个用户

docker run -it \--rm \--net=host \--ipc=host \--pid=host \--privileged \-v /dev:/dev \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=$DISPLAY \-v /etc/localtime:/etc/localtime:ro \-v ~/your_ws:/home/ros2_ws \--user $(id -u):$(id -g) \--name ros2_jazzy_dev \your_ros2_jazzy_image:latest

注意:
运行之后,宿主机和容器可能用户名不同,这是因为--user $(id -u):$(id -g)命令保证了容器中使用宿主机的UID和GID,但没有指定容器中使用哪个用户名,Docker默认不会自动创建和绑定用户名,只会绑定UID和GID,我们只要保证UID和GID一致即可,验证命令如下:

id -u
id -un

查询用户名命令:

whoami

3.2 方法2:修改宿主机权限

(1) 直接切换到root:
宿主机运行su root,切换到root用户,然后运行:

 ros2 run demo_nodes_cpp listener

容器运行:

 ros2 run demo_nodes_cpp talker

即可完成通信
(2) 临时修改共享内存区域:

cd /dev/shm
sudo chmod 777 -R .

该方法只是临时修改共享内存的权限,每次运行完,需要重新运行上述命令,才可以进行通信

4. 参考资料

参考1

http://www.xdnf.cn/news/955261.html

相关文章:

  • 驭码 CodeRider 2.0 产品体验:智能研发的革新之旅
  • OceanBase 桌面版
  • 从零开始了解数据采集(二十八)——制造业数字孪生
  • Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
  • 基于FPGA的PID算法学习———实现P比例控制算法
  • 协同过滤算法进行电影推荐
  • java教程笔记(十三)-synchronized和ReentrantLock
  • Hilt vs Dagger2:Android 依赖注入框架对比
  • 2025年css+html面试题
  • PH热榜 | 2025-06-07
  • 有限自动机到正规文法转换器v1.0
  • 土建施工员考试:建筑施工技术重点知识有哪些?
  • Java中方法调用参数传递机制的理解和示例验证
  • NFT模式:数字资产确权与链游经济系统构建
  • 什么是VR全景展示?VR全景展示的用途
  • 微信小程序云开发平台MySQL的连接方式
  • STA(Station)模式与AP(Access Point)模式
  • LeetCode - 260. 只出现一次的数字 III
  • 镜像里切换为普通用户
  • VBA高级应用30例应用4:利用键盘设置来阻止自动运行事件
  • 研读论文《Attention Is All You Need》(14)
  • React---day11
  • 基于vue框架的多媒体教室管理系统72d6w(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • Redis群集
  • 沙箱虚拟化技术虚拟机容器之间的关系详解
  • 基于Springboot+Vue的办公管理系统
  • Hugo 自动化部署实战-部署 Hugo 到 Vercel
  • macOS 终端智能代理检测
  • Uncaught ReferenceError: process is not defined
  • EU 2023/1669与EU 2023/1670 的区别