https://blog.csdn.net/zkk9527/article/details/121159353
设置full和关闭RANDR:
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的。
拉这个镜像:
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 相关的概念,我来逐步解释:
bash展开代码docker run --name visual_use -it zkjoker/laserslam:v4 bash
zkjoker/laserslam:v4
创建并运行一个名为 visual_use
的容器-it
表示以交互模式运行并分配伪终端bash
命令进入容器 shellbash展开代码-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 域套接字bash展开代码-v ~/out_home:/out_home
将宿主机的 ~/out_home
目录挂载到容器的 /out_home
,用于数据持久化和共享
工作原理总结
--net=host
让容器共享主机网络栈,使 X11 通信可以直接通过 localhost 进行.Xauthority
文件解决 X11 的身份验证问题/tmp/.X11-unix
目录让容器内程序可以连接到主机的 X11 服务器进入容器后是显示出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个显示则表示显示成功:
分析一下
/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 脚本。让我逐步分析这个脚本的内容和功能:
bash展开代码source /opt/ros/kinetic/setup.sh
source /root/catkin_ws/devel/setup.sh
bash展开代码(roslaunch mbot_gazebo mbot_laser_nav_gazebo.launch)&
bash展开代码(roslaunch mbot_navigation gmapping_demo.launch)&
bash展开代码rosbag play control.bag
时间控制:
这个脚本的典型用途是:
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!