Публикация последовательностей / объектов через RTI Conector для приложений ROS2

Я взаимодействую с ROS2 с собственным соединителем RTI DDS для Python, где я публикую сообщения в RTI соединителе и подписываюсь в ROS2.

У меня есть следующая структура сообщения для сообщения с именем DetectedObjectList:

int16 id
// An array of objects of another message type
DetectedObject[ ] objects

Это интерпретируется как неограниченные последовательности в IDL.

Другое сообщение с именем DetectedObject:

int16 id
string name
int16 x
int16 y

Допустим, тема, используемая для связи, - "объекты", а тип сообщения - "DetectedObjectList".

Поскольку подписчик в ROS2 подписывается на идентификатор типа int16 и объекты типа DetectedObject [], как я могу опубликовать объект из коннектора RTI?

Обычный поток в соединителе РТИ:

  • Получить экземпляр вывода:

    output = connector.getOutput("MyPublisher::MyDataWriter")

  • Опубликовать экземпляр:

    output.instance.setNumber("id", 5)

    output.write()

Как я могу написать объект типа DetectedObject вместо setNumber?

1 ответ

Решение

У меня нет опыта работы с ROS, но я постараюсь помочь с частью DDS/Connector.

Насколько я знаю, в DDS нельзя указывать неограниченный массив. Вы можете иметь неограниченные последовательности, но не массивы. Итак, если вы используете тип, который выглядит следующим образом:

struct DetectedObject {
  short id;
  string name;
  short x;
  short y;
};


struct MyMessage {
  short id;
  DetectedObject objects[10];
};

или вместо этого у вас есть неограниченная последовательность:

struct DetectedObject {
  short id;
  string name;
  short x;
  short y;
};


struct MyMessage {
  short id;
  sequence<DetectedObject> objects;
};

Тогда ваш код соединителя будет примерно таким:

connector = rti.Connector("MyParticipantLibrary::PubParticipant",
                          filepath + "/ROS.xml")
outputDDS = connector.getOutput("MyPub::MyTopicWriter")

for i in range(1, 500):
    # There are two ways to set values in an instance:

    # 1. Field by Fields:
    outputDDS.instance.setNumber("id", 1)
        #note index, for now, starts from 1. This may change in the future
    outputDDS.instance.setNumber("objects[1].id", 2)
    outputDDS.instance.setString("objects[1].name", "aName")
    outputDDS.instance.setNumber("objects[1].x", 3)
    outputDDS.instance.setNumber("objects[1].y", 4)
    outputDDS.write()

        # OR

    # 2. By first creating a dictionary and then setting it all at once:
    myDict = {'id': 5, 'objects': [{'id': 6, 'name': '', 'x': 7, 'y': 8}]}
    outputDDS.instance.setDictionary(myDict)
    outputDDS.write()
    sleep(2)

Может быть, кто-то еще может внести свой вклад в отображение ROS <-> DDS, когда речь идет о неограниченных массивах.

Я надеюсь, что это поможет, Джанпьеро

Другие вопросы по тегам