虚拟仪表盘显示界面的设计
2017-11-21
厦门工学院,福建厦门361021
一、引言
汽车仪表是驾驶员获取汽车状态信息的关键设备,对汽车的安全行驶起着重要的作用。近年来,随着计算机、微电子和各种现场总线通信技术的广泛应用,汽车电子技术得到了迅猛的发展,汽车仪表盘上显示的信息不断增加,传统的机械式、电气式组合仪表越来越无法满足使用的需求。
本文介绍的数字仪表盘是S3C2410开发板下基于Linux操作系统下设计的数字仪表,具有显示直观、读识速度快、准确度高、适应环境亮度范围宽、彩色视觉效果好、对比度高等优点。
本文重点阐述设计时主要解决的三个问题:图形开发界面的选择、仪表盘窗口的设计、仪表指针显示设计。
二、图形开发界面选择
设计数字仪表,需要选择一个友好的图形用户界面支持系统GUI来进行显示界面的开发。因为嵌入式设备的可用资源有限,所以选择的GUI必须是可定制、占用资源少、高性能、高可靠性以及可配置。
Qt/Embedded具有平台无关性、良好的GUI编程接口以及强大的开发工具支持[1],本文选用Qt/Embedded来进行仪表盘图形显示界面的开发。
图1所示为Qt/Embedded应用程序开发流程图。首先,安装Qt/Embedded工具开发包,然后基于S3C2410开发板硬件特性,交叉编译Qt/Embedded库,确认可用的情况下再进行相关应用程序开发和联调,最终发布应用程序。
三、仪表盘显示界面设计
仪表盘显示结构图如图2所示,将LCD显示界面划分为不同的区域,分别显示车速、发动机转速、水温、油量、时间、里程数、档位标志和各种警告标志[2]。
首先建立一个640×480(和LCD等大小)的主窗体,然后在主窗体上分别添加各个子窗体,由各子窗体完成显示任务。子窗体的建立是通过对Qt中的QWidget进行子类化来完成的。
例如,建立一个QWidget的派生类CarSpeed,用于动态显示汽车的行驶速度。在主窗口中设置其显示区域,将其显示在仪表盘的左下角。
为CarSpeed类的对象carspeed设置显示区域,以主窗口的坐标x=0,y=180为起点,分配一个长为400,高为300的矩形区域。Qt中默认的坐标系是以窗体的左上角为原点,向右为x轴的正半轴,向下为y轴的正半轴。
至此,一个用于显示车速和总里程数的子类窗口已经建立,在此窗口中可完成图形的绘制,其他各个子窗体的建立与此类似。
1、基于Qt画图类实现图形的绘制
Qt中主要用以下两个类来完成图形的绘制功能:QPainte和QPaintDevice。QPainter类完成整个画图工具的定义, QPaintDevice类则定义画图的设备,即最终的图像显示设备[3]。
Qt下画图程序基本框架如下:
下面以车速显示窗口绘制为例说明显示程序的具体实现。
图3所示为车速表示意图。车速表画成模拟表盘的形式,指针可随车速的不同而动态旋转,同时指针下方可显示汽车速度和总里程数。
该显示模块,是定义了一个QWidget的派生类CarSpeed,由这个类来完成车速表的绘制。分析该类的组成,车速和里程数构成了两个最重要的成员变量,车速表上模拟指针的摆动和数字显示都是依靠这两个值;其次还包括弧线半径、起始角和终止角这三个参数,它们决定了表盘的外形[4]。而成员函数则包含有构造函数(初始化成员变量)、设置车速、设置里程数、绘制外圆弧、绘制刻度线、绘制文字(包扣刻度值和数字式车速、里程数)、绘制指针(随车速的不同而不断摆动)和画图事件(响应画图事件,调用上面的绘制函数,实现图像更新)。类的定义代码如下所示:
下面重点介绍表盘刻度线的绘制drawScaleLable()函数:
因刻度线较多,在绘制刻度线时,需要确定大量的线段端点坐标,该工作量较大且易出错。因此我们采用图4所示的方法来确定刻度线的每一个端点的坐标。
如图4所示:刻度线a是由端点0和1组成,刻度线b是由端点2和3组成,而端点0是由直线a与半径为rl的大圆相交而得,端点1是由直线a与半径为rs的小圆相交而得;端点2是由直线b与半径为rl的大圆相交所得,端点3是由直线b与半径为rm的中圆相交而得。
若原点坐标为(x,y) ,直线a与x轴的角度为θ1,则端点0的横坐标x0=x+rL*cosθ1,纵坐标y0=y-rL*sinθ1(因为Qt中y轴的方向以直角坐标系的y轴方向相反,所以y0是y-rL*sinθ1,而不是y+rL*sinθ1)。同理,端点 1 的横坐标x1=x+rS*cosθ1,纵坐标y1=y-rS*sinθ1。
若直线b与x轴的角度为θ2,则端点2的横坐标x2=x+rL*cosθ2,纵坐标y2=y-rL*sinθ2。端点 3 的横坐标x3=x+rM*cosθ2,纵坐标y3=y-rM*sinθ2。
以上规律可以看出:
在 0、2、4、6、......、2n的 点 坐 标 都 为x2n=x+rL*cosθ,yn=y-rL*sinθ;
在1、5、9、13、......、4n+1的点坐标都为x4n+1=x+rS*cosθ,y4n+1=y-rS*sinθ;
在3、7、11、15、......、4n-1的点坐标都为x4n-1=x+rM*cosθ,y4n-1=y-rM*sinθ。
算法如图5所示:计算出所有的点坐标之后,创建一个QPointArray类的对象parray,将各点坐标按序列装入parray中,调用QPainter::drawLineSegments(pa rray)则可以绘制出第0点到第1点的线段a,第2点到第3点的线段b。至此,表盘刻度线绘制完成。
中华门是南京明城墙的十三座明代京城城门之一,原名聚宝门,是中国现存规模最大的城门,也是世界上保存最完好、结构最复杂的堡垒瓮城,有“天下第一瓮城”之称。由于传统地位和现代交通等因素的影响,中华门是南京众多城墙当中的明星。[5]
2、基于Qt画图类对图形进行处理
仪表盘上需要显示一些小图标来提示车辆的运行状况,如水温、油量、手刹车未松、车门未关好、前排乘客未系上安全带、电池电量低等,这些小图标都有标准的形状和画法,从互联网上下载标准图标后,通过Linux下的convert程序可以将其从某种外部模式转换成一种可以显示的模式,然后将其显示在仪表盘上。但因网上获得的图标背景色与仪表盘的背景色不同,如果将其直接显示的话,视觉效果不好,所以我们需要将其背景色进行转化[5]。
在Qt中,有一个QImage的类可以访问像素的值,它能够对单个像素信息进行底层访问。通过访问每一个像素,获得其颜色值并修改,可以对整个图形的颜色进行修改。具体实现步骤如下:
(1)将图标文件转换成XPM的图形模式,如fi le.jpg转换成 fi le.xpm;
(2)基于file.xpm创建一个QPixmap的对象QPixmap fi le;
(3)调用QPixmap::convertToImage()将其转换成QImage格式,
(4)访问QImage中的每一个像素,对于背景色:白色(红:255,蓝:255,绿:255)和黑色(红:0,蓝:0,绿:0),都将其修改为仪表盘的背景色(红:85,蓝:127,绿:0);
(5)调用QPixmap::convertFromImage()将修改后的图形数据转换成另一个QPixmap形式的像素映射;
(6)调用QPainter::drawPixmap()就可将转换后的图标显示出来。
处理后的图形显示效果如图6所示。
四、整体调试图
仪表盘的显示效果如图7所示:表盘选用靓青色(红:85,蓝:127,绿:0)为背景,指针、外圆弧、刻度线、时间和单次里程数用白色绘制,刻度值、车速值、转速值和总里程表用红色显示,警告小图标用黄色显示。上述颜色的搭配显示,目的是使仪表盘显示更加醒目,让驾驶员对显示信息一目了然。
仪表盘右下角显示的是发动机转速,指针随转速的不同动态偏转,同时也以数字显示出具体的转速值;
转速表上方显示的是一些安全警告,比如车门未关好、未系安全带等,这些黄色小图标在汽车正常状态时不会显示出来,只有当状况发生时,比如有人坐上座位又没有系安全带,这时未系安全带的警告图标就会显示[6];
右上角显示的是油量,指针会随油量的多少而偏转;
左上角显示的是冷却水温度,指针随水温的变换而偏转;
中间方形模块显示的是汽车各种车灯的工作情况,包括远光灯、近光灯、雾灯和转向灯等,各车灯点亮后会同时在仪表盘上显示出来;
车灯右方显示的是汽车挡位,红色显示的就是当前汽车所运行的挡位。
车灯左方显示的是汽车的品牌名称;
车灯下方显示的是时间和单次里程表,以数字式的形式显示当前系统时间,单次里程表可以进行清零操作。
五、结论
本文设计的仪表盘是一种较新的汽车仪表概念,逐步向“综合信息系统”方向发展,其特征是以液晶显示为基础,趋向于计算机数据处理和综合信息传递及显示的主节点。即汽车仪表作为汽车综合信息显示中心,不再仅仅是一个显示信息的工具,还是一个会分析、处理信息并控制执行的系统。并在仪表系统中成功地应用了S3C2410微处理器和嵌入式Linux系统,ARM处理器的使用,使系统的整体性能有了质的飞跃;嵌入式Linux系统的引入,对系统的软件设计和功能模块的添加/裁剪,提供了最大的方便。眼下开放式结构正处于发展阶段中,这种结构在整个汽车寿命期内都可以灵活地进行功能组合,并方便进行功能扩展,完善系统。