远程工作站 docker 实现 isaac sim 和 ROS 之间的通信

参考内容

【Docker】初识docker 基本概念及安装使用(巨详细版)-优快云博客

ISAAC SIM(Ubuntu20.04) 下载使用流程_isaac sim下载-优快云博客

忘了方便找,经常用的要放上面

复制文件到docker中的某处:

docker cp xxxxxxx <container name>:/root/xxxxxxx

查看进程id,方便杀docker中进程

ps -ef

kill PID

docker操作

docker start <container name>

docker exec -it <container name> bash

docker stop <container name>

docker rm <container name>

新建docker容器:

 docker run --name ros-noetic -it --network=host ros:dashing-ros1-bridge-bionic

docker run --name isaac-sim --entrypoint bash -it --runtime=nvidia --gpus "device=0" -e "ACCEPT_EULA=Y" -e "OMNI_SERVER=omniverse://10.10.111.35/NVIDIA/Assets/Isaac/4.1"  -e "OMNI_USER=<name>" -e "OMNI_PASS=<password>"  --network=host nvcr.io/nvidia/isaac-sim:4.1.0

rocker --nvidia --x11 --privileged --network host  --name <container name> osrf/ros:noetic-desktop-full-focal --nocleanup

 检查 Docker 磁盘使用情况:

docker system df

 列出所有 Docker 镜像: 

docker images -a

镜像打包

docker save -o noetic-desktop-full-focal.tar osrf/ros:noetic-desktop-full-focal 

镜像传输到服务器上

scp noetic-desktop-full.tar xxxxx@10.10.xx.x:~/xxxx

 在服务器中分别加载 tar 文件,解压打包的镜像

docker load -i ./noetic-desktop-full.tar

#没有权限就用 chmod 777 ./xxx 添加权限

 验证镜像是否成功导入

docker images | grep osrf/ros

以下为正文内容

一.Vscode 使用 远程服务器中的 docker

1.在扩展中下载 Docker 和 Docker Compose

2.下载 Dev Containers

3.点击左侧Docker,在containers中找到自己要连接的,右键选择Attach Visual Studio Code,然后找到自己需要连接的容器

二.Docker常用命令

ssh xxx@xx.xx.xx.x

docker start isaac-sim

docker exec -it isaac-sim bash

./runheadless.native.sh

管理容器

运行新容器:(等同于先执行 docker create 命令,再执行 docker start 命令)

docker run hello-world 

列出正在运行的容器,包括已经停止的:

docker ps -a 

停止一个或多个容器:

docker stop container_name_or_id 

移除一个或多个容器:

docker rm container_name_or_id 

镜像管理

从Docker Hub或其他注册表拉取一个镜像:

docker pull nginx

列出本地镜像。类似于docker ps,但用于查看镜像而不是容器:

docker images

删除一个或多个本地镜像:

docker rmi nginx

从Dockerfile构建一个镜像:

docker build -t my_image .

不会的直接看--help吧

docker run --help 

容器的进入
需要进入容器进行命令操作时,可以使用 docker exec 命令进入运行着的容器。

docker start 2592d3fad0fb
#进入容器前,确保容器正在运行
docker exec -it 2592d3fad0fb /bin/bash
格式:docker exec -it 容器ID/名称 /bin/bash
-i 选项表示让容器的输入保持打开;
-t 选项表示让 Docker 分配一个伪终端。
 
ls
 
exit
#退出容器后,容器仍在运行
 
docker ps -a
 
docker run -it nginx:latest bash
#不加 -d 选项会创建容器后直接进入容器进行交互,但是退出容器,容器也会停止 

基于ssh

# 1. 创建镜像,端口指定为3xx22,例如31022
docker run --gpus {all/1/"device=0"/'"device=0,1"'} -dit --name {container name} -v {local dir}:{container dir} -p {port}:22 {镜像名称} /usr/sbin/sshd -D

# 2. 添加自己的公钥
docker exec -it {container name/id} sh -c 'echo "{id_ras.pub的文本}" >> ~/.ssh/authorized_keys'

# 3. 现在可以ssh进容器了

ssh root@{ip} -p {port}

本地使用

# 创建镜像
docker run --gpus {all/1/"device=0"} -dit --name {container name} -v {local dir}:{container dir} {镜像名称} bash

# 进入镜像
docker exec -it {container name/id} bash

三.Isaac Sim Docker设置

3.1 Isaac Sim Docker 镜像下载及使用

这里可以移步至链接中第2.4章容器部署

ISAAC SIM(Ubuntu20.04) 下载使用流程_isaac sim下载-优快云博客

3.2 远程工作站 docker 实现 isaac sim 和 ROS 之间的通信

 同一主机中的不同 docker 之间要想进行 ROS 通信,有两种方式:

  • docker 之间通过虚拟网桥相连接,实现通信。

    • 每一个 docker 容器都将被分配一个 IP 地址,可以通过设置主从等方式来实现 ROS 通信。

    • 这是最常用,最简单的一种方式,但在 isaacsim 中不适用,原因是 isaacsim 的启动必须要 network 为 host,否则无法用远程控制(Streaming Client)查看 GUI 界面。

  • 另一种方式是设置 docker 容器的 network 为 host,直接使用宿主机的网络,没有隔离的网络。

    • 此时容器的网络配置与宿主机相同,可以直接访问宿主机的端口。

步骤一:安装 Rocker

Rocker 是一个帮助简化 ROS 与 Docker 集成的工具:GitHub - osrf/rocker: A tool to run docker containers with overlays and convenient options for things like GUIs etc.

这里可以直接在远程工作站中执行,需要 root 权限,要找远程服务器相关负责人

官方手册中的安装 rocker 方式如下,注意这个命令不可用,链接过期(2024.12.04测试不可用,未来官方可能会修复)

sudo apt-get install python3-rocker

所以要绕一下安装方式:

sudo apt install software-properties-common
sudo add-apt-repository universe
sudo apt update && sudo apt install curl -y
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
sudo apt update
sudo apt-get install python3-rocker

步骤二:运行 Docker-Ros

  • --nvidia,启用 NVIDIA 显卡进行渲染

  • --x11,启用 x11

  • --name,设置 docker 名称

  • --nocleanup,停止时不删除 Docker 容器

rocker --nvidia --x11 --privileged --network host  --name <container name> osrf/ros:noetic-desktop-full-focal --nocleanup

重新开启一个远程服务器的终端界面,克隆 Isaac Sim ROS Workspace 存储库。

git clone https://github.com/isaac-sim/IsaacSim-ros_workspaces.git
cd IsaacSim-ros_workspaces/

将 Isaac Sim 文件夹复制到正在运行的 ROS 容器中。 

docker cp noetic_ws <container name>:/root/noetic_ws

输出:Successfully copied  ...MB to .....

从新的本地终端打开现有的 ROS Docker

docker exec -it <container name> bash

进入 Docker 容器后,获取 Docker 的 ROS

source /opt/ros/noetic/setup.sh
roscore

安装依赖项、构建工作区并获取新工作区

cd /root/noetic_ws
apt-get update
apt-get install <package name noetic version>
rosdep install --from-paths src --ignore-src --rosdistro=noetic -y
source /opt/ros/noetic/setup.sh
catkin_make
source devel/setup.bash

步骤三:测试 Docker 之间的 Ros 通信

docker 开启 IsaacSim 的无头模式,在/isaac-sim主路径下:

./runheadless.native.sh

使用远程控制 Streaming Client,开启扩展中的 ROS Bridge,发送任意 rostopic,在 ROS Docker 中使用命令 rostopic list 进行查看话题列表

  • rostopic list:查看话题列表
  • rostopic hz /topic_name:查看话题帧率
  • rostopic echo /topic_name:查看话题输出内容
  • rostopic info /topic_name:查看话题类型及发布者接收者

3.3 远程服务器和本机服务器通信方式

大体思路:

远程服务器:Docker1(ROS所在),Docker2(isaacsim所在)

首先确定两个 docker 之间的网络和 ROS 联通情况,这里我两个服务器创建时都设置了 --network=host 。

Docker2 运行仿真,发布 Rostopic 到 Docker1 ,再发给本机服务器(?这里可能我理解有误,因为并不只是 Docker1 需要设置 ROS_MASTER_URI 和 ROS_IP ,Docker2 也同样需要)

1. 首先,确保远程服务器和本机服务器可以互相 ping 通,且没有防火墙阻隔

2. 登录远程服务器

ssh xxx@xx.xx.xxx.xx

3. 确保 Docker 容器运行的网络模式为 host(以便容器共享主机网络)

启动方式

docker run --net=host -it your_ros_image

如果容器已经运行,确认网络模式

docker inspect <container_id> | grep NetworkMode

4.在容器中设置以下 ROS 环境变量(两个容器都要配置)

vim ~/.bashrc
(i键编辑,esc退出编辑,:wq保存改动并退出)
export ROS_MASTER_URI=http://远程服务器IP:11311
export ROS_IP=远程服务器IP
source ~/.bashrc

5.本机服务器设置

export ROS_MASTER_URI=http://远程服务器IP:11311
export ROS_IP=本机服务器IP
export ROS_HOSTNAME=本机服务器IP

不知道自己服务器ip,使用ifconfig命令查看

6.测试通信

在远程服务器的 Docker 中,发布一个话题,例如:

rostopic pub /test std_msgs/String "data: 'Hello ROS'" -r 1

在本机中使用命令:

rostopic list
rostopic echo /test

如果能看到消息内容 Hello ROS,说明通信成功,可以去试试 isaacsim 的话题有没有正常通信

可能遇到的问题:

1.测试在远程服务器中的 roscore 所在 docker,可通信,可是 isaacsim 的 rostopic 没有成功通信本机

具体情况:

在远程服务器的 docker 中发布 rostopic pub /test std_msgs/String "data: 'Hello ROS'" -r 1

在本机中使用 rostopic list,可以看到有 /test 话题

rostopic echo /test,可以看到输出了“Hello ROS”

但 isaacsim 的话题一个都接不到,显示 “no message”

解决方式:

  • 在 Docker 容器中使用 rostopic pub /test 可以成功发布到本机,说明本机与 Docker 容器的 ROS 通信配置是正确的。
  • 来自另一个 Docker 容器的话题未能传递到本机,说明容器间通信与主机通信的桥接存在问题。
  • 综上所述,就是一个配置好了另一个没有配置好,仔细检查bashrc中关于 ROS_MASTER_URI 和 ROS_IP 的部分是否正确
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值