基于OpenGL的汽车姿态监控3D还原系统

更新时间:2024-03-07 作者:用户投稿原创标记本站原创 点赞:34047 浏览:157901

摘 要 :本文从现有的汽车姿态研究状况出发,介绍了汽车姿态监控还原系统的背景、现状.给出了详细的硬件选取、组成以及软件的设计方案:包括传感器数据输入模块的设计,通过串口得到MEMS加速度传感器的实时数据的方法,如何采用OpenGL库还原出汽车的3D姿态,以及数据记录和图表的显示.提出了一种结构简单,实用的汽车姿态监控还原系统.

关 键 词 :汽车姿态,串口通信,MEMS加速度传感器,OpenGL

1.背景

现代的汽车设计制造已不仅仅满足于汽车的框架结构设计和行驶功能实现,转而向汽车电子、导航、以及车辆状态监控等方面进行探索,例如对车辆的机械控制向电子控制的转变:汽车底盘控制(包括悬挂控制、转向控制、牵引力控制.在高档轿车上,关于这三方面的电子系统越来越多),以及车辆的导航,即时故障推测等.

在已有的车辆姿态测量系统中,车辆姿态测量仅仅以路面作为参考系,通过悬挂高度来确定车姿,不能反应车身实际的姿态,对提升驾驶舒适性的帮助有限.目前,汽车姿态的测量一般通过三轴加速度传感器以及三轴陀螺仪表示:陀螺仪由于其测量过程中机械转子容易漂移.系统累积误差难以消除,需要通过其他传感器不断作数值修正.另外还有采用六个或九个单轴线加速度传感器捷联解算出姿态角的,同样存在系统复杂.实时性差,成本高等缺点,其应用也受到了限制.可见汽车姿态的测量不单是关键的一环,而且一直是难点.

因此,针对这一领域的市场需求,提出了一种基于MEMS加速度传感器、电子罗盘的小车姿态监控及还原系统的软、硬件开发方案.

2.硬件部分

系统的硬件主要分为三个部分,即传感器部分(加速度传感器,电子罗盘)、数据采集转换部分(单片机),以及上位机系统.如图1所示.

图1 硬件部分示意图

上图中,加速度传感器采用Freescale的A7261三轴MEMS加速度传感器,利用压电效应给出所受加速度的量值,量程最大为±10g.加速度传感器每秒发送10组加速度数据给模块后板,波特率为19200,后板收到数据后立即转发给主板.

加速度传感器发送的数据协议为:

其中:0X58 0X59 0X5A为命令头,固定数值不变;X、Y、Z轴小数部分精度均为1/256G;校验和SUM为前面各个数值相加,结果取低8位.

图2 加速度传感器模块实物图

(1 P89LPC952单片机,2 加速度传感器)

同样,电子罗盘将模拟量信号传送给C51单片机,经由单片机转化后,所得的数字信号通过一定协议格式,由RS232串口传至作为上位机的电脑.

3.软件部分

3.1.理论基础

车身姿态是反映车辆行驶状态的重要参数.近年来,随着汽车在人们生活中得到普及,在追求性能的同时,也对驾驶舒适度提出了更高的要求,因此国内外都迫切希望精确测量车辆车身姿态的方法.为简化分析,将车辆所在空间划分为两个坐标参考系,分别是大地惯性参考系X0Y0Z0和车身平台坐标参考系XAYAZA.

描述车辆运动姿态时用的坐标系如下图所示:

图3 描述车辆运动姿态的坐标系

由于汽车一般是向前行驶的,所以以汽车向前行驶时XA与地面参考坐标系的X0方向是一致的.由图可知,车身姿态就可以用车身平台相对于大地惯性参考系角度的偏移量来描述.


姿态角包括三个:横滚角κA——车身绕XA轴的转角(ZA与OX0Z0平面的夹角);俯仰角φA——车身绕YA轴的转角(XA与OX0Y0平面的夹角);横摆角ψA——车身绕ZA轴的转角(YA与OY0Z0平面的夹角).

测量原理为:在每一时刻,三轴加速度传感器都会输出一个相对车身平台坐标系的三维加速度测量数据,将其表示成向量 .同时,车辆时刻受到地球固有的重力作用,表示成重力加速度向量 ,以其作为大地惯性参考系的Z轴.我们测量车身姿态主要就是测量 与 的相对偏移量.如图4所示:

图4 加速度的分解

当汽车静止或匀速行驶时,容易得出车身相对于地面的姿态角:

(3-1)

当汽车匀速加速或减速运动时,相对于路面有一个纵向加速度 ;转向时相对路面有横向加速度 ,相对路面的合加速度向量 .方案中没有将路面平立成一坐标系,因此须把 映射成车身平台坐标系上的 ,再做处理.

根据定义,便可得出车身姿态角:

(3-2)

整个计算过程建立在车轮没有大幅度滑移的检测设上,因此行车方向始终与车头垂直,航向角 即为合加速度向量 对车体平台坐标系x轴的偏离角度.

3.2.软件编写

本系统的软件由VC++编写,开发平台为Visual Studio 2010,引入VC++6.0的MSCOMM控件进行串口通信的编程.系统程序采用MFC框架,多线程运行的方式,以分割主窗口的形式显示各个功能区.软件的流程图如图5.

系统软件引入了基于OpenGL函数库的开源3DSReader程序,通过在初始化过程中,新建一个3DSReader类的对象,然后以Reader(char* filename, CTriList* _list)方式读取模型文件所在位置,通过该方法,可以很容易的导入3DS格式的三维模型,当需要显示不同的目标形体时,将新的模型文件替换旧的即可,实现方便的更改和替换.代码如下所示:

C3dsReader Loader;

Loader.Reader("data/Car1.3DS", &m_triList);

串口通信采用MSCOMM控件,由于该控件是为VC++6.0设计的,所以VS2010必须通过注册控件的方法来获取MSCOMM,具体方法为:通过将m32.ocx等文件拷入C:\Windows\System32中,再由开始菜单→运行→输入cmd→输入regsvr32 m32.ocx完成注册.注册成功后即可在界面中单击鼠标右键找到控件. 图5 程序流程图

图6 MSCOMM控件

由于本系统中用到了2个串口进行通讯,所以在界面上必须放置2个控件,每个控件独立进行串口数据的读取.MSCOMM控件在程序运行时会自动隐藏,不必另外设置.

右键单击控件图标,查看属性,并在属性页面点击“控件事件”按钮,插入事件“OnCommM1”.事件代码如下:

void CMDld::OnCommM1()

{

CString strtemp;

VARIANT variant_inp;

COleSafeArray safearray_inp;

long k;

byte rxdata[512]; //设置BYTE数组

if(m_1_control.GetCommEvent()等于等于2) //值为表示接收缓冲区内有字符

{

variant_inp等于m_1_control.GetInput(); //读缓冲区消息

safearray_inp等于variant_inp; //变量转换

for(k等于0;k<15;k++)

safearray_inp.GetElement(&k,rxdata+k);

AD2[0] 等于 (float)TransToDEC(rxdata); //命令头0x58//

AD2[1] 等于 (float)TransToDEC(rxdata+1); //命令头0x59//

AD2[2] 等于 (float)TransToDEC(rxdata+2); //命令头0x5A//

AD2[3] 等于 (float)TransToDEC(rxdata+3); //X

按照前文所描述的串口数据格式,去掉数据头,转换为十进制数,再将其与进位、符号位结合,最后得到所要的数据.转换代码如下:

int selectdirect1等于1; //加速度传感器符号位、进位读取//

int selectdirect2等于1;

int numberadded1,numberadded2;

if (AD2[3]>等于128)//负号以16进制80(未进位)或81(进1位)的方式表示//

{

AD2[4]等于0-AD2[4];

selectdirect1等于-1;

numberadded1等于AD2[3]-128;

AD2[4]等于AD2[4]+selectdirect1*numberadded1*256;

}

if (AD2[3]<=127)

{

selectdirect1等于1;

numberadded1等于AD2[3];

AD2[4]等于AD2[4]+selectdirect1*numberadded1*256;

}

AD2数组共由15个数组成,其中AD2[4]为第五位(参看前文数据格式).每个轴的转换方式一致,在此不重复列出.其中TransToDEC函数代码如下:

int CMDld::TransToDEC(byte bt[]) //16进制向10进制转换函数//

{

int a等于0;

a 等于 (*bt & 0xff);

return a;

}

两个串口的程序基本相同,只需设置两个不同的数组存储所接收的数据即可.

在OpenGL图形显示中,通过以上得出的角度偏差数值,控制三维模型的姿态,从而达到了预期的目标.另外程序添加了图表,即时显示各个轴的角度状态趋势,同时配备了数据记录及校准功能.

图7 程序界面

图8 记录的数据

4.总结

本文采用MEMS加速度传感器模块,及电子罗盘、单片机等,通过RS232串口将数据传入电脑,并用VC++编程进行汽车姿态的还原与监测.详细的介绍了硬件,软件的组成,给出了读取串口数据的方法,初步完成了一个汽车姿态的监控与还原系统.由于采用的传感器精度不是很高,在减少误差方面还有待改进.