【问题标题】:Using rviz in a remote connection "Could not connect to any X display."在远程连接中使用 rviz “无法连接到任何 X 显示器。”
【发布时间】:2021-09-13 17:14:38
【问题描述】:

我正在尝试通过与 ssh 的远程连接来使用 rviz。当我执行命令rosrun rviz rviz时,出现这个错误:

QStandardPaths: XDG_RUNTIME_DIR 未设置,默认为 '/tmp/runtime-root' qt.qpa.screen:QXcbConnection:无法连接到显示器 无法连接到任何 X 显示器。

我已经在 ssh 连接期间通过ssh myusername@host -X 添加了 -X 标志,但没有任何变化。

我不知道还能做什么,所以欢迎任何帮助。

我在 Mac 计算机 (macOS Catalina) 上工作,远程我在带有 Docker 的工作站上工作,我的映像有 Ubuntu 18.04 和 ROS Melodic。

提前谢谢你。

编辑:

我刚尝试在工作站本地执行rviz,出现同样的错误,所以我想ssh连接不是问题。问题可能是由于 Docker 或工作站(Nvidia DGX Station)造成的吗?会不会是权限问题?

谢谢。

【问题讨论】:

  • 当你连接到这个远程系统时,你本地系统(你运行 ssh 的那个)上的 DISPLAY 环境变量的值是多少?远程系统(您连接到运行 ros 的系统)上 DISPLAY 的值是多少?你在本地系统上运行什么 X 服务器?
  • 首先,我不得不说我是一个初学者,总的来说,我不确定自己在做什么。如果我在本地运行echo $DISPLAY,则会出现“/private/tmp/com.apple.launchd.ZDXU5Z6owS/org.xquartz:0”。当我在远程系统上执行相同操作时,会出现“localhost:10.0”。我正在使用 XQuartz,它是“在 macOS 上运行的 X.Org X 窗口系统的版本”。谢谢。
  • 你试过-Y标志吗?
  • @JuanR 是的,我刚试过,没有任何变化

标签: docker ssh ros


【解决方案1】:

我目前不了解 docker,但以下内容对您有用吗:

user@local $ export ROS_MASTER_URI=http://your_remote's_hostname:11311

user@local $ rosrun rviz rviz

并查看https://wiki.ros.org/ROS/NetworkSetup了解详情+两台机器上的ip配置。

【讨论】:

    【解决方案2】:

    更新:Here 是一些关于在 docker 和 MAC 中运行 GUI 应用程序的说明,可能很有用(如果你还没有看过的话)。

    我有一个带有 ROS 的 docker 容器,我用它来运行 rviz 和其他 UI 应用程序(ROS 的基于 QT 的应用程序在 KDE Neon 中不起作用)。

    docker-compose.yml 包含以下内容:

    ##############
    version: "3.8"
    
    services:
      ros:
        container_name: ros1
        network_mode: host
        # I created my own image, with my own user, etc
        image: YOUR_IMAGE
        volumes:
          # you can ignore this line if you want (I'll explain below)
          # - /home/ichramm/devel/robots:/home/ichramm/devel/robots
          - /etc/localtime:/etc/localtime:ro
          - /tmp/.X11-unix:/tmp/.X11-unix:ro
          - /home/ichramm/.Xauthority:/home/ichramm/.Xauthority:ro
          - /run/user/1000:/run/user/1000:ro
          - /run/user/1000/bus:/run/user/1000/bus:ro
        command: /entrypoint.sh
        environment:
          USER: ichramm
          DISPLAY: ${DISPLAY}
          XDG_RUNTIME_DIR=/tmp/runtime-${USER}
          DBUS_SESSION_BUS_ADDRESS: unix:path=/run/user/1000/bus
        devices:
          #- "/dev/ttyUSB0:/dev/ttyUSB0"
          #- "/dev/dri/card0:/dev/dri/card0"
          #- "/dev/dri/card1:/dev/dri/card1"
    

    您应该尝试将已安装的卷映射到您的系统。我知道您有 MAC,这意味着这可能不适合您。

    这对我有用,但我不使用 ssh,我只使用两个脚本:

    1.

    ❯ cat docker-run.sh
    #!/bin/bash
    
    docker exec -ti -w $(pwd) ros1 ./wrapper.sh $@
    
    ❯ cat wrapper.sh 
    #!/bin/bash
    
    export XDG_RUNTIME_DIR=/tmp/runtime-$USER
    
    source env.sh
    
    $@
    

    为了使其工作,您需要以下内容:

    1. 在容器中挂载工作目录(见上面的注释行)
    2. 有一个文件env.sh,其中源ROS 的setup.bash 和工作区devel/setup.bash

    当然,这些脚本的经验是有限的,这就是为什么我也直接使用以下方法进入 docker:

    ❯ cat enter-env.sh 
    #!/bin/bash
    
    docker exec -ti -w /home/ichramm/devel/robots ros1 /bin/bash
    

    这仅是因为容器的目录结构与主机的目录结构匹配。 (请注意,无论如何我只挂载开发目录)。我还添加了一个与主机中具有相同名称 UID 和 GID 的用户,以防止文件权限出现问题。

    如果你不能让它工作,我建议你转向虚拟机。只需安装没有 UI 的 Ubuntu 20.04(您可以稍后使用 sudo systemctl set-default multi-user 禁用它)并使用带有 X 转发的 SSH。我使用该设置切换到 docker 并且仍然拥有 VM,以防万一发生。

    更新:请记住,我正在做一些可能不安全的事情,例如安装 .Xauthority。它对我有用,因为没有其他人可以访问我的计算机。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2014-01-07
      • 1970-01-01
      相关资源
      最近更新 更多