网站信息备案查询,淘宝网站运营的工作怎么做,做网站的相关协议,响应式网站设计建设制作#x1f300; 一个中大型ROS项目常需要各个人员分别完成特定的功能#xff0c;而后再组合部署#xff0c;而各人员完成的功能常常依赖于一定的环境#xff0c;而我们很难确保这些环境之间不会相互冲突#xff0c;特别是涉及深度学习环境时。这就给团队项目的部署落地带来了… 一个中大型ROS项目常需要各个人员分别完成特定的功能而后再组合部署而各人员完成的功能常常依赖于一定的环境而我们很难确保这些环境之间不会相互冲突特别是涉及深度学习环境时。这就给团队项目的部署落地带来了极大的困难。虽然类似于conda这样的工具可以弥补一部分的不足但是对于项目部署而言还是不足的。
现在就针对上述的问题提出一种基于docker的ROS2通信解决方案其中会涉及docker network和docker compose等内容。容器与宿主机的ROS2版本LTS版(foxy/humble/…)都行。 01前情说明 首先有以下几点说明 (1) 宿主系统是基于ubuntu系统系统的架构x86_64或arm均可使用的是NVIDIA显卡且系统内已安装相应的显卡驱动。 (2) 宿主机和容器的架构(x86_64/arm64)保持一致。 (3) 如果宿主机开了VPN先关掉避免干扰。 为了讲解的方便假设我们有以下环境 (1) 宿主系统是ubuntu20.04架构是x86_64安装了ros foxy显卡是NVIDIA GTX 1650且显卡驱动可用。 (2) 宿主系统内docker和docker compose都可以正常使用。 (3) 有一个docker镜像(假设叫做image:latest)镜像环境是ubuntu22.04架构也是x86_64安装了ros humble。 02创建docker compose文件 第一步编写一个docker compose文件用以从镜像创建容器。这种方式会比使用docker run好些因为它能够把容器的参数写到文件里还能联调多个容器的关系对于多容器组合的项目开发比较友好。并且我建议如果你只有一个docker容器那也使用docker compose这样相对于docker run的命令行方式更容易维护。
mkdir project cd project
touch project.yml然后编写project.yml的内容示例如下。这里之所有没用device:来挂载摄像头、激光雷达等外设那是因为这些外设的驱动节点(传感器数据发布节点)放在宿主机中更好容器只要订阅这些节点发布的话题进行处理即可。另外ROS_DOMAIN_ID要一样才能通信默认为0。
# 多对多自由
services:c1: # 服务名称(一个服务对应一个容器),自己取名即可container_name: c1 # 容器名称image: image:latest # 镜像名称working_dir: [your_workdir_path1] # 工作目录,比如/home/zhangsanshm_size: [your_share_memory_size] # 共享内存大小,比如4Gruntime: nvidia environment:- NVIDIA_VISIBLE_DEVICESall- DISPLAY${DISPLAY} # 设置DISPLAY环境变量 volumes:- [your_source_path1]:[your_target_path1] # 挂载项目目录- /dev/dri:/dev/dri # 挂载 GPU 设备- /tmp/.X11-unix:/tmp/.X11-unix:rw # 挂载 X11 Unix 套接字- ${HOME}/.Xauthority:/root/.Xauthority:rw # 挂载 X11 认证文件networks:- [network_name] # 共享网络名称比如ros_networkstdin_open: true # 相当于 -itty: true # 相当于 -tc2: # 服务名称(一个服务对应一个容器),自己取名即可container_name: c2 # 容器名称image: image:latest # 镜像名称working_dir: [your_workdir_path2] # 工作目录,比如/home/lisishm_size: [your_share_memory_size] # 共享内存大小,比如4Gruntime: nvidia environment:- NVIDIA_VISIBLE_DEVICESall- DISPLAY${DISPLAY} # 设置DISPLAY环境变量 volumes:- [your_source_path2]:[your_target_path2] # 挂载项目目录- /dev/dri:/dev/dri # 挂载 GPU 设备- /tmp/.X11-unix:/tmp/.X11-unix:rw # 挂载 X11 Unix 套接字- ${HOME}/.Xauthority:/root/.Xauthority:rw # 挂载 X11 认证文件networks:- [network_name] # 共享网络名称比如ros_networkstdin_open: true # 相当于 -itty: true # 相当于 -tnetworks: # 如果没有名称为ros_network的网络会自己创建一个。[network_name]:name: [network_name]driver: bridge03启动docker compose服务 开放X11服务(这样容器中的窗口就可以显示出来)并从project.yml文件启动docker容器。
xhost
docker-compose -f project.yml up接着你可以查看网络信息确认是否共享上了
docker network ls你会看这样的信息
NETWORK ID NAME DRIVER SCOPE
ecb8bca83c79 bridge bridge local
0e489127c701 host host local #这个是你宿主机的网络
fad86f998533 none null local
65b64309ebc2 ros_network bridge local #这个是你刚才创建的共享网络进一步查看共享网络信息
docker network inspect ros_network 你会看到这样的输出
# c1和c2之间的ROS2节点在ros_network子网中通信
# 容器ROS2节点通过把数据转发给ros_network网关网关再转接给host实现与宿主机ROS2节点通信
[{Name: ros_network,Id: 65b64309ebc2df88cd05c3a1fb33635ab4818fd6d2022ce028ad25ef22f2e0ef,Created: 2025-01-11T20:20:06.63280073508:00,Scope: local,Driver: bridge,EnableIPv6: false,IPAM: {Driver: default,Options: {},Config: [{Subnet: 172.18.0.0/16, # 子网Gateway: 172.18.0.1 # 网关}]},Internal: false,Attachable: false,Ingress: false,ConfigFrom: {Network: },ConfigOnly: false,Containers: {79ba2ce2e7914e02e9c36828eb40c343c5abe5f3ca43f2c61b304b91f8cd8de6: {Name: c1,EndpointID: f3956bf172423f84b4e2bf0d55d9c1149b9135dcc32cfc6d01c6770b86a0015d,MacAddress: 02:42:ac:12:00:03,IPv4Address: 172.18.0.3/16, # c1的ipIPv6Address: },d02027c00ae82e6589dd4690fb7f69974de9d867958f17ced17f3babe0c7527b: {Name: c2,EndpointID: 50b4abf51ee3f4b118b99813b061830a2cf2858ecffa4b2c6147849e378fe8b7,MacAddress: 02:42:ac:12:00:02,IPv4Address: 172.18.0.2/16, #c2的ipIPv6Address: }},Options: {},Labels: {}}
]04ROS2通信测试 另开两个终端分别在终端内运行以下命令进入容器(你可以开多个)
docker exec -it c1 /bin/bash # 第一个终端(可以开多个)
docker exec -it c2 /bin/bash # 第二个终端(可以开多个)启动以下节点
# 在宿主机中
ros2 run turtlesim turtlesim_node
# 在c1容器中
ros2 run demo_nodes_cpp talker # [INFO] [1736647116.948458682] [talker]: Publishing: Hello World: 1
# 在c2容器中
ros2 run demo_nodes_cpp listener # [INFO] [1736647126.948946624] [listener]: I heard: [Hello World: 1]并分别在各环境中运行
ros2 node list如果所有环境中都输出了以下内容那就说明成功了。
/listener
/talker
/turtlesim05附录 5.1 安装docker compose
# 从官方下载软件包(确保和自己机器的架构一致)https://github.com/docker/compose/releases
# 假设下载了docker-compose-linux-x86_64到~/Downloads
cd ~/Downloads
# 改名
mv docker-compose-linux-x86_64 docker-compose
# 移动到指定位置
sudo mv docker-compose /usr/local/bin
# 赋予权限
sudo chmod x /usr/local/bin/docker-compose