Взаимодействие родной системы DDS с ROS2

Для связи с издателем на основе ROS2 и подписчиком на основе RTI Connext оба они должны иметь совместимые настройки QoS.

Я использую RTI Connector для python и использую XML Application Creation для запуска подписчика.

Я запускаю talker_py в ROS2 с

Я добавил <types> в свой USER_QoS.xml, и это выглядит так:

<dds xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://community.rti.com/schema/5.1.0/rti_dds_profiles.xsd" version="5.1.0">

    <!-- Qos Library -->
    <qos_library name="QosLibrary">
        <qos_profile name="DefaultProfile" is_default_qos="true">
           <datawriter_qos>
            <history>
                <kind>KEEP_LAST_HISTORY_QOS</kind>
                <depth>1000</depth>
            </history>
            <reliability>
                <kind>RELIABLE_RELIABILITY_QOS</kind>
            </reliability>
            <durablitiy>
                <kind>VOLATILE_DURABILITY_QOS</kind>
            </durablitiy>
           </datawriter_qos>
            <participant_qos>
                <transport_builtin>
                    <mask>UDPV4 | SHMEM</mask>
                </transport_builtin>

                <!-- Turn on monitoring -->
                <!-- Begin Monitoring
                <property>
                    <value>
                        <element>
                            <name>rti.monitor.library</name>
                            <value>rtimonitoring</value>
                        </element>
                        <element>
                            <name>rti.monitor.create_function_ptr</name>
                            <value>$(NDDS_MONITOR)</value>
                        </element>
                    </value>
                </property>
                 End Monitoring -->
            </participant_qos>
        </qos_profile>
    </qos_library>

    <!-- types -->
    <types>
    <module name="std_msgs">
      <module name="msg">
        <module name="dds_">

          <struct name="String_" extensibility="extensible">
            <member name="data_" type="std_msgs::msg::dds_::string" "/>

          </struct>
        </module>
      </module>
    </module>
    </types>


    <!-- Domain Library -->
    <domain_library name="MyDomainLibrary">
        <domain name="MyDomain" domain_id="0">
            <register_type name="std_msgs::msg::dds_::String_"  type_ref="std_msgs::msg::dds_::String_" />
            <topic name="chatter"    register_type_ref="std_msgs::msg::dds_::String_"/>

        </domain>
    </domain_library>


    <!-- Participant library -->
    <domain_participant_library name="MyParticipantLibrary">
      <domain_participant name="Zero" domain_ref="MyDomainLibrary::MyDomain">

        <subscriber name="MySubscriber">
          <data_reader name="MyChatterReader" topic_ref="chatter" />
        </subscriber>

          </domain_participant>
   </domain_participant_library>
</dds>

Теперь, когда я использую RTI Connector для python, первым делом я пытаюсь загрузить файл USER_QoS.xml, и он всегда выдает ошибку Unable to parse the .xml file. Я твердо уверен, что это из-за присутствия ключевого слова module в определении <types>.

Вот сценарий python для RTI Connector:

from __future__ import print_function
from sys import path as sysPath
from os import path as osPath
from time import sleep
filepath = osPath.dirname(osPath.realpath(__file__))
sysPath.append(filepath + "/../../../")
import rticonnextdds_connector as rti

connector = rti.Connector("MyParticipantLibrary::Zero",
                          filepath + "/../User_QoS.xml")
inputDDS = connector.getInput("MySubscriber::MyChatterReader")

for i in range(1, 500):
    inputDDS.take()
    numOfSamples = inputDDS.samples.getLength()
    for j in range(1, numOfSamples+1):
        if inputDDS.infos.isValid(j):
            # This gives you a dictionary
            sample = inputDDS.samples.getDictionary(j)
            x = sample['x']
            # Or you can just access the field directly
            toPrint = "Received x: " + repr(x)

            print(toPrint)
    sleep(2)

Я чувствую, что соединитель не может проанализировать это module ключевое слово. Может ли быть так?


person Vishal Rawat    schedule 27.07.2018    source источник


Ответы (1)


Когда я пробую вашу настройку, Connector обеспечивает больше выходных данных, чем вы указали. Среди прочего:

RTIXMLParser_validateOnStartTag:Parse error at line 15: Unexpected tag 'durablitiy'

Это ошибка в вашем XML, согласно его схеме имя тега должно быть durability.

Тогда вы, кажется, сделали ошибки копирования-вставки, копируя сгенерированный тег <types> и его содержимое в ваш XML. Для этого коннектор выдает следующую ошибку:

RTIXMLParser_parseFromFile_ex:Parse error at line 50: not well-formed (invalid token)

Действительно, в вашей строке 50 в конце есть лишняя цитата:

<member name="data_" type="std_msgs::msg::dds_::string" "/>

Кроме того, значение атрибута type отличается от сгенерированного XML, который вы пытались вставить сюда, который имеет:

<member name="data_" type="string"/>

После исправления этих ошибок Connector создает экземпляр правильно.

Чтобы проверить свой XML-файл на соответствие его схеме, вы можете / должны использовать связанную схему XSD определение.

person Reinier Torenbeek    schedule 27.07.2018