模块简介
LCM(Lightweight Communications and Marshalling)是一套用于消息传递和数据编组的库和工具的集合,旨在为实时系统提供高带宽和低延迟的消息传递的能力。它提供了一个发布/订阅消息传递模型以及为各种编程语言的应用程序自动生成编/解组代码。
LCM官方地址
使用LCM进行信息交换需要完成以下三个主要步骤:
- 初始化LCM
- 发布消息
- 订阅接受消息
初始化LCM
- 创建一个以.lcm结尾的文件(本例中为l.lcm)
package exlcm; // exlcm 为生成的文件夹名称,同时也是命名空间
struct Example{ // Example 为域名,在文件夹exlcm中会包含一个Example.hpp的头文件
int8_t a;
double b;
}
需要注意的是:结构体struct后面不需要加分号;
- 对l.lcm文件执行lcm-gen程序,就会成一个以我们的域名为名称的文件夹,文件夹下有一个以我们结构体名称为名字的.hpp文件,那么这个.hpp文件就是lcm所需要的数据类型,同时也满足我们自身结构体的设计初衷。
会在命名空间exlcm中生成一个名为Example的class类 - Example.hpp中所有的代码都不需要我们管,我们只需要将它当做我们自己设计的结构体来用就行,通过这个类,LCM就可以将我们的需要和LCM的规范整合到一起来
发布消息
#include <lcm/lcm-cpp.hpp>
#include "exlcm/Example.hpp" // 通过lcm-gen程序自动生成的结构体
int main(int argc, char ** argv)
{
lcm::LCM lcm;
if(!lcm.good()) // 返回初始化是否成功的标识符
return 1;
exlcm::Example my_data; // 实例化结构体
my_data.a=5;
my_data.b=5.0; // 赋值
// 发布消息
// 第一个参数为 channel name
// 第二个参数为需要发送的数据对象的指针
lcm.publish("EXAMPLE", &my_data);
return 0;
}
接收数据
int main(int argc, char** argv)
{
lcm::LCM lcm;
if(!lcm.good())
return 1;
Handler handlerObject;
// 订阅channel 接收消息
// 第一个参数为channel name
// 第二个参数为回调函数
// 第三个参数为回调函数所在的对象的指针
lcm.subscribe("EXAMPLE", &Handler::handleMessage, &handlerObject);
while(0 == lcm.handle());
return 0;
}
handle方法内部其实就是一个recvfrom调用,handle方法会阻塞在recvfrom调用,当接受到消息时,结束handle方法,成功返回0,失败返回 -1,所以如果想要一直接收消息,请使用while循环