🚀今天来分享一下通过VsCode的Remote-SSH插件在远程服务器的docker中打开Rviz进行可视化的方法。
具体流程如下图所示,在操作开始前,请先重启设备
,排除之前运行配置的影响:
⭐️ 我这里是使用主机连接服务器,并在服务器中运行docker,并把该docker中运行的rviz窗口传回主机端显示。相当于有两步转发,即第一步从主机端到服务器本地端,第二步从服务器本地端到服务器docker端,如果你没有docker需求,只需要完成第一步转发即可。
🌔01
主机端配置
⭐️ 我主机端使用的是Win10,并已确保ssh可以正常使用。
1.1 配置Xming
①
{\color{#E16B8C}{①}}
① 下载并安装Xming。
②
{\color{#E16B8C}{②}}
② 把XLaunch创建一份快捷方式在桌面,以后每次要进行X11远程窗口显示都要启动它。
③
{\color{#E16B8C}{③}}
③ 打开XLaunch,设置Display number,我这里设置的是10,之后的设置默认即可。
设置完毕后,桌面右下角会出现Xming Server图标,并显示你刚刚设置的Display number。
1.2 设置DISPLAY环境变量
① {\color{#E16B8C}{①}} ① Win+R后输入以下命令,直接进入环境变量设置窗口界面
rundll32.exe sysdm.cpl,EditEnvironmentVariables
②
{\color{#E16B8C}{②}}
② 新建用户变量如下:
③
{\color{#E16B8C}{③}}
③ 打开cmd,输入以下命令进行验证,如果输出localhost:10.0,则环境变量设置成功。
echo %DISPLAY%
1.3 配置Remote-SSH
①
{\color{#E16B8C}{①}}
① 打开vscode,并安装Remote-SSH插件。
②
{\color{#E16B8C}{②}}
② 在vscode界面Ctrl+Shift+P,输入以下命令打开.ssh/config文件:
Remote-SSh:Open SSH Configuration File
③ {\color{#E16B8C}{③}} ③ 编辑config文件,添加以下信息,其中,ip填你服务器的ip地址,SSH端口默认是22,也可以根据你自身服务器的端口设置,而这3个Forward配置与X11显示密切相关。
Host [your_ip]
HostName [your_ip]
User [your_username]
Port 22
ForwardX11 yes
ForwardX11Trusted yes
ForwardAgent yes
④ {\color{#E16B8C}{④}} ④ 配置完毕vscode的.ssh/config后,重新打开vscode,在侧边栏的这个图标界面可以连接服务器。
🌔02
服务器本地端配置
⭐️ 我服务器使用的是Ubuntu18.04,并已确保ssh可以正常使用。
2.1 设置DISPLAY环境变量
① {\color{#E16B8C}{①}} ① 由于vscode使用remote-ssh插件连接服务器后,每打开服务器中的一个文件夹进行编辑,就相当于打开了一个新的shell,进行了一次新的ssh连接,这时候,服务器本地端的DISPLAY环境变量会出现异常,于是把环境变量设置写入服务器的.bashrc中加以解决:
export DISPLAY=localhost:10.0
② {\color{#E16B8C}{②}} ② 在服务器端打开一个新的终端(vscode可以通过Ctrl+Shift+`打开),输入以下命令进行验证,若输出localhost:10.0,说明环境变量设置正确。
echo $DISPLAY
2.2 xclock验证
① {\color{#E16B8C}{①}} ① 终端运行以下命令进行简单验证:
xclock
如果显示了时钟窗口,则验证成功。
②
{\color{#E16B8C}{②}}
② 此时,如果你不在服务器中使用docker,而是直接在服务器本地端运行rviz,那么rviz的可视化窗口就像xclock一样,也是能在你的主机端显示的。
🌔03
服务器docker端配置
⭐️ 我的docker运行在服务器端,且docker可以正常使用,且默认你已经准备好了带ros2的linux的docker镜像(ros1同理)。
3.1 创建container
① {\color{#E16B8C}{①}} ① 现在需要在从镜像创建容器这一步加上一些有关X11的配置:
docker run \
-it \
--name [your_container_name] \
-w [your_workspace] \
-v [your_src_folder]:[your_dst_folder] \
-v /tmp/.X11-unix:/tmp/.X11-unix:rw \
-v $HOME/.Xauthority:/root/.Xauthority:rw \
-e DISPLAY=$DISPLAY \
--net=host \
--shm-size=5g \
-p 6006:6006 \
-p 2222:22 \
[your_image:tag]
② {\color{#E16B8C}{②}} ② 其中与X11有关的选项说明如下:
① -v /tmp/.X11-unix:/tmp/.X11-unix:rw:
这是一个卷挂载选项,将主机的 /tmp/.X11-unix 目录挂载到容器的同一目录中,并设置为读写模式 (rw)。
这个目录通常用于 X11(图形界面系统)的 Unix 套接字通信,这样容器就可以访问主机的图形界面。
② -v $HOME/.Xauthority:/root/.Xauthority:rw:
这也是一个卷挂载选项,将主机用户的 .Xauthority 文件挂载到容器的 /root/.Xauthority 中,并设置为读写模式。
.Xauthority 文件用于存储 X11 的授权信息,这样容器可以使用主机的 X11 会话。
原则上这样就不需要再在服务器本地端设置X11权限了,如果为了保险,可以在服务器本地端运行命令:xhost +
③ -e DISPLAY=$DISPLAY:
这是一个环境变量设置选项,将主机的 DISPLAY 环境变量传递给容器。
DISPLAY 变量指定 X11 服务器的地址,通常用于图形界面应用程序。
④ --net=host:
这个选项让容器使用主机的网络堆栈。
使用 host 网络模式,容器将与主机共享网络接口和 IP 地址,这样可以直接访问主机的网络资源(包括代理 e.g.clash)
3.2 检查DISPLAY环境变量
① {\color{#E16B8C}{①}} ①在服务器docker端内,运行以下命令,验证DISPLAY环境变量是否传递成功,若输出localhost:10.0,说明环境传递设置正确。
echo $DISPLAY
3.3 rviz验证
① {\color{#E16B8C}{①}} ① 在服务器docker端内,运行以下命令,验证rviz是否可以在主机端显示出来。
rviz2
② {\color{#E16B8C}{②}} ② 如果没有成功显示,并报错,可以尝试先退出并停止容器,然后再重启容器进行尝试:
exit
docker stop [your-container_name]
docker start [your-container_name] && docker exec -it [your-container_name] /bin/bash
③
{\color{#E16B8C}{③}}
③ 最后的最后,重启设备
,再次尝试在docker中打开rviz,如果成功了,之后就可以稳定的进行可视化调试了。