ROS Docker可视化界面
2025-08-07
ROS
00

https://blog.csdn.net/zkk9527/article/details/121159353

设置full和关闭RANDR:

image.png

SSH进入服务器,安装这几个:

bash
展开代码
sudo apt update sudo apt install x11-xserver-utils sudo apt install xfonts-base xfonts-utils

执行这个

bash
展开代码
xhost +

可以看到:

bash
展开代码
(base) xd@xd-OptiPlex-3070:~$ xhost + access control disabled, clients can connect from any host

每次SSH进入服务器后均要执行 xhost +

执行这个命令:

bash
展开代码
xclock

看到时钟弹出来则说明xhost + 设置是ok的。

image.png

拉这个镜像:

bash
展开代码
docker pull zkjoker/laserslam:v4

运行容器:

bash
展开代码
docker run \ --name visual_use \ -e QT_X11_NO_MITSHM=1 \ -e DISPLAY \ --net=host \ -v ~/.Xauthority:/root/.Xauthority:rw \ -v ~/tmp/.X11-unix:/tmp/.X11-unix:ro \ -v ~/out_home:/out_home \ -it zkjoker/laserslam:v4 bash

分析一下:

这个 docker run 命令的原理涉及多个 Docker 和 X11 相关的概念,我来逐步解释:

  1. 基本容器运行
bash
展开代码
docker run --name visual_use -it zkjoker/laserslam:v4 bash
  • 从镜像 zkjoker/laserslam:v4 创建并运行一个名为 visual_use 的容器
  • -it 表示以交互模式运行并分配伪终端
  • 最后执行 bash 命令进入容器 shell
  1. X11 图形显示相关参数
bash
展开代码
-e QT_X11_NO_MITSHM=1 \ -e DISPLAY \ --net=host \ -v ~/.Xauthority:/root/.Xauthority:rw \ -v ~/tmp/.X11-unix:/tmp/.X11-unix:ro \

这些参数是为了让容器内的 GUI 程序能够显示在宿主机的 X11 服务器上:

  • -e QT_X11_NO_MITSHM=1:禁用 QT 的共享内存扩展,解决某些 X11 兼容性问题
  • -e DISPLAY:传递宿主机的 DISPLAY 环境变量到容器
  • --net=host:使用主机网络模式,使容器能直接访问主机的 X11 服务
  • -v ~/.Xauthority:/root/.Xauthority:rw:共享 X11 认证 cookie 文件
  • -v ~/tmp/.X11-unix:/tmp/.X11-unix:ro:共享 X11 的 Unix 域套接字
  1. 数据卷挂载
bash
展开代码
-v ~/out_home:/out_home

将宿主机的 ~/out_home 目录挂载到容器的 /out_home,用于数据持久化和共享

工作原理总结

  1. 网络模式:使用 --net=host 让容器共享主机网络栈,使 X11 通信可以直接通过 localhost 进行
  2. X11 认证:通过共享 .Xauthority 文件解决 X11 的身份验证问题
  3. 显示连接:通过共享 /tmp/.X11-unix 目录让容器内程序可以连接到主机的 X11 服务器
  4. 环境变量:传递必要的 DISPLAY 变量告诉 GUI 程序连接到哪个显示服务器

进入容器后是显示出root@xd-OptiPlex-3070

bash
展开代码
(base) xd@xd-OptiPlex-3070:~$ docker run \ --name visual_use \ -e QT_X11_NO_MITSHM=1 \ -e DISPLAY \ --net=host \ -v ~/.Xauthority:/root/.Xauthority:rw \ -v ~/tmp/.X11-unix:/tmp/.X11-unix:ro \ -v ~/out_home:/out_home \ -it zkjoker/laserslam:v4 bash root@xd-OptiPlex-3070:/#

执行这个:

bash
展开代码
bash /root/run_gmapping.sh

看到弹出这2个显示则表示显示成功:

image.png

image.png

分析一下

/root/run_gmapping.sh 里内容:

bash
展开代码
root@xd-OptiPlex-3070:/# cat /root/run_gmapping.sh source /opt/ros/kinetic/setup.sh source /root/catkin_ws/devel/setup.sh sleep 1 (roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch)& sleep 5 (roslaunch mbot_navigation gmapping_demo.launch)& sleep 10 rosbag play control.bag

这是一个用于运行 gmapping SLAM 算法的 shell 脚本。让我逐步分析这个脚本的内容和功能:

  1. 环境设置:
bash
展开代码
source /opt/ros/kinetic/setup.sh source /root/catkin_ws/devel/setup.sh
  • 加载 ROS Kinetic 的环境设置
  • 加载自定义工作空间 catkin_ws 的环境设置
  1. 启动 Gazebo 仿真环境:
bash
展开代码
(roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch)&
  • 在后台(&)启动 Gazebo 仿真环境
  • 使用 mbot_laser_nav_gazebo.launch 文件配置
  • 包含机器人模型和激光雷达传感器
  1. 启动 gmapping SLAM:
bash
展开代码
(roslaunch mbot_navigation gmapping_demo.launch)&
  • 在后台(&)启动 gmapping SLAM 算法
  • 使用 gmapping_demo.launch 文件配置
  • 用于创建环境地图
  1. 播放控制数据:
bash
展开代码
rosbag play control.bag
  • 播放预先录制的 ROS bag 文件
  • 包含控制指令或传感器数据

时间控制:

  • 各步骤之间有 sleep 命令确保前一步完全启动:
    • 初始 sleep 1 秒
    • Gazebo 启动后 sleep 5 秒
    • gmapping 启动后 sleep 10 秒

这个脚本的典型用途是:

  1. 在 Gazebo 中启动机器人仿真环境
  2. 运行 gmapping SLAM 算法构建地图
  3. 通过预录制的控制数据驱动机器人运动
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!