Использование rviz в удаленном соединении «Не удалось подключиться ни к одному X-дисплею».

avatar
joseandres94
1 июля 2021 в 16:03
1220
2
1

Я пытаюсь работать с rviz посредством удаленного подключения по ssh. Когда я выполняю команду rosrun rviz rviz, появляется эта ошибка:

QStandardPaths: XDG_RUNTIME_DIR не задан, по умолчанию используется '/tmp/runtime-root' qt.qpa.screen: QXcbConnection: не удалось подключиться к дисплею Не удалось подключиться ни к одному из дисплеев X.

Я уже добавил флаг -X во время ssh-подключения с помощью ssh myusername@host -X, но ничего не изменилось.

Я не знаю, что еще делать, поэтому буду рад любой помощи.

Я работаю с компьютера Mac (macOS Catalina), удаленно работаю на рабочей станции с Docker, и на моем образе установлены Ubuntu 18.04 и ROS Melodic.

Заранее спасибо.

РЕДАКТИРОВАТЬ:

Я только что попытался выполнить rviz локально на рабочей станции и получил ту же ошибку, поэтому я полагаю, что проблема не в ssh-подключении. Может ли проблема быть связана с Docker или рабочей станцией (Nvidia DGX Station)? Может ли это быть связано с проблемой разрешения?

Спасибо.

Источник
Kenster
1 июля 2021 в 16:49
1

Когда вы подключаетесь к этой удаленной системе, каково значение переменной среды DISPLAY в вашей локальной системе (в которой вы запускаете ssh)? Каково значение DISPLAY в удаленной системе (той, к которой вы подключаетесь для запуска ros)? Какой X-сервер вы используете в локальной системе?

joseandres94
1 июля 2021 в 17:10
0

Во-первых, я должен сказать, что я новичок и, в общем, я не уверен, что я делаю. Если я запускаю echo $DISPLAY локально, это то, что появляется «/private/tmp/com.apple.launchd.ZDXU5Z6owS/org.xquartz:0». Когда я делаю то же самое в удаленной системе, появляется «localhost: 10.0». Я использую XQuartz, который «является версией X.Org X Window System, работающей на macOS». Спасибо.

JuanR
2 июля 2021 в 04:14
0

вы пробовали с флагом -Y?

joseandres94
2 июля 2021 в 08:00
0

@JuanR Да, я только что попробовал, и ничего не изменилось.

Ответы (2)

avatar
alek
23 сентября 2021 в 09:29
1

В настоящее время я ничего не знаю о докере, но могу сделать для вас следующее:

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

user@local $ rosrun rviz rviz

И см. https://wiki.ros.org/ROS/NetworkSetup для получения подробной информации + настройка IP на обеих машинах.

avatar
JuanR
2 июля 2021 в 17:31
0

Обновление: Здесь приведены некоторые инструкции по запуску приложений с графическим интерфейсом в докере и MAC, которые могут быть полезны (если вы их еще не видели).

У меня есть док-контейнер с ROS, который я использую для запуска rviz и других приложений пользовательского интерфейса (приложения 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, который является источником setup.bash ROS и рабочей области devel/setup.bash.

Конечно, опыт работы с этими сценариями ограничен, поэтому я также вхожу в докер напрямую, используя следующее:

❯ cat enter-env.sh 
#!/bin/bash

docker exec -ti -w /home/ichramm/devel/robots ros1 /bin/bash

Это работает только потому, что структура каталогов контейнера совпадает со структурой хоста. (Обратите внимание, что я все равно монтирую только каталог разработки). Я также добавил пользователя с тем же именем UID и GID, что и у хоста, чтобы предотвратить проблемы с правами доступа к файлам.

Если вы не можете заставить его работать, я предлагаю вам обратиться к виртуальной машине. Просто установите Ubuntu 20.04 без пользовательского интерфейса (вы можете отключить его позже с помощью sudo systemctl set-default multi-user) и используйте SSH с переадресацией X. Я работал с этой настройкой, переключаясь на докер, и у меня все еще есть виртуальная машина на случай, если что-то случится.

Обновление: Имейте в виду, что я делаю некоторые потенциально небезопасные вещи, такие как монтирование .Xauthority. Это работает для меня, потому что никто другой не имеет доступа к моему компьютеру.