docker容器中的界面在宿主机上可视化并转发到多台客户机上

0.客户端指令速看版

ssh -X username@IP_address

# 服务器上
xhost +
echo $DISPLAY #查看DISPLAY环境变量
:10.0 #将该参数存到运行docker run的终端窗口,即下一行指令
sudo docker run -it --name yourID_v1 --net=host -e DISPLAY=:10.0 -v $HOME/.Xauthority:/root/.Xauthority {image_name} /bin/bash

# 容器中
vim ~/.bashrc
export ROS_MASTER_URI=http://localhost:2222 #设置ros master uri用于多master节点,2222为自定义端口号
source opt/ros/melodic/setup.bash
roscore -p 2222 # 运行roscore,端口号为上上一行设置的值

# 服务器上,用另一个终端进入刚才的容器
sudo docker exec -it {容器名称 or 容器ID} /bin/bash
source opt/ros/melodic/setup.bash
rviz # 测试可视化界面是否显示在当前屏幕

1.需求概述

由于有些基于ROS的任务对资源要求较高,个人电脑跑起来很卡,因此可以利用实验室的公用服务器运行它们,这就产生了以下需求:
1.不同用户项目的依赖项需要隔离;
2.需要从服务器转发可视化界面(rviz、gazebo)到客户机;
3.多人同时使用一个网络环境下ros master节点互不冲突。
上述需求可以利用docker + ssh -X + 多个roscore解决。

2.环境描述:

1.1 服务器,Ubuntu 18.04,运行docker的机器,IP地址为xxx.xxx.xxx.1
1.2 客户机,Ubuntu 18.04,每位同学的个人电脑,IP地址为xxx.xxx.xxx.2、xxx.xxx.xxx.3等
(查看ip指令:ifconfig)

3. 客户机通过ssh转发服务器的可视化界面

# 安装ssh:
sudo apt update
sudo apt install openssh-server
# 在客户机上通过ssh登录服务器,加上-X关键字:
ssh -X username@ip_address

即可通过X协议转发远程服务器上的界面。(利用指令whoami查看username)

4.docker容器的建立与几个关键字段

首先确保服务器端打开了xserver的连接权限:

xhost +

创建容器:

sudo docker run -it --name yourID_v1 \
--net=host \
-e DISPLAY=:10.0 \
-v $HOME/.Xauthority:/root/.Xauthority \
-e NVIDIA_VISIBLE_DEVICES=all \
-e NVIDIA_DRIVER_CAPABILITIES=all \
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
--gpus all \
--env="QT_X11_NO_MITSHM=1" \
{image_name} bash

这里涉及到三个关键点:

–net=host是设置docker的网络模式,众所周知docker的容器有四种网络模式分别是brige模式、host模式、container模式和none模式。其中host模式可以让容器完全共享宿主机的网络栈,同时也与其他与宿主机保持host模式的容器处在同一个网络环境中,此时不同容器的网络是不隔离的,也就意味着不同容器只能同时存在一个ROSmaster节点(11311端口下),这个问题可以用roscore -p解决,具体见下节。

第二个是-e DISPLAY=:10.0,在Linux/Unix类操作系统上, DISPLAY用来设置将图形显示到何处,利用echo $DISPLAY 可以查看客户机当前终端的DISPLAY变量,利用export DISPLAY=10.0 可以设置该值。每个终端会有不同的DISPLAY值,例如,打开第一个终端输入echo $DISPLAY,返回:10.0,第二个终端会返回:11.0,以此类推。只要将docker run后面的DISPLAY设为当前终端的值即可,该环境变量就会传入容器中。

第三个是Xauthority文件,Xauthority文件是一个基于cookie的授权文件,这个文件可以被当前机器里的所有程序访问获得权限,程序便可将可视化界面显示在当前机器的屏幕上(linux内核中没有UI界面,ubuntu是通过X协议将程序的界面进行可视化),如果想让容器中的程序(例如rviz)将界面显示在当前机器的屏幕上,就要将这个文件复制到容器中的主目录下。详情查看wiki-X_Window_authorizationX框架可以看这篇

然后即可实现容器中rviz界面的可视化(一个终端打开roscore,另一个终端打开rviz,如下图):
实现容器中rviz界面的可视化(一个终端打开roscore,另一个终端打开rviz)

5. 多用户使用多个ROS Master

ROS Master节点可以通过设置端口的方式与其他ROS Master进行隔离,详情见,具体做法如下:

# 在容器中的第一个终端
vim ~/.bashrc	# 打开bachrc
export ROS_MASTER_URI=http://localhost:2222	# 将环境变量语句添加进去(第一行就行),2222自己设置闲置端口,
source opt/ros/melodic/setup.bash
roscore -p 2222	# 打开roscore

# 打开第二个容器
sudo docker exec -it {容器名称 or 容器ID} bash
# 检查一下ROS_MASTER_URI,如果没有返回结果,source一下:source ~/.bashrc
echo $ROS_MASTER_URI
http://localhost:2222
# 这时启动rviz时就会通过2222的端口
source opt/ros/melodic/setup.bash
rviz

另一位同学在另一个容器中通过设置不同的端口,即可实现多个ROS Master同时运行,可视化界面输出到自己的显示器上。

6.小结

使用vscode的docker插件管理文件,结合终端,可以实现像在本地电脑一样的开发调试体验(可视化界面依赖网络,局域网内亲测与本地无异)。

参考

  1. Docker容器显示图形到宿主机屏幕
  2. Linux图像系统框架与X协议
  3. docker服务器的图形显示方案
  4. X Window System
  5. X Window authorization
  6. roscore
  7. 一遍成功的ROS主从机详细配置
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值