···186186187187== Packaging Nix pour _gz-unitree_
188188189189-Le packaging pour Nix de _gz-unitree_ lui-même n'est pas très complexe: il s'agit d'un projet C++ / CMake standard.
189189+Le packaging pour Nix de _gz-unitree_ lui-même n'est pas très complexe: il s'agit d'un projet C++ / CMake standard @gzu-cmakelists.
190190191191-Cependant, _gz-unitree_ a deux principales dépendances
191191+Cependant, _gz-unitree_ a deux dépendances principales:
192192193193- Gazebo lui-même, à travers `gz-sim`, `gz-sensors`, `gz-common`, `gz-plugin`, `gz-cmake`, etc.
194194-- Le SDK2 d'Unitree
194194+- Le SDK d'Unitree, `unitree_sdk2`
195195196196-En ce qui concerne le SDK2 d'Unitree, une déclaration de paquet Nix a pu être écrite sans trop de soucis, la bibliothèque étant également un projet C++ standard:
196196+En ce qui concerne le SDK d'Unitree, un paquet Nix a pu être écrit sans trop de soucis, la bibliothèque étant également un projet C++ standard:
197197198198```nix
199199{
···231231232232Par contre, en ce qui concerne Gazebo, la situation est plus complexe: étant un simulateur système, le projet est bien plus conséquent, et donc plus dur à packager.
233233234234-Il existe plusieurs tentaives de packaging de Gazebo pour Nix:
234234+Il existe plusieurs tentatives de packaging de Gazebo pour Nix:
235235236236- Un _overlay_ ROS (Robot Operating System), qui inclut notamment Gazebo @nixros
237237-- Un package pour nixpkgs (registry officielle de Nix) @nixgz @nixgz2 @nixgz3
237237+- Un package pour _Nixpkgs_ @nixgz @nixgz2 @nixgz3
238238- Un outil de génération de paquets Nix à partir de paquets ROS ou Gazebo, développé par Guilhem Saurel au sein de l'équipe Gepetto, _gazebros2nix_ @gazebros2nix
239239240240Au début du développement de _gz-unitree_, des essais d'utilisation des paquets Nix pour le développement et la compilation ont été réalisés, mais des erreurs subsistaient, en particulier avec Gazebo.
241241-241241+ Des efforts supplémentaires sont nécéssaires pour empaqueter _gz-unitree_.
242242
+84-25
rapport/sdk2-study.typ
···1111- 6 dans chaque jambe (3 à la hanche, 2 au talon et un au genou),
1212- 7 dans chaque bras (3 à l'épaule, 3 au poignet et un au coude) @h1v2
13131414-Unitree met à disposition du public un _SDK_#footnote[Kit de développement logiciel (Software Development Kit)] permettant de le contrôler.
1414+Unitree met à disposition du public un _SDK_#footnote[Kit de développement logiciel (Software Development Kit)] permettant de le contrôler, `unitree_sdk2` @unitree_sdk2
15151616== Canaux DDS
17171818-Pour communiquer avec le robot via le réseau, Unitree utilise CycloneDDS, une implémentation par Oracle du standard DDS#footnote[pour Data Distribution Service] @cyclonedds, une technologie de communication bidirectionnelle#footnote[dite "_pub-sub_" pour _publish_/_subscribe_ ] en temps réel, standardisée par l'Object Management Group, OMG @dds. Les messages sont envoyées sur le réseau via UDP et IP.
1818+Pour communiquer avec le robot via le réseau, Unitree utilise CycloneDDS, une implémentation par Oracle du standard DDS#footnote[pour Data Distribution Service] @cyclonedds. DDS est une technologie de communication bidirectionnelle#footnote[dite "_pub-sub_" pour _publish_/_subscribe_ ] en temps réel, standardisée par l'Object Management Group, OMG @dds. Les messages sont envoyés sur le réseau via UDP et IP.
19192020Les données contenues dans chacun des messages sont spécifiées via un autre format, IDL, également standardisé par l'OMG @omgidl.
21212222-L'intérêt d'un format indépendant du langage de programmation est que l'on peut générer du code décrivant ces données pour plusieurs langages, ce que fait Unitree en distribuant du code C++ et Python.
2222+L'intérêt d'un format indépendant du langage de programmation est que l'on peut générer du code décrivant ces données dans plusieurs langages de programmation, ce que fait Unitree en distribuant un SDK en C++ et en Python.
23232424Par exemple, les messages permettant de contrôler les moteurs du H1v2 sont définis ainsi
25252626#figure(
2727- caption: [`LowCmd.idl`, traduit depuis sa conversion en C++ @lowcmd_hpp],
2828- ```c
2929- struct MotorCmd
3030- {
3131- uint8 mode;
3232- float q;
3333- float dq;
3434- float tau;
3535- float kp;
3636- float kd;
3737- unsigned long reserve;
3838- };
2727+ caption: [`LowCmd.idl`, traduit depuis sa conversion en C++ @lowcmd_hpp],
2828+ ```c
2929+ struct MotorCmd
3030+ {
3131+ uint8 mode;
3232+ float q;
3333+ float dq;
3434+ float tau;
3535+ float kp;
3636+ float kd;
3737+ unsigned long reserve;
3838+ };
3939+4040+ struct Cmd
4141+ {
4242+ uint8 mode_pr;
4343+ uint8 mode_machine;
4444+ MotorCmd motor_cmd[35];
4545+ unsigned long reserve[4];
4646+ unsigned long crc;
4747+ };
4848+ ```)
4949+5050+5151+#grid(
5252+ columns: 2,
5353+ ```python
5454+ @dataclass
5555+ @annotate.final
5656+ @annotate.autoid("sequential")
5757+ class MotorCmd_(idl.IdlStruct, typename="MotorCmd"):
5858+ mode: types.uint8
5959+ q: types.float32
6060+ dq: types.float32
6161+ tau: types.float32
6262+ kp: types.float32
6363+ kd: types.float32
6464+ reserve: types.uint32
6565+6666+ @dataclass
6767+ @annotate.final
6868+ @annotate.autoid("sequential")
6969+ class LowCmd_(idl.IdlStruct, typename="Cmd"):
7070+ mode_pr: types.uint8
7171+ mode_machine: types.uint8
7272+ motor_cmd: types.array['MotorCmd_', 35]
7373+ reserve: types.array[types.uint32, 4]
7474+ crc: types.uint32
7575+7676+ ```,
7777+ ```cpp
7878+ class LowCmd_
7979+ {
8080+ private:
8181+ uint8_t mode_pr_ = 0;
8282+ uint8_t mode_machine_ = 0;
8383+ std::array<::MotorCmd_, 35> motor_cmd_ = { };
8484+ std::array<uint32_t, 4> reserve_ = { };
8585+ uint32_t crc_ = 0;
39864040- struct Cmd
4141- {
4242- uint8 mode_pr;
4343- uint8 mode_machine;
4444- MotorCmd motor_cmd[35];
4545- unsigned long reserve[4];
4646- unsigned long crc;
4747- };
4848- ```,
4949-)
8787+ public:
8888+ LowCmd_() = default;
8989+9090+ explicit LowCmd_(
9191+ uint8_t mode_pr,
9292+ uint8_t mode_machine,
9393+ const std::array<::MotorCmd_, 35>& motor_cmd,
9494+ const std::array<uint32_t, 4>& reserve,
9595+ uint32_t crc) :
9696+ mode_pr_(mode_pr),
9797+ mode_machine_(mode_machine),
9898+ motor_cmd_(motor_cmd),
9999+ reserve_(reserve),
100100+ crc_(crc) { }
101101+102102+ uint8_t mode_pr() const { return this->mode_pr_; }
103103+ uint8_t& mode_pr() { return this->mode_pr_; }
104104+ void mode_pr(uint8_t _val_) { this->mode_pr_ = _val_; }
105105+ uint8_t mode_machine() const { return this->mode_machine_; }
106106+ ```
107107+ )
108108+))
5010951110DDS groupe les mesages dans des _topics_. Les messages sont échangés sur un topic de la manière suivante
52111