如何在docker内运行ROS2(dashing)的“小乌龟(turttlesim)”

如何在docker内运行ROS2(dashing)的“小乌龟(turttlesim)”

文章目录

    • 如何在docker内运行ROS2(dashing)的“小乌龟(turttlesim)”
      • 前置条件
      • deb安装turttlesim
      • 源码安装turttlesim
      • 运行turttlesim
      • 关于docker
      • 方法一:需重新启动一个新的容器
        • 开放权限(在主系统)
        • 启动docker
        • 可视化
      • 方法二:不需要重新启动新的容器
        • 分别查看主机与docker的ip地址
        • 在docker内
        • 在主机
      • 注意
      • 测试是否可以显示图像

前置条件

首先需要安装docker及ROS2,不赘述

deb安装turttlesim

dashing后的版本都可直接apt安装

sudo apt update
sudo apt install ros-dashing-turtlesim

检查是否安装成功

ros2 pkg executables turtlesim
#成功则返回
turtlesim draw_square
turtlesim mimic
turtlesim turtle_teleop_key
turtlesim turtlesim_node

源码安装turttlesim

#记得选择对应版本的分支
git clone https://github.com/ros/ros_tutorials.git -b dashing-devel
cd ros_tutorials
colcon build
#加载环境变量
source /opt/ros/dashing/setup.bash
source install/local_setup.bash

运行turttlesim

ros2 run turtlesim turtlesim_node

此时会报错,因为docker内只是命令行终端,没有图形化界面

QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'
qt.qpa.screen: QXcbConnection: Could not connect to display 
Could not connect to any X display.

关于docker

docker本身的工作模式是命令行的,其主要使用场景是做服务器后端方面的比较多。原理上可以把docker镜像看作一台没有显示器的电脑,程序可以运行,只是没地方显示。所以只需要让其与linux系统共享显示就行。具体步骤如下:

方法一:需重新启动一个新的容器

开放权限(在主系统)

#允许所有用户,包括docker,访问X11 的显示接口
sudo apt-get install x11-xserver-utils
xhost +
#输出为:access control disabled, clients can connect from any host

启动docker

#添加选项
-v /tmp/.X11-unix:/tmp/.X11-unix \           #共享本地unix端口
 -e DISPLAY=unix$DISPLAY \                    #修改环境变量DISPLAY
 -e GDK_SCALE \                               #我觉得这两个是与显示效果相关的环境变量,没有细究
 -e GDK_DPI_SCALE \

最终启动命令示例

docker run -d -it   -v /etc/localtime:/etc/localtime:ro   -v /tmp/.X11-unix:/tmp/.X11-unix   -e DISPLAY=unix$DISPLAY   -e GDK_SCALE   -e GDK_DPI_SCALE ros2:dashing

可视化

然后运行turttlesim,便可以看到熟悉的小乌龟了

关于docker的使用也不赘述

方法二:不需要重新启动新的容器

主机与docker其实就是server/client模式,可通过IP地址来映射显示

分别查看主机与docker的ip地址

ifconfig

在docker内

export DISPLAY=主机IP

在主机

sudo gedit /etc/lightdm/lightdm.conf
#增加一行    xserver-allow-tcp=true
sudo systemctl restart lightdm 
xhost  +  

然后就可以了

这种方式用的是IP地址,在系统没联网时,网卡就没有分配的IP地址了,这种方法就行不通了

注意

两种方法每次重新开机需要在本机运行一次

xhost +

第二种方法还需要在docker内运行一下

export DISPLAY= XXX

当然,你也可以写进开机选项或者~/.bashrc,根据你的需求来就好

测试是否可以显示图像

#安装这个小程序
sudo apt-get install xarclock  
#运行,如果配置成功,会显示出一个小钟表动画
xarclock                      

END.

你可能感兴趣的:(linux,Ubuntu)