example_uros.c 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. #include <rtthread.h>
  2. #include <stdlib.h>
  3. #include <uxr/client/client.h>
  4. #include <ucdr/microcdr.h>
  5. #include "Header.h"
  6. #define STREAM_HISTORY 5
  7. #define BUFFER_SIZE UXR_CONFIG_SERIAL_TRANSPORT_MTU * STREAM_HISTORY
  8. static char* ip = "127.0.0.1";
  9. static char* port = "8888";
  10. // #define UROS_TRANSPORT_TCP
  11. static int recv_ping = 0;
  12. void on_topic(
  13. uxrSession* session,
  14. uxrObjectId object_id,
  15. uint16_t request_id,
  16. uxrStreamId stream_id,
  17. struct ucdrBuffer* ub,
  18. uint16_t length,
  19. void* args)
  20. {
  21. (void) session; (void) object_id; (void) request_id; (void) stream_id; (void) length;
  22. Header topic;
  23. Header_deserialize_topic(ub, &topic);
  24. rt_kprintf("Received topic: %s, sec: %ld\n", topic.frame_id, topic.stamp.sec);
  25. recv_ping = 1;
  26. }
  27. static void uros_entry(void *arg)
  28. {
  29. #ifdef UROS_TRANSPORT_TCP
  30. uxrTCPTransport transport;
  31. uxrTCPPlatform tcp_platform;
  32. #else
  33. uxrUDPTransport transport;
  34. uxrUDPPlatform udp_platform;
  35. #endif
  36. rt_kprintf("Micro-ROS ping-pong demo.\n");
  37. #ifdef UROS_TRANSPORT_TCP
  38. if(!uxr_init_tcp_transport(&transport, &tcp_platform, UXR_IPv4, ip, port))
  39. {
  40. rt_kprintf("Error at create transport.\n");
  41. return;
  42. }
  43. #else
  44. if(!uxr_init_udp_transport(&transport, &udp_platform, UXR_IPv4, ip, port))
  45. {
  46. rt_kprintf("Error at create transport.\n");
  47. return;
  48. }
  49. #endif
  50. // Session
  51. uxrSession session;
  52. uxr_init_session(&session, &transport.comm, 0xABCDABCD);
  53. uxr_set_topic_callback(&session, on_topic, NULL);
  54. if(!uxr_create_session(&session))
  55. {
  56. rt_kprintf("Error at create session.\n");
  57. return;
  58. }
  59. // Streams
  60. uint8_t output_reliable_stream_buffer[BUFFER_SIZE];
  61. uxrStreamId reliable_out = uxr_create_output_reliable_stream(&session, output_reliable_stream_buffer, BUFFER_SIZE, STREAM_HISTORY);
  62. uint8_t input_reliable_stream_buffer[BUFFER_SIZE];
  63. uxrStreamId reliable_in = uxr_create_input_reliable_stream(&session, input_reliable_stream_buffer, BUFFER_SIZE, STREAM_HISTORY);
  64. // Create entities
  65. uxrObjectId participant_id = uxr_object_id(0x01, UXR_PARTICIPANT_ID);
  66. const char* participant_xml = "<dds>"
  67. "<participant>"
  68. "<rtps>"
  69. "<name>pingpong_node</name>"
  70. "</rtps>"
  71. "</participant>"
  72. "</dds>";
  73. uint16_t participant_req = uxr_buffer_create_participant_xml(&session, reliable_out, participant_id, 0, participant_xml, UXR_REPLACE);
  74. uxrObjectId topic_ping_id = uxr_object_id(0x01, UXR_TOPIC_ID);
  75. const char* topic_ping_xml = "<dds>"
  76. "<topic>"
  77. "<name>rt/microROS/ping</name>"
  78. "<dataType>std_msgs::msg::dds_::Header_</dataType>"
  79. "</topic>"
  80. "</dds>";
  81. uint16_t topic_ping_req = uxr_buffer_create_topic_xml(&session, reliable_out, topic_ping_id, participant_id, topic_ping_xml, UXR_REPLACE);
  82. uxrObjectId topic_pong_id = uxr_object_id(0x02, UXR_TOPIC_ID);
  83. const char* topic_pong_xml = "<dds>"
  84. "<topic>"
  85. "<name>rt/microROS/pong</name>"
  86. "<dataType>std_msgs::msg::dds_::Header_</dataType>"
  87. "</topic>"
  88. "</dds>";
  89. uint16_t topic_pong_req = uxr_buffer_create_topic_xml(&session, reliable_out, topic_pong_id, participant_id, topic_pong_xml, UXR_REPLACE);
  90. uxrObjectId publisher_id = uxr_object_id(0x01, UXR_PUBLISHER_ID);
  91. const char* publisher_xml = "";
  92. uint16_t publisher_req = uxr_buffer_create_publisher_xml(&session, reliable_out, publisher_id, participant_id, publisher_xml, UXR_REPLACE);
  93. uxrObjectId subscriber_id = uxr_object_id(0x01, UXR_SUBSCRIBER_ID);
  94. const char* subscriber_xml = "";
  95. uint16_t subscriber_req = uxr_buffer_create_subscriber_xml(&session, reliable_out, subscriber_id, participant_id, subscriber_xml, UXR_REPLACE);
  96. uxrObjectId datawriter_id = uxr_object_id(0x01, UXR_DATAWRITER_ID);
  97. const char* datawriter_xml = "<dds>"
  98. "<data_writer>"
  99. "<topic>"
  100. "<kind>NO_KEY</kind>"
  101. "<name>rt/microROS/pong</name>"
  102. "<dataType>std_msgs::msg::dds_::Header_</dataType>"
  103. "</topic>"
  104. "</data_writer>"
  105. "</dds>";
  106. uint16_t datawriter_req = uxr_buffer_create_datawriter_xml(&session, reliable_out, datawriter_id, publisher_id, datawriter_xml, UXR_REPLACE);
  107. uxrObjectId datareader_id = uxr_object_id(0x01, UXR_DATAREADER_ID);
  108. const char* datareader_xml = "<dds>"
  109. "<data_reader>"
  110. "<topic>"
  111. "<kind>NO_KEY</kind>"
  112. "<name>rt/microROS/ping</name>"
  113. "<dataType>std_msgs::msg::dds_::Header_</dataType>"
  114. "</topic>"
  115. "</data_reader>"
  116. "</dds>";
  117. uint16_t datareader_req = uxr_buffer_create_datareader_xml(&session, reliable_out, datareader_id, subscriber_id, datareader_xml, UXR_REPLACE);
  118. uint8_t status[7]; // we have 7 request to check.
  119. uint16_t requests[7] = {participant_req, topic_ping_req, topic_pong_req, publisher_req, subscriber_req, datawriter_req, datareader_req};
  120. if(!uxr_run_session_until_all_status(&session, 1000, requests, status, 7))
  121. {
  122. rt_kprintf("Error at create entities: participant: %i topic: %i %i publisher: %i darawriter: %i subscriber: %i datareader: %i\n",
  123. status[0], status[1], status[2], status[3], status[4], status[5], status[6]);
  124. return;
  125. }
  126. // Write topics
  127. bool connected = true;
  128. uint32_t count = 0;
  129. Header topic;
  130. rt_sprintf(topic.frame_id, "Hello RT-Thread!");
  131. // Request topics
  132. uxrDeliveryControl delivery_control = {0};
  133. delivery_control.max_samples = UXR_MAX_SAMPLES_UNLIMITED;
  134. uxr_buffer_request_data(&session, reliable_out, datareader_id, reliable_in, &delivery_control);
  135. rt_kprintf("Wait for ping topic\n");
  136. while(connected && count < 100)
  137. {
  138. if(recv_ping) {
  139. uint32_t time_now_ms = rt_tick_get_millisecond();
  140. topic.stamp.sec = time_now_ms / 1000;
  141. topic.stamp.nanosec = (time_now_ms % 1000) * 1e6;
  142. ucdrBuffer ub;
  143. uint32_t topic_size = Header_size_of_topic(&topic, 0);
  144. uxr_prepare_output_stream(&session, reliable_out, datawriter_id, &ub, topic_size);
  145. Header_serialize_topic(&ub, &topic);
  146. rt_kprintf("Send pong topic: %s, sec: %ld\n", topic.frame_id, topic.stamp.sec);
  147. recv_ping = 0;
  148. count++;
  149. }
  150. connected = uxr_run_session_until_data(&session, 1000 * 300);
  151. }
  152. // Delete resources
  153. uxr_delete_session(&session);
  154. #ifdef UROS_TRANSPORT_TCP
  155. uxr_close_tcp_transport(&transport);
  156. #else
  157. uxr_close_udp_transport(&transport);
  158. #endif
  159. rt_kprintf("Exit demo.\n");
  160. return;
  161. }
  162. static void uros_test(int argc, char** argv)
  163. {
  164. rt_thread_t tid;
  165. tid = rt_thread_create("uros_client",
  166. uros_entry, RT_NULL,
  167. 10240, RT_THREAD_PRIORITY_MAX/3, 20);
  168. if (tid != RT_NULL)
  169. {
  170. rt_thread_startup(tid);
  171. }
  172. return;
  173. }
  174. MSH_CMD_EXPORT(uros_test, micro-ros ping-pong demo.);