FAST-RTPS的idl文件使用教程

2019-12-19  本文已影响0人  prophet__

FAST-RTPS

之前就有提到过FAST-RTPS是使用在多机通讯上的一种中间件,可以在同一个局域网之内进行UDP转发和相同话题之间的通讯。
FAST-RTPS的安装有很多版本,我选择的是eProsima的eProsima rtps下载


在每个participant(参与机器)的程序当中,最基础的事情是要定义一个消息格式(.idl文件)。

idl文件

idl文件在通讯系统的当中的作用类似于定义一个C++的结构体,这个结构体里可以放置各种各样的变量。

//hello.idl
struct hello
{
   string hello_msg;
   short num;
};

一个普通的idl文件大概就是长上面这样,在struct当中定义的变量类型与C++有所不同,不同的RTPS版本对idl文件的要求也不一样。我所使用的是eProsima出的rtps版本,关于变量类型的定义可以查询下面这个网站。idl撰写文档

撰写好了idl之后,我们先将安装好的fastrtpsgen加入到环境变量当中。
在ubuntu下打开~/.bashrc,在最低下加入

export PATH=(你的fastrtpsgen路径):$PATH

然后打开终端,通过使用下面的代码通过fastrtpsgen帮你生成通讯所需要的一些函数和代码。

fastrtpsgen -example CMake hello.idl

这一步之后会在文件夹下生成一堆的.cxx和.h文件,同时会生成一个CMakeList.txt。
主要我们可以调用的东西都写在xxxPubSubmain.cxx/xxxPublisher.cxx/xxxSubscriber.cxx当中了,首先更改一下Publisher里的run,在函数当中对两个变量进行赋值。然后可以看一眼Subscriber的OnNewMessage函数,通过打印st.num()来观察消息是否发送成功。

注意事项

在对基础的应用有了一些了解之后,在我使用过程当中有一些注意事项提醒一下大家。由于在使用过程当中,是多机通讯,不同的机器上有一个自己的消息文件夹。

当某些时候发现这个idl文件有需要增删改查的变量的时候,就会对这个idl文件进行修改。
1.改完了idl文件之后,需要重新使用fastrtpsgen进行代码的生成,因为变量名变了,如果不重新生成会失败。

2.改完了一个机器上的代码之后,要使两个机器上的idl包括生成的代码保持一致。idl变量在代码当中的储存形式类似于一个vector,如果你两边的idl不一样,那么即使你对某些代码赋值了,可能会赋值到它的上一个顺序变量当中,结果本体没有赋值,最后程序出现错误。(血泪教训)。

3.idl文件可以调用我们在idl当中编写的其他结构体,就像是一个嵌套的结构体一样。代码如下所示。

//MSG_hello.idl
struct detect
{
   boolean yesorno;
   short guid;
}
struct hello
{
   detect detection;
   string hello_msg;
   short num;
};

那么如何在程序当中给detect当中的yesorno赋值呢?

    bool a = true;
    hello.detection().yesorno() = a ;

关于简化idl文件生成的有关事宜

idl文件里加入-example会生成很多类似于样例的文件,但是其实在后期使用当中,我们是需要自己写这些文件的,所以我们只要生成一些核心的文件,其他的文件是要放在别的地方,然后调用这些核心函数的。

生成简化的fastrtps文件的命令是:

fastrtpsgen Helloworld.idl

不加任何的参数。关于参数的部分,可以参考官方库。


关于idl的介绍大概就是这么多了,有什么疑问可以留言讨论。

上一篇 下一篇

猜你喜欢

热点阅读