this repo has no description
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Continue rapport

+31 -68
+7
bib.yaml
··· 817 817 date: '2025-10-22' 818 818 value: https://gazebosim.org/api/sim/8/resources.html#:~:text=All%20paths%20on%20the%20GZ_SIM_SYSTEM_PLUGIN_PATH%20environment%20variable 819 819 820 + wireshark: 821 + type: web 822 + title: Protocols/rtps - Wireshark Wiki 823 + url: 824 + date: '2025-10-22' 825 + value: https://wiki.wireshark.org/Protocols/rtps 826 +
+1 -1
pages_count
··· 1 - 38 1 + 39
+23 -67
rapport/gz-unitree.typ
··· 1 1 #import "@preview/zebraw:0.5.5" 2 2 #import "@preview/fletcher:0.5.8": diagram, node, edge 3 + #import "@preview/cetz:0.4.2" 3 4 #import "./utils.typ": dontbreak 4 5 #show figure: set block(spacing: 2em) 5 6 #let zebraw = (..args) => zebraw.zebraw(lang: false, background-color: luma(255).opacify(0%), ..args) ··· 10 11 11 12 Une première tentative a été de suivre la documentation de CycloneDDS pour écouter sur le canal @cyclonedds-helloworld `rt/lowcmd`, en récupérant les définitions IDL des messages, disponibles sur le dépot `unitree_ros2`#footnote[`unitree_mujoco` n'avait pas encore été découvert] @unitree_ros2 12 13 13 - // On commence par importer la bibliothèque DDS et les définitions IDL de `rt/lowcmd` 14 - // 15 - // ```cpp 16 - // #include "messages/LowCmd_.hpp" 17 - // #include "dds/dds.h" 18 - // ... 19 - // 20 - // int main (int argc, char ** argv) 21 - // { 22 - // ``` 23 - // 24 - // On initialise les différents objets permettant de lire sur un canal 25 - // 26 - // ```cpp 27 - // dds_entity_t participant, topic, reader; 28 - // LowCmd_ *msg; 29 - // void *samples[MAX_SAMPLES]; 30 - // ... 31 - // 32 - // participant = dds_create_participant(DDS_DOMAIN_DEFAULT, NULL, NULL); 33 - // 34 - // topic = dds_create_topic(participant, &LowCmd__desc, "HelloWorldData_Msg", NULL, NULL); 35 - // 36 - // qos = dds_create_qos(); 37 - // dds_qset_reliability(qos, DDS_RELIABILITY_RELIABLE, DDS_SECS (10)); 38 - // 39 - // reader = dds_create_reader(participant, topic, qos, NULL); 40 - // 41 - // dds_delete_qos(qos); 42 - // 43 - // samples[0] = LowCmd___alloc(); 44 - // ``` 45 - // 46 - // Et on attend qu'un message arrive sur le canal, pour l'afficher 47 - // 48 - // ```cpp 49 - // /* Poll until data has been read. */ 50 - // while (true) 51 - // { 52 - // rc = dds_read(reader, samples, infos, MAX_SAMPLES, MAX_SAMPLES); 53 - // 54 - // /* Check if we read some data and it is valid. */ 55 - // if ((rc > 0) && (infos[0].valid_data)) 56 - // { 57 - // /* Print Message. */ 58 - // msg = (LowCmd_*) samples[0]; 59 - // printf("=== [Subscriber] Received : "); 60 - // fflush(stdout); 61 - // break; 62 - // } 63 - // else 64 - // { 65 - // dds_sleepfor(DDS_MSECS(20)); 66 - // } 67 - // } 68 - // ``` 69 - // 70 - // Enfin, on libère les ressources avant la terminaison du programme 71 - // 72 - // ```cpp 73 - // LowCmd__free(samples[0], DDS_FREE_ALL); 74 - // dds_delete(participant); 75 - // return EXIT_SUCCESS; 76 - // } 77 - // ``` 78 - 79 14 Malheureusement, cette solution s'est avérée infructueuse, à cause de (ce qui sera compris bien plus tard) un problème de numéro de domaine DDS. 80 15 81 16 On change d'approche en préférant plutôt utiliser les abstractions fournies par le SDK de Unitree (cf @receive-lowcmd et @send-lowstate) 82 - 83 17 84 18 Enfin, si un pare-feu est actif, il faut autoriser le traffic udp l'intervalle d'addresses IP `224.0.0.0/4`. Par exemple, avec _ufw_ 85 19 ··· 88 22 sudo ufw allow in proto udp to 224.0.0.0/4 89 23 ``` 90 24 25 + Pour arriver à ces solutions, du débuggage du traffic RTPS (le protocole sur lequel est construit DDS @dds) s'est avéré utile. 26 + 27 + _Wireshark_ @wireshark supporte le décodage de paquets RTPS 28 + 29 + #let img = image("./wireshark-trace.png") 30 + // https://forum.typst.app/t/how-to-blend-a-color-with-an-image-and-make-the-image-transparent/1677/5 31 + #let overlayed-img = contents => layout(bounds => { 32 + let size = measure(img, ..bounds) 33 + img 34 + place(top+left, block(..size, contents)) 35 + }) 36 + 37 + #figure( 38 + caption: [Trace de paquets RTPS sur _Wireshark_], 39 + overlayed-img[ 40 + #diagram({ 41 + set math.equation(numbering: none) 42 + import "@preview/fletcher:0.5.8": shapes 43 + node(enclose: ((5, 2), (5, 5)), shape: shapes.bracket.with(dir: right))[Initialisation] 44 + }) 45 + ] 46 + ) 91 47 92 48 93 49 == Installation du plugin dans Gazebo