···11-#import "@preview/arkheion:0.1.0": arkheion, arkheion-appendices
21#import "@preview/fletcher:0.5.8": diagram, edge, node
3244-#show: arkheion.with(
55- title: "Étude bibliographique I",
66- authors: (
77- (name: "Gwenn Le Bihan", email: "gwenn.lebihan@etu.inp-n7.fr", affiliation: "ENSEEIHT"),
88- ),
99- date: "2 Septembre 2025",
1010- abstract: [
1111- 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.
1212-1313- 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.
1414- ],
1515-)
1616-1717-#outline(
1818- title: [Table des matières],
1919-)
33+= Étude bibliographique Ⅰ
2042121-= Reproductibilité
55+== Reproductibilité
2262323-== État dans le domaine de la programmation
77+=== État dans le domaine de la programmation
248259La différence entre une fonction au sens mathématique et une fonction au sens programmatique consiste en le fait que, par des raisons de practicité, on permet aux `function`s des langages de programmation d'avoir des _effets de bords_. Ces effets affectent, modifient ou font dépendre la fonction d'un environnement global qui n'est pas explicitement déclaré comme une entrée (un argument) de la fonction en question @purefunctions.
2610···45294630De manière donc très concrète, si cette fonction `f` fait partie du protocole expérimental d'une expérience, cette expérience n'est plus reproductible, et ses résultats sont donc potentiellement non vérifiables, si le papier est soumis le 15 décembre 2025 et la _peer review_ effectuée le 2 janvier 2026.
47314848-== Contenir les effets de bords
3232+=== Contenir les effets de bords
49335034En dehors du besoin de vérifiabilité du monde de la recherche, la reproductibilité est une qualité recherchée dans certains domaines de programmation @reproducibility
51355236Il existe donc depuis longtemps des langages de programmation dits _fonctionnels_, qui, de manière plus ou moins stricte, limite les effets de bords. Certains langages font également la distinction entre une fonction _pure_#footnote[sans effets de bord] et une fonction classique @fortran-pure. Certaines fonctions, plutôt appelées _procédures_, sont uniquement composées d'effet de bord puisqu'elle ne renvoie pas de valeur @ibm-function-procedure-routine
533754385555-== État dans le domaine de la robotique
3939+=== État dans le domaine de la robotique
56405741En robotique, pour donner des ordres au matériel, on intéragit beaucoup avec le monde extérieur (ordres et lecture d'état de servo-moteurs, flux vidéo d'une caméra, etc), souvent dans un langage plutôt bas-niveau, pour des questions de performance et de proximité abstractionnelle au matériel
5842···6145L'idée de s'affranchir d'effets de bords pour rendre les programmes dans la recherche en robotique reproductibles est donc plus utopique que réaliste.
624663476464-== Environnements de développement
4848+=== Environnements de développement
65496650Cependant, 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)
6751···77617862Nix ne peut pas garantir que le programme sera sans effets de bords au _runtime_, mais vise à le garantir au _build-time_.
79638080-= Nix, le gestionnaire de paquets pur
6464+== Nix, le gestionnaire de paquets pur
81658282-== Un _DSL_#footnote[Domain-Specific Language] fonctionnel
6666+=== Un _DSL_#footnote[Domain-Specific Language] fonctionnel
83678468Une autre caractéristique que l'on trouve souvent dans la famille de langages fonctionnels est l'omniprésence des _expressions_: quasi toute les constructions syntaxiques forment des expressions valides, et peuvent donc servir de valeur
8569···165149166150La dérivation ici prend en entrée le code source (`src-odri-masterboard-sdk`), ainsi que des dépendances, que ce soit des fonctions relatives à Nix même (comme `stdenv.mkDerivation`) pour simplifier la définition de dérivation, ou des dépendances au programmes, que ce soit pour sa compilation ou pour son exécution (dans ce dernier cas de figures, les dépendances sont inclues ou reliées au binaire final)
167151168168-== Un ecosystème de dépendances
152152+=== Un ecosystème de dépendances
169153170154Afin de conserver la reproductibilité même lorsque l'on dépend de libraries tierces, ces dépendances doivent également avoir une compilation reproductible: on déclare donc des dépendances à des _packages_ Nix, disponibles sur _Nixpkgs_ @nixpkgs.
171155···173157174158Pour ne pas avoir à compiler toutes les dépendances soit-même quand on dépend de `.nix` de _nixpkgs_, il existe un serveur de cache, qui propose des binaires des dépendances, Cachix @cachix
175159176176-== Une compilation dans un environnement fixé
160160+=== Une compilation dans un environnement fixé
177161178162Certains aspects de l'environnement dans lequel l'on compile un programme peuvent faire varier le résultat final. Pour éviter cela, Nix limite au maximum les variations d'environnement. Par exemple, la date du système est fixée au 0 UNIX (1er janvier 1990): le programme compilé ne peut pas dépendre de la date à laquelle il a été compilé.
179163180164Quand le _sandboxing_ est activé, Nix isole également le code source de tout accès au réseau, aux autres fichiers du système (ainsi que d'autres mesures) pour améliorer la reproductibilité @nix-sandboxing
181165182182-=== Un complément utile: compiler en CI
166166+==== Un complément utile: compiler en CI
183167184168Pour aller plus loin, on peut lancer la compilation du paquet Nix en _CI_#footnote[Continuous Integration, lit. intégration continue], c'est-à-dire sur un serveur distant au lieu de sur sa propre machine. On s'assure donc que l'état de notre machine de développement personnelle n'influe pas sur la compilation, puisque chaque compilation est lancée dans une machine virtuelle vierge @github-runners.
185169186186-= NixOS, un système d'exploitation à configuration déclarative
170170+== NixOS, un système d'exploitation à configuration déclarative
187171188172Une fois le programme compilé avec ses dépendances, il est prêt à être transféré sur l'ordinateur ou la carte de contrôle embarquée au robot.
189173···199183200184Ici 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.
201185202202-= Gazebo & Unitree
186186+== Gazebo & Unitree
203187204204-== Contexte
188188+=== Contexte
205189206190J'ai également été approchée pour travailler sur la création d'un _plugin_ pour Gazebo, un logiciel de simulation robotique @gazebo.
207191208192Le 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.
209193210210-== Une base de code partiellement open-source
194194+=== Une base de code partiellement open-source
211195212196Une 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.
213197214198Au 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.
215199216216-== `rt/lowstate`, `rt/lowcmd`
200200+=== `rt/lowstate`, `rt/lowcmd`
217201218202Le SDK de Unitree fonctionne via des canaux DDS, une technologie de communication temps-réel bas niveau @dds.
219203···234218 node((2, 0))[Modèle SDF du robot]
235219))
236220237237-== Des tests end-to-end automatisés
221221+=== Des tests end-to-end automatisés
238222239223Je 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.
240224···242226243227Il 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_, un serveur X virtuel @xvfb.
244228245245-== Packaging sous Nix
229229+=== Packaging sous Nix
246230247231Le 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
248248-249249-250250-251251-#bibliography("bib.yaml")
enseeiht.jpeg
This is a binary file and will not be displayed.
+1-5
log.typ
···11-= Stage au LAAS
22-33-== Journal de bord
11+= Journal de bord
4253#for month in ("may", "june", "july", "august", "september", "november") {
64 include("log/" + month + ".typ")
75}
88-99-#bibliography("bib.yaml")
+5-5
log/july.typ
···11-=== 30 Juin - 4 Juillet
11+== 30 Juin - 4 Juillet
2233- Continuation du travail: essais pour rajouter un capteur IMU sur le robot, essais pour faire fonctionner l'auto-collision
4455-=== 7-11 Juillet
55+== 7-11 Juillet
6677- Capteur IMU rajouté
88- Ajout du tick (temps) de simulation
99- Essais d'utilisation de gz-unitree avec les politiques RL#footnote[Reinforcement Learning] de Gepetto
10101111-=== 14-18 Juillet
1111+== 14-18 Juillet
12121313- Tentatives d'amélioration des performances pour améliorer le RTF: passage de 10% à 15%
1414 - Parallélisation de l'envoi des messages des DDS dans un thread différent du principal
···1717- Ecriture d'une recette _Just_ @justfile pour configurer l'environnement de développement, sur Arch Linux ou Ubuntu
1818- Reproduction des résultats sur un OS et une machine différente
19192020-=== 21-25 Juillet
2020+== 21-25 Juillet
21212222- Évaluation de `gazebo-sim-overlay` @gazebo-sim-overlay comme solution pour un packaging Nix
2323- Recherche sur un mode headless de gazebo suite à des erreurs de QT sous devshell Nix
24242525-=== 28 Juillet - 1 août
2525+== 28 Juillet - 1 août
26262727- Recherche autour de l'utilisation de Gazebo dans des environnements CI/CD @msr2022-cps, en particulier pour capturer une simulation en vidéo
+4-4
log/june.typ
···11-=== 2-6 Juin
11+== 2-6 Juin
2233- Début de recherches sur l'installation de NixOS sur Raspberry Pi @raspi 400 et 5
44- Flash du firmware master-board sur un testbench
55- Test du packaging de odri_control_interface @odri-controls avec les scripts de démos à l'aide d'un testbench
66- Début de recherches sur la création d'un plugin Gazebo @gazebo communiquant avec la couche bas niveau du SDK2 @unitree_sdk2 d'Unitree afin de simuler du code pour le robot H1 @h1 dans Gazebo
7788-=== 9-13 Juin
88+== 9-13 Juin
991010- Progrès sur l'accès à la couche bas niveau du SDK2 @unitree_sdk2
1111 - Analyse via Wireshark des paquets
1212 - Analyse du code source du plugin Mujoco @mujoco fourni par Unitree
13131414-=== 16-20 Juin
1414+== 16-20 Juin
15151616- Réussite de l'accès à la couche bas niveau du SDK2 via les définitions IDL @omgidl fournies par Unitree
1717- Documentation sur le système de plugins de Gazebo @gazebo
1818- Début de travail sur le bridge Gazebo/unitree: `gz-unitree`
1919 - Implémentation de la communication DDS @dds entre un binaire d'exemple d'utilisation du SDK2 et le plugin Gazebo
20202121-=== 23-27 Juin
2121+== 23-27 Juin
22222323- Construction du _lowstate_ à envoyer au SDK2 depuis _gz-unitree_:
2424- Utilisation du modèle SDF @sdf du robot H1-2 @h1v2 au lieu de H1 @h1, ajout d'un sol au monde du SDF
+2-5
log/may.typ
···11-=== 19-23 Mai
11+== 19-23 Mai
2233- Mise en place de l'environnement de développement
44- Documentation sur Nix le langage @nix-language
···1212- Recherche autour d'une potentielle validation au runtime en C++ des fichiers de config par le JSON Schema
1313- Découverte des overlays Nix
14141515-=== 26-28 Mai
1515+== 26-28 Mai
16161717- Continuation du travail précédent
1818-1919-2020-
+28
main.typ
···11+#import "template.typ": arkheion, arkheion-appendices
22+#show: arkheion.with(
33+ title: "Stage au LAAS",
44+ authors: (
55+ (name: "Gwenn Le Bihan", email: "gwenn.lebihan@etu.inp-n7.fr", affiliation: "ENSEEIHT"),
66+ ),
77+ date: "2 Septembre 2025",
88+ logo: "enseeiht.jpeg",
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+ ],
1414+)
1515+1616+#outline(
1717+ title: [Table des matières],
1818+)
1919+2020+#pagebreak()
2121+2222+2323+#include("biblio.typ")
2424+2525+#include("log.typ")
2626+2727+2828+#bibliography("bib.yaml")