自从买了新电脑,遇到的麻烦接连不断。先是安装Ubuntu系统安装不上,安装完成之后网卡、触控板等硬件都没有打上驱动,折腾了老半天,把ubuntu的内核升级到了Ubuntu20.04所支持的最高版本,然而还是没有解决驱动的问题,遂一气之下将系统升级为了Ubuntu22.04,这一次安装完系统后驱动全部自动打好,之前的各种小毛病也消失了。
但是问题来了,鄙人习惯于使用Ubuntu20.04+ROS1 noetic进行开发,而Ubuntu22.04不支持ROS1,遂决定使用Docker ROS。因此我学习Docker仅仅是为了能够让Docker ROS使用起来和直接装在环境一样。
以下内容权且当作我的学习笔记。
Docker及其命令简介
1、Docker基本概念:
docker 镜像(image)与容器(container)的关系:
镜像:只读的模板,可以用来创建container容器
容器:在镜像之上的可编辑层
要使用Docker ROS,首先要有一个Docker镜像,然后使用docker run命令生成一个docker容器,而我们要使用的ROS就运行在这个容器里面。
2、Docker常用命令
1、镜像Image命令:
{image:tag}→{镜像名称:镜像版本号}
注:版本号默认是latest
docker images # 查看本机镜像列表
docker rmi {-f} {image} # 删除镜像(-f强制删除)
docker search {image} # 搜索镜像
docker pull {image:tag} # 拉取镜像
docker system df # 查看镜像容器所占的空间
2、容器Container命令
docker ps -a # 查看本机所有container
docker rm {container_name} # 删除container
docker start {container_name} # 打开container
docker stop {container_name} # 关闭container
docker exec -it {container_name} /bin/bash # 进入container
3、Docker服务命令:
syetemctl start docker # 启动docker
systemctl stop docker # 停止docker
systemctl restart docker 重启docker
查看docker状态: systemctl status docker
查看docker概要信息:docker info
4、Docker run命令:
# 后面会讲
Docker ROS的安装与配置
1、安装docker和镜像
直接使用鱼香ROS一键安装(使用鱼香ROS只是为了安装docker镜像)
小鱼的一键安装系列 | 鱼香ROS (fishros.org.cn)
wget http://fishros.com/install -O fishros && . Fishros
选择noetic版本,安装过程中要输入container名称。安装完成之后应会生成一个你自己命名的container,输入名称即可进入。其实docker ros已经安装完了,但是这个container并不好用(没有nvidia-container-toolkit,没有串口且无法实现局域网通信),因此需要一些操作重新docker run一个container出来使用。
安装完成之后直接输入命令把container删掉,留下镜像就行。
输入以下命令:
docker images # 查看镜像列表
显示如下图:
这个fishros2/ros:noetic-desktop-full就是我们要使用的镜像。(其他镜像是我自己装的,请忽视)
2、使用docker run命令生成一个我们需要的容器,并制作启动脚本
以下操作参考了这篇文章,欢迎大家前去围观:
针对ros机器人开发同学的docker入门教程 - 哔哩哔哩 (bilibili.com)
这个up@我不是姓崔的还做了视频:
【教程向】机器人专业Docker入门指南【鱼香ros】_哔哩哔哩_bilibili
我在学习的时候也参考学习了这篇文章,这里把我使用到的部分列出来:
1、docker run命令生成容器
直接说答案:
sudo docker run -dit \
--name={输入container的名称} \
--privileged \
-e DISPLAY=unix$DISPLAY \
-w /home/{ubuntu用户名} \
--net=host \
-v /dev:/dev \
-v /home/{ubuntu用户名}:/home/{ubuntu用户名} \
-v /tmp/.X11-unix:/tmp/.X11-unix \
fishros2/ros:noetic-desktop-full
#--gpus all \ # 如果安装了nvidia-container-toolkit,可以加上这一行
其中比较关键的是-v命令,其能够将docker内的文件夹内容与我们的主机实时映射,作用类似于VMware虚拟机的共享文件夹。关于容器数据卷详细教程可以参考这个视频:
30_容器数据卷能干嘛_哔哩哔哩_bilibili
2、如何像鱼香的docker ros一样打开和关闭ROS的container
鱼香ROS安装的容器可以输入容器名称这样进入,如下图所示:
但是你创建的容器的开关和进入需要使用以下命令,非常麻烦:
docker start {container_name} # 打开container
docker stop {container_name} # 关闭container
docker exec -it {container_name} /bin/bash # 进入container
其实鱼香ROS不过是使用了脚本来进行启动,其脚本位置在/home/{用户名}/.fishros/bin/
以下是一键生成脚本的python文件
def generate_shell_file(container_name):
shell_content = f'''
xhost +local: >> /dev/null
echo "请输入指令控制{container_name}: 重启(r) 进入(e) 启动(s) 关闭(c) 删除(d) 测试(t):"
read choose
case $choose in
r) docker restart {container_name};;
e) docker exec -it {container_name} /bin/bash;;
s) docker start {container_name};;
c) docker stop {container_name};;
d) docker stop {container_name} && docker rm {container_name} && sudo rm -rf /home/kr/.fishros/bin/ros;;
t) docker exec -it {container_name} /bin/bash -c "source /ros_entrypoint.sh && roscore";;
esac
newgrp docker
'''
with open('/home/{user_name}/.fishros/bin/'+f'{container_name}', 'w',encoding='utf-8') as file: # 把{user_name}改成自己的用户名
file.write(shell_content)
container_name = input("请输入容器名称:")
generate_shell_file(container_name)
print("Shell文件已生成!")
输入以下命令:
su -
python3 container_shell_producer.py
生成脚本成功后,还需要为其添加可执行权限:
cd /home/{user_name}/.fishros/bin/
chmod +x {脚本名称}
输入容器名称即可启动脚本,轻松启动关闭进入容器。文章来源:https://www.toymoban.com/news/detail-853987.html
此时docker ros使用起来已经和20.04+noetic大差不差了。文章来源地址https://www.toymoban.com/news/detail-853987.html
到了这里,关于如何像正常使用ROS一样使用Docker ROS?Ubuntu22.04在docker中安装noetic版本ROS的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!