···230230 url:
231231 value: https://docs.github.com/en/actions/concepts/runners/github-hosted-runners
232232 date: 2025-09-04
233233+234234+cmake:
235235+ type: book
236236+ title: The Architecture of Open Source Applications (Volume 1) CMake
237237+ author: [Bill Hoffman, Kenneth Martin]
238238+ url:
239239+ date: 2025-09-04
240240+ value: https://aosabook.org/en/v1/cmake.html
241241+242242+nixos-impatient:
243243+ type: article
244244+ title: NixOS for the Impatient
245245+ author: Fernando Borretti
246246+ date: 2023-05-07
247247+ url:
248248+ date: 2025-09-04
249249+ value: https://borretti.me/article/nixos-for-the-impatient
250250+251251+sdk2-in-source-binaries:
252252+ type: web
253253+ title: unitreerobotics/unitree_sdk2, main branch, lib/x86_64
254254+ publisher: Github
255255+ url:
256256+ date: 2025-09-04
257257+ value: https://github.com/unitreerobotics/unitree_sdk2/tree/c8a71e281093593f4dcc7bceb3b3b529ff0e36b4/lib/x86_64
258258+259259+gz-sim-overlay-update-msgs-issue:
260260+ type: web
261261+ title: "update gz-msgs · Issue #2 · muellerbernd/gazebo-sim-overlay"
262262+ publisher: Github
263263+ url:
264264+ date: 2025-09-04
265265+ value: https://github.com/muellerbernd/gazebo-sim-overlay/issues/2
266266+267267+xvfb:
268268+ type: article
269269+ title: XVFB
270270+ publisher: X.org
271271+ author: David P. Wiggins, The Open Group, Inc.
272272+ url:
273273+ date: 2025-09-04
274274+ value: https://www.x.org/archive/X11R7.7/doc/man/man1/Xvfb.1.xhtml
275275+276276+unitree-mujoco:
277277+ type: web
278278+ title: Unitree mujoco
279279+ publisher: Github
280280+ author: Unitree Robotics
281281+ url:
282282+ date: 2025-09-04
283283+ value: https://github.com/unitreerobotics/unitree_mujoco
+40-5
biblio.typ
···11#import "@preview/arkheion:0.1.0": arkheion, arkheion-appendices
2233-#let citneeded = super([[réf. nécéssaire]])
44-53#show: arkheion.with(
64 title: "Étude bibliographique I",
75 authors: (
86 (name: "Gwenn Le Bihan", email: "gwenn.lebihan@etu.inp-n7.fr", affiliation: "ENSEEIHT"),
97 ),
108 date: "2 Septembre 2025",
1111- abstract: [Ce stage porte sur l'intégration de Nix et NixOS dans les processus de développement et de déploiement logiciel dans le domaine robotique au sein du LAAS. Nix, le _package manager_, et NixOS, l'OS, sont des technologies permettant une reproductibilité, une qualité importante dans le monde de la recherche]
99+ abstract: [
1010+ Ce stage porte sur l'intégration de Nix et NixOS dans les processus de développement et de déploiement logiciel dans le domaine robotique au sein du LAAS. Nix, le _package manager_, et NixOS, l'OS, sont des technologies permettant une reproductibilité, une qualité importante dans le monde de la recherche.
1111+1212+ J'ai été aussi amenée à travailler sur la création d'un _plugin_ pour Gazebo, un logiciel de simulation robotique, pour l'utiliser avec le _SDK_ d'un robot de Unitree.
1313+ ]
1214)
13151416#outline(
···60626163== Environnements de développement
62646363-Cependant, ce qui fait un programme n'est pas seulement son code: surtout dans des langages plus anciens sans gestion de dépendance simple, les dépendances (bibliothèques) du programme, ainsi que l'environnement et les étapes de compilation de ce dernier, représentent également une partie considérable de la complexité du programme.
6565+Cependant, ce qui fait un programme n'est pas seulement son code: surtout dans des langages plus anciens sans gestion de dépendance simple, les dépendances (bibliothèques) du programme, ainsi que l'environnement et les étapes de compilation de ce dernier, représentent également une partie considérable de la complexité du programme (par exemple, en C++, on utilise un outil générant des fichiers de configuration pour un autre outil qui à son tour configure le compilateur de C++ @cmake)
64666567C'est cette partie que Nix, le gestionnaire de paquet, permet d'encapsuler et de rendre reproductible. Dans ce modèle, la compilation (et de manière plus générale la construction, ou _build_) du projet est la fonction que l'on veut rendre pure. L'entrée est le code source, et le résultat de la fonction est un binaire, qui ne doit dépendre que du code source.
6668···191193192194C'est un problème assez récurrent dans Linux de manière générale: d'un coup, le son ne marche plus, on passe ½h sur un forum à copier-coller des commandes dans un terminal, et le problème est réglé… jusqu'à ce qu'il survienne à nouveau après un redémarrage ou une réinstallation.
193195194194-Ici, NixOS assure que toute modification de la configuration d'un système est _déclarée_ (d'où l'adjectif "déclaratif") dans des fichiers de configurations, également écrit dans des fichiers `.nix`.
196196+Ici, NixOS assure que toute modification de la configuration d'un système est _déclarée_ (d'où l'adjectif "déclaratif") dans des fichiers de configurations, également écrit dans des fichiers `.nix` @nixos-impatient.
195197196198Ici encore, cela apporte un gain en terme de reproductibilité: l'état de configuration de l'OS sur lequel est déployé le programme du robot est, lui aussi, rendu reproductible.
197199200200+= Gazebo & Unitree
201201+202202+== Contexte
203203+204204+J'ai également été approchée pour travailler sur la création d'un _plugin_ pour Gazebo, un logiciel de simulation robotique @gazebo.
205205+206206+Le but était de pouvoir utiliser ce logiciel de simulation open source avec un robot de la companie Unitree, le H1v2 @h1v2, un robot humanoïde tout-usage.
207207+208208+== Une base de code partiellement open-source
209209+210210+Une partie du code source de ce SDK n'est pas disponible, et n'est que distribué sous forme de binaires @sdk2-in-source-binaries. J'ai donc chercher à comprendre cette partie du code par ingénierie inverse, ce qui ne s'est pas avéré nécéssaire.
211211+212212+Au final, en explorant le code source du plugin pour un autre logiciel de simulation, Mujoco @mujoco @unitree-mujoco, j'ai pu comprendre comment interfacer le SDK avec Gazebo.
213213+214214+== `rt/lowstate`, `rt/lowcmd`
215215+216216+Le SDK de Unitree fonctionne via des canaux DDS, une technologie de communication temps-réel bas niveau @dds.
217217+218218+Deux de ces canaux donnent accès au contrôle (resp. à l'état) bas-niveau des moteurs (resp. capteurs) du robot: `rt/lowcmd` (resp. `rt/lowstate`).
219219+220220+Grâce à l'étude des paquets transmis via Wireshark, j'ai pu débugger les communications entre mon plugin, _gz-unitree_, et le SDK.
221221+222222+== Des tests end-to-end automatisés
223223+224224+Je souhaitais permettre de tester le code sur simulateur de manière automatique: on push un commit modifiant une politique de contrôle du robot, et, automatiquement, en CI, un test sous simulateur est lancé. On reçoit un artéfact avec une vidéo filmant le test.
225225+226226+Pour faire ceci, il a fallu rendre la fonctionnalité native à Gazebo d'enregistrement vidéo automatisable: elle ne l'est pas nativement, il a donc fallu que je duplique le code du module Gazebo correspondant, afin d'y rajouter de quoi contrôler l'entregistrement vidéo via des _topics_ Gazebo.
227227+228228+Il y a aussi un challenge lié au fait que, en CI, il n'y a pas d'interface graphique, ce qui rend le lancement de l'interface graphique de Gazebo impossible. Il faut donc simuler une interface graphique avec _Xvfb_ @xvfb, un serveur X virtuel.
229229+230230+== Packaging sous Nix
231231+232232+Le packaging sous Nix de _gz-unitree_ est en cours, mais se heurte à quelques problèmes liés à l'état du packaging Nix de Gazebo lui-même: gazebo est packagé dans un _overlay_ tierce, _gazebo-sim-overlay_ @gazebo-sim-overlay, qui n'a pas mis à jour une des bibliothèques de Gaazebo depuis plus d'un an @gz-sim-overlay-update-msgs-issue
198233199234200235