机器人端的图形界面ssh远程显示方案

前言

最近在做机器人平台调试的时候,遇到了一些特殊的需求。比如:我们一般通过ssh的方式远程登陆机器人端的小电脑进行开发(用远程桌面的方式画质太低了;另外,ROS组网的方式很多时候要设置rviz订阅的话题以及配置一些显示参数,效率太低了),不同于服务器的运维,我们的机器是上面运行着ROS系统,有时候我们需要打开rviz做一些可视化,所以这时候就需要远程打开某些图形软件了。有没有一种办法可以在我们自己的win11上显示出机器人端的软件(如:rvizgazebo)呢?答案是肯定的,我们可以通过X11服务实现。

原理解析

不同于Windows,从 Windows 95 开始,图形界面就直接在系统内核中实现了,是操作系统不可或缺的一部分。Linux 本身是没有图形化界面的,所谓的图形化界面系统只不过中 Linux 下的应用程序。Linux 的图形化界面,底层都是基于 X 协议,我们平时使用的Ubuntu系统桌面版实际上也是通过X11进行图形显示的。我们完全可以在服务器端执行程序的计算部分,将程序的显示部分放在图形终端上。

image-20221029104759932

  • 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 serverX client可以位于同一计算机上,就类似于平时使用的Windows操作系统;当X serverX 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
  1. PermitRootLogin yes
  2. X11Forwarding yes
  3. X11UseLocalhost no

image-20221029143817110

image-20221029143735388

image-20221029143927911

PS: 使用vim的查找功能可以快速定位。命令模式下 /xx 就可以在当前文档中查找 xx

image-20221029145044659

有时候root用户无法远程登陆是因为现在比较新的Linux版本都没有给root设置密码,而且默认不允许用户远程空密码登陆,所以我们root账户是没有任何密码的。所以无法远程登陆root,想要远程登陆root用户,就要给用户设置一个密码。

$ sudo passwd root

设置密码,并在/etc/ssh/sshd_config 中设置 PermitRootLogin 变量为yes 即可

调试端(X server):

命令行中输入

$ xhost +

image-20221029145641723

然后在ssh远程登陆的时候带上 -X 参数即可

image-20221029145943983

测试效果

下面我们通过看看是否能够在调试端打开rviz

首先通过ssh的方式远程登陆到机器人端,因为我们暂时使用的是ROS1,所以我们首先启动Master节点

image-20221029150004800

然后再开一个终端输入rviz

image-20221029150129196

可以看到正常显示,之后就可以愉快地使用远程调试啦~
能在win11系统打开rvizgazebo这种画面感觉还是很神奇的,但了解了 它背后的原理觉得也就那么回事。实际上,这种方法还可以应用到docker,因为通常docker是没有图形化界面的,但是因为某些原因可能偶尔还是需要调出某个程序的GUI所以也可以通过X11服务来实现。

但是,也有一些小问题,在高刷新的场景下还是会有点卡顿,比如:激光雷达的点云渲染的时候

猜你喜欢

转载自blog.csdn.net/weixin_40599145/article/details/127588838
今日推荐