raspberry pi/orienge pi等arm架构硬件打包ros humble docker开发镜像
前言
这篇文章主要用于定制化打包需要的docker镜像,由于ros
1提供的镜像源是国外的很多软件无法更新,所以这篇文章讲如何通过定制的方式修改源,并且提前安装好需要的环境软件等。
docker hub中提供的镜像包含下边三种架构:
docker pull时会自动根据架构拉取对应的镜像,本文选择的是humble镜像,镜像名如下:
ros:humble-perception-jammy
本文开发的基础环境:
名称 | 内容 |
---|---|
系统 | ubuntu 22.04 / debian buster |
硬件 | raspberry pi或orange pi arm64V8(32V7理论上也是可以的) |
内存 | 8G |
硬盘 | 32GB |
如果是 arm64V8可以直接拉取博主上传的镜像,根据后续docker-compose启动即可:
docker pull binglee75/humble_arm_v8:240522
准备工作
安装docker可以通过这篇文章安装《如何建立并使用docker》
启动ros2 docker可以参考这篇文章《raspberry/arm 搭建ros2 docker开发环境》
国内镜像加速可参考《docker使用http服务及国内镜像加速_docker http-CSDN博客》
拉取镜像
本地拉取ros:humble-perception-jammy
2镜像
docker pull ros:humble-perception-jammy
编写Dockerfile
Dockerfile
是指导docker打包镜像的指引文件,总体文件结构如下:
.
├── Dockerfile
├── base
│ ├── base.bash
│ ├── pip.tsinghua.conf
│ ├── requirements.txt
│ ├── ros_entrypoint.sh
│ └── sources.list
└── docker-compose.yaml
下边是一份简单的文件,博主替换了现有镜像中的apt源与ros源,避免下载速度慢和连接不上的问题
FROM ros:humble-perception-jammy
LABEL Description="A Dockerfile to ros humble $RES_NAME:$TAG" Author="LinxinLi" Version="0.1"
SHELL ["/bin/bash", "-o", "pipefail", "-c"]
COPY base /app/base
WORKDIR /app/base
RUN ./base.bash
# 默认登陆用户
USER dev
ENTRYPOINT ["/ros_entrypoint.sh"]
CMD ["bash"]
sources.list 内容如下
# /etc/apt/source.list
deb http://repo.huaweicloud.com/ubuntu-ports/ jammy main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb http://repo.huaweicloud.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
deb-src http://repo.huaweicloud.com/ubuntu-ports/ jammy main restricted universe multiverse
deb-src http://repo.huaweicloud.com/ubuntu-ports/ jammy-security main restricted universe multiverse
deb-src http://repo.huaweicloud.com/ubuntu-ports/ jammy-updates main restricted universe multiverse
deb-src http://repo.huaweicloud.com/ubuntu-ports/ jammy-proposed main restricted universe multiverse
base.bash 内容如下
#!/bin/bash
set -e
# Clear official mirror
rm -f /etc/apt/sources.list
touch /etc/apt/sources.list
# Add ubuntu huawei mirror
cp ./sources.list /etc/apt/sources.list.d
# Add Pip tsinghua mirron
cp ./pip.tsinghua.conf /etc/pip.conf
# reset ros entrypoint
rm -f /ros_entrypoint.sh
cp ./ros_entrypoint.sh /ros_entrypoint.sh
# Create $USER
useradd -m -s /bin/bash -u 1000 -p '$y$j9T$VgKHVyg3h4qyu.V2kBzuj0$Q2GZP1BaFXHsEN3nwid5j/LcwRzecMWWd4SlM5F/15.' dev
usermod -aG sudo dev
# Install necessary
apt-get update
apt-get install --assume-yes --no-install-recommends --quiet=2 \
ranger \
tmux \
vim \
net-tools \
iproute2 \
cmake \
libtorch-dev \
python3-pip
# Install python packages
su dev
pip3 install -r requirements.txt
编译docker镜像
docker build -t binglee75/humble_arm_v8:240522 .
[+] Building 0.3s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 346B 0.0s
=> [internal] load metadata for docker.io/library/ros:humble-perception-jammy 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 259B 0.0s
=> [1/4] FROM docker.io/library/ros:humble-perception-jammy 0.0s
=> CACHED [2/4] COPY base /app/base 0.0s
=> CACHED [3/4] WORKDIR /app/base 0.0s
=> CACHED [4/4] RUN ./base.bash 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:cffb8cb4a411077c9559df41ce8de8bc676bfbf485f2117cb51d755dea47b3f7 0.0s
=> => naming to docker.io/binglee75/humble_arm_v8:240522
启动镜像
便捷启动可以采用docker run
命令,如下直接进入容器,会在退出后自动删除:
docker run -it --rm binglee75/humble_arm_v8:240522 bash
博主使用的是docker-compose
启动
docker-compose文件编写
networks: {}
services:
core:
command: bash
container_name: humble_armv8_ros_core
environment:
DISPLAY: ${DISPLAY}
ROS_DOMAIN_ID: 8
TERM: xterm-256color
hostname: humble
image: binglee75/humble_arm_v8:240522
logging:
driver: json-file
options:
max-file: '5'
max-size: 10m
network_mode: host
privileged: true
shm_size: 2g
stdin_open: true
tty: true
restart: always
volumes:
- /dev:/dev:rw
- /media:/media:rw
- /usr/share/zoneinfo/Hongkong:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- /tmp/.X11-unix:/tmp/.X11-unix:rw
- /usr/bin/docker:/usr/bin/docker:rw
- /run/docker.sock:/var/run/docker.sock:rw
- /home/HwHiAiUser/log/.ros:/home/dev/.ros:rw
- /home/HwHiAiUser/workspace:/home/dev/workspace:rw
working_dir: /home/dev
version: '2.3'
volumes: {}
注意上边的本地路径换成你对应的用户地址/home/HwHiAiUser/log/.ros
其中HwHiAiUser
换成你的本地路径。
启动如下:
docker-compose up -d
docker exec -it humble_armv8_ros_core bash
source /ros_entrypoint.sh
总结
ros2 arm架构的镜像个人定制大体如上所述,之所以整理这篇文章是机器人,视觉,控制等相关环境在ros包中都做好了选型,可以直接在内部做开发,博主这个镜像对torch cpu版也做了安装,方便开发使用。