倒车轨迹理论实现方法_第1页
倒车轨迹理论实现方法_第2页
倒车轨迹理论实现方法_第3页
倒车轨迹理论实现方法_第4页
倒车轨迹理论实现方法_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、wordword41/41word倒车轨迹理论实现方法帅文王文梁关键字:倒车轨迹视角转换前言:倒车轨迹是近两年局部国产汽车导航设备上新出现的一个功能,其借助方向盘转角信息将汽车可能的后退路线叠加到后视摄像头的输出上并标注出距离,以直观形象化的形式协助驾驶人员调整选择倒车路线,减少驾驶人员特别是新手的误判断,对使用者是一个不错的实用功能。倒车轨迹在智能倒车领域内属于辅助倒车系统中的一种,虽然其还无法达到智能化倒车,但是其实用性和辅助性上对汽车智能化单元技术方面是一个有效的补充。本文将基于使用为目的,从经验角度并结合根本数学推导分析倒车轨迹的原理、实现过程并给出实际使用过程中需要的操作点。由于本文

2、非侧重于数学理论,对局部数学细节在不影响实际结论情况下不做深入探讨。一倒车轨迹的根本原理从日常经验可知,以自行车为例,如果前轮有一定转角,在维持转角不变状态和无轴向移动前提下自行车走过的路径将会以某个圆点为中心旋转,同样的状态也会出现在汽车上。其走过路径如图1。图中假设车轮不会出现轴向移动,故如果保持车轮转角不变的情况下,每个车轮只能沿着垂直其车轴的方向行进,这里取前后轮的轴心作为轨迹跟踪点实际过程中两个前轮轴心不会出现平行,如此轨迹应该是以前后轮轴向线的焦点为圆心的圆。图中为为前轮同水平方向的夹角,记前后轮轴距为L,后轮轴长为W,后轮距离车尾的距离为D,从几何关系可知,后轮轴心的运动轨迹可以

3、描述为以半径Lcot()的圆周运动。两个后轮的轨迹分别为Lcot()-W/2和Lcot()+W/2的圆。这里的推导过程采用经验法结合几何推算,完全从数学角度的推算过程请参考资料1。图中的x方向和y方向不同于一般习惯主要是考虑后面的视角变换。从等式可以看到,当接近0度时候行进轨迹近似直线,接近90度时半径呈缩小趋势,符合我们日常经验值。二视角转换从倒车公式推导出的路线图为行进路线的俯视图,实际显示给操作者的路线应该是从车内观察点观察到的轨迹,驾驶人员看到的运动轨迹实际为以车尾摄像头为中心点坐标的图像描述图一中车尾位置的原点。将摄像头位置定为坐标零点,如此轨迹上的任意点位置公式为:x+Lcot()

4、2+(y+D)2=(Lcot()21上面推导的轨迹仍然是基于俯视条件下的轨迹,看到的应该为处于一定视角观察的轨迹,故需要进展一定角度的转换才能切换到实际观察到的图像。假设摄像头的可视角X围为2,摄像头距离地面h,摄像头中心线同水平面的夹角为,输出屏幕的高度为H,这里假设摄像头相对于屏幕为一个点,会造成实际计算结果的一定偏差,关于偏差的细节数学计算不属本文讨论的重点。我们实际观察到的Yr为地面y在显示屏H上的投影,y方向的转换过程如图二:上图中为了便于计算,将经过摄像头采集后输出的显示器直接投影到同一个图中,这和实际输出没有区别。上图中的虚线为水平线,点线为屏幕的中心点到摄像头的连线,为中心线和

5、水平线的夹角将上图进展简化可转为如下数学问题,等腰三角形中同顶点成角度所对应的边长,简化后的计算如图三。Yr对应的角度为+-,其中=arctg(h/y)通过几何运算可得:三计算轨迹的条件从以上计算我们可以看到,需要计算出轨迹,必须提供以下参数:1摄像头的可视角X围2a2摄像头距离地面距离h3 摄像头中心线同水平面的夹角4 输出屏幕的高度H和宽带W5汽车前后轮轴距L6汽车轴长W,后轮距离车尾的距离D7 前轮同水平方向的夹角以上参数中除转角外对于固定的车型和安装方式都已经固定,转角的获取可以有两种方式:1对于有方向盘角度信息的车型可以直接通过输出接口如can总线获取。2外加角度传感器获取角度信息。

6、两种方式都需要对采集的信息作一定的校正。四验证将上面公式的2和3带入1,可推导出显示屏幕上的实际轨迹图像。我们用vc实现了过程模拟,程序流程图四,模拟结果如图五。在真实的嵌入式平台上实现需要该平台支持图像叠加功能,目前许多多媒体soc芯片都能具备硬件融合功能,可以方便的将描绘出的轨迹叠加到摄像头的输入信号上,对于角度信息的采集,如此要求平台有can总线接口局部车型可以输出角度信息或外加角度传感器接口获取车轮转角。五结论:从验证情况看,结果和经验吻合,证明算法的主要正确性。一些细节信息需要针对具体的实现平台进展微调。以上算法对于如下场景无法解决,如果路面有斜坡由于整个系统无法感知而导致叠加图像有

7、误,当倒车速度过快如漂移会造成上述公式整体失效,但是对于普通用户场景-低速、路面相对平整还是主要场合,故将参数校准后会有较好的参考价值。/ BackTrack.h: interface for the CBackTrack class. / / #if !defined(AFX_BACKTRACK_H_EAF4E3A8_3691_44DA_A864_72658056A1D9_INCLUDED_) #define AFX_BACKTRACK_H_EAF4E3A8_3691_44DA_A864_72658056A1D9_INCLUDED_ #if _MSC_VER 1000 #pragma onc

8、e #endif / _MSC_VER 1000 #include RearCalibration.h /* struct Mypoint int x; int y; ; typedef struct Mypoint MyPoint; */ class CBackTrack public: bool InitObject(CRearCalibration *pCali, float fAngle,float fAxleDist,float fWheelDist,int lWidth, int lHeight); void DrawExtendSpot(unsigned char *lpDIBB

9、its, int lWidth, int lHeight, bool bInverse=false); void DrawExtendTrack(unsigned char *lpDIBBits, int lWidth, int lHeight); void DrawBackSpot(unsigned char *lpDIBBits, int lWidth, int lHeight); void DrawBackTrack(unsigned char *lpDIBBits, int lWidth, int lHeight, bool bInverse=false); /*void Way2_B

10、ack_Track_Draw(char *lpDIBBits, int lWidth, int lHeight); void Back_Track_Draw(char *lpDIBBits, int lWidth, int lHeight); void Calibration_Track_Draw(CRearCalibration *pCali,char *lpDIBBits, int lWidth, int lHeight); void GetBackTrackDraw(CRearCalibration *pCali,char *lpDIBBits, int lWidth, int lHei

11、ght, float fAngle); */ void DrawTrack(unsigned char *lpDIBBits, int lWidth, int lHeight); CBackTrack(); virtual CBackTrack(); private: void InverseBmp(unsigned char *lpDIBBits, int lWidth, int lHeight); CRearCalibration *m_pCali; float m_fAngle; float m_VBack; int m_iTlong; int m_step; void GetExten

12、dUV(); void puterExtendXY(); void GetTfromView(int lWidth, int lHeight); void puterXY(); void puterUV(); CPoint GetUfromVofExtend(short v); CPoint GetUfromV(short v); void GetMarkXU(); short RelationYV(short v); int m_iNT; int m_iFT; float m_fLX40; float m_fLY40; float m_fRX40; float m_fRY40; float

13、m_fLeX40; float m_fLeY40; float m_fReX40; float m_fReY40; int m_iLU40; int m_iLV40; int m_iRU40; int m_iRV40; int m_iLeU40; int m_iLeV40; int m_iReU40; int m_iReV40;float m_LRearAxle; float m_LRearWheel; int m_U1288,m_U2288; ; #endif / !defined(AFX_BACKTRACK_H_EAF4E3A8_3691_44DA_A864_72658056A1D9_IN

14、CLUDED_) / BackTrack.cpp: implementation of the CBackTrack class. / / #include stdafx.h #include BackTrack.h #include math.h #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE=_FILE_; #define new DEBUG_NEW #endif / / Construction/Destruction / CBackTrack:CBackTrack() m_VBack = 0.1f; m_LRearAxle =

15、0; m_LRearWheel = 0; m_iTlong = 0; GetMarkXU(); CBackTrack:CBackTrack() / /分步骤进展编程 /* void CBackTrack:GetTfromView() /float VBack = 138.9; / 相机视野的最近点和最远点距离汽车后轴的距离,Ny要大于100,由于现在假定相机安装在后轴中心,故先付值100 int Ny,Fy; Ny = 100; Fy = 330; / 中间变量 float a,b; int t; /判断分母中为零的项,a不可能为零,因为前轴中心的转向角永远小于50度 if( sin(m_fA

16、ngle) != 0 ) a = m_LRearAxle / (float)(tan (m_fAngle) - m_LRearWheel / 2; b = m_LRearAxle / m_VBack / (float)(sin (m_fAngle); m_iNT = (int)(b * (float)(asin ( Ny / a) + 0.5f); m_iFT = (int)(b * (float)(asin ( Fy / a) + 0.5f); /当这两项为零时,车辆没有倒车,因此可以只把后轮的延长线画出 else m_iNT = (int)(Ny/m_VBack + 0.5f); m_iF

17、T = (int)(Fy/m_VBack + 0.5f); / puter time jump step m_step = (m_iFT - m_iNT) / 30; m_iTlong = 0; for( t = m_iNT; t m_iFT; t = t + m_step) m_iTlong + ; */ void CBackTrack:GetTfromView(int lWidth, int lHeight) /float VBack = 138.9; / 相机视野的最近点和最远点距离汽车后轴的距离,Ny要大于100,由于现在假定相机安装在后轴中心,故先付值100 int Ny,Fy; N

18、y = 100; Fy = 380; / 中间变量 /float a,b; int t; CPoint pl,pr; m_iNT = (int)(Ny/m_VBack + 0.5f); m_iFT = (int)(Fy/m_VBack + 0.5f); /* float a,b; a = m_LRearAxle / (float)tan (m_fAngle); b = m_LRearAxle / m_VBack / (float)sin (m_fAngle); do m_fLX0 = -(a - m_LRearWheel / 2) * (float)(cos(m_iNT / b) + a; m

19、_fLY0 = (a- m_LRearWheel / 2) * (float)(sin(m_iNT / b); pl = m_pCali-GetUVfromXY( m_fLX0, m_fLY0); m_fRX0 = -(a+m_LRearWheel / 2) * (float)(cos(m_iNT / b) + a; m_fRY0 = (a+ m_LRearWheel / 2)* (float)(sin(m_iNT / b); pr = m_pCali-GetUVfromXY( m_fRX0, m_fRY0);m_iNT +; while( pl.x 1 | pl.y 1 | pr.x 1 |

20、 pr.y 1); do m_fLX0 = -(a - m_LRearWheel / 2) * (float)(cos(m_iFT / b) + a; m_fLY0 = (a- m_LRearWheel / 2) * (float)(sin(m_iFT / b); pl = m_pCali-GetUVfromXY( m_fLX0, m_fLY0); m_fRX0 = -(a+m_LRearWheel / 2) * (float)(cos(m_iFT / b) + a; m_fRY0 = (a+ m_LRearWheel / 2)* (float)(sin(m_iFT / b); pr = m_

21、pCali-GetUVfromXY( m_fRX0, m_fRY0);m_iFT -; while( pl.x lWidth | pl.y lHeight | pr.x lWidth | pr.y lHeight); */ puter time jump step m_step = (m_iFT - m_iNT) / 38; m_iTlong = 0; for( t = m_iNT; t m_iFT; t = t + m_step) m_iTlong + ; /* puterXY() 计算倒车轨迹点 参数是方向盘转角,此处暂为前轴中心点的转角 */ void CBackTrack:puterX

22、Y() float a,b; a = m_LRearAxle / (float)(tan (m_fAngle); b = m_VBack * (float)(sin (m_fAngle) / m_LRearAxle; int t; int l = 0;for ( t = m_iNT ; t m_iFT ; t = t + m_step) / left rear wheel back track m_fLX l = - ( a - m_LRearWheel / 2) * (float)(cos ( b * t ) + a; m_fLY l = ( a - m_LRearWheel / 2) *

23、(float)(sin( b * t ); / right rear wheel back track m_fRX l = - ( a + m_LRearWheel / 2) * (float)(cos ( b * t ) + a; m_fRY l = ( a + m_LRearWheel / 2) * (float)(sin( b * t ); l+; /* 车辆后轮延长线,无论方向盘转角等参数如何变, 延长线上的点是不变的,因此可分开来写,尤其是当前轴 中心点的转角为零时,在图像上只显示后轮延长线,因此需要 单独写出来 */ void CBackTrack:puterExtendXY()

24、int t; int l = 0; for(t = m_iNT ; t m_iFT ; t = t + m_step) / left rear wheel extend m_fLeX l = m_LRearWheel / 2; m_fLeY l = t*m_VBack; / right rear wheel extend m_fReX l = - m_LRearWheel / 2; m_fReY l = m_fLeY l ; l+; void CBackTrack:puterUV() int t; int l = 0; CPoint p; for( t = m_iNT ; t m_iFT ;

25、t = t + m_step) / left rear wheel back track in image p = m_pCali-GetUVfromXY( m_fLXl, m_fLYl); m_iLUl = p.x; m_iLVl = p.y; /right rear wheel back track in image p = m_pCali-GetUVfromXY( m_fRXl, m_fRYl); m_iRUl = p.x; m_iRVl = p.y; l+; void CBackTrack:GetExtendUV() int t; int l = 0; CPoint p; for( t

26、 = m_iNT ; t m_iFT ; t = t + m_step) / left rear wheel extend in image p = m_pCali-GetUVfromXY( m_fLeXl, m_fLeYl); m_iLeUl = p.x; m_iLeVl = p.y; / right rear wheel extend in image p = m_pCali-GetUVfromXY( m_fReXl, m_fReYl); m_iReUl = p.x; m_iReVl = p.y; l+; void CBackTrack:DrawBackSpot(unsigned char

27、 *lpDIBBits, int lWidth, int lHeight) int t ; long lLineBytes = WIDTHBYTES(lWidth * 8);for( t = 0 ; t m_iTlong ; t +) / left wheel track spot *(unsigned char *)lpDIBBits + lLineBytes * m_iLVt + m_iLUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (m_iLVt -1) + m_iLUt) = 255; *(unsigned char *)l

28、pDIBBits + lLineBytes * (m_iLVt +1) + m_iLUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iLVt + m_iLUt -1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iLVt + m_iLUt + 1) = 255; / right wheel track spot *(unsigned char *)lpDIBBits + lLineBytes * m_iRVt + m_iRUt) = 255; *(unsigned cha

29、r *)lpDIBBits + lLineBytes * (m_iRVt -1) + m_iRUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (m_iRVt +1) + m_iRUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iRVt + m_iRUt -1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iRVt + m_iRUt + 1) = 255; void CBackTrack:DrawExtendSpo

30、t(unsigned char *lpDIBBits, int lWidth, int lHeight, bool bInverse) if(bInverse) InverseBmp(lpDIBBits,lWidth,lHeight); int t ; long lLineBytes = WIDTHBYTES(lWidth * 8);for( t = 0 ; t m_iTlong ; t +) / left wheel track spot *(unsigned char *)lpDIBBits + lLineBytes * m_iLeVt + m_iLeUt) = 255; *(unsign

31、ed char *)lpDIBBits + lLineBytes * (m_iLeVt -1) + m_iLeUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (m_iLeVt +1) + m_iLeUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iLeVt + m_iLeUt -1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iLeVt + m_iLeUt + 1) = 255; / right wheel t

32、rack spot *(unsigned char *)lpDIBBits + lLineBytes * m_iReVt + m_iReUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (m_iReVt -1) + m_iReUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (m_iReVt +1) + m_iReUt) = 255; *(unsigned char *)lpDIBBits + lLineBytes * m_iReVt + m_iReUt -1) = 255; *

33、(unsigned char *)lpDIBBits + lLineBytes * m_iReVt + m_iReUt + 1) = 255; if(bInverse) InverseBmp(lpDIBBits,lWidth,lHeight); void CBackTrack:DrawBackTrack(unsigned char *lpDIBBits, int lWidth, int lHeight, bool bInverse) if(bInverse) InverseBmp(lpDIBBits,lWidth,lHeight); int t,tj ; float k ; int U,off

34、set; long lLineBytes = WIDTHBYTES(lWidth * 8); for( t = 0 ; t m_iTlong - 1 ; t +) / draw left wheel back track k = (float) ( m_iLU t - m_iLU t + 1 ) / (float) ( m_iLV t - m_iLV t + 1 ); if( m_iLV t m_iLV t + 1 ) for ( tj = m_iLV t ; tj m_iLV t + 1 ; tj+) offset = lLineBytes * tj; U = (int) (m_iLU t

35、- k * (m_iLV t - tj); if( U lWidth - 1 & tj lHeight - 1 & tj 1 & U 1 ) *(unsigned char *)lpDIBBits + offset + U) = 255; *(unsigned char *)lpDIBBits + offset - lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + U +1) = 255; *(un

36、signed char *)lpDIBBits + offset + U -1) = 255; else if( m_iLV t m_iLV t + 1 ) for ( tj = m_iLV t ; tj m_iLV t + 1 ; tj-) offset = lLineBytes * tj; U = (int) (m_iLU t - k * (m_iLV t - tj); if( U lWidth - 1 & tj lHeight - 1 & tj 1 & U 1 ) *(unsigned char *)lpDIBBits + offset + U) = 255; *(unsigned ch

37、ar *)lpDIBBits + offset - lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + U +1) = 255; *(unsigned char *)lpDIBBits + offset + U -1) = 255; / draw right wheel back track k = (float) ( m_iRU t - m_iRU t + 1 ) / (float) ( m_iRV

38、 t - m_iRV t + 1 ); if( m_iRV t m_iRV t + 1 ) for ( tj = m_iRV t ; tj m_iRV t + 1 ; tj+) offset = lLineBytes * tj; U = (int) (m_iRU t - k * (m_iRV t - tj); if( U lWidth - 1 & tj lHeight - 1 & tj 1 & U 1 ) *(unsigned char *)lpDIBBits + offset + U) = 255; *(unsigned char *)lpDIBBits + offset - lLineBy

39、tes + U) = 255; *(unsigned char *)lpDIBBits + offset + lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + U +1) = 255; *(unsigned char *)lpDIBBits + offset + U -1) = 255; else if( m_iRV t m_iRV t + 1 ) for ( tj = m_iRV t ; tj m_iRV t + 1 ; tj-) offset = lLineBytes * tj; U = (int) (m_iRU t

40、 - k * (m_iRV t - tj); if( U lWidth - 1 & tj lHeight - 1 & tj 1 & U 1 ) *(unsigned char *)lpDIBBits + offset + U) = 255; *(unsigned char *)lpDIBBits + offset - lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + lLineBytes + U) = 255; *(unsigned char *)lpDIBBits + offset + U +1) = 255; *(u

41、nsigned char *)lpDIBBits + offset + U -1) = 255; if(bInverse) InverseBmp(lpDIBBits,lWidth,lHeight); void CBackTrack:DrawExtendTrack(unsigned char *lpDIBBits, int lWidth, int lHeight) int t ,tj; float k ; int V; long lLineBytes = WIDTHBYTES(lWidth * 8); for( t = 0 ; t m_iTlong - 1 ; t +) / draw left

42、wheel extend track if( m_iLeU t m_iLeU t + 1 ) for ( tj = m_iLeU t ; tj m_iLeU t + 1 ; tj-) k = (float) ( m_iLeV t - m_iLeV t + 1 ) / (float) ( m_iLeU t - m_iLeU t + 1 ); V = (int) ( k * tj + m_iLeV t - k * m_iLeU t ); if( tj lWidth - 1 & V lHeight - 1 & tj 1 & V 1 ) *(unsigned char *)lpDIBBits + lL

43、ineBytes * V + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * ( V - 1 ) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (V + 1) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj +1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj -1) = 255; else for ( tj = m_iLeU

44、 t ; tj m_iLeU t + 1 ; tj+) k = (float) ( m_iLeV t - m_iLeV t + 1 ) / (float) ( m_iLeU t - m_iLeU t + 1 ); V = (int) ( k * tj + m_iLeV t - k * m_iLeU t ); if( tj lWidth - 1 & V lHeight - 1 & tj 1 & V 1 ) *(unsigned char *)lpDIBBits + lLineBytes * V + tj) = 255; *(unsigned char *)lpDIBBits + lLineByt

45、es * ( V - 1 ) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (V + 1) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj +1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj -1) = 255; / draw right wheel extend track if( m_iReU t m_iReU t + 1 ) for ( tj = m_iReU t ; tj m

46、_iReU t + 1 ; tj-) k = (float) ( m_iReV t - m_iReV t + 1 ) / (float) ( m_iReU t - m_iReU t + 1 ); V = (int) ( k * tj + m_iReV t - k * m_iReU t ); if( tj lWidth - 1 & V lHeight - 1 & tj 1 & V 1 ) *(unsigned char *)lpDIBBits + lLineBytes * V + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * ( V

47、- 1 ) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (V + 1) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj +1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj -1) = 255; else for ( tj = m_iReU t ; tj m_iReU t + 1 ; tj+) k = (float) ( m_iReV t - m_iReV t + 1 ) / (fl

48、oat) ( m_iReU t - m_iReU t + 1 ); V = (int) ( k * tj + m_iReV t - k * m_iReU t ); if( tj lWidth - 1 & V lHeight - 1 & tj 1 & V 1 ) *(unsigned char *)lpDIBBits + lLineBytes * V + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * ( V - 1 ) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * (V

49、 + 1) + tj) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj +1) = 255; *(unsigned char *)lpDIBBits + lLineBytes * V + tj -1) = 255; bool CBackTrack:InitObject(CRearCalibration *pCali, float fAngle,float fAxleDist,float fWheelDist,int lWidth, int lHeight) if(!pCali-IfDoneCali() return false;

50、 m_LRearAxle = fAxleDist; m_LRearWheel = fWheelDist; m_pCali = pCali; m_fAngle = fAngle; GetTfromView(lWidth, lHeight); puterExtendXY(); GetExtendUV(); puterXY(); puterUV(); return true; void CBackTrack:InverseBmp(unsigned char *lpDIBBits, int lWidth, int lHeight) unsigned char *pData = new unsigned

51、 charlWidth*lHeight; int i,j,off1=0,off2=(lHeight-1)*lWidth; for(i=0;ilHeight;i+) for(j=0;j416) k=(float)(28)/(float)(416-480); b=72-k*480; else if(v=416 & v322) k=(float)(40)/(float)(322-416); b=100-k*416; else if(v=322 & v276) k=(float)(40)/(float)(276-322); b=140-k*322; else if(v=276 & v248) k=(f

52、loat)(40)/(float)(248-276); /-1.42857 b=180-k*276; else if(v=248 & v230) k=(float)(40)/(float)(230-248); /-2.22222 b=220-k*248;/771.1111 else if(v=230 & v216) k=(float)(40)/(float)(216-230); /-2.85714 b=260-k*230;/917.143 else if(v=216 & v206) k=(float)(40)/(float)(206-216); /-4.000 b=300-k*216; /11

53、64.00 else if(v=206 & v198) k=(float)(40)/(float)(198-206);/-5.0000 b=340-k*206;/1370.00 else if(v=198 & v186) k=(float)(80)/(float)(186-198);/=-6.6667; b=380.0f-k*198.0f;/1700.00 else if(v=186 & v=177) k=(float)(80)/(float)(177-186); b=460-k*186; y=(short)(k*v+b+0.5); return y; /* GetMarkXU() 找两条直线

54、作为标线参考 本处去X=40和X=-40这两条参考线 */ void CBackTrack:GetMarkXU() short i; short l=0; short U1Top,U1Bott,U2Top,U2Bott; float k1,k2,b1,b2; U1Top=273; U1Bott=124+4; U2Top=362; U2Bott=508+6; k1=(198.0f-410.0f)/(float)(U1Top-U1Bott); k2=(198.0f-410.0f)/(float)(U2Top-U2Bott); b1=198.0f-k1*U1Top; b2=198.0f-k2*U2T

55、op; for(i=198;i=480;i+) m_U1i-198=(short)(i-b1)/k1+0.5); m_U2i-198=(short)(i-b2)/k2+0.5); /* GetUfromV() 根据输入的V值,采用标线法求出V行上 倒车轨迹在该行对应的点 入口:第几行 */ CPoint CBackTrack:GetUfromV(short v) float xr,xl,y; float a,b,c,temp1,temp2; short Ur,Ul; CPoint p; y=RelationYV(v); a=m_LRearAxle/(float)tan(m_fAngle); b

56、=a+m_LRearWheel/2; c=a-m_LRearWheel/2; temp1=(float)sqrt(b*b-y*y); temp2=(float)sqrt(c*c-y*y); if(m_fAngle0) xr=temp1-a; xl=temp2-a; Ur=(short)(xr+40)*(m_U1v-198-m_U2v-198)/80.0+m_U2v-198+0.5); Ul=(short)(xl+40)*(m_U1v-198-m_U2v-198)/80.0+m_U2v-198+0.5); p.x=Ur; p.y=Ul; return p; /* GetUfromVofExten

57、d(short v) 根据输入的V值,采用标线法求出V行上 两后轮延长线在该行对应的点 入口:第几行 */ CPoint CBackTrack:GetUfromVofExtend(short v) float xr,xl; short Ur,Ul; CPoint p; xr=m_LRearWheel/2; xl=-m_LRearWheel/2; Ur=(short)(float)(xr+40)*(float)(m_U1v-198-m_U2v-198)/80.0+m_U2v-198+0.5); Ul=(short)(float)(xl+40)*(float)(m_U1v-198-m_U2v-19

58、8)/80.0+m_U2v-198+0.5); p.x=Ur; p.y=Ul; return p; /* DrawTrack() 将轨迹线和延长线同时画出 */ void CBackTrack:DrawTrack(unsigned char *lpDIBBits, int lWidth, int lHeight) long lLineBytes = WIDTHBYTES(lWidth * 8); CPoint p; int ur,ul,uer,uel; short i; int offset = 100; lHeight -= offset; for(i=198;i=0 & ur=lWidth) *(unsigned char *)lpDIBBits + lLineBytes * (lHeight-i) + ur) = 0; *(unsigned char *)lpDIBBits + lLineBytes * ( lHeight-i+ 1 )

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论