目录
Qos (Quality of Service)用于指定服务的行为,允许用户指定每个实体怎样表现或运行。通过XML文件(Profiles)来配置或者在代码中直接指定。
XML profiles
xml配置文件可以有多个。
加载文件
Fast DDS在初始化阶段自动加载XML:
- 在当前可执行文件的路径下加载 DEFAULT_FASTRTPS_PROFILES.xml
- 加载环境变量FASTRTPS_DEFAULT_PROFILES_FILE指定的xml
- 加载配置参数指定的xml文件
- 直接加载xml格式的字符串
加载内容
- 需要在创建任何entity之前调用
load_XML_profiles_file()加载xml文件,或者使用load_XML_profiles_string()加载通过字符串指定的xml格式的内容; - 然后使用
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>
<dds>, <profiles>, <library_settings>, <types>, <log>这些标签可以独立定义。<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_thread | SHM 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子元素
| Name | Description | Values | 默认值 |
|---|---|---|---|
<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>标签可以配置服务发现机制
| Name | Description | Values | Default |
|---|---|---|---|
<discoveryProtocol> | |||
<discoveryServersList> | |||
<ignoreParticipantFlags> | |||
<EDP> | |||
<simpleEDP> | |||
<leaseDuration> | |||
<leaseAnnouncement> | |||
<initialAnnouncements> | |||
<clientAnnouncementPeriod> | |||
<static_edp_xml_config> |
- Port配置
根据RTPS标准,服务发现的单播监听端口计算公式如下:
7400 + 250 * DomainID + 10 + 2 * ParticipantID
| Name | Description | Values | Default |
|---|---|---|---|
<portBase> | uint16_t | 7400 | |
<domainIDGain> | uint16_t | 250 | |
<participantIDGain> | uint16_t | 2 | |
<offsetd0> | uint16_t | 0 | |
<offsetd1> | uint16_t | 10 | |
<offsetd2> | uint16_t | 1 | |
<offsetd3> | uint16_t | 11 |
本文详细介绍了Fast DDS中的Quality of Service (QoS)配置方法,包括通过XML文件和代码配置QoS策略,涵盖了各种策略如History、ResourceLimits、Deadline、Durability等的使用场景及规则。

163

被折叠的 条评论
为什么被折叠?



