Matlab/Simulink在自动驾驶开发中的快速算法模型验证(LCM,protobuf实现通讯)

1. 背景:

  • simulink可以用来搭建各种模型及算法,且可以自动生成汽车级的c/c++代码,支持从原型开发到工业级代码生成。
  • 使用simulink搭建自动驾驶需要的算法,并与其他自动驾驶模块及仿真环境通讯,实现快速模型验证。
  • LCM是基于UDP广播通讯的跨平台,跨语言的数据交换工具,多家自动驾驶公司均有使用。https://lcm-proj.github.io/
  • Protobuf是google开发的跨平台,跨语言的数据交换工具,https://github.com/protocolbuffers/protobuf/tree/master
  • 这里主要讨论是基于LCM和protobuf的simulink与其他模块的通讯(跨平台) 

2. 架构:

  • Matlab/Simulink在自动驾驶开发中的快速算法模型验证(LCM,protobuf实现通讯)_第1张图片
  • 所有的数据结构都通过protobuf定义,好处就是数据结构变更之后,依然可以兼容之前保存的log数据
  • protobuf序列化为byte[](不要用string)之后,通过LCM广播。LCM虽然也可以定义数据结构并序列化,但是数据结构修改之后,那么代码不能使用之前的log数据。
  • matlab的m脚本可以直接使用jar包,故需要将LCM的publish和subscribe,以及prototbuf的序列化和反序列化都使用java语言编写好,打包成jar包,供m脚本调用
  • 再使用level 2 s-function封装一个simulink block来调用jar包,实现LCM+protobuf的数据的收发
  • protobuf-java.jar包从 https://repo1.maven.org/maven2/com/google/protobuf/protobuf-java/,下载
  • lcm.jar可以直接从lcm的源代码打包
  • 注意使用LCM时,特别是subscribe的函数,要设置接收消息队列的buffer大小,LCM默认不限制接收buffer的大小,很危险。
  • 编译的jar包需要放在simulink特定的目录下,在matlab的cmd窗口,输入 edit('classpath.txt'),就知道该怎么做了

3. 结果:

  • simulink(windows)运行controller模型,Ubuntu(虚拟机)运行车辆动力学。controller发送control_cmd,车辆动力学发送canbus_chassis
  • simulink的s-function
  • Matlab/Simulink在自动驾驶开发中的快速算法模型验证(LCM,protobuf实现通讯)_第2张图片
  • 运行结果:
  • Matlab/Simulink在自动驾驶开发中的快速算法模型验证(LCM,protobuf实现通讯)_第3张图片

你可能感兴趣的:(自动驾驶,汽车电子,matlab)