forked from Dan4ick/Lidar_Muxa
109 lines
6.6 KiB
Docker
109 lines
6.6 KiB
Docker
# FlyGuard — обнаружение посторонних объектов в тоннеле метро по данным 3D-лидара.
|
||
#
|
||
# Образ самодостаточен: во время работы сеть не нужна, все зависимости ставятся
|
||
# на этапе сборки. Базовый образ — официальный ROS 2 Humble на Ubuntu 22.04,
|
||
# ровно та среда, что указана в ТЗ.
|
||
#
|
||
# docker build -t flyguard .
|
||
# docker run --rm -it --gpus all --network host --ipc host -v /path/to/bags:/data flyguard
|
||
#
|
||
# Без --gpus all (или на машине без видеокарты NVIDIA) тот же образ считает на
|
||
# процессоре — с тем же результатом.
|
||
FROM ros:humble-ros-base-jammy
|
||
|
||
ARG DEBIAN_FRONTEND=noninteractive
|
||
|
||
# Численное ядро берётся из репозиториев Ubuntu, а не из pip: так образ собирается
|
||
# без выхода в PyPI и получает numpy/scipy, слинкованные с системным BLAS.
|
||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||
python3-numpy \
|
||
python3-scipy \
|
||
python3-opencv \
|
||
python3-pil \
|
||
fonts-dejavu-core \
|
||
python3-colcon-common-extensions \
|
||
ros-humble-rviz2 \
|
||
ros-humble-rosbag2-storage-mcap \
|
||
ros-humble-diagnostic-msgs \
|
||
&& rm -rf /var/lib/apt/lists/*
|
||
|
||
# PyTorch с CUDA 12.8 — плотные стадии конвейера на видеокарте (сетчатка,
|
||
# ламина, кластеризация; flyguard/gpu.py). Колёса несут свою среду CUDA, от
|
||
# машины нужен только драйвер NVIDIA (у стенда 580 — это до CUDA 13.0).
|
||
# 2.9.1 — последняя сборка под Python 3.10 из Ubuntu 22.04; CUDA 12.8 нужна
|
||
# для Blackwell (RTX 50xx) и годится для Ada (RTX 40xx). Весит PyTorch с
|
||
# библиотеками CUDA 6.5 ГБ, поэтому ставится одним слоем и без кэша pip.
|
||
#
|
||
# Колёса — из индекса PyTorch, а если задан TORCH_WHEELS — с этого адреса
|
||
# (сборка там, где сети нет: колёса скачиваются на соседней машине и отдаются
|
||
# любым HTTP-сервером, docker/wheels/README.md). В контекст сборки колёса не
|
||
# кладутся: это ещё 4 ГБ копий на диске.
|
||
ARG TORCH_WHEELS=
|
||
RUN set -e; \
|
||
if [ -n "$TORCH_WHEELS" ]; then \
|
||
python3 -c "import re, urllib.request as u; b = '$TORCH_WHEELS'.rstrip('/'); \
|
||
f = re.findall(r'href=\"(pip-[^\"]+\.whl)\"', u.urlopen(b + '/').read().decode())[0]; \
|
||
u.urlretrieve(b + '/' + f, '/tmp/pip.whl')"; \
|
||
python3 /tmp/pip.whl/pip install --no-cache-dir --no-index \
|
||
--find-links "$TORCH_WHEELS" torch==2.9.1; \
|
||
rm -f /tmp/pip.whl; \
|
||
else \
|
||
apt-get update && apt-get install -y --no-install-recommends python3-pip; \
|
||
pip3 install --no-cache-dir --index-url https://download.pytorch.org/whl/cu128 \
|
||
torch==2.9.1; \
|
||
rm -rf /var/lib/apt/lists/*; \
|
||
fi; \
|
||
python3 -c "import torch; print('torch', torch.__version__, 'CUDA', torch.version.cuda)"
|
||
|
||
# Видеокарта для CUDA и для RViz (OpenGL через драйвер NVIDIA при --gpus all)
|
||
ENV NVIDIA_VISIBLE_DEVICES=all \
|
||
NVIDIA_DRIVER_CAPABILITIES=all
|
||
|
||
WORKDIR /opt/flyguard
|
||
|
||
# Сначала манифесты — слой с зависимостями переживает правки кода
|
||
COPY ros2_ws/src/flyguard/package.xml ros2_ws/src/flyguard/package.xml
|
||
COPY ros2_ws/src/flyguard_msgs/package.xml ros2_ws/src/flyguard_msgs/package.xml
|
||
COPY ros2_ws/src/flyguard_msgs/CMakeLists.txt ros2_ws/src/flyguard_msgs/CMakeLists.txt
|
||
|
||
COPY ros2_ws/src ros2_ws/src
|
||
# Память тоннеля и обученное считывание MBON. Без считывания узел работает
|
||
# на ручной формуле веса улики, а у неё ложных тревог в полтора раза больше
|
||
# (13.6 против 8.0 на км, README) — замеренная конфигурация и образ должны совпадать.
|
||
COPY artifacts/mushroom_body.npz ros2_ws/src/flyguard/artifacts/mushroom_body.npz
|
||
COPY artifacts/mbon_readout.npz ros2_ws/src/flyguard/artifacts/mbon_readout.npz
|
||
|
||
# Обычная установка, без --symlink-install: тот режим оставляет в install/
|
||
# ссылки внутрь build/ и src/, и последующее удаление build/ ломает пакет.
|
||
RUN . /opt/ros/humble/setup.sh \
|
||
&& cd ros2_ws \
|
||
&& colcon build --cmake-args -DCMAKE_BUILD_TYPE=Release \
|
||
&& rm -rf build log
|
||
|
||
COPY docker/entrypoint.sh /entrypoint.sh
|
||
COPY docker/fastdds_large.xml /opt/flyguard/fastdds_large.xml
|
||
COPY docker/fastdds_udp.xml /opt/flyguard/fastdds_udp.xml
|
||
# Пульт проигрывания для `docker exec` (пауза, перемотка, скорость)
|
||
COPY docker/flyguard-keys.sh /usr/local/bin/flyguard-keys
|
||
# Снятие CR: при клонировании на Windows git может подставить CRLF, и тогда
|
||
# ядро ищет интерпретатор «bash\r». Ошибка неочевидная, а стоит одной строки.
|
||
RUN sed -i 's/\r$//' /entrypoint.sh /usr/local/bin/flyguard-keys \
|
||
&& chmod +x /entrypoint.sh /usr/local/bin/flyguard-keys
|
||
|
||
# BLAS в один поток. Матрицы конвейера мелкие, и потоки OpenBLAS не ускоряют
|
||
# кадр, а крутятся вхолостую в ожидании работы: при 4 потоках узел занимал
|
||
# 3 ядра, при одном — 0.4 ядра, а кадр даже чуть быстрее (33.9 / 39.3 мс против
|
||
# 33.2 / 40.5, медиана / p95; синтетика 43.7 / 50.2 против 45.9 / 54.7).
|
||
ENV OMP_NUM_THREADS=1 \
|
||
OPENBLAS_NUM_THREADS=1 \
|
||
MKL_NUM_THREADS=1 \
|
||
PYTHONUNBUFFERED=1 \
|
||
RCUTILS_COLORIZED_OUTPUT=1
|
||
|
||
# Транспорт под кадр в 24 МБ: умолчания Fast DDS рассчитаны на сотни килобайт
|
||
# и теряли половину кадров ещё до подписчика. Профиль поднимает сегмент
|
||
# разделяемой памяти и буферы сокетов; снимается через FLYGUARD_DDS_PROFILE=0.
|
||
ENV FASTRTPS_DEFAULT_PROFILES_FILE=/opt/flyguard/fastdds_large.xml
|
||
|
||
ENTRYPOINT ["/entrypoint.sh"]
|
||
CMD ["ros2", "launch", "flyguard", "detect.launch.py"]
|