如何在docker内运行ROS2(dashing)的“小乌龟(turttlesim)”
文章目录
前置条件
首先需要安装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内
有人会问为什么是 :0
,你只需要在宿主机echo
一下DISPLAY
就明白了。
export DISPLAY=主机IP:0
在主机
cd /etc/lightdm/lightdm.conf.d
# 如果没有该文件,请自行创建
sudo gedit lightdm.conf
# 增加两行
[SeatDefaults]
xserver-allow-tcp=true
# 然后
sudo systemctl restart lightdm
xhost +
然后就可以了
这种方式用的是IP地址,在系统没联网时,网卡就没有分配的IP地址了,这种方法就行不通了
注意
两种方法每次重新开机需要在本机运行一次
xhost +
第二种方法还需要在docker
内运行一下
export DISPLAY= XXX:0
当然,你也可以写进开机选项或者~/.bashrc
,根据你的需求来就好
测试是否可以显示图像
#安装这个小程序
sudo apt-get install xarclock
#运行,如果配置成功,会显示出一个小钟表动画
xarclock
END.