张金博 张喜民 袁战军
摘 要: 智能车辆的发展对控制系统提出了更高的要求,因而设计了一款智能车无线控制系统。系统基于ARM Linux,开发并实现了车载系统客户端,在搭建了交叉编译开发环境的基础上对嵌入式Linux内核进行了配置编译,并详细介绍了数据采集与发送层的编码实现过程,实现了采集图像与录制视频、网路发送与监控功能,各模块设计为独立进程,各子模块作为独立线程运行,监控软件客户端通过内存盘中的文件完成数据交换过程,从而有效实现了异步执行和远程监控功能。
关键词: 智能车辆无线控制; ARM Linux; 远程监控系统; 实现路径
中图分类号: TP 273.5 文献标志码: A
Design and Research of Wireless Control System for Smart
Car Based on ARM Technology
ZHANG Jinbo, ZHANG Ximin, YUAN Zhanjun
(School of Information Engineering, Shanxi Institute of International Trade & Commerce, Xian, Shanxi 712046, China)
Abstract:
The development of intelligent vehicles puts forward higher requirements for the control system. This paper mainly completes the design of a wireless control system of the smart car. The system is based on ARM Linux, develops and implements the vehicle system client, and builds a cross-compilation development environment. Based on the configuration and compilation of the embedded Linux kernel, the coding implementation process of the data acquisition and transmission layer is introduced in detail, and the functions of collecting images and recording video, network transmission and monitoring are realized. Each module is designed as an independent process. The module runs as a separate thread, and the monitoring software client completes the data exchange process through the files in the memory disk, thereby effectively implementing the asynchronous execution and remote monitoring functions.
Key words:
intelligent vehicle wireless control; ARM Linux; remote monitoring system; implementation path
0 引言
快速发展的人工智能为智能车辆的完善提供了有力支撑,在智能交通系统中智能车辆占用重要地位,促使在目前的汽车行业中自动驾驶成为热门发展技术,该技术以驾驶环境为依据并通过对人类行为进行模拟做出相应决策,在此基础上完成驾驶行为,因此对智能车无线控制系统的研究成为主要方向之一,嵌入式系统可有效满足控制需求,其核心部分即嵌入式系统软件负责实现系统业务逻辑的任务,具体通過对嵌入式硬件平台进行控制和调度完成。本文主要对基于ARM Linux 的远程监控系统进行了研究,重点介绍了监控系统客户端软件的实现过程,完成了底层开发环境及用户交互的图形系统的搭建,并实现了核心业务模块功能。
1 Linux的构建和移植
开发Linux程序的步骤为:首先完成交叉编译开发环境的建立,然后向目标平台移植 Linux 内核,将程序逻辑通过PC Linux 完成编写调通,通过模拟模块实现同相关硬件的有效对接,及时修正测试中的软件缺陷,接下来在目标平台上交叉编译调通的软件模块,通过测试进一步发现并修正相应软件缺陷。
1.1 交叉编译开发环境的建立
交叉编译开发环境是移植Linux内核及开发 Linux 的基础,通常是将交叉编译器运行于PC平台或高服务器(即宿主机HOST)上通过编译链接实现目标平台代码的生成,本文的远程监控系统以普通PC作为宿主机完成交叉编译开发环境的建立,主要包括交叉编译工具链 的安装和测试(arm-linux-gcc,运行于PC平台的交叉编译器,负责生成ARM平台二进制代码)以及通讯测试。本文选用的硬件开发板卡S3C6410含有arm-linux-gcc-压缩包,先在 s3c6410-gcc(位于HOME目录下)中建立一个存放交叉编译工具链的目录,进入目录拷贝并解压TAR 压缩包到安装目录,此目录通过指定Linux环境变量即可完成到可执行程序搜索路径的添加,从而完成交叉编译环境的建立[1]。
1.2 配置编译Linux内核
作为嵌入式系统软件的关键部分Linux内核由系统底层的初始代码构成(针对特定目标平台),提供最基本的各种系统服务,启动系统时需先完成基本的初始化工作(通过引导器),在内存中装载Linux 内核后跳转到内存位置继续执行,为满足项目需求本文使用了附带移植好Linux 内核的开发板卡,使包括配置CPU 类型、线程调度模型等在内的系统核心功能无需额外改动,主要改动硬件外设。系统客户端的硬件外设包括液晶屏、GPS及GPRS 模块(二者通过S3C6410 的串口通信)、SD卡插槽及USB 接口各一个SOC內建的串口驱动已包含在内核配置中无需改动。系统的内核配置采用xconfig完成,选择Device Driver/Netwrok device support(位于界面左侧列表)后勾选PPP support,从而在该Linux内核中加入PPP 的支持;选择HID Devices / USB Device support 后勾选需支持的 USB 设备驱动;选择MMC/card support后勾选所需存储设备驱动。配置完成后当前目录生成一个配置文件(config),可通过 make 命令完成编译,根据板卡的说明书将由make uImage 命令生成内核镜像烧录至板卡上[2]。
2 图像采集与视频录制的设计与实现
2.1 硬件加速模块与软件 API 接口
本文选用了S3C6410,其硬件JPEG编解码模块支持编码输入为YCbCr 视频源、解码输入为JPEG 图像数据(UXGA分辨率可达1600x1 200),具备摄像头数据直接输入功能;JPEG 硬件解码器的API包括初始化、编解码执行、配置等,调用编码功能涉及到的API流程为:首先需对编码器进行初始化处理(EncodeInit ),涉及底层操作的硬件编码器可直接访问内存(无需通过SOC 的 MMU ),JPEG 编码器使用驱动预留的内存区域(物理连续);接下来通过通过GetEncodeInBuf和GetEncodeOutBuf完成存放源图像数据及存放编码后数据的获取(位于内存区域中),在此基础上完成JPEG 编码操作(由EncodeExe 执行),选项配置由SetConfig完成,将获取的源图形数据(位于指定内存区域)进行编码后,在指定内存输出区域存放图像,最后调用EncodeDeInit释放系统资源并关闭编码器。
MPEG4编解码模块支持 MPEG4 SimpleProfie规格的编解码,其API 调用流程类似于JPEG 硬件编码器,远程监控系统中使用了多个API,通过SetConfig 函数完成配置,Init 函数和Decode函数分别用于初始化硬件模块及解码,内存空间指针(放置输入数据)通过调用GetInBuf 函数获取后调用Exe 函数执行,接下来通过 GetOutBuf 函数的调用完成输出数据内存指针的获取,最后调用 deInit 函数关闭编码器[3]。
2.2 数据与内存管理
摄像头采集子模块作为数据的生产者,其所产生的 YUV 数据包可被两个子模块即图像压缩存储(采集图像需压缩成 JPEG 图像)及视频编码存储(需压缩记录到AVI 文件中)使用。考虑到嵌入式系统有限的总线带宽,数据量较大的图像无法采用内存拷贝的方式,通过内存管理子模块(属于C++类)主要负责对数据包流向及内存使用情况进行控制,实现两个子模块各自具有指针,能够指向同一YUV 图像数据,子模块使用完毕后通过一个外部模块释放图像数据指针的内存空间。C++类聚合了MemServer(内存池类),由内存池负责分配与释放大量的内存,使内存碎片问题得以有效解决,并对工作中的内存使用状况进行监控以确保内存的合理分配和使用[4]。数据包从采集到编码以数据与内存管理模块作为中转,在内存的实际分配和释放过程中记录内存的大小,该模块通过调用推送方法将数据包推入,同时注册了自有的一个函数作为回调函数,通过回调函数的调用实现了数据包指针在各编码子模块使用完后返回至数据管理子模块。此外,采用自主编程实现内存池类,预先malloc内存区域(若干块等长)实现MemServer内部管理,对各个块的状态(使用与空闲两条链表)进行记录,外部以数据大小为依据对内存接口进行调用分配,其返回给外部的指针包括一块指向内存块指针(标记为空闲)或一块内存块合并的指针(合并连续的多个空闲块),并向使用链表移动这些记录;外部则以链表上的记录为依据完成内存区域的释放后将其标记为空闲,记录返回至空闲链表上(恢复合并的内存块到原始分离状态)[5]。
采集到新的数据帧后,采集模块通过内存分配接口的调用完成内存空间的申请,用数据包封装指向此内存空间的指针,结构体如下(包含了数据指针和使用计数,标记使用过这块内存区域的编码模块的个数)[6]。
struct MediaPackage
{
int ref;
MMStreamPackage
*
pak;
};
若编码模块在数量上等于数据包的使用计数,说明所有编码模块均使用了此数据包可安全释放。各编码模块承自同一父类EncodeServer,即可使用父类的各个接口(包括数据推送、清除缓冲、回调函数),并在初始化时注册指针,内存管理子模块据此可预先获知采集数据的消费者数目。内存管理子模块对EncodeServer 类进行维护,通过指针指向即可完成推送/清空数据、注册回调函数,数据管理同编码间的关系得以抽象和简化,提高了系统的扩展性。当采集模块推入数据时候,数据管理子模块统一对数据包进行释放处理[7]。
2.3 摄像头采集子模块
该子模块同样属于C++的类,主要由图像采集线程和数据推送线程构成,摄像头模块驱动采用标准V4L 接口(/dev 目录下的设备文件),程序读写数据通过标准Linux文件调用读取API完成,并通过ioctl 函数完成参数设置。图像采集线程启动后打开V4L设备文件(同模拟摄像头对应)并设置采集参数,在此基础上对YUV 帧数据(由摄像头模块返回)进行持续读取。采集线程向各新YUV 数据分配新的数据包并打上时间戳(标记采集时间),再将数据包放入一个属于链表的缓冲内,指向数据包的指针[8]。数据推送线程以预先设计好的间隔为依据,将数据包从缓冲取出后推出给内存管理子模块,并通过清空缓冲及停止采集两个函数接口的设置提升了系统的鲁棒性。
3 图像压缩及视频编码存储采集的实现
3.1 图像压缩存储采集
该子模块内部包含一个作为输入数据缓冲的链表和用于数据压缩的工作线程构成,被封装成一个 C++的类。该模块设置了回调函数设置接口,负责将子模块的工作状态传递给外部,系统的内存管理子模块通过此接口获取并释放数据包的指针,通过接口数据推送接口的调用 推入YUV 图像数据包。数据包先以节点的形式挂载于链表上(作为缓冲),线程同步事件由推入的新数据触发,唤醒图像压缩工作线程(处于等待状态),具体的工作线程流程如图1所示,先以预定的拍照间隔为依据对数据包的时间戳进行检查,图像工作线程会将未达到间隔的数据标记为使用,并向内存管理子模块返回数据包(通过回调函数接口);工作线程在当前数据包的时间戳大于上次拍照时间同预设时间间隔之和的情况下,通过JPEG编码API的调用完成该YUV图像到JPEG图片的压缩及在指定位置存储过程[9]。
3.2 视频编码存储采集
该子模块由数据包链表、视频压缩工作线程及回调注册接口构成,此外还包含AVI 打包模块负责处理MPEG4数据帧,将其以用户设置的参数为依据打包为AVI视频文件(适用于普通播放软件)。通过数据推送接口的调用内存管理子模块完成YUV 图像数据包的推入,其工作流程如图2所示。
先对自身的工作状态进行检查,工作线程在没有录像任务的情况下标记数据表为使用,再将数据包返回至内存管理子模块(回调函数接口)。有录像任务则将该 YUV图像通过MPEG4编码 API 的调用完成到MPEG4 帧的压缩,然后由 AVI打包模块封装上时间戳和帧信息后打包,存储到指定位置[10]。
4 总结
本文主要完成了基于ARM Linux智能车无线控制系统的设计,以S3C6410作为嵌入式系统平台的主控,完成了客户端软件的设计,图像采集与视频录制模块主要由摄像头采集、图像压缩存储、编码存储等功能子模块构成,各子模块间异步执行(以独立线程的方式运行),在分配的内存区域中存放通过采集、编码、压缩处理后的信息以供后续处理,输入内存采用线性缓冲进行管理。
参考文献
[1]李泽彬,姚有峰,张飞龙,等.基于单片机的智能家居语音控制系统设计[J]. 电子设计工程, 2017(8):175-177.
[2] 李云红,张恒,张亚林,等.基于ARM的WiFi无线终端系统设计[J]. 计算机与数字工程, 2017(3):498-501.
[3] 叶身村.周庆.于振浩.基于KEA128的电磁直立智能车控制系统设计[J].汽车实用技术,2018(21):27-28.
[4] 苏元楷,季磊,聂嘉欣,等.基于STM32F407的路径识别智能小车设计[J]. 信息通信, 2017(8):31-33.
[5] Jorge Godoy, Joshué Pérez, Enrique Onieva, et al. A driverless vehicle demonstration on motorways and in urban environments[J]. Transport, 2015 (3):253-263.
[6] Suresh Nanda Kumar, Ramasamy Panneerselvam. A Time-Dependent Vehicle Routing Problem with Time Windows for E-Commerce Supplier Site Pickups Using Genetic Algorithm[J]. Intelligent Information Management, 2015 (4):181-194.
[7] 王浩.基于RT5350嵌入式平台的无线智能小车控制系统设计[J]. 泰山学院学报,2016(6):75-79.
[8] 张栋冰.基于TOPHAT-PCNN的图像车辆目标检测方法研究[J]. 南京大学学报(自然科学), 2017(3):590-597.
[9] 胡焯源,曹玉东,李羊.基于HSV颜色空间的车身颜色识别算法[J]. 辽宁工业大学学报(自然科學版), 2017(1):10-12.
[10] 黄姝娟,刘萍萍,白小军,等.基于STM32的智能车控制系统的设计与实现[J].计算机技术与发展,2018(9):185-188.
(收稿日期: 2019.08.10)