···11#import "@preview/zebraw:0.5.5"
22#import "@preview/fletcher:0.5.8": diagram, node, edge
33#import "@preview/cetz:0.4.2"
44-#import "./utils.typ": dontbreak, todo
44+#import "./utils.typ": dontbreak, todo, refneeded
55#show figure: set block(spacing: 2em)
66#let zebraw = (..args) => zebraw.zebraw(lang: false, background-color: luma(255).opacify(0%), ..args)
77···415415416416== `rt/lowstate`
417417418418+#todo[Parler de IMUHandler et TickHandler !! (topics gz)]
419419+418420=== Construction d'un message `rt/lowstate`
419421420422La documentation d'Unitree liste l'ensemble des champs disponibles dans un message `rt/lowstate`, c'est-à-dire l'ensemble des données que l'on doit récupérer afin de construire nos messages d'état @h1-rt-lowstate:
421423422424#table(
423423- columns: (1.5fr, 0.5fr, 3fr, 2fr),
425425+ // columns: (1.5fr, 0.5fr, 3fr, 2fr),
426426+ columns: 4,
424427 stroke: none,
425428 inset: 8pt,
426429427430 "Champ", "Type", "Description", "Où récupérer la valeur",
428431 table.hline(),
429432430430- `version`, $NN^2$, [Tuple représentation la version d'Unitree], [],
431431- `mode_pr`, ${0, 1}$, [Défini sur 0 par défaut], [],
432432- `mode_machine`, ${4, 6}$, [Défini sur 6 par défaut], [],
433433- `tick`, $NN$, [Non documenté], [],
434434- `wireless_remote`, ${0, 1}^(40)$, [Non documenté], [],
435435- `reserve`, $NN^4$, [Non documenté], [],
436436- `crc`, $NN$, [Somme de contrôle du message, utilisant _CRC32_. Une implémentation ad-hoc existe dans le code source de `unitree_sdk2` et de `unitree_mujoco` #todo[Mettre en annexe ?]], [Copié-collé de l'implémentation d'Unitree],
437437- `imu_state`, `IMUState`, [Valeurs des capteurs intertiels du robot],
438438- `imu_state.quaternion`, $RR^4$, [Posture dans l'espace du robot, dans l'ordre $(w, x, y, z)$],
439439- `imu_state.rpy`, $RR^3$, [Angle d'Euler du robot, dans l'ordre $(r, p, y)$],
440440- `imu_state.gyroscope`, $$
433433+ `version`, $NN^2$, [Tuple représentant la version d'Unitree], [Expérimentalement],
434434+ `mode_pr`, ${0, 1}$, [Défini sur 0 par défaut], [0],
435435+ `mode_machine`, ${4, 6}$, [Défini sur 6 par défaut], [6],
436436+ `tick`, $NN quad ("ms")$, [Non documenté, proablement le temps écoulé depuis le début de la simulation], [Messages `gz::msgs::Clock` sur le topic Gazebo `/clock` ],
437437+ `wireless_remote`, ${0, 1}^(40)$, [Non documenté], [_Laissé vide_],
438438+ `reserve`, $NN^4$, [Non documenté], [_Laissé vide_],
439439+ `crc`, $NN$, [Somme de contrôle du message, utilisant _CRC32_. ], [Implémentation de CRC32 par Unitree #footnote[
440440+ Une implémentation ad-hoc existe dans le code source de `unitree_sdk2` et de `unitree_mujoco` #todo[Mettre en annexe ?] #refneeded
441441+ ]],
442442+ `imu_state…`, "struct.", [Valeurs des capteurs intertiels du robot], [Messages `gz::msgs::IMU` sur le topic Gazebo `/imu`],
443443+ ` .quaternion`, $RR^4$, [Posture dans l'espace du robot, dans l'ordre $(w, x, y, z)$], [$w$, $x$, $y$ et $z$ sur `.orientation()`],
444444+ ` .rpy`, $RR^3$, [Angle d'Euler du robot, dans l'ordre $(r, p, y)$], `.linear_acceleration()`,
445445+ ` .gyroscope`, $RR^3$, todo[], $"atan"_2(2(w x + y z), 1 - 2 (x^2 + y^2) )) \ "asin"(2 (w y - z x)) \ "atan"_2(2(w z + x y), 1 - 2(y^2 + z^2))$,
446446+ ` .accelerometer`, $RR^3$, todo[], `.angular_velocity()`,
447447+ `motor_state…`, [$"struct."^(35)$], [Etat de chaque moteur], `gz::sim::Model(…)→joints`,
448448+ ` .mode`, ${0, 1}$, [$0$ pour "Brake" et $1$ pour "FOC" #todo[]], [0],
449449+ ` .q`, $RR quad ("rad")$, [Angle en radians de rotation du moteur], `.Position()`,
450450+ ` .dq`, $RR quad ("rad" dot "s"^(-1))$, [Angle de rotation du moteur], `.Velocity()`,
451451+ ` .ddq`, $RR quad ("rad" dot "s"^(-2))$, [Angle de rotation du moteur], [_Laissé vide_],
452452+ ` .tau_est`, $RR quad ("N" dot "m")$, [Estimation de la torque #todo[]], [_Laissé vide_],
441453)
442454443455