赞
踩
自从买了新电脑,遇到的麻烦接连不断。先是安装Ubuntu系统安装不上,安装完成之后网卡、触控板等硬件都没有打上驱动,折腾了老半天,把ubuntu的内核升级到了Ubuntu20.04所支持的最高版本,然而还是没有解决驱动的问题,遂一气之下将系统升级为了Ubuntu22.04,这一次安装完系统后驱动全部自动打好,之前的各种小毛病也消失了。
但是问题来了,鄙人习惯于使用Ubuntu20.04+ROS1 noetic进行开发,而Ubuntu22.04不支持ROS1,遂决定使用Docker ROS。因此我学习Docker仅仅是为了能够让Docker ROS使用起来和直接装在环境一样。
以下内容权且当作我的学习笔记。
docker 镜像(image)与容器(container)的关系:
镜像:只读的模板,可以用来创建container容器
容器:在镜像之上的可编辑层
要使用Docker ROS,首先要有一个Docker镜像,然后使用docker run命令生成一个docker容器,而我们要使用的ROS就运行在这个容器里面。
{image:tag}→{镜像名称:镜像版本号}
注:版本号默认是latest
- docker images # 查看本机镜像列表
-
- docker rmi {-f} {image} # 删除镜像(-f强制删除)
-
- docker search {image} # 搜索镜像
-
- docker pull {image:tag} # 拉取镜像
-
- docker system df # 查看镜像容器所占的空间
- 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
- syetemctl start docker # 启动docker
-
- systemctl stop docker # 停止docker
-
- systemctl restart docker 重启docker
-
- 查看docker状态: systemctl status docker
-
- 查看docker概要信息:docker info
# 后面会讲
直接使用鱼香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就是我们要使用的镜像。(其他镜像是我自己装的,请忽视)
以下操作参考了这篇文章,欢迎大家前去围观:
针对ros机器人开发同学的docker入门教程 - 哔哩哔哩 (bilibili.com)
这个up@我不是姓崔的还做了视频:
【教程向】机器人专业Docker入门指南【鱼香ros】_哔哩哔哩_bilibili
我在学习的时候也参考学习了这篇文章,这里把我使用到的部分列出来:
直接说答案:
- 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虚拟机的共享文件夹。关于容器数据卷详细教程可以参考这个视频:
鱼香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 {脚本名称}
输入容器名称即可启动脚本,轻松启动关闭进入容器。
此时docker ros使用起来已经和20.04+noetic大差不差了。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。