Публикация последовательностей / объектов через 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, когда речь идет о неограниченных массивах.
Я надеюсь, что это поможет, Джанпьеро