Docker中配置ROS(二)——安装ros的docker镜像,测试turtlebot

目录
1.ubuntu添加国内镜像源
2.安装docker
3.docker内安装ros

1.ubuntu添加国内镜像源

1.1 打开source.list文件
sudo gedit /etc/apt/sources.list
1.2 添加清华镜像源,复制下列内容到sources.list文件中,注意是ubuntu18.04

# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

1.3 更新apt
sudo apt-get update

2.安装docker

2.1 卸载旧版本

sudo apt-get remove docker docker-engine docker.io containerd runc

2.2 安装软件包以允许 apt 通过 HTTPS 使用存储库

sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

2.3 添加docker的国内源(注意区分镜像源与docker源

docker的官方源下载比较慢,需要更换为国内源,这里用了腾讯源

2.3.1 添加 Docker 使用的GPG公钥
curl -fsSL https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

2.3.2 添加 Docker 远程仓库
sudo add-apt-repository "deb [arch=amd64] https://mirrors.cloud.tencent.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update

2.4 安装最新版本的 Docker Engine-Community 和 containerd

sudo apt-get install docker-ce docker-ce-cli containerd.io

安装docker

2.5 更换docker的镜像源为国内的源(没有此文件会自动创建)

2.5.1 创建(打开)/etc/docker/daemon.json文件
sudo gedit /etc/docker/daemon.json

2.5.2 复制下列代码到json文件中

{
    "registry-mirrors": [
     "https://mirror.ccs.tencentyun.com",
     "https://docker.mirrors.ustc.edu.cn"

    ]
}

2.5.3 重启docker
sudo systemctl restart docker

2.6 测试docker是否安装成功

sudo docker run hello-world

需要稍微等待下,会从dockerhub上拉镜像下来

2.7 设置普通用户也可以使用docker命令

2.7.1 添加”docker group“
sudo groupadd docker(可能已经存在)

2.7.2 将用户添加到docker的group
sudo gpasswd -a ${USER} docker
把${USER}换成你的用户名,比如我的是
sudo gpasswd -a wanghuohuo docker

2.7.3 增加“docker.sock”文件的权限:所有人皆可读写
sudo chmod a+rw /var/run/docker.sock

2.7.4 重启服务
sudo service docker restart
sudo /etc/init.d/docker restart

2.7.5 切换当前会话到新 group
newgrp - docker

2.7.6 测试
新开一个终端以普通用户测试docker命令
docker version

3. docker内安装ros-kinetic

3.1 新开一个终端,把ros的官方镜像拉下来
docker pull osrf/ros:kinetic-desktop-full

3.2 下载完后,查看镜像,ros-kinetic的image是3.2个G
docker images

ros的docker镜像大小

3.3 根据镜像创建容器
docker run -it osrf/ros:kinetic-desktop-full bash

3.4 容器中运行rosocore
roscore

此时已经成功创建ros的容器了,接下来解决docker的GUI问题

4 打开docker中gui界面,如rviz,rqt等

docker中开启GUI原理:
xhost 是用来控制X server访问权限的。通常当你从hostA登陆到hostB上运行hostB上的应用程序时,做为应用程序来说,hostA是client,但是作为图形来说,是在hostA上显示的,需要使用hostA的Xserver,所以hostA是server。因此在登陆到hostB前,需要在hostA上运行xhost +来使其它用户能够访问hostA的Xserver.

总结:docker中显示client通过映射将对Xserver的请求透传到主机端DISPALY,DISPLAY对应主机端的显示接口,主机端也使能接收,完成显示。

xhost + 是使所有用户都能访问Xserver.
xhost + ip使ip上的用户能够访问Xserver.
xhost + nis:user@domain使domain上的nis用户user能够访问
xhost + inet:user@domain使domain上的inet用户能够访问。

4.1 运行xserver

4.1.1 终端输入
xhost +

  • 若成功启动,则跳到第4.2继续执行。
  • 若显示xhost: unable to open display,则说明没有安装vncserver。

4.2 安装vncserver

4.2.1 进入root,确认下vncserver确实没装(我也不明白为什么要进入root,但是照做就行)
su root
vncsever
若提示bash: vncserver: command not found则需要安装vnc。

4.2.2 退出root(或者重新开一个终端),安装vnc
sudo apt-get install tigervnc-standalone-server tigervnc-viewer
上面命令是我测试没问题的,网上还有其它安装的包

如果上面的命令能安装好vnc,就不用下面这些测试了,直接进入4.2.4
sudo apt-get install x11-xserver-utils
上面这个包系统已经默认装好了,但是仍然不能执行xhost +

sudo apt install xfce4 xfce4-goodies
sudo apt install tightvncserver
上面这个包没有测试过,感觉似乎可以。

sudo apt-get install tigervnc-server
上面这个包没有测试过,感觉似乎也可以。

安装完后就是配置VNC,感觉这个设置挺复杂的,采用了网上最简单的操作方式

4.2.4 安装好vnc后,进入root启动vnc
su root
vncserver
第一次运行会让你输入很多密码,输入就行,一路yes~

4.3 运行turtlesim,测试下docker中的GUI界面

接下来需要启动三个终端,分别是roscoreturtlesim_nodeturtle_teleop_key

4.3.1 第一个终端——roscore:
①docker命令新建一个容器(带GUI环境变量)

docker run -it \
    --env="DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    osrf/ros:kinetic-desktop-full \
    /bin/bash
docker run -it \
    --env="DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    osrf/ros:melodic-desktop-full \
    /bin/bash

命令解释
--env="DISPLAY" :开启显示GUI界面
--env="QT_X11_NO_MITSHM=1" :采用X11的端口1进行显示
--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" :映射显示服务节点目录
osrf/ros:kinetic-desktop-full:容器从镜像osrf/ros:kinetic-desktop-full创建
/bin/bash:运行命令bash

②创建完容器后,命令行自动进入了docker,接着运行roscore
source /opt/ros/kinetic/setup.bash
roscore

在创造容器的时候,环境就陪伴着容器,每次进去就会默认加载第一次的环境。

4.3.2 第二个终端——turtlesim_node:

①先查看之前新建的容器名称
docker ps --all
②进入容器中
docker exec -it /bin/bash
③运行turtlesim_node
source /opt/ros/kinetic/setup.bash
rosrun turtlesim turtlesim_node

小海龟界面

4.3.3 第三个终端——键盘控制:
①进入同一个容器中
docker exec -it /bin/bash
source /opt/ros/kinetic/setup.bash
②运行遥控键盘
rosrun turtlesim turtle_teleop_key
此时即可控制小海龟运动

键盘控制

4.3.4 docker容器启动的主次之分
进入docker之前,有一个终端是执行的start或者run命令的,其它终端是执行exec命令进入docker的。前者退出docker会导致整个容器都停止运行,所有会话自动退出。而后者彼此之间不会相互影响。

如本例中,第一个终端退出会导致第二第三个终端退出,而第二第三个终端退出,并不会影响其它终端。

4.4 测试gazebo和rviz

rviz和gazebo都能正常打开,但是终端会报错,提示libGL error

4.4.1 rviz
实测报错,缺少一些包,但是可以正常打开


4.4.2 gazebo
实测报错,缺少一些包,但是可以正常打开


4.5 测试catkin_make编译
和上面一样进入到docker容器中,不再赘述,然后建立一个空package,测试编译
mkdir -p catkin_ws/src
cd catkin_ws/src
catkin_create_pkg test rospy roscpp
cd ..
catkin_make

4.6 测试git(随便找的链接)
git clone https://github.com/octocat/Hello-World

最后,该docker里面没有gedit和Vi

参考:
1 docker安装
https://evilran.me/2021/05/solve-docker-installation-too-slow-on-ubuntu
https://juejin.cn/post/7011154334645747719

2 docker中安装ros

3 如何在Ubuntu 18.04上安装和配置VNC
https://cloud.tencent.com/developer/article/1350304

4 Docker容器运行GUI程序的配置方法
https://www.cnblogs.com/panpanwelcome/p/12877902.html

为什么要新建一个docker的用户组group
https://www.zhangshengrong.com/p/YjNKpbA6XW/

你可能感兴趣的:(Docker中配置ROS(二)——安装ros的docker镜像,测试turtlebot)