博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
LCM通信模块简介
阅读量:6257 次
发布时间:2019-06-22

本文共 3630 字,大约阅读时间需要 12 分钟。

1. LCM通信模块简介

LCM(Lightweight Communications and Marshalling)是一套用于消息传递和数据编组的库和工具的集合,旨在为实时系统提供高带宽和低延迟的消息传递的能力。它提供了一个发布/订阅消息传递模型以及为各种编程语言的应用程序自动生成编/解组代码。
LCM允许多个进程以安全和高性能地方式进行消息的交换。消息是LCM通信的基本单元,开发者可将消息定义为与编程语言无关的数据结构,然后使用LCM提供的lcm-gen工具将自定义的数据结构编译为特定语言的代码。lcm-gen支持C、C++、Java、Python等编程语言,关于lcm-gen的使用可以参考官方文档。
LCM官方下载地址为:

2. LCM通信模块使用方法

本节旨在介绍基于C编程语言进行LCM通信的使用方法。在此之前,用户需要使用lcm-gen工具将自定义的数据结构编译为LCM能够处理的消息格式。
开发者使用LCM进行消息交换时需要完成以下三个主要步骤:
1)初始化LCM;
2)发布一个消息;
3)订阅及接收消息。
2.1 初始化
LCM的初始化代码如下所示。

#include 
#include
int main(int argc, char **argv){ lcm_t *lcm = lcm_create(NULL); if(!lcm) { return (PX_ERROR);} /* * 用户应用程序代码 */ lcm_destroy(lcm); return (ERROR_NONE);}

函数lcm_create主要完成lcm_t实例的分配与初始化,该实例表示与LCM网络的连接。其入参为NULL表示使用默认设置来初始化LCM。初始化的默认值适合于本地计算机上的其他LCM应用程序进行通信,也可以指定底层网络通信机制的字符串。

完成之后,调用lcm_destroy来清理LCM使用的资源。
2.2 发布消息
假定用户已使用lcm-gen生成了“exlcm_example_t.h”和“exlcm_example_t.c”两个文件,其中用户定义的数据结构被lcm-gen编译并保存在“exlcm_example_t.h”中,假设生成的消息结构如下所示。

typedef struct _exlcm_example_t exlcm_example_t;struct _exlcm_example_t {    int64_t  timestamp;    double   position[3];    double   orientation[4];    int32_t  num_ranges;    int16_t  ranges;    char     name;    int8_t   enabled;};

接下来我们将按照消息结构实例化一些数据并进行发布,如下所示。

#include 
#include
#include "exlcm_example_t.h"int main(int argc, char **argv){ int i; int16_t ranges[15]; lcm_t *lcm = lcm_create(NULL); if(!lcm) { return (PX_ERROR); } exlcm_example_t lcmData = { .timestamp = 0, .position = { 1, 2, 3 }, .orientation = { 1, 0, 0, 0 }, }; for(i = 0; i < 15; i++) { ranges[i] = i; } lcmData.num_ranges = 15; lcmData.ranges = ranges; lcmData.name = "example string"; lcmData.enabled = 1; exlcm_example_t_publish(lcm, "EXAMPLE", &lcmData); lcm_destroy(lcm); return (ERROR_NONE);}

函数exlcm_example_t_publish将数据串行化为字节流,并使用LCM将数据包发送给接收器,“EXAMPLE”在这里表示通道名,是与数据包一起进行传输的字符串,用于向接收方标识内容。接收这使用该标识符订阅不同的通道,从而可以快速有效的丢弃无关的数据。

2.3 订阅消息
如2.2节所描述,每个LCM消息都以相关联的通道名发送,用户可以根据通道名决定应用程序接收哪些已订阅的消息。发布者与接收者必须就每种消息类型达成使用的通道名的一致性。
消息订阅示例代码如下所示。

#include 
#include
#include
#include
#include "exlcm_example_t.h"static void my_handler (const lcm_recv_buf_t *rbuf, const char *channel, const exlcm_example_t *msg, void *user){ printf("Received message on channel %s:\n", channel);}int main(int argc, char ** argv){ int status lcm_t *lcm; lcm = lcm_create(NULL); if(!lcm) { return (PX_ERROR); } exlcm_example_t_subscription_t *sub = exlcm_example_t_subscribe(lcm, "EXAMPLE", &my_handler, NULL); while(1) { fd_set fds; int lcm_fd = lcm_get_fileno(lcm); FD_ZERO(&fds); FD_SET(lcm_fd, &fds); struct timeval timeout = { 1, 0 }; status = select(lcm_fd + 1, &fds, 0, 0, &timeout); if(ERROR_NONE == status) { printf("waiting for message\n"); } else if(FD_ISSET(lcm_fd, &fds)) { lcm_handle(lcm); } } exlcm_example_t_unsubscribe(lcm, sub); lcm_destroy(lcm); return (ERROR_NONE);}

本示例代码首先创建了一个LCM实例,然后向“EXAMPL”通道添加订阅,当该通道接收到消息,将会调用my_handler将该通道打印出来。其中my_handler是在lcm_handle函数内被调用的。如果其他通道上有消息传输,则该示例程序不会接收到,因为该程序只订阅了“EXAMPL”通道。通常一个特定的LCM实例可能具有若干数量的订阅。

3. 最后
SylixOS基于LCM通信模块开发了一套板间通信机制。该机制主要完成了对LCM库的进一步封装。详细内容参见文档《SylixOS板间通信框架开发手册》。

转载于:https://blog.51cto.com/12557908/2150593

你可能感兴趣的文章
11月20日学习内容整理:jquery插件
查看>>
SVN与TortoiseSVN实战:补丁详解
查看>>
获取页面中所有dropdownlist类型控件
查看>>
读《淘宝数据魔方技术架构解析》有感
查看>>
[转载]如何破解Excel VBA密码
查看>>
【BZOJ】2563: 阿狸和桃子的游戏
查看>>
redis 中文字符显示
查看>>
顺序图【6】--☆☆
查看>>
Docker Swarm 让你事半功倍
查看>>
javaScript事件(四)event的公共成员(属性和方法)
查看>>
Oracle SID爆破工具SidGuess
查看>>
批处理常用命令总结2
查看>>
Android -- 自定义View小Demo,绘制钟表时间(一)
查看>>
信息检索Reading List
查看>>
自动精简配置&重复数据删除核心技术点及其经济效应探究
查看>>
cncert网络安全周报35期 境内被植入后门的政府网站112个 环比上涨24.4%
查看>>
物联网到底是不是泡沫,且看英特尔交出的答案
查看>>
IPv6太落后了:中国加速服务器援建
查看>>
物理引擎中velocity的单位是个什么鬼?
查看>>
oracle的drop命令
查看>>