倒车轨迹理论实现方法
倒车轨迹原理

倒车轨迹原理倒车轨迹原理是指在车辆倒车时,通过车载摄像头或者倒车雷达等装置,可以在车辆后部显示出一条虚拟轨迹线,用来指导驾驶员进行倒车操作。
这项技术在现代汽车中已经得到了广泛的应用,极大地提高了倒车的安全性和便利性。
下面我们将详细介绍倒车轨迹原理及其实现方式。
首先,倒车轨迹原理是基于摄像头或雷达传感器获取车辆周围环境信息的基础上实现的。
当驾驶员将车辆挂入倒挡时,车载系统会自动启动摄像头或雷达传感器,并将获取的环境信息传输到车载显示屏上。
然后,系统会对获取的环境信息进行处理和分析,通过算法计算出车辆倒车时应该采取的轨迹线,并在显示屏上以虚拟线条的形式呈现出来。
其次,倒车轨迹的实现方式主要有两种,一种是基于摄像头的视觉辅助系统,另一种是基于雷达传感器的声纳辅助系统。
视觉辅助系统通过摄像头获取车辆周围的实时影像,并在显示屏上显示出倒车轨迹线,驾驶员可以根据轨迹线的引导进行倒车操作。
而声纳辅助系统则是通过雷达传感器对车辆周围的障碍物进行探测,系统会根据检测到的障碍物位置和距离来生成倒车轨迹线,同样用于指导驾驶员进行倒车操作。
此外,倒车轨迹原理的实现还需要考虑到车辆的转向角度、车身尺寸、摄像头或雷达传感器的位置等因素。
这些因素会影响到倒车轨迹线的准确性和可靠性,因此在设计和安装倒车轨迹系统时需要进行精确的测量和计算,以确保系统能够准确地反映出车辆周围的环境情况。
总的来说,倒车轨迹原理是一项利用摄像头或雷达传感器获取车辆周围环境信息,并通过算法计算出倒车轨迹线的技术。
它可以帮助驾驶员更加准确地掌握车辆倒车时的位置和方向,提高了倒车操作的安全性和便利性。
随着科技的不断进步,倒车轨迹系统也将会得到更加完善和智能化的发展,为驾驶员提供更加全面的倒车辅助服务。
倒车影像随动轨迹原理

倒车影像随动轨迹原理
倒车影像随动轨迹的原理主要基于摄像头和车辆内部网络的配合。
这种高级的摄像头与车辆内部网络连接,当车辆倒车时,摄像头的处理单元可以从车载网络上获取方向盘转动角度的信号。
然后,通过特殊的算法,这个处理单元可以计算出车尾的轨迹,并生成对应的轨迹线信号。
这些轨迹线信号与图像信号一起被传递给车机屏幕,从而在屏幕上显示出车尾的画面和动态的轨迹线。
这种动态倒车轨迹系统的精准度较高,因为它基于科学的算法进行计算。
此外,为了实现这一功能,车辆通常需要具备ESP系统和车载网络系统。
ESP 系统用于提供方向盘转角传感器的信号,而车载网络系统则使这些信号能够被摄像头实时获取,从而调节轨迹。
以上内容仅供参考,如需了解更多信息,建议咨询专业技术人员或查阅相关技术手册。
倒车影像随动轨迹原理

倒车影像随动轨迹原理
倒车影像随动轨迹是指在倒车时,车辆后部的摄像头会根据车辆的移动轨迹自动调整显示的图像位置,以帮助驾驶员更准确地判断车辆与障碍物的位置关系。
其原理主要包括以下几个步骤:
1. 获取车辆的倒车状态:通过车辆的倒车开关或倒车灯等信号,系统可以得知车辆正在进行倒车操作。
2. 获取车辆的转向角度:通过车辆的转向角度传感器或转向盘传感器等,系统可以得知车辆的转向角度。
3. 获取车辆的移动速度:通过车辆的车速传感器或轮速传感器等,系统可以得知车辆的移动速度。
4. 根据转向角度和移动速度计算轨迹:根据车辆的转向角度和移动速度,系统可以计算出车辆倒车时的移动轨迹。
5. 调整摄像头的图像位置:根据计算得到的移动轨迹,系统会自动调整摄像头的图像位置,使其能够准确显示车辆与障碍物的位置关系。
通过以上步骤,倒车影像随动轨迹系统可以实现在倒车时自动调整摄像头的图像位置,帮助驾驶员更准确地判断车辆与障碍物的距离和方位,提高倒车的安全性和准确性。
倒车轨迹线计算公式

倒车轨迹线计算公式倒车轨迹线计算公式是一种用于计算车辆倒车轨迹的数学模型。
通过分析车辆倒车过程中的运动规律和几何关系,可以推导出一些常用的倒车轨迹线计算公式。
下面将介绍几个常见的倒车轨迹线计算公式,并说明其相关参考内容。
1. 直线倒车轨迹线计算公式:在直线倒车过程中,车辆的轨迹可以近似看作一条直线。
根据运动学的知识,可以得到直线倒车轨迹线计算公式如下:s(t) = s0 + v * t其中,s(t)表示倒车时刻t时车辆的位置,s0表示起始位置,v表示倒车速度,t表示时间。
参考内容:关于运动学知识的参考内容可以参考高中物理教材或者相关的在线学习资源。
2. 圆弧倒车轨迹线计算公式:在倒车过程中,为了更好地控制车辆的转向和转弯半径,常常选择进行圆弧倒车。
根据几何学的知识,可以得到圆弧倒车轨迹线计算公式如下:x(t) = x0 + R * cos(θ0 + ω * t)y(t) = y0 + R * sin(θ0 + ω * t)其中,x(t)和y(t)表示倒车时刻t时车辆的位置,x0和y0表示圆弧的圆心坐标,R表示转弯半径,θ0表示初始转向角度,ω表示角速度。
参考内容:关于几何学知识的参考内容可以参考相关的高等数学教材或者在线学习资源。
3. 曲线倒车轨迹线计算公式:当需要在倒车过程中进行复杂的曲线行驶时,可以使用曲线倒车轨迹线计算公式。
具体的计算公式取决于倒车曲线的形状和特点,可以采用参数方程、极坐标方程等形式。
参考内容:关于曲线方程和参数方程的计算方法可以参考相关的高等数学教材或者在线学习资源。
需要注意的是,以上的倒车轨迹线计算公式都是基于一定的简化和近似条件得到的,并不能完全准确地描述实际的倒车轨迹。
实际倒车过程中还需要考虑车辆的特性、驾驶员的操作等多种因素,因此在实际操作中应该结合实际情况进行合理的调整和判断。
总结起来,倒车轨迹线计算公式是一种用于计算车辆倒车轨迹的数学模型。
通过分析运动规律和几何关系,可以得到直线倒车、圆弧倒车、曲线倒车等情况下的计算公式。
贝塞尔曲线绘制倒车轨迹

贝塞尔曲线绘制倒车轨迹一、引言随着智能驾驶技术的快速发展,倒车轨迹的准确绘制成为了提升驾驶安全性的关键因素之一。
贝塞尔曲线作为一种数学工具,具有简单、准确、连续的特性,因此在倒车轨迹绘制中得到了广泛应用。
本文将介绍贝塞尔曲线的基本原理,并探讨其在倒车轨迹绘制中的应用。
二、贝塞尔曲线原理贝塞尔曲线是基于参数的数学曲线,通过控制点的位置和数量来定义曲线的形状。
通过调整控制点的位置,可以生成各种复杂的曲线形状。
贝塞尔曲线的数学表达式为:P(t) = (1-t)^n * P0 + t^n * Pn 其中,P0、Pn为控制点,n为阶数,t为参数。
三、倒车轨迹绘制中的贝塞尔曲线应用1. 倒车轨迹数据采集:通过传感器获取车辆后方的障碍物信息,包括障碍物的位置、大小和形状等,并以此为基础生成倒车轨迹的控制点。
2. 贝塞尔曲线生成:根据控制点,利用贝塞尔曲线算法生成倒车轨迹曲线。
可以根据需要选择不同的阶数和参数,以生成符合实际需求的曲线。
3. 轨迹规划:根据生成的贝塞尔曲线,结合车辆的运动学模型,进行轨迹规划。
考虑车辆的转向、速度、加速度等约束条件,确保轨迹的可行性。
4. 实时绘制:将规划好的轨迹实时绘制在车载显示屏上,帮助驾驶员了解车辆的倒车运动状态,提高驾驶安全性。
四、结论贝塞尔曲线在倒车轨迹绘制中具有显著的优势,能够根据实际需求生成符合车辆运动学模型的轨迹曲线。
通过实时绘制,驾驶员可以直观地了解车辆的倒车运动状态,从而做出准确的驾驶决策。
随着智能驾驶技术的不断发展和完善,贝塞尔曲线在倒车轨迹绘制中的应用将得到更广泛的应用和推广。
五、未来展望1. 优化算法:随着计算能力的提升,可以进一步优化贝塞尔曲线的生成算法,提高计算效率和精度,以满足实时性要求。
2. 多模式适应:研究不同驾驶模式下的贝塞尔曲线生成算法,以满足不同场景下的倒车轨迹绘制需求。
3. 人工智能辅助:结合人工智能技术,自动识别障碍物并进行轨迹规划,提高倒车轨迹绘制的自动化程度。
倒车轨迹理论实现方法

倒车轨迹理论实现方法帅文王文梁关键字:倒车轨迹视角转换前言:倒车轨迹是近两年部分国产汽车导航设备上新出现的一个功能,其借助方向盘转角信息将汽车可能的后退路线叠加到后视摄像头的输出上并标注出距离,以直观形象化的形式协助驾驶人员调整选择倒车路线,减少驾驶人员特别是新手的误判断,对使用者是一个不错的实用功能。
倒车轨迹在智能倒车领域内属于辅助倒车系统中的一种,虽然其还无法达到智能化倒车,但是其实用性和辅助性上对汽车智能化单元技术方面是一个有效的补充。
本文将基于使用为目的,从经验角度并结合基本数学推导分析倒车轨迹的原理、实现过程并给出实际使用过程中需要的操作点。
由于本文非侧重于数学理论,对部分数学细节在不影响实际结论情况下不做深入探讨。
一倒车轨迹的基本原理从日常经验可知,以自行车为例,如果前轮有一定转角,在维持转角不变状态和无轴向移动前提下自行车走过的路径将会以某个圆点为中心旋转,同样的状态也会出现在汽车上。
其走过路径如图1。
图中假设车轮不会出现轴向移动,故如果保持车轮转角不变的情况下,每个车轮只能沿着垂直其车轴的方向行进,这里取前后轮的轴心作为轨迹跟踪点(实际过程中两个前轮轴心不会出现平行),则轨迹应该是以前后轮轴向线的焦点为圆心的圆。
图中φ为为前轮同水平方向的夹角,记前后轮轴距为L,后轮轴长为W,后轮距离车尾的距离为D,从几何关系可知,后轮轴心的运动轨迹可以描述为以半径Lcot(φ)的圆周运动。
两个后轮的轨迹分别为Lcot(φ)-W/2和Lcot(φ)+W/2的圆。
这里的推导过程采用经验法结合几何推算,完全从数学角度的推算过程请参考资料1。
图中的x方向和y方向不同于一般习惯主要是考虑后面的视角变换。
从等式可以看到,当φ接近0度时候行进轨迹近似直线,接近90度时半径呈缩小趋势,符合我们日常经验值。
二视角转换从倒车公式推导出的路线图为行进路线的俯视图,实际显示给操作者的路线应该是从车内观察点观察到的轨迹,驾驶人员看到的运动轨迹实际为以车尾摄像头为中心点坐标的图像描述(图一中车尾位置的原点)。
汽车轨迹倒车的原理

汽车轨迹倒车的原理
汽车倒车时的轨迹主要依赖于车辆的转向和倒车方向的选择。
汽车的方向盘控制前轮转向,通过改变前轮的转向角度,可以使车辆在倒车时按照特定的路径行驶。
在传统的汽车中,前轮和后轮是通过机械连接相互关联的,因此前轮的转向会直接影响后轮的转向。
当车辆倒车时,司机通过转动方向盘,使得前轮向左或向右转动,后轮也会相应地转向。
根据转向角度的不同,汽车倒车时可以出现以下几种常见的轨迹:
1. 直线倒车轨迹:当前轮保持直线状态,后轮按照相同的方向直线行驶,这种情况下,汽车会倒车直线行驶。
2. 弯道倒车轨迹:当转动方向盘使得前轮转向,后轮会随之转向,汽车会按照弯道倒车。
3. 打滑倒车轨迹:在某些特殊情况下,例如道路湿滑或路面不平,汽车的后轮可能会打滑,导致倒车时轨迹变得不稳定和不可控。
需要注意的是,倒车时司机应根据实际情况合理选择倒车的角度和路径,以确保安全和灵活的操作。
此外,现代汽车也配备了辅助倒车系统,如倒车雷达和倒车
摄像头,可以帮助司机更好地掌握倒车时的情况,提高倒车的准确性和安全性。
倒车入库车轮轨迹计算公式

倒车入库车轮轨迹计算公式在日常生活中,倒车入库是驾驶员需要掌握的一项基本技能。
在进行倒车入库时,车轮的轨迹是一个非常重要的因素,它直接影响着车辆的入库路径和安全性。
为了帮助驾驶员更好地掌握倒车入库的技巧,我们可以通过计算车轮的轨迹来辅助驾驶员进行操作。
倒车入库车轮轨迹的计算公式是一种基于数学原理的方法,它可以帮助我们预测车辆在倒车入库过程中的轨迹。
这个公式可以通过一些简单的数学运算来得到,它包括了车辆的转向角度、车轮的转动半径等因素。
通过这个公式,我们可以计算出车辆在倒车入库过程中的轨迹,从而更好地掌握倒车入库的技巧。
首先,我们需要了解一些基本的数学概念。
在进行倒车入库时,车辆的转向角度是一个非常重要的因素。
转向角度可以决定车辆在倒车入库过程中的入库路径,它直接影响着车辆的位置和方向。
另外,车轮的转动半径也是一个非常重要的因素。
车轮的转动半径可以决定车辆在倒车入库过程中的转弯半径,它直接影响着车辆的转向和位置。
通过一些简单的几何原理,我们可以得到倒车入库车轮轨迹的计算公式。
假设车辆在倒车入库时,车轮的转动半径为R,车辆的转向角度为θ,车辆的轴距为L。
根据几何原理,我们可以得到车辆在倒车入库过程中的轨迹方程为:x = R sin(θ) + L cos(θ) L。
y = R (1 cos(θ)) + L sin(θ)。
其中,x和y分别表示车辆在倒车入库过程中的横向和纵向位移,R表示车轮的转动半径,θ表示车辆的转向角度,L表示车辆的轴距。
通过这个公式,我们可以计算出车辆在倒车入库过程中的轨迹。
通过调整车辆的转向角度和车轮的转动半径,我们可以控制车辆在倒车入库过程中的轨迹,从而更好地掌握倒车入库的技巧。
除了倒车入库车轮轨迹的计算公式,我们还可以通过一些实际的操作来帮助驾驶员更好地掌握倒车入库的技巧。
例如,我们可以通过设置倒车入库的参考点来帮助驾驶员更好地掌握车辆的位置和方向。
另外,我们还可以通过进行一些模拟训练来帮助驾驶员更好地掌握倒车入库的技巧。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
倒车轨迹理论实现方法 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】倒车轨迹理论实现方法帅文王文梁关键字:倒车轨迹视角转换前言:倒车轨迹是近两年部分国产汽车导航设备上新出现的一个功能,其借助方向盘转角信息将汽车可能的后退路线叠加到后视摄像头的输出上并标注出距离,以直观形象化的形式协助驾驶人员调整选择倒车路线,减少驾驶人员特别是新手的误判断,对使用者是一个不错的实用功能。
倒车轨迹在智能倒车领域内属于辅助倒车系统中的一种,虽然其还无法达到智能化倒车,但是其实用性和辅助性上对汽车智能化单元技术方面是一个有效的补充。
本文将基于使用为目的,从经验角度并结合基本数学推导分析倒车轨迹的原理、实现过程并给出实际使用过程中需要的操作点。
由于本文非侧重于数学理论,对部分数学细节在不影响实际结论情况下不做深入探讨。
一倒车轨迹的基本原理从日常经验可知,以自行车为例,如果前轮有一定转角,在维持转角不变状态和无轴向移动前提下自行车走过的路径将会以某个圆点为中心旋转,同样的状态也会出现在汽车上。
其走过路径如图1。
图中假设车轮不会出现轴向移动,故如果保持车轮转角不变的情况下,每个车轮只能沿着垂直其车轴的方向行进,这里取前后轮的轴心作为轨迹跟踪点(实际过程中两个前轮轴心不会出现平行),则轨迹应该是以前后轮轴向线的焦点为圆心的圆。
图中φ为为前轮同水平方向的夹角,记前后轮轴距为L,后轮轴长为W,后轮距离车尾的距离为D,从几何关系可知,后轮轴心的运动轨迹可以描述为以半径Lcot(φ)的圆周运动。
两个后轮的轨迹分别为Lcot(φ)-W/2和Lcot(φ)+W/2的圆。
这里的推导过程采用经验法结合几何推算,完全从数学角度的推算过程请参考资料1。
图中的x方向和y方向不同于一般习惯主要是考虑后面的视角变换。
从等式可以看到,当φ接近0度时候行进轨迹近似直线,接近90度时半径呈缩小趋势,符合我们日常经验值。
二视角转换从倒车公式推导出的路线图为行进路线的俯视图,实际显示给操作者的路线应该是从车内观察点观察到的轨迹,驾驶人员看到的运动轨迹实际为以车尾摄像头为中心点坐标的图像描述(图一中车尾位置的原点)。
将摄像头位置定为坐标零点,则轨迹上的任意点位置公式为:(x+Lcot(φ))2+(y+D)2=(Lcot(φ))2(1)上面推导的轨迹仍然是基于俯视条件下的轨迹,看到的应该为处于一定视角观察的轨迹,故需要进行一定角度的转换才能切换到实际观察到的图像。
假设摄像头的可视角范围为2α,摄像头距离地面h,摄像头中心线同水平面的夹角为β,输出屏幕的高度为H,这里假设摄像头相对于屏幕为一个点,会造成实际计算结果的一定偏差,关于偏差的细节数学计算不属本文讨论的重点。
我们实际观察到的Yr为地面y在显示屏H上的投影,y方向的转换过程如图二:上图中为了便于计算,将经过摄像头采集后输出的显示器直接投影到同一个图中,这和实际输出没有区别。
上图中的虚线为水平线,点线为屏幕的中心点到摄像头的连线,β为中心线和水平线的夹角将上图进行简化可转为下列数学问题,等腰三角形中同顶点成已知角度所对应的边长,简化后的计算如图三。
Yr对应的角度为α+β-θ,其中θ=arctg(h/y)通过几何运算可得:三计算轨迹的条件从以上计算我们可以看到,需要计算出轨迹,必须提供以下参数:1摄像头的可视角范围2a2摄像头距离地面距离h3 摄像头中心线同水平面的夹角β4 输出屏幕的高度H和宽带W5汽车前后轮轴距L6汽车轴长W,后轮距离车尾的距离D7 前轮同水平方向的夹角φ以上参数中除转角φ外对于固定的车型和安装方式都已经固定,转角φ的获取可以有两种方式:1对于有方向盘角度信息的车型可以直接通过输出接口如can总线获取。
2外加角度传感器获取角度信息。
两种方式都需要对采集的信息作一定的校正。
四验证将上面公式的2和3带入1,可推导出显示屏幕上的实际轨迹图像。
我们用vc实现了过程模拟,程序流程图四,模拟结果如图五。
在真实的嵌入式平台上实现需要该平台支持图像叠加功能,目前许多多媒体soc芯片都能具备硬件α融合功能,可以方便的将描绘出的轨迹叠加到摄像头的输入信号上,对于角度信息的采集,则要求平台有can总线接口(部分车型可以输出角度信息)或外加角度传感器接口获取车轮转角。
五结论:从验证情况看,结果和经验吻合,证明算法的主要正确性。
一些细节信息需要针对具体的实现平台进行微调。
以上算法对于下列场景无法解决,如果路面有斜坡由于整个系统无法感知而导致叠加图像有误,当倒车速度过快(如漂移)会造成上述公式整体失效,但是对于普通用户场景-低速、路面相对平整还是主要场合,故将参数校准后会有较好的参考价值。
////////////////////////////////////////////////////////////////////////#include ""#include ""#include ""#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE[]=__FILE__;#define new DEBUG_NEW#endif//////////////////////////////////////////////////////////////////////// Construction/Destruction////////////////////////////////////////////////////////////////////// CBackTrack::CBackTrack(){m_VBack = ;m_LRearAxle = 0;m_LRearWheel = 0;m_iTlong = 0;GetMarkXU();}CBackTrack::~CBackTrack(){}//////////////////////////////////////////////////////////////分步骤进行编程/*void CBackTrack::GetTfromView(){// float VBack = ;// 相机视野的最近点和最远点距离汽车后轴的距离,Ny要大于100,由于现在假定相机安装在后轴中心,故先付值100int Ny,Fy;Ny = 100;Fy = 330;// 中间变量float a,b;int t;//判断分母中为零的项,a不可能为零,因为前轴中心的转向角永远小于50度if( sin(m_fAngle) != 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)) + ;m_iFT = (int)(b * (float)(asin ( Fy / a)) + ;}//当这两项为零时,车辆没有倒车,因此可以只把后轮的延长线画出else{m_iNT = (int)(Ny/m_VBack + ;m_iFT = (int)(Fy/m_VBack + ;}// computer time jump stepm_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 = ;// 相机视野的最近点和最远点距离汽车后轴的距离,Ny要大于100,由于现在假定相机安装在后轴中心,故先付值100int Ny,Fy;Ny = 100;Fy = 380;// 中间变量// float a,b;int t;CPoint pl,pr;m_iNT = (int)(Ny/m_VBack + ;m_iFT = (int)(Fy/m_VBack + ;/*float a,b;a = m_LRearAxle / (float)tan (m_fAngle);b = m_LRearAxle / m_VBack / (float)sin (m_fAngle);do{m_fLX[0] = -(a - m_LRearWheel / 2) * (float)(cos(m_iNT / b)) + a;m_fLY[0] = (a- m_LRearWheel / 2) * (float)(sin(m_iNT / b));pl = m_pCali->GetUVfromXY( m_fLX[0], m_fLY[0]);m_fRX[0] = -(a+m_LRearWheel / 2) * (float)(cos(m_iNT / b)) + a;m_fRY[0] = (a+ m_LRearWheel / 2)* (float)(sin(m_iNT / b));pr = m_pCali->GetUVfromXY( m_fRX[0], m_fRY[0]);m_iNT ++;} while( 1 || 1 || 1 || 1);do{m_fLX[0] = -(a - m_LRearWheel / 2) * (float)(cos(m_iFT / b)) + a;m_fLY[0] = (a- m_LRearWheel / 2) * (float)(sin(m_iFT / b));pl = m_pCali->GetUVfromXY( m_fLX[0], m_fLY[0]);m_fRX[0] = -(a+m_LRearWheel / 2) * (float)(cos(m_iFT / b)) + a;m_fRY[0] = (a+ m_LRearWheel / 2)* (float)(sin(m_iFT / b));pr = m_pCali->GetUVfromXY( m_fRX[0], m_fRY[0]);m_iFT --;} while( > lWidth || > lHeight || > lWidth || > lHeight);*/// computer time jump stepm_step = (m_iFT - m_iNT) / 38;m_iTlong = 0;for( t = m_iNT; t m_iFT; t = t + m_step){m_iTlong ++ ;}}/********************************************ComputerXY()计算倒车轨迹点参数是方向盘转角,此处暂为前轴中心点的转角*********************************************/void CBackTrack::ComputerXY(){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 trackm_fLX [ l ] = - ( a - m_LRearWheel / 2) * (float)(cos ( b *t )) + a;m_fLY [ l ] = ( a - m_LRearWheel / 2) * (float)(sin( b * t ));// right rear wheel back trackm_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::ComputerExtendXY(){int t;int l = 0;for(t = m_iNT ; t m_iFT ; t = t + m_step){// left rear wheel extendm_fLeX[ l ] = m_LRearWheel / 2;m_fLeY[ l ] = t*m_VBack;// right rear wheel extendm_fReX[ l ] = - m_LRearWheel / 2;m_fReY[ l ] = m_fLeY[ l ];l++;}}void CBackTrack::ComputerUV(){int t;int l = 0;CPoint p;for( t = m_iNT ; t m_iFT ; t = t + m_step){// left rear wheel back track in imagep = m_pCali->GetUVfromXY( m_fLX[l], m_fLY[l]);m_iLU[l] = ;m_iLV[l] = ;//right rear wheel back track in imagep = m_pCali->GetUVfromXY( m_fRX[l], m_fRY[l]);m_iRU[l] = ;m_iRV[l] = ;l++;}}void CBackTrack::GetExtendUV(){int t;int l = 0;CPoint p;for( t = m_iNT ; t m_iFT ; t = t + m_step){// left rear wheel extend in imagep = m_pCali->GetUVfromXY( m_fLeX[l], m_fLeY[l]);m_iLeU[l] = ;m_iLeV[l] = ;// right rear wheel extend in imagep = m_pCali->GetUVfromXY( m_fReX[l], m_fReY[l]);m_iReU[l] = ;m_iReV[l] = ;l++;}}void CBackTrack::DrawBackSpot(unsigned char *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_iLV[t] +m_iLU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iLV[t] -1) + m_iLU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iLV[t ]+1) + m_iLU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iLV[t] +m_iLU[t] -1) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iLV[t] +m_iLU[t] + 1) = 255;// right wheel track spot*((unsigned char *)lpDIBBits + lLineBytes * m_iRV[t] + m_iRU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iRV[t] -1) + m_iRU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iRV[t ]+1) + m_iRU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iRV[t] +m_iRU[t] -1) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iRV[t] +m_iRU[t] + 1) = 255;}}void CBackTrack::DrawExtendSpot(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_iLeV[t] +m_iLeU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iLeV[t] -1) + m_iLeU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iLeV[t ]+1) + m_iLeU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iLeV[t] +m_iLeU[t] -1) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iLeV[t] +m_iLeU[t] + 1) = 255;// right wheel track spot*((unsigned char *)lpDIBBits + lLineBytes * m_iReV[t] + m_iReU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iReV[t] -1) + m_iReU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * (m_iReV[t ]+1) + m_iReU[t]) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iReV[t] +m_iReU[t] -1) = 255;*((unsigned char *)lpDIBBits + lLineBytes * m_iReV[t] +m_iReU[t] + 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,offset;long lLineBytes = WIDTHBYTES(lWidth * 8);for( t = 0 ; t m_iTlong - 1 ; t ++){// draw left wheel back trackk = (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 ] - 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;*((unsigned 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 char *)lpDIBBits + offset - lLineBytes + U) = 255;*((unsigned char *)lpDIBBits + offset + lLineBytes + U) = 255;*((unsigned char *)lpDIBBits + offset + U +1) = 255;}}}// draw right wheel back trackk = (float) ( m_iRU [ t ] - m_iRU [ t + 1] ) / (float)( m_iRV [ 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 - lLineBytes + 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 ] - 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;}}}}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 wheel extend trackif( 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 + lLineBytes * 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;}}}elsefor ( 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 + lLineBytes * 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;}}}// draw right wheel extend trackif( m_iReU [ t ] > m_iReU [ t + 1 ] ){for ( tj = m_iReU [ t ]; tj > m_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 - 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 ] ) / (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 - 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;}}}}}bool CBackTrack::InitObject(CRearCalibration *pCali, float fAngle,float fAxleDist,float fWheelDist,int lWidth, int lHeight){if(!pCali->IfDoneCali()){return false;}m_LRearAxle = fAxleDist;m_LRearWheel = fWheelDist;m_pCali = pCali;m_fAngle = fAngle;GetTfromView(lWidth, lHeight);ComputerExtendXY();;GetExtendUV();ComputerXY();ComputerUV();return true;}void CBackTrack::InverseBmp(unsigned char *lpDIBBits, int lWidth, int lHeight){unsigned char *pData = new unsigned char[lWidth*lHeight];int i,j,off1=0,off2=(lHeight-1)*lWidth;for(i=0;i<lHeight;i++){for(j=0;j<lWidth;j++){pData[off2 + j] = lpDIBBits[off1 + j];}off1 += lWidth;off2 -= lWidth;}memcpy(lpDIBBits,pData,lWidth*lHeight);delete []pData;}/*08-01-09 彭海娟在辅助停车类中增加了一个私有成员数组m_U1[213],m_U2[213],用于存放两个标线在每行上的U值*//***************************************RelationYV()根据相机的理想小孔成像原理,计算标定板的路面坐标系Y与相应图像坐标系V之间的对应关系,假设Y与V成线性关系,并且假设每块的对应关系不同。