参考内容
【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 的部分是否正确