参考:https://github.com/ros2/rmw_fastrtps#full-qos-configuration
测试零拷贝时出现如下问题:
terminate called after throwing an instance of 'eprosima::fastcdr::exception::NotEnoughMemoryException'what(): Not enough memory in the buffer stream
堆栈如下:
对应的源码位置:
看堆栈崩溃原因是因为创建节点(rclcpp::Node)时,会发送node创建的消息,序列化时崩溃(具体是在序列化node的namespace,即”/“)
解决方法是在dds_profile.xml中增加如下配置:
<?xml version="1.0" encoding="UTF-8" ?><profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"><transport_descriptors><transport_descriptor><transport_id>CustomUDPTransport</transport_id><type>UDPv4</type><interfaceWhiteList><address>192.168.1.2</address><address>127.0.0.1</address></interfaceWhiteList><maxInitialPeersRange>10</maxInitialPeersRange><maxMessageSize>65500</maxMessageSize><sendBufferSize>1048576</sendBufferSize><receiveBufferSize>1048576</receiveBufferSize></transport_descriptor></transport_descriptors><participant profile_name="CustomUDPTransportParticipant" is_default_profile="true"><rtps><useBuiltinTransports>true</useBuiltinTransports><userTransports><transport_id>CustomUDPTransport</transport_id></userTransports></rtps></participant><!-- 增加如下data_writer和data_reader配置解决上述问题 --><data_writer profile_name="default publisher profile" is_default_profile="true"><qos><publishMode><kind>SYNCHRONOUS</kind></publishMode><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy></data_writer><data_reader profile_name="default subscription profile" is_default_profile="true"><qos><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>DYNAMIC</historyMemoryPolicy></data_reader></profiles>
1、设置环境变量:
export RMW_IMPLEMENTATION=rmw_fastrtps_cppexport RMW_FASTRTPS_USE_QOS_FROM_XML=1 # 必须export FASTRTPS_DEFAULT_PROFILES_FILE=/home/ubuntu/data/param/dds_profile.xml
/home/ubuntu/data/param/dds_profile.xml:
<?xml version="1.0" encoding="UTF-8"?><dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles"><profiles><!-- Default publisher profile --><publisher profile_name="default publisher profile" is_default_profile="true"><qos><publishMode><kind>SYNCHRONOUS</kind></publishMode><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy></publisher><!-- Default subscriber profile --><subscriber profile_name="default subscriber profile" is_default_profile="true"><qos><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy></subscriber><!-- Publisher profile for topic helloworld --><publisher profile_name="helloworld"><qos><publishMode><kind>SYNCHRONOUS</kind></publishMode><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos></publisher><!-- Request subscriber profile for services --><subscriber profile_name="service"><qos><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy></subscriber><!-- Request publisher profile for clients --><publisher profile_name="client"><qos><publishMode><kind>ASYNCHRONOUS</kind></publishMode><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos></publisher><!-- Request subscriber profile for server of service "add_two_ints" --><subscriber profile_name="rq/add_two_intsRequest"><qos><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy></subscriber><!-- Reply subscriber profile for client of service "add_two_ints" --><subscriber profile_name="rr/add_two_intsReply"><qos><data_sharing><kind>AUTOMATIC</kind></data_sharing></qos><historyMemoryPolicy>PREALLOCATED_WITH_REALLOC</historyMemoryPolicy></subscriber></profiles></dds>