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的介绍大概就是这么多了,有什么疑问可以留言讨论。
网友评论