···231231 edge((2, 1), (3, 1), "|-|", stroke: blue + 1.25pt, label-side: right, text(fill: blue)[*API de Gazebo*])
232232}))
233233234234-Le bridge de Mujoco fonctionne en interceptant les messages sur les canaux `rt/lowcmd` et `rt/lowstate`, qui correspondent respectivement aux commandes envoyées au robot et à l'état (angles des joints, moteurs, valeurs des capteurs, etc) renvoyé par le robot. Le `low` indique que ce sont des messages bas-niveau: par exemple, `rt/lowcmd` correspond directement à des ordres de tension pour les moteurs, et non pas à des messages plus avancés du type "avancer de $x$ mètres" #todo[ces messages plus haut-niveau = sport mode non? dire quand ils servent]
234234+Le bridge de Mujoco fonctionne en interceptant les messages sur le canal `rt/lowcmd` et en en envoyant dans le canal `rt/lowstate`, qui correspondent respectivement aux commandes envoyées au robot et à l'état (angles des joints, moteurs, valeurs des capteurs, etc) renvoyé par le robot.
235235+236236+Le `low` indique que ce sont des messages bas-niveau: par exemple, `rt/lowcmd` correspond directement à des ordres de tension pour les moteurs, et non pas à des messages plus avancés du type "avancer de $x$ mètres" #todo[ces messages plus haut-niveau = sport mode non? dire quand ils servent]
235237236238Les ordres dans `rt/lowcmd` sont ensuite traduits en appels de fonctions de Mujoco pour mettre à jour l'état du robot simulé, et de messages `rt/lowstate` sont créés à partir des données fournies par Mujoco
237239238238-#figure(caption: [Cycle de vie de la simulation avec le bridge], diagram({
240240+Étant donné le modèle _pub/sub_ de DDS, on parle de _pub(lication)_ de message, et de _sub(scription)_#footnote[abonnement] aux messages d'un canal (pour les recevoir)
241241+242242+#figure(caption: [Cycle de vie de la simulation avec le bridge pour Mujoco], diagram({
239243 node(name: <sdk>, (0, 0))[SDK]
240244 node(enclose: ((1, 1), (-1, 1)), stroke: blue, inset: 10pt, snap: false, text(fill: blue)[Canaux \ DDS])
241245 node(name: <lowcmd>, (1, 1))[`rt/lowcmd`]
···245249246250247251 edge(<sdk>, <lowcmd>, "->", bend: 30deg)[pub]
248248- edge(<lowcmd>, (1, 2), "..>", bend: 20deg)[sub]
249249- edge((1, 2), <mujoco>, "->", bend: 20deg, todo[])
252252+ edge(<lowcmd>, (1, 2), "..>", bend: 20deg)[via sub]
253253+ edge((1, 2), <mujoco>, "->", bend: 20deg, `data->ctrl[i] = ...`)
250254251251- edge(<sdk>, <lowstate>, "<..", bend: -30deg)[sub]
255255+ edge(<sdk>, <lowstate>, "<..", bend: -30deg)[via sub]
252256 edge(<lowstate>, (-1, 2), "<-", bend: -20deg)[pub]
253253- edge((-1, 2), <mujoco>, "<-", bend: -20deg, todo[])
257257+ edge((-1, 2), <mujoco>, "<-", bend: -20deg, `... = data->sensordata[i]`)
258258+259259+ edge(<mujoco>, <mujoco>, "->", bend: 130deg, loop-angle: -90deg, `mj_step(model, data)`)
254260}))
261261+262262+Le but est donc de reproduire un cycle de vie équivalent, mais en remplaçant la partie spécifique à Mujoco par une partie adaptée à Gazebo.