写在前面
说到自动驾驶间的通讯,最常见的就是ROS以及一些基于ROS的改进,例如Apollo的Cyber就可以看作是升级版的ROS,今天介绍一种适用于高速自动驾驶场景的LCM通信协议,其特点是轻量化、传输速度快,易封装。
LCM(Lightweight Communications and Marshalling)是一组用于消息传递和数据编组的库和工具,其基于UDP传输的属性,传输速度较快,其目标是高带宽和低延迟的实时系统。它提供了一种发布/订阅消息传递模型以及带有各种编程语言C++、Java、python等应用程序绑定的自动编组/解组代码生成,LCM通过将消息封装在不同的Channel中进行通信,这点类似于ROS中的Topic。
LCM官方的学习文档
LCM1.40版本下载地址
首先下载lcm-1.4.0.zip
然后解压,或者使用命令行解压
unzip lcm-1.3.1.zip
之后进入lcm-1.4.0文件夹,要注意的是1.40版本及之后已经不提供 ./configure的安装方式了,所以直接按照cmake安装即可。
cd lcm-1.3.1
mkdir build
cd build
cmake ..
sudo make install
至此lcm就算是安装完成了!
关于教程可以直接看官方教程以及文档。lcm类型定义与编程语言无关,这里介绍一下利用C++收发消息,参考这篇博客。
使用C ++发送和接收LCM消息
进入lcm_example文件夹,新建example_t.lcm空白文档,写入以下内容
package exlcm;
struct example_t
{
int64_t timestamp;
double position[3];
double orientation[4];
int32_t num_ranges;
int16_t ranges[num_ranges];
string name;
boolean enabled;
}
打开终端,执行命令
lcm-gen -x example_t.lcm
如果你使用其他语言,用lcm-gen -h
获取帮助。运行之后生成一个文件夹exlcm,并包含一个文件example_t.hpp,到这里lcm结构体定义完成。
发送消息
在lcm_example目录下,新建send_message.cpp复制以下内容
// file: send_message.cpp
//
// LCM example program.
//
// compile with:
// $ g++ -o send_message send_message.cpp -llcm
//
// On a system with pkg-config, you can also use:
// $ g++ -o send_message send_message.cpp `pkg-config --cflags --libs lcm`
#include <lcm/lcm-cpp.hpp>
#include "exlcm/example_t.hpp"
int main(int argc, char ** argv)
{
lcm::LCM lcm;
if(!lcm.good())
return 1;
exlcm::example_t my_data;
my_data.timestamp = 0;
my_data.position[0] = 1;
my_data.position[1] = 2;
my_data.position[2] = 3;
my_data.orientation[0] = 1;
my_data.orientation[1] = 0;
my_data.orientation[2] = 0;
my_data.orientation[3] = 0