Fast DDS中的xml配置

本文详细介绍了Fast DDS中的Quality of Service (QoS)配置方法,包括通过XML文件和代码配置QoS策略,涵盖了各种策略如History、ResourceLimits、Deadline、Durability等的使用场景及规则。


Qos (Quality of Service)用于指定服务的行为,允许用户指定每个实体怎样表现或运行。通过XML文件(Profiles)来配置或者在代码中直接指定。

XML profiles

xml配置文件可以有多个。

加载文件

Fast DDS在初始化阶段自动加载XML:

  • 在当前可执行文件的路径下加载 DEFAULT_FASTRTPS_PROFILES.xml
  • 加载环境变量FASTRTPS_DEFAULT_PROFILES_FILE指定的xml
  • 加载配置参数指定的xml文件
  • 直接加载xml格式的字符串

加载内容

  1. 需要在创建任何entity之前调用load_XML_profiles_file() 加载xml文件,或者使用load_XML_profiles_string()加载通过字符串指定的xml格式的内容;
  2. 然后使用create_participant_with_profile(), create_publisher_with_profile(), create_subscriber_with_profile(), create_datawriter_with_profile(), and create_datareader_with_profile() 这些方法通过参数指定的profile name创建对应的entity。

文件格式

模板

<?xml version="1.0" encoding="UTF-8" ?>
<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <profiles>
        <domainparticipant_factory profile_name="domainparticipant_factory_profile">
            <!-- ... -->
        </domainparticipant_factory>

        <participant profile_name="participant_profile">
            <!-- ... -->
        </participant>

        <data_writer profile_name="datawriter_profile">
            <!-- ... -->
        </data_writer>

        <data_reader profile_name="datareader_profile">
            <!-- ... -->
        </data_reader>

        <topic profile_name="topic_profile">
            <!-- ... -->
        </topic>

        <transport_descriptors>
            <!-- ... -->
        </transport_descriptors>
    </profiles>

    <library_settings>
        <!-- ... -->
    </library_settings>

    <log>
        <!-- ... -->
    </log>

    <types>
        <!-- ... -->
    </types>
</dds>
  1. <dds>, <profiles>, <library_settings>, <types>, <log> 这些标签可以独立定义。
  2. <participant>, <data_reader>, <data_writer>, <topic>, <transport_descriptors> 这些标签必须作为<profiles>的子元素

代码中修改

这些Qos的设置也可以在代码中增加或修改。具体内容参考源代码,这里不做介绍,因为介绍这些没有太大的意义,看源码去写是最靠谱的。

domainparticipant_factory

domainparticipant_factory的xml配置定义在domainparticipant_factory标签下。模板如下:

<?xml version="1.0" encoding="UTF-8" ?>
<dds>
    <profiles xmlns="http://www.eprosima.com">
        <domainparticipant_factory profile_name="domainparticipant_factory_profile_name">
            <qos>
                <entity_factory>
                    <autoenable_created_entities>true</autoenable_created_entities>
                </entity_factory>
                <shm_watchdog_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </shm_watchdog_thread>
                <file_watch_threads>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </file_watch_threads>
            </qos>
        </domainparticipant_factory>
    </profiles>
<dds>

属性

属性有两个

名字描述
profile_name
is_default_profile

子元素

子元素有一个:Qos

Qos元素

QoS的子元素有三个

名字描述
entity_factory
shm_watchdog_threadSHM watchdog的线程设置
file_watch_threads文件监控的线程设置

DomainParticipant

DomainParticipant的配置是以 <participant> 标签开始,模板如下

<?xml version="1.0" encoding="UTF-8" ?>
<dds>
    <profiles xmlns="http://www.eprosima.com">
        <participant profile_name="domainparticipant_profile_name">
            <domainId>4</domainId>
            <rtps>
                <name>DomainParticipant Name</name>

                <defaultUnicastLocatorList>
                    <!-- LOCATOR_LIST -->
                    <locator>
                        <udpv4>
                            <port>7400</port>
                            <address>192.168.1.41</address>
                        </udpv4>
                    </locator>
                </defaultUnicastLocatorList>

                <defaultMulticastLocatorList>
                    <!-- LOCATOR_LIST -->
                    <locator>
                        <udpv4>
                            <port>7400</port>
                            <address>192.168.2.41</address>
                        </udpv4>
                    </locator>
                </defaultMulticastLocatorList>

                <default_external_unicast_locators>
                    <!-- EXTERNAL_LOCATOR_LIST -->
                    <udpv4 externality="1" cost="0" mask="24">
                        <address>100.100.100.10</address>
                        <port>23456</port>
                    </udpv4>
                </default_external_unicast_locators>

                <ignore_non_matching_locators>true</ignore_non_matching_locators>

                <sendSocketBufferSize>8192</sendSocketBufferSize>

                <listenSocketBufferSize>8192</listenSocketBufferSize>

                <netmask_filter>ON</netmask_filter>

                <builtin>
                    <!-- BUILTIN -->
                </builtin>

                <port>
                    <portBase>7400</portBase>
                    <domainIDGain>200</domainIDGain>
                    <participantIDGain>10</participantIDGain>
                    <offsetd0>0</offsetd0>
                    <offsetd1>1</offsetd1>
                    <offsetd2>2</offsetd2>
                    <offsetd3>3</offsetd3>
                </port>

                <participantID>99</participantID>

                <userTransports>
                    <transport_id>TransportId1</transport_id>
                    <transport_id>TransportId2</transport_id>
                </userTransports>

                <useBuiltinTransports>false</useBuiltinTransports>

                <builtinTransports>DEFAULT</builtinTransports>

                <propertiesPolicy>
                    <!-- PROPERTIES_POLICY -->
                    <properties>
                        <property>
                            <name>Property1Name</name>
                            <value>Property1Value</value>
                            <propagate>false</propagate>
                        </property>
                    </properties>
                </propertiesPolicy>

                <allocation>
                    <!-- ALLOCATION -->
                </allocation>

                <userData>
                    <value>3.4.7.0.C</value>
                </userData>

                <prefix>72.61.73.70.66.61.72.6d.74.65.73.74</prefix>

                <builtin_controllers_sender_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </builtin_controllers_sender_thread>

                <timed_events_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </timed_events_thread>

                <discovery_server_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </discovery_server_thread>

                <typelookup_service_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </typelookup_service_thread>

                <builtin_transports_reception_threads>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </builtin_transports_reception_threads>

                <security_log_thread>
                    <scheduling_policy>-1</scheduling_policy>
                    <priority>0</priority>
                    <affinity>0</affinity>
                    <stack_size>-1</stack_size>
                </security_log_thread>

                <flow_controller_descriptor_list>
                    <flow_controller_descriptor>
                        <name>example_flow_controller</name>
                        <scheduler>FIFO</scheduler>
                        <max_bytes_per_period>4096</max_bytes_per_period>
                        <period_ms>500</period_ms>
                        <sender_thread>
                            <scheduling_policy>-1</scheduling_policy>
                            <priority>0</priority>
                            <affinity>0</affinity>
                            <stack_size>-1</stack_size>
                        </sender_thread>
                    </flow_controller_descriptor>
                </flow_controller_descriptor_list>
            </rtps>
        </participant>
    </profiles>
</dds>

属性

属性有两个

名字描述
profile_name
is_default_profile

子元素

子元素有两个, and

name描述值类型默认值
<domainId>uint32_t
<rtps>dds domainparticipant的配置

RTPS子元素

NameDescriptionValues默认值
<name>
<defaultUnicastLocatorList>
<defaultMulticastLocatorList>
<default_external_unicast_locators>
<ignore_non_matching_locators>
<sendSocketBufferSize>
<listenSocketBufferSize>
<netmask_filter>
<builtin>
<port>
<participantID>
<easy_mode_ip>
<userTransports>
<useBuiltinTransports>
<builtinTransports>
<propertiesPolicy>
<allocation>
<userData>
<prefix>
<builtin_controllers_sender_thread>
<timed_events_thread>
<discovery_server_thread>
<typelookup_service_thread>
<builtin_transports_reception_threads>
<security_log_thread>
<flow_controller_descriptor_list>
Builtin参数

Builtbin参数配置模板

<builtin>
    <discovery_config>
        <discoveryProtocol>CLIENT</discoveryProtocol>

        <discoveryServersList>
            <locator>
                <udpv4>
                    <address>192.168.10.57</address>
                    <port>56542</port>
                </udpv4>
            </locator>
            <locator>
                <udpv4>
                    <address>192.168.10.58</address>
                    <port>24565</port>
                </udpv4>
            </locator>
        </discoveryServersList>

        <ignoreParticipantFlags>FILTER_DIFFERENT_HOST</ignoreParticipantFlags>

        <EDP>SIMPLE</EDP>

        <simpleEDP>
            <PUBWRITER_SUBREADER>true</PUBWRITER_SUBREADER>
            <PUBREADER_SUBWRITER>true</PUBREADER_SUBWRITER>
        </simpleEDP>

        <leaseDuration>
            <!-- DURATION -->
            <sec>20</sec>
        </leaseDuration>

        <leaseAnnouncement>
            <!-- DURATION -->
            <sec>3</sec>
        </leaseAnnouncement>

        <initialAnnouncements>
            <!-- INITIAL_ANNOUNCEMENTS -->
            <count>10</count>
            <period>
                <nanosec>50</nanosec>
            </period>
        </initialAnnouncements>

        <clientAnnouncementPeriod>
            <nanosec>250000000</nanosec>
        </clientAnnouncementPeriod>

        <static_edp_xml_config>file://filename1.xml</static_edp_xml_config>
        <static_edp_xml_config>file://filename2.xml</static_edp_xml_config>
        <static_edp_xml_config>file://filename3.xml</static_edp_xml_config>
    </discovery_config>

    <avoid_builtin_multicast>true</avoid_builtin_multicast>

    <use_WriterLivelinessProtocol>false</use_WriterLivelinessProtocol>

    <metatrafficUnicastLocatorList>
        <!-- LOCATOR_LIST -->
        <locator>
            <udpv4>
                <address>192.168.0.1</address>
            </udpv4>
        </locator>
    </metatrafficUnicastLocatorList>

    <metatrafficMulticastLocatorList>
        <!-- LOCATOR_LIST -->
        <locator>
            <udpv4>
                <address>192.168.0.1</address>
            </udpv4>
        </locator>
    </metatrafficMulticastLocatorList>

    <initialPeersList>
        <!-- LOCATOR_LIST -->
        <locator>
            <udpv4>
                <address>192.168.0.1</address>
            </udpv4>
        </locator>
    </initialPeersList>

    <metatraffic_external_unicast_locators>
        <!-- EXTERNAL_LOCATOR_LIST -->
        <udpv4 externality="1" cost="0" mask="24">
            <address>100.100.100.10</address>
            <port>34567</port>
        </udpv4>
    </metatraffic_external_unicast_locators>

    <readerHistoryMemoryPolicy>PREALLOCATED_WITH_REALLOC</readerHistoryMemoryPolicy>

    <writerHistoryMemoryPolicy>PREALLOCATED_WITH_REALLOC</writerHistoryMemoryPolicy>

    <readerPayloadSize>512</readerPayloadSize>

    <writerPayloadSize>512</writerPayloadSize>

    <mutation_tries>55</mutation_tries>

</builtin>
discovery_config

通过<discovery_config>标签可以配置服务发现机制

NameDescriptionValuesDefault
<discoveryProtocol>
<discoveryServersList>
<ignoreParticipantFlags>
<EDP>
<simpleEDP>
<leaseDuration>
<leaseAnnouncement>
<initialAnnouncements>
<clientAnnouncementPeriod>
<static_edp_xml_config>
  1. Port配置
    根据RTPS标准,服务发现的单播监听端口计算公式如下:
7400 + 250 * DomainID + 10 + 2 * ParticipantID
NameDescriptionValuesDefault
<portBase>uint16_t7400
<domainIDGain>uint16_t250
<participantIDGain>uint16_t2
<offsetd0>uint16_t0
<offsetd1>uint16_t10
<offsetd2>uint16_t1
<offsetd3>uint16_t11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值