我将ROS2与Python的本机RTI DDS连接器接口,我在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的id和类型为DetectedObject []的对象,因此如何从RTI连接器发布对象?

RTI Connector中的通常流程是:


获取输出的实例:

output = connector.getOutput("MyPublisher::MyDataWriter")
发布实例:

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

output.write()


如何编写类型为DetectedObject而不是setNumber的对象?

最佳答案

我没有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映射做出更多贡献。

希望有帮助
  詹皮耶罗

09-19 06:02