文章目录
配置ROS的Docker环境
目标
- 配置ROS1和ROS2两个独立的Docker环境
- 在本地显示服务器上ros docker容器内的GUI应用,例如rqt、rviz等
- 从本地可以直接ssh登录到服务器的ROS容器内
- 将服务器的某一目录挂载到容器内,方便文件传输
- 暴露ROS端口,以从外部连接容器内节点
方法一
1. 从OSRF获取带桌面版的ROS镜像
网址:https://hub.docker.com/r/osrf/ros/tags?page=1&ordering=last_updated
docker pull osrf/ros:noetic-desktop-full-focal # ros-noetic ubuntu20.02
docker pull osrf/ros:galactic-desktop # ros-galactic
2. Xshell 和 Xmanager准备
- 为了能在本地显示服务器上docker容器内的GUI应用,Xshell连接时需要勾选X11转移,并打开Xmanager -Passive,以接收服务器传过来的界面
3. 创建容器
export DISPLAY=本地ip:0.0
docker run -it \ 交互
--name ros-noetic-container \
--privileged \ # root权限:包括设备权限
-v /tmp/.X11-unix:/tmp/.X11-unix \ # 映射显示服务节点
-e DISPLAY=$DISPLAY \ # 配置显示参数 本地ip:0.0
-v $HOME/noetic_dir:/root/noetic_shared \ # 共享目录
osrf/ros:noetic-desktop-full-focal \ # 官方镜像
/bin/bash
4. 设置使得本地可直接ssh登录到容器内
-
修改容器的root密码:
passwd
, 输入新的密码,例如:123 -
安装vim:
apt-get update
,apt-get install vim -y
-
安装容器的openssh-server,输入
apt-get install openssh-server -y
-
成功安装后,vim /etc/ssh/sshd_config,修改下面两个配置
PermitRootLogin yes
UsePAM no -
启动ssh服务,service ssh start
-
退出容器,输入exit,然后输入docker ps -a,查看容器的ID
-
提交容器成为新的镜像,例如叫做ros-noetic-ssh,
docker commit 容器ID ros-noetic-ssh
-
启动这个镜像的容器,并映射本地的一个闲置的端口(例如10000)到容器的22端口,并启动容器的sshd
docker run -d --name ros-noetic-container --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $HOME/noetic_dir:/home/noetic_shared -p 10000:22 ros-noetic-ssh /usr/sbin/sshd -D
-
至此就可以xshell远程用服务器ip和10000号端口直接访问容器,同时服务器目录
$HOME/noetic_dir
也挂载到容器/home/noetic_shared
中了
5. 本地显示容器内GUI app
# 安装(服务器和容器内)
sudo apt install xserver-xorg x11-xserver-utils
# (可选)许可所有用户都可以访问xserver
xhost +
# 设置服环境变量转发X11到本机 (服务器和容器内)
export DISPLAY=本机ip地址:0.0 # 写入~/.bashrc中
# vim ~/.bashrc 加入以下:
export DISPLAY=10.103.13.225:0.0
export ROS_DISTRO=noetic
source /ros_entrypoint.sh
6. commit镜像
docker commit 容器ID ros-noetic-ssh # galactic同理
方法二
上述方法可以保证不同容器是隔离的。为了暴露容器内ROS节点端口,可采用以下方法
1. 用--net=host
创建容器,和宿主机共用网络,不再需要映射端口:
docker run -it --name ros-galactic-container --privileged -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=$DISPLAY -v $HOME/galactic_dir:/root/galactic_shared --net=host ros-galactic-ssh /bin/bash # 这里使用了上一方法中commit后的镜像:安装了openssh,且能本地显示容器内GUI
2. 进入容器,修改ssh端口号
vim /etc/ssh/sshd_config
Port=10001
3. 退出容器,后台启动容器,远程ssh登录容器
docker exec -d ros-galactic-container /usr/sbin/sshd -D