--- marp: true theme: uncover paginate: true --- # Nix/Nixos ОС-независимая сборка пакетов ROS | Брылёв Игорь robossembler.org --- # Что же такое ROS? * Стандарт * Фреймворк * Набор форматов * ... * Система сборки и дистрибьюции ПО --- ### Проблемы пакетных менеджеров * Апгрейд конфигурации безвозвратно изменяет состояние системы * Сборки не детерминированы * Не поддерживаются разные версии бинарников и библиотек * Конфликты пакетов --- #### Проблемы управления зависимостями в ROS * Зависимость от Ubuntu и её системных зависимостей (apt-пакеты) * Сложность интеграции с ПО вне ROS-экосистемы * Подготовить для удобного запуска сложный ROS-проект - трудоёмкая задача --- # Тренды * Из набора библиотек для одного робота ROS становится стандартом для роботизированных кибер-физических систем * В робототехнику проникают инструменты из других ниш: web, машинное обучение, DevOps --- # А как же Docker? --- ![](reproducible-testing.jpg) --- # "В" воспроизводимость --- # Теория Dockerfile -> Image --- # Реальность Dockerfile -> Image1 || Image2 ... ImageN --- # Типичный Dockerfile для ROS FROM ros:foxy-ros-base-focal ... RUN rosdep update && apt-get update ... RUN apk add --no-cache python g++ make ... RUN curl -sSL http://get.gazebosim.org | sh ... CMD [ "ros2", "launch", "app", "app_bringup.launch.py" ] --- # Ключевая идея nix Описывать сборку в виде _чистой функции_ или уравнения(derivation), результат исполнения строго детерминирован входными параметрами. --- ![](eelco.jpeg) Eelco Dolstra ## The Purely Functional Software Deployment Model PhD Thesis'2006 https://edolstra.github.io/pubs/phd-thesis.pdf --- # Парадигмы программирования * Императивная (как?) - C, C++, Java * Декларативная (что?) - Lisp, Prolog, Nix --- # Парадигмы конфигурации * Императивная конфигурация (apt) - Изменение состояния (dependency hell, неконсистентные состояния) * Декларативная конфигурация (nix) - Пакеты = иммутабельные переменные (нельзя изменить напрямую, только через функцию) - Одно и то же nix-выражение даёт всегда один и тот же результат --- { pname = "hello"; version = "2.12.1"; src = fetchurl { url = "http://github.com/hello-${version}.tar.bz2"; sha256 = "0x2g1jqy..."; }; buildInputs = [ libbar perl ncurses ]; buildPhase = ''gcc hello.c -o hello''; installPhase = ''mkdir -p $out/bin && cp hello $out/bin''; } --- { "builder": "/nix/store/561wgc73s0x1250hrgp7jm22hhv7yfln-bash-5.2-p15/bin/bash", "env": { "builder": "/nix/store/561wgc73s0x1250hrgp7jm22hhv7yfln-bash-5.2-p15/bin/bash", "out": "/nix/store/260q5867crm1xjs4khgqpl6vr9kywql1-hello-2.12.1", "src": "/nix/store/pa10z4ngm0g83kx9mssrqzz30s84vq7k-hello-2.12.1.tar.gz", "stdenv": "/nix/store/b09v23lirgvci3wzszh22mbkdfj0h0yq-stdenv-linux", "version": "2.12.1" }, "inputDrvs": { "/nix/store/0hnjp6s8k71xm62157v37zg3qzwvl8lx-bash-5.2-p15.drv": [ "out" ], "/nix/store/8n3ib41pb90nkq3vv49z520qinf4q9c0-hello-2.12.1.tar.gz.drv": [ "out" ], "/nix/store/r2h029bx2fbyxxj84s5hf1abp2vfkah2-stdenv-linux.drv": [ "out" ] }, "inputSrcs": [ "/nix/store/6xg259477c90a229xwmb53pdfkn6ig3g-default-builder.sh" ], "outputs": { "out": { "path": "/nix/store/260q5867crm1xjs4khgqpl6vr9kywql1-hello-2.12.1" } }, "system": "x86_64-linux" } } --- $ ls /nix/store/ | grep humble 00z4hg8q0cxhsl5jq4s7iq81zz54j8vy-ros-humble-ament-lint-common-0.12.5-r1 01nvrmwbf0zbchb3d25kb49rl8jzspv6-ros-humble-ament-cmake-cppcheck-0.12.5-r1 02gdrzn2yrngmqih4hq0j17vj2hgiiz3-ros-humble-unique-identifier-msgs-2.2.1-r3 08s5gvg7gaypllyxvzd17w21ijqx3hgd-ros-humble-tf2-msgs-0.25.2-r1 0hwva9zk3250hd6spwq11ayk0aq4flnm-ros-humble-control-msgs-4.1.0-r1 --- ![width:900px](drv-cryptohash.png) --- # Что это даёт для ROS? * Возможность запустить проект ROS на любой ОС, даже без apt * Контролируемое управление зависимостями * Возможность использования разных версий одних и тех же пакетов и библиотек * Детерминированные сборки одной командой * CACHE!!! --- # Основные компоненты nix * Nix (менеджер пакетов и язык программирования) * Nixpkgs (репозиторий пакетов и стандартная библиотека) * NixOS (операционная система) * NixOps (DevOps инструмент) --- ![width:1000px](map_repo_size_fresh-2018-06-08.svg) --- ## Nix ROS Overlay https://github.com/lopsided98/nix-ros-overlay Автоматическая генерация nix-выражений для сборки пакетов ROS из официальных репозиториев (github:ros/rosdistro). --- { lib, buildRosPackage, fetchurl, ament-cmake ... }: buildRosPackage { pname = "ros-rolling-std-msgs"; version = "4.6.1-r1"; src = fetchurl { url = "https://github.com/ros2-gbp/common_interfaces/std_msgs/4.6.1-1.tar.gz"; name = "4.6.1-1.tar.gz"; sha256 = "87eee895c2c60a8335ae2a63b05f99773f0897e451e5bf7f45a14a6c36295640"; }; buildType = "ament_cmake"; buildInputs = [ ament-cmake rosidl-default-generators ]; checkInputs = [ ament-lint-common ]; propagatedBuildInputs = [ builtin-interfaces rosidl-default-runtime ]; nativeBuildInputs = [ ament-cmake rosidl-default-generators ]; meta = { description = ''A package containing some standard message definitions.''; license = with lib.licenses; [ asl20 ]; }; } --- # Недостатки * Пологая кривая обучения * Некоторая разрозненность документации * Не все пакеты ROS адаптированы в nix * Необходимость сборки мусора --- # Полезные ресурсы ![width:200px](nix-snowflake.svg) Русскоязычное сообщество Telegram @ru_nixos Туториал для новичков zero-to-nix.com