通过 RTI Conector 发布 sequences/objects 到 ROS2 应用程序
Publishing sequences/objects through RTI Conector to ROS2 applications
我正在将 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
假设用于通信的主题是“objects”,消息类型是“DetectedObjectList”。
由于 ROS2 中的订阅者正在订阅类型为 int16 的 id 和类型为 DetectedObject[] 的对象,我如何从 RTI 连接器发布对象?
RTI 连接器中的常规流程是:
获取输出实例:
output = connector.getOutput("MyPublisher::MyDataWriter")
Post一个实例:
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 映射做出更多贡献。
希望对您有所帮助,
詹皮耶罗
我正在将 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
假设用于通信的主题是“objects”,消息类型是“DetectedObjectList”。
由于 ROS2 中的订阅者正在订阅类型为 int16 的 id 和类型为 DetectedObject[] 的对象,我如何从 RTI 连接器发布对象?
RTI 连接器中的常规流程是:
获取输出实例:
output = connector.getOutput("MyPublisher::MyDataWriter")
Post一个实例:
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 映射做出更多贡献。
希望对您有所帮助, 詹皮耶罗