robossembler.org/docs/slides/2023-ros-meetup/ros-meetup-slides.md

17 KiB
Raw Blame History

marp theme paginate
true uncover true

Nix/Nixos

ОС-независимая сборка пакетов ROS

|

Брылёв Игорь robossembler.org


Что же такое ROS?

  • Стандарт
  • Фреймворк
  • Набор форматов
  • ...
  • Система сборки и дистрибьюции ПО

Проблемы пакетных менеджеров

  • Апгрейд конфигурации безвозвратно изменяет состояние системы
  • Сборки не детерминированы
  • Не поддерживаются разные версии бинарников и библиотек
  • Конфликты пакетов

Проблемы управления зависимостями в ROS

  • Зависимость от Ubuntu и её системных зависимостей (apt-пакеты)
  • Сложность интеграции с ПО вне ROS-экосистемы
  • Подготовить для удобного запуска сложный ROS-проект - трудоёмкая задача

Тренды

  • Из набора библиотек для одного робота ROS становится стандартом для роботизированных кибер-физических систем
  • В робототехнику проникают инструменты из других ниш: web, машинное обучение, DevOps

А как же Docker?



"В"

воспроизводимость


Теория

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 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


Что это даёт для ROS?

  • Возможность запустить проект ROS на любой ОС, даже без apt
  • Контролируемое управление зависимостями
  • Возможность использования разных версий одних и тех же пакетов и библиотек
  • Детерминированные сборки одной командой
  • CACHE!!!

Основные компоненты nix

  • Nix (менеджер пакетов и язык программирования)
  • Nixpkgs (репозиторий пакетов и стандартная библиотека)
  • NixOS (операционная система)
  • NixOps (DevOps инструмент)

width:1000px


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 Русскоязычное сообщество Telegram @ru_nixos

Туториал для новичков zero-to-nix.com