APP下载

基于风河VxWorks6.9 系统的自动驾驶系统研究

2021-06-26付建宽李金亮刘苏楠孙嘉城

科学技术创新 2021年16期
关键词:工控机惯导驱动程序

付建宽 李金亮 刘苏楠 孙嘉城 张 佳

(中汽数据(天津)有限公司,天津300000)

1 概述

VxWorks是美国风河公司的一款实时可裁剪的嵌入式操作系统,可以运行在X86、ARM、PowerPC、MIPS等多种架构的CPU上;VxWorks系统性能强悍、可靠性极高;支持抢占式多任务的调度、TCP/IP网络协议栈、文件系统、设备管理、2D图形显示等;跨平台的开发环境WindRiverWorksbench十分友好,通过交叉编译生成bootrom启动引导文件和VxWorks内核镜像文件,使用WDB方便开发和调试RTP应用程序和Kernel程序。

2 系统设计

本设计中计算单元采用研华ARK-3500工控机,9-34V宽压直流电源输入,搭载的是Intel酷睿三代ivy bridge架构的CPU,QM77芯片组显示支持DVI+HDMI+DisplayPort接口,支持PCI扩展,还有6路USB口和8路DB9串口可供连接外设,计算单元上运行VxWorks6.9 的操作系统。我们的毫米波雷达、超声波雷达、车辆底盘、Mobileye都是通过CAN总线和计算单元进行连接的,组合惯导通过RS232异步串口接入计算单元,激光雷达通过以太网接入计算单元,计算单元通过连接工业4G路由器和云服务器进行交互。系统的硬件组成框图如图1所示。

图1 系统组成框图

3 软件设计

3.1 启动程序及BSP设计

VxWorks系统在6.9 版本以前多采用基于bootrom加载内核或者DOS引导装载bootrom再加载内核的方法,在6.9 版本及以后大多采用grub或syslinux或UEFI来启动引导,本文采用的是syslinux启动装载,首先需要格式化启动盘为FAT32的主分区文件系统,并激活盘符,然后解压syslinux.zip文件到启动盘,使用管理员权限启动cmd,在命令行内输入以下命令:

X:>syslinux-m-a-d-f-iX:

X代表的是启动盘所在的盘符,比方说启动盘是F盘则X替换为F,最后我们的系统最终是运行在工控机内置硬盘上的,需要将硬盘取下使用SATA转USB线连接PC来制作启动盘。启动盘制作好后开机引导界面如图2所示。

图2 syslinux开机引导界面

BSP是板级支持包的英文缩写,主要完成系统中断向量初始化、时钟初始化、内存映射、外设初始化等功能[1]。我们在通用的target/config/itl_x86路径下的BSP基础上修改,首先复制该文件夹并重命名,然后在config.h文件中添加如下宏定义:

根据工控机内存大小调整SYSTEM_RAM_SIZE宏,程序中如果不跑特别消耗内存的任务也可以使用缺省值。

3.2 驱动程序设计

3.2.1 以太网网卡驱动

ARK3500工控机的LAN1是Intel 82579LM以太网控制器,LAN2是Intel I-210IT以太网控制器,通过使能INCLUDE_GEI825XX_VXB_END、INCLUDE_MII_BUS、INCLUDE_GENERICPHY三个宏,系统会调用函数muxDevLoad()即可完成网络初始化。

3.2.2 SATA固态硬盘驱动

针对SATA电子盘的驱动,需要配置AHCI相关的组件,AHCI驱动为vxBus架构,在VxWorks shell下用vxBusShow能看到设备成功注册,因为支持DMA读写,因此速度非常快[2]。需要注意的是BIOS的配置要从IDE模式改为AHCI模式。如果需要对VxWorks下的磁盘分区重命名为ata0a,可以在usrAppInit.c中添加如下代码来实现。

3.2.3 USB键鼠驱动

在文本模式下,VxWorks6.9 默认支持USB键鼠,在图形模式下,需要添加对UHCI、OHCI、EHCI的USB协议栈的支持。

3.2.4 串口驱动

工控机提供了8路串口,其中4路固定232串口,4路可变232/422/485串口,我们因为只有惯导使用了一路232串口,因此只需要初始化1路232串口,在config.h文件中对CONSOLE_TTY、CONSOLE_BAUD_RATE两个宏进行设置,另外BSP中串口配置一定要和BIOS的IO ADDRESS、INT LEVEL保持一致[3]。在命令行在输入devs回显的/tyCo/0就是我们要使用的串口设备。

3.2.5 芯片组QM77集成显卡驱动

VxWorks支持集显驱动,可以编译内核态的WindML-5.3 显示库,进而使用tilcon或者QT进行图形界面程序的开发。

3.2.6 PCI-CAN驱动

由于工控机不带CAN总线,因此我们外接了一块基于SJA1000控制器PCI的CAN接口卡设备,自行编写设备驱动,步骤如下:

3.2.6.1 调用pciFindDevice()函数,根据vender id和device id查找设备的总线号、设备号、功能号。

3.2.6.2 调用pciConfigInLong()函数;获取配置空间、内存空间、I/O空间的地址(偏移地址)。

3.2.6.3 根据获取偏移地址最低位,判断访问方式是I/O访问,还是内存访问。IO访问为1,内存访问为0。

3.2.6.4 往bar的地址写-1,然后重新读取,获取bar空间大小。

3.2.6.5 根据获取的bar2地址,配置板卡寄存器。

3.2.6.6 调用pciConfigInByte()函数获取中断号。

3.2.6.7 调用pciIntConnect()连接中断向量,中断号加0x20,调用sysIntEnablePIC()使能中断。

3.2.6.8 编写open、read、write、ioctl、close等设备访问函数。

3.2.6.9 使用iosDrvInstall()函数创建驱动,将驱动程序的入口写入到驱动程序表中。

3.2.6.10 使用iosDevAdd()函数创建设备描述符结构,将设备添加到设备列表中[4]。

3.3 传感器解析程序设计

3.3.1 组合惯导定位感知

组合惯导内部集成的工业级MEMS陀螺仪、加速度计和双频GNSS接收机,RTK状态良好稳定,配置RS232串口波特率230400Kbps,解析输出稳定连续的位置、方向、速度、姿态以及授时信息。

3.3.2 激光雷达感知

激光雷达完成三维测量相关数据输出,包括激光测距值、回波的反射率值、水平旋转角度值等,通过UDP发送到指定IP和端口上,给融合模块、决策模块使用。

3.3.3 毫米波雷达感知

首先将车辆的速度、半径曲率等信息发送给毫米波雷达进行初始化,输出64个障碍物的三个维度的距离、角度和速度信息,还可以输出目标分组、车道变换检测等信息,CAN总线设备之间通信波特率为500Kbps。

3.4 自动驾驶程序设计

3.4.1 高精地图制作

我们使用配置有GPS、IMU、Mobieye、Camera传感器的采集车来获取集原始数据,使用惯导采集GPS数据、使用Mobieye采集GPS数据到左右车道的距离,用来推算左右车道点的数据、使用相机采集车前信息,用于回放时用来提取车道点进行参考,采集后的数据为文本格式,使用自研工具进行车道拟合,区域之间采用贝塞尔曲线相连,加入了车道实线虚线信息等道路标志。

3.4.2 路径规划

使用自研工具设置目标点,进行全局路径规划,暂时不支持动态切换;而局部路径规划实时变化,可至少规划60m的距离,考虑路径、场景、交规等,生成原始路径,包含路径长度,左右边界等,同时规划目标速度,规避动态障碍物。

3.4.3 决策控制实现

采用PID横纵向控制算法,通过计算障碍物信息、横向位置和角度误差、纵向位置和速度误差,自适应动力学模型算法,参数自动整定;添加速度补偿,在车辆转弯半径允许条件下,尽量小误差范围内动作;预测碰撞时间,计算出油门、刹车、方向盘角度值,实现自动驾驶自动循迹,自主避障、自主泊车等功能[5];工控机通过CAN总线直接下发命令给车辆底盘,决策时间不大于20ms。

3.5 系统运行实况

将需要编译进kernel的用户任务写进usrAppInit.c文件中,驱动程序编译成模块动态加载,经测试,实车运行稳定可靠,响应迅速及时,系统运行实况画面如图3所示。

图3 系统运行实况画面

4 总结与展望

本设计仅做了适配研究,很多算法工具库在VxWorks下并没有,需要单独移植,例如opencv这个开源的计算机视觉和机器学习库,github仓库上只有对VxWorks7.0 的支持,VxWorks6.9下需要自行开发,我们只能暂时使用Mobileye这种通过CAN总线输出对目标的识别结果的智能相机。功能安全是智能网联汽车的一项重要要求,风河的VxWorks系统虽然生态上相对Linux要差很多,但是在实时性、安全性上有极大的优势,相信VxWorks系统在自动驾驶领域会有不错的前景。

猜你喜欢

工控机惯导驱动程序
UUV惯导系统多线谱振动抑制研究
光纤惯导国内外发展现状及其关键技术分析
阻止Windows Update更新驱动程序
计算机硬件设备驱动程序分析
无人机室内视觉/惯导组合导航方法
普通台机替代工控机成功应用
印刷网络化解决方案中工控机系统的设计与实现
控制舱测试系统及其BIT设计
导航算法对捷联惯导系统精度的影响分析
工控机使用方法和故障分析