如何像正常使用ROS一样使用Docker ROS?Ubuntu22.04在docker中安装noetic版本ROS

自从买了新电脑,遇到的麻烦接连不断。先是安装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 {脚本名称}

输入容器名称即可启动脚本,轻松启动关闭进入容器。

此时docker ros使用起来已经和20.04+noetic大差不差了。

  • 13
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值