···11+#import "@preview/fletcher:0.5.8": diagram, node, edge
22+13#show figure: set block(spacing: 3em)
2435Unitree met à disposition du public un _SDK_#footnote[Kit de développement logiciel (Software Development Kit)] permettant de contrôler ses robots (dont le H1v2).
···164166165167== Un autre bridge existant: `unitree_mujoco`
166168167167-Unitree propose un "bridge" officiel pour utiliser son SDK avec Mujoco, et ainsi faire du reinforcement learning avec H1v2 en utilisant Mujoco.
169169+Unitree propose un bridge officiel pour utiliser son SDK avec Mujoco.
170170+171171+Le fonctionnement d'un bridge est au final assez similaire, quelque soit le simulateur pour lequel on l'écrit: il s'agit d'envoyer l'état du robot au simulateur, et de réagir quand le simulateur envoie des ordres de commandes.
172172+173173+#figure(caption: "Fonctionnement usuel du SDK", diagram({
174174+ node((0, 0), "Politique")
175175+ node((1, 0), "SDK")
176176+ node((2, 0), "Robot")
177177+178178+ for i in range(0, 2) {
179179+ edge((i, 0), (i+1, 0), "->", bend: 30deg)[ordres];
180180+ edge((i, 0), (i+1, 0), "<-", bend: -30deg)[état];
181181+ }
182182+}))
183183+184184+185185+#figure(caption: [Fonctionnement via _unitree\_mujoco_ du SDK], diagram({
186186+ node((0, 0), "Politique")
187187+ node((1, 0), "SDK")
188188+ node((2, 0))[`unitree_mujoco`]
189189+ node((3, 0), "Mujoco")
190190+191191+ for i in range(0, 3) {
192192+ edge((i, 0), (i+1, 0), "->", bend: 30deg)[ordres]
193193+ edge((i, 0), (i+1, 0), "<-", bend: -30deg)[état]
194194+ }
195195+196196+ edge((0, 1), (2, 1), "|-|", label-side: right)[API du SDK]
197197+ edge((2, 1), (3, 1), "|-|", label-side: right)[API de Mujoco]
198198+}))
199199+200200+Le but est de faire la même chose avec notre propre bridge. Le code du bridge Mujoco existant est utile car un bridge, se situant par définition à la frontière entre deux APIs, fait usage des deux APIs.
201201+202202+Écrire un bridge Gazebo pour le même SDK implique donc de changer "API de Mujoco" par "API de Gazebo", mais le code faisant usage du SDK d'Unitree reste le même.
203203+204204+205205+#figure(caption: [Fonctionnement via _gz-unitree_ du SDK], diagram({
206206+ node((0, 0), "Politique")
207207+ node((1, 0), "SDK")
208208+ node((2, 0))[*`gz-unitree`*]
209209+ node((3, 0))[*Gazebo*]
210210+211211+ for i in range(0, 2) {
212212+ edge((i, 0), (i+1, 0), "->", bend: 30deg)[ordres]
213213+ edge((i, 0), (i+1, 0), "<-", bend: -30deg)[état]
214214+ }
215215+216216+ edge((2, 0), (2+1, 0), "->", bend: 30deg, extrude: (-1, 0, 1))[*ordres*]
217217+ edge((2, 0), (2+1, 0), "<-", bend: -30deg, extrude: (-1, 0, 1))[*état*]
218218+219219+ edge((0, 1), (2, 1), "|-|", label-side: right)[API du SDK]
220220+ edge((2, 1), (3, 1), "|-|", label-side: right)[*API de Gazebo*]
221221+}))