问题

我是 Xshell 连接的 VirtualBox 的 Ubuntu16.04 版本
是因为我在命令行窗口启动 GUI 界面导致的

QXcbConnection: Could not connect to display localhost:17.0
rqt: cannot connect to X server localhost:.0

解释

17.0 是 DISPLAY 变量的值
关于DISPLAY 变量的解释,建议可以参考 Linux DISPLAY环境变量的妙用 文章格式有点乱,但戳中了正点.

解决方法

  1. 删掉 Docker 容器,在图形化桌面开启容器,因为这样默认分配到图形化桌面的显示器来显示
    root@ubuntu:/home/walker# docker container rm kinetic -f
    root@ubuntu:/home/walker# docker run -itd --name kinetic --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" -v "/root/.ros/:/root/.ros/" osrf/ros:kinetic-desktop-full-xenial rqt
  2. 这个未经验证,是根据对 DISPLAY 的理解来推理的(请自己肉测)
    1)查看图形化桌面的 DISPLAY 值
    2)修改报错的那个终端的 DISPLAY 值为系统桌面的

若碰到 No protocol specified rqt: cannot connect to X server :1 提示,记得赋权限

root@ubuntu:/home/walker# echo ${DISPLAY}
:1
root@ubuntu:/home/walker# xhost +
access control disabled, clients can connect from any host