···872872873873Cependant, l'enregistrement vidéo n'est pas nativement contrôlable par du code. L'idée était en effet de faire automatiquement tourner une simulation à chaque changement de la politique RL, et d'obtenir la vidéo du résultat, pour en observer l'évolution.
874874875875-Il a donc fallu développer un autre plugin, héritant de `gz::gui::Plugin` cette fois-ci. Ce plugin écoute des messages sur un topic Gazebo, `/video`, et permet de démarrer et arrêter l'enregistrement, tout en indiquant le chemin vers le fichier mp4 de sortie.
875875+Il a donc fallu développer un autre plugin, héritant de `gz::gui::Plugin` cette fois-ci. Ce plugin écoute des messages sur des topics Gazebo, `/gui/record_video/...`, et permet de démarrer et arrêter l'enregistrement, tout en indiquant le chemin vers le fichier mp4 de sortie.
876876+877877+Au final, un script complet permettant de démarrer une simulation et l'enregistrer en MP4 ressemble à ceci
878878+879879+```bash
880880+# Envoyer un message Gazebo avec un argument de type String et une valeur de retour de type Booléen
881881+send_to_gz() {
882882+ gz service -s $1 --reqtype gz.msgs.StringMsg --reptype gz.msgs.Boolean --req "data: \"$2\""
883883+}
884884+885885+# Lancement en arrière plan
886886+gz sim robot.sdf & sim_pid=$!
887887+# On attends que la simulation soit prête
888888+sleep 30
889889+890890+# Lancement de l'enregistrement
891891+send_to_gz /gui/record_video/start mp4
892892+893893+# Lancement de la politique RL
894894+uv run policy.py & policy_pid=$!
895895+# On décide de la durée maximale de la vidéo (si la politique ne s'arrête pas d'elle même)
896896+sleep 120
897897+kill $policy_pid
898898+899899+# Arrêt de l'enregistrement
900900+send_to_gz /gui/record_video/stop file:///tmp/result.mp4
901901+902902+# Arrêt du simulateur
903903+kill $sim_pid
904904+905905+# La vidéo est disponible à /tmp/result.mp4
906906+```
876907877908== Mise en CI/CD
878909···916947Une fois cette image disponible, on peut l'utiliser dans un workflow Github:
917948918949#zebraw(
950950+ numbering: false,
919951 highlight-lines: (6, 7),
920952 ```yaml
921953 ...
···931963 ...
932964 ```
933965)
966966+967967+Et lancer la simulation et l'enregistrement vidéo.
968968+969969+Pour récupérer le fichier vidéo final, on peut utiliser la notion d'_artifacts_ de Github Actions:
970970+971971+```yaml
972972+ - name: Save video as artifact
973973+ uses: actions/upload-artifact@v4
974974+ with:
975975+ name: gz-unitree-video
976976+ path: /tmp/result.mp4
977977+```
934978935979==== Émuler un serveur graphique <simulate-x>