LCM库

模块简介

LCM(Lightweight Communications and Marshalling)是一套用于消息传递和数据编组的库和工具的集合,旨在为实时系统提供高带宽和低延迟的消息传递的能力。它提供了一个发布/订阅消息传递模型以及为各种编程语言的应用程序自动生成编/解组代码。
LCM官方地址
使用LCM进行信息交换需要完成以下三个主要步骤:

  1. 初始化LCM
  2. 发布消息
  3. 订阅接受消息

初始化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循环

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值