一文讲明白ROS2通信配置方法
发布时间:2025-11-19 15:10:15.467 文章来源:AiSoftCloud 浏览次数:52 下载次数:1 

零拷贝的配置方法

参考:https://github.com/ros2/rmw_fastrtps#full-qos-configuration

问题

测试零拷贝时出现如下问题:

  1. terminate called after throwing an instance of 'eprosima::fastcdr::exception::NotEnoughMemoryException'
  2. what(): Not enough memory in the buffer stream

堆栈如下:

对应的源码位置:

看堆栈崩溃原因是因为创建节点(rclcpp::Node)时,会发送node创建的消息,序列化时崩溃(具体是在序列化node的namespace,即”/“)

解决方法是在dds_profile.xml中增加如下配置:

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
  3. <transport_descriptors>
  4. <transport_descriptor>
  5. <transport_id>CustomUDPTransport</transport_id>
  6. <type>UDPv4</type>
  7. <interfaceWhiteList>
  8. <address>192.168.1.2</address>
  9. <address>127.0.0.1</address>
  10. </interfaceWhiteList>
  11. <maxInitialPeersRange>10</maxInitialPeersRange>
  12. <maxMessageSize>65500</maxMessageSize>
  13. <sendBufferSize>1048576</sendBufferSize>
  14. <receiveBufferSize>1048576</receiveBufferSize>
  15. </transport_descriptor>
  16. </transport_descriptors>
  17. <participant profile_name="CustomUDPTransportParticipant" is_default_profile="true">
  18. <rtps>
  19. <useBuiltinTransports>true</useBuiltinTransports>
  20. <userTransports>
  21. <transport_id>CustomUDPTransport</transport_id>
  22. </userTransports>
  23. </rtps>
  24. </participant>
  25. <!-- 增加如下data_writer和data_reader配置解决上述问题 -->
  26. <data_writer profile_name="default publisher profile" is_default_profile="true">
  27. <qos>
  28. <publishMode>
  29. <kind>SYNCHRONOUS</kind>
  30. </publishMode>
  31. <data_sharing>
  32. <kind>AUTOMATIC</kind>
  33. </data_sharing>
  34. </qos>
  35. <historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
  36. </data_writer>
  37. <data_reader profile_name="default subscription profile" is_default_profile="true">
  38. <qos>
  39. <data_sharing>
  40. <kind>AUTOMATIC</kind>
  41. </data_sharing>
  42. </qos>
  43. <historyMemoryPolicy>DYNAMIC</historyMemoryPolicy>
  44. </data_reader>
  45. </profiles>

1、设置环境变量:

  1. export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
  2. export RMW_FASTRTPS_USE_QOS_FROM_XML=1 # 必须
  3. export FASTRTPS_DEFAULT_PROFILES_FILE=/home/ubuntu/data/param/dds_profile.xml

/home/ubuntu/data/param/dds_profile.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
  3. <profiles>
  4. <!-- Default publisher profile -->
  5. <publisher profile_name="default publisher profile" is_default_profile="true">
  6. <qos>
  7. <publishMode>
  8. <kind>SYNCHRONOUS</kind>
  9. </publishMode>
  10. <data_sharing>
  11. <kind>AUTOMATIC</kind>
  12. </data_sharing>
  13. </qos>
  14. <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
  15. </publisher>
  16. <!-- Default subscriber profile -->
  17. <subscriber profile_name="default subscriber profile" is_default_profile="true">
  18. <qos>
  19. <data_sharing>
  20. <kind>AUTOMATIC</kind>
  21. </data_sharing>
  22. </qos>
  23. <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
  24. </subscriber>
  25. <!-- Publisher profile for topic helloworld -->
  26. <publisher profile_name="helloworld">
  27. <qos>
  28. <publishMode>
  29. <kind>SYNCHRONOUS</kind>
  30. </publishMode>
  31. <data_sharing>
  32. <kind>AUTOMATIC</kind>
  33. </data_sharing>
  34. </qos>
  35. </publisher>
  36. <!-- Request subscriber profile for services -->
  37. <subscriber profile_name="service">
  38. <qos>
  39. <data_sharing>
  40. <kind>AUTOMATIC</kind>
  41. </data_sharing>
  42. </qos>
  43. <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
  44. </subscriber>
  45. <!-- Request publisher profile for clients -->
  46. <publisher profile_name="client">
  47. <qos>
  48. <publishMode>
  49. <kind>ASYNCHRONOUS</kind>
  50. </publishMode>
  51. <data_sharing>
  52. <kind>AUTOMATIC</kind>
  53. </data_sharing>
  54. </qos>
  55. </publisher>
  56. <!-- Request subscriber profile for server of service "add_two_ints" -->
  57. <subscriber profile_name="rq/add_two_intsRequest">
  58. <qos>
  59. <data_sharing>
  60. <kind>AUTOMATIC</kind>
  61. </data_sharing>
  62. </qos>
  63. <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
  64. </subscriber>
  65. <!-- Reply subscriber profile for client of service "add_two_ints" -->
  66. <subscriber profile_name="rr/add_two_intsReply">
  67. <qos>
  68. <data_sharing>
  69. <kind>AUTOMATIC</kind>
  70. </data_sharing>
  71. </qos>
  72. <historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy>
  73. </subscriber>
  74. </profiles>
  75. </dds>
更多文章可关注公众号
aisoftcloud