DDS 键控主题

Posted

技术标签:

【中文标题】DDS 键控主题【英文标题】:DDS Keyed Topics 【发布时间】:2015-01-21 16:49:41 【问题描述】:

我目前在一个系统上使用 RTI DDS,我们将为多个项目设置一个主题,例如带有多个 vin 号码的 car topic。由于这是我正在尝试制作的设计,因此我尝试创建一个 "keyed" topic,它基本上是一个主题,其中有一个成员充当键(有点像数据库中的主键),在本例中将是 vin每辆车。为了实现keyed topics,我使用了一个 IDL 文件,如下所示,

const string CAR_TOPIC = "CAR";
enum ALARMSTATUS 
    ON,
    OFF
;

struct keys 

    long vin; //@key

    string make;

    ALARMSTATUS alarm;

;

当我通过 rtigen 工具运行 IDL 文件以从 IDL 制作 C、Java 等类型的文件时,我唯一能做的就是运行程序看看

Writing keys, count 0
Writing keys, count 1 ...

keys subscriber sleeping for 4 sec...
Received:
    vin: 38
    make: 
    alarm : ON

keys subscriber sleeping for 4 sec...
Received:
    vin: 38
    make: 
    alarm : ON ...

因此很难看出关键主题是如何工作的,以及它们是否真的有效。有没有人知道如何处理从 IDL 文件生成的文件以使程序更实用?另外我从来没有看到CAR 的主题,所以我不确定我是否使用了正确的语法来为 DDS 设置主题。

【问题讨论】:

【参考方案1】:

当你说“我唯一能做的就是运行程序”时,不清楚“该”程序是什么。我无法识别您给出的确切输出,所以您是否调整了生成示例的代码?

无论如何,回应你的一些言论:

因此很难看出关键主题是如何运作的,以及它们是否真的有效。

当 DataReader 中同时存在多个实例的值(即不同的键值)时,键的概念最清晰可见。这相当于拥有一个同时包含多行的数据库表。因此,为了演示关键概念,您必须为 DataWriter 端的关键字段和 write() 结果样本分配不同的值。这在生成的示例中默认不会发生,因此您必须调整代码才能实现。

在 DataReader 方面,您必须确保保留多个值以展示效果。这意味着您不应执行take()(类似于“破坏性读取”),而应执行read()。这样,您的 DataReader 中的值的数量将随着您写入的不同键值的数量而增长。

请注意,在现实生活中,您不应该永远拥有越来越多的键值,就像您不希望数据库表包含越来越多的行一样。

此外,我从来没有看到主题 CAR,所以我不确定我是否使用正确的语法来为 DDS 设置主题。

查看创建主题的代码。方法名称取决于您使用的语言,但应该包含 create_topic() 之类的内容。该调用的第二个参数是主题的名称。一般情况下,您定义的IDL常量CAR_TOPIC不会自动作为Topic的名称,需要在代码中注明。

根据您正在运行的示例,您可以尝试-h 来获取一些额外的标志来使用。您也许可以增加详细程度以查看正在创建的主题的名称,或者将主题名称设置为关闭命令行。

如果您想验证系统中的主题名称,您可以使用rtiddsspy 来观察数据流动。它的输出包括它发现的主题的名称。

【讨论】:

对不起,我的意思是有一个**classname**Publisher.java,默认情况下我对文件真正能做的就是运行那个发布者类。所以基本上我必须加入这些类并使用它们听起来像。它是一种像 jaxb 这样的类生成器,每个都说它们不是用来运行程序而是补充你想做的事情? OK - 请注意,此**classname**Publisher.java 纯粹是为您提供的示例。它不应该在您的应用程序中使用。如果您想了解该示例中的不同代码块,我建议您查看参考手册中“模块”部分中的“编程方法”部分。见community.rti.com/rti-doc/500/ndds/doc/html/api_java 啊,好的,谢谢。我知道我做对了,但不确定生成类后该做什么,这很有帮助。所以如果我喜欢正确的话,我可以覆盖那里的内容和读者? 是的,您可以覆盖其中的内容。当您再次运行make 时,请注意不要丢失您的修改。例如,当您更改 IDL 时,将重新生成其所有依赖项,包括示例类。虽然我认为默认情况下,它会拒绝覆盖现有文件。 是的。你还知道 rti 使用的 idl 语法的好资源吗?

以上是关于DDS 键控主题的主要内容,如果未能解决你的问题,请参考以下文章

如何使用通配符订阅一组相似的 DDS 主题

如何使用 python 和静态创建的主题类创建 OpenSplice DDS 主题?

ROS2/DDS/QoS/主题的记录

为 DDS 录制服务创建配置文件

DDS 中的互操作性

每个子任务/分区是不是可以有一个窗口