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 <container_name> /bin/bash
③运行turtlesim_node
source /opt/ros/kinetic/setup.bash
rosrun turtlesim turtlesim_node

小海龟界面

4.3.3 第三个终端——键盘控制:
①进入同一个容器中
docker exec -it <container_name> /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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容