目录:
- 前言
- 原理解析
- 实现步骤
- 机器人端(X client):
- 1、安装一些必要的软件
- 2、修改`/etc/ssh/sshd_config `中的四个地方
- 调试端(X server):
- 测试效果
前言
最近在做机器人平台调试的时候,遇到了一些特殊的需求。比如:我们一般通过ssh
的方式远程登陆机器人端的小电脑进行开发(用远程桌面的方式画质太低了;另外,ROS
组网的方式很多时候要设置rviz
订阅的话题以及配置一些显示参数,效率太低了),不同于服务器的运维,我们的机器是上面运行着ROS
系统,有时候我们需要打开rviz
做一些可视化,所以这时候就需要远程打开某些图形软件了。有没有一种办法可以在我们自己的win11上显示出机器人端的软件(如:rviz
、gazebo
)呢?答案是肯定的,我们可以通过X11
服务实现。
原理解析
不同于Windows,从 Windows 95 开始,图形界面就直接在系统内核中实现了,是操作系统不可或缺的一部分。Linux 本身是没有图形化界面的,所谓的图形化界面系统只不过中 Linux 下的应用程序。Linux 的图形化界面,底层都是基于 X 协议,我们平时使用的Ubuntu系统桌面版实际上也是通过X11进行图形显示的。我们完全可以在服务器端执行程序的计算部分,将程序的显示部分放在图形终端上。
-
X Window System 常被简称为 X11 ,其功能包括窗口的绘制、移动,以及与鼠标、键盘等输入设备的交互。
-
C/S模型:一个X server
和多个应用程序(client)通信。server
接收client
的请求绘制窗口,并将来自鼠标、键盘等设备的输入传递给client
。
-
X 协议由 X server 和 X client 组成:
X server 管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面的绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知 X client。
X client (即 X 应用程序) 则主要负责事件的处理(即程序的逻辑)。
X server
和X client
可以位于同一计算机上,就类似于平时使用的Windows操作系统;当X server
和X client
不在同一计算机时,只要彼此通过 X 协议通信,即可使用本地的X server
进行绘制、交互,就变成了远程桌面。
所以,在本地显示 (X server),运行在服务器上的 GUI 程序 (X client),实际上这样的操作是可以通过 SSH X11 Forwarding (转发) 来实现。
实现步骤
机器人端(X client):
1、安装一些必要的软件
$ sudo apt update
$ sudo apt install x11-apps vim ssh
2、修改/etc/ssh/sshd_config
中的四个地方
$ sudo vim /etc/ssh/sshd_config
- PermitRootLogin yes
- X11Forwarding yes
- X11UseLocalhost no
PS: 使用vim
的查找功能可以快速定位。命令模式下 /xx 就可以在当前文档中查找 xx
有时候root用户无法远程登陆是因为现在比较新的Linux版本都没有给root设置密码,而且默认不允许用户远程空密码登陆,所以我们root账户是没有任何密码的。所以无法远程登陆root,想要远程登陆root用户,就要给用户设置一个密码。
$ sudo passwd root
设置密码,并在/etc/ssh/sshd_config
中设置 PermitRootLogin
变量为yes
即可
调试端(X server):
命令行中输入
$ xhost +
然后在ssh
远程登陆的时候带上 -X
参数即可
测试效果
下面我们通过看看是否能够在调试端打开rviz
首先通过ssh的方式远程登陆到机器人端,因为我们暂时使用的是ROS1,所以我们首先启动Master节点
然后再开一个终端输入rviz
可以看到正常显示,之后就可以愉快地使用远程调试啦~
能在win11系统打开rviz
和gazebo
这种画面感觉还是很神奇的,但了解了 它背后的原理觉得也就那么回事。实际上,这种方法还可以应用到docker
,因为通常docker
是没有图形化界面的,但是因为某些原因可能偶尔还是需要调出某个程序的GUI所以也可以通过X11服务来实现。
但是,也有一些小问题,在高刷新的场景下还是会有点卡顿,比如:激光雷达的点云渲染的时候
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)