倒车轨迹线的实现方法(基于前人基础改进和验证)

背景:

网上对于倒车轨迹的大多数原创和转发的博客应该都基于同一篇,其他人没有进一步思考就对其进行转载和借鉴,其中原理的说明基本也是原版照抄,我看了一下,对于有些地方还是应该存疑,这些地方其他转发和借鉴的朋友也没有修改。

这是我能找到的最早的,借鉴最多的对于倒车轨迹研究的博客,我接下来的分析也是根据这篇博客,有些地方就稍微带过,主要对其中介绍不足的地方进行介绍,请参照原博客一起看。

原理

1.俯瞰监督倒车轨迹形成原理

倒车轨迹
先看上面示意图,这是俯瞰图,我们从二维平面来分析一下,不管是车辆前进还是后退,我们对其后轮进行追踪,我们通过生活经验可以发现,如果在某一时刻的方向盘角度不变,一直前进或者后退,车轮将会在地面画出圆形的轨迹,我们现在摘取后轮的轨迹来研究;
先声明要使用的参数:

  • φ: 前轮同水平方向的夹角
  • L:前后轮轴距
  • w:后轮轴长
  • D:后轮距离车尾的距离

从几何关系可知,后轮轴心的运动轨迹可以描述为以半径Lcot(φ)的圆周运动。两个后轮的轨迹分别为Lcot(φ)-W/2Lcot(φ)+W/2的圆。从等式可以看到,当φ接近0度时候行进轨迹近似直线,接近90度时半径呈缩小趋势,符合我们日常经验值。

坐标转换

我们都知道单位圆的几何方程为:
X 2 + Y 2 = R 2 ( R 为 圆 半 径 ) X^{2}+Y^{2} =R^{2}(R为圆半径) X2+Y2=R2R
那么在这里我们的后轮画出的圆的轨迹方程为:(以外侧轮为例)
X 2 + Y 2 = ( L c o t ( φ ) − w 2 ) 2 X^{2}+Y^{2}=(Lcot(φ)-\frac{w}{2})^{2} X2+Y2=(Lcot(φ)2w)2
注意:上面的方程建立在以后轮轨迹圆心为坐标原点的,所以我们需要将坐标原点建立在摄像头所在位置,如上图1所示,此时我们的方程就变为:

( X + L c o t ( φ ) ) 2 + ( Y + D ) 2 = ( L c o t ( φ ) + w 2 ) 2 ① (X+Lcot(φ))^{2}+(Y+D)^{2}=(Lcot(φ)+\frac{w}{2})^{2} ① X+Lcot(φ)2+Y+D2=(Lcot(φ)+2w)2

同理:我们的内侧后轮轨迹方程为:

( X + L c o t ( φ ) ) 2 + ( Y + D ) 2 = ( L c o t ( φ ) − w 2 ) 2 ② (X+Lcot(φ))^{2}+(Y+D)^{2}=(Lcot(φ)-\frac{w}{2})^{2}② X+Lcot(φ)2+Y+D2=(Lcot(φ)2w)2
但是,从实际出发。从车尾摄像头看车尾部的景象是有角度的。我们还需要对其进行角度的转化

角度转换

上面我们推算出的轨迹是俯瞰的结果,但是驾车人员看屏幕中从摄像头上传的倒车景象是带有角度(并不是俯瞰)。我们现在通过数学模型简化一下视图来源的流程:这里如果摄像头相对于屏幕为一个点,会造成实际计算结果的一定偏差。关于偏差的细节数学计算不属本文讨论的重点
先声明要使用的参数:

  • 2α: camera的张角的二分之一( 假设camera的张角为2α)
  • h: 摄像头距离地面
  • β:摄像头中心线同水平面的夹角
  • H: 输出屏幕的高度
  • W: 输出屏幕的宽度

我们实际观察到的Yr为地面y在显示屏H上的投影,y方向的转换过程如图二: 坐标转换
上图简化camera图像采集和显示到屏幕的过程:现在完全可以理解为显示屏上的景象是实际远处景象在中间的投影。
上图中的虚线为水平线,点线为屏幕的中心点到摄像头的连线,β为中心线和水平线的夹角
将上图进行简化可转为下列数学问题,等腰三角形中同顶点成已知角度所相应的边长,简化后的计算如图三。在这里插入图片描述
通过正弦定理、几何运算可得:(这里原博客把下面③④式子中的*写成x,现改正过来)
Y r = sin ⁡ θ 1 sin ⁡ ( θ 1 + θ 2 ) ∗ H 2 sin ⁡ α ③ Yr = \frac{\sin\theta _{1}}{\sin(\theta _{1}+\theta _{2})}*\frac{H}{2\sin\alpha } ③ Yr=sin(θ1+θ2)sinθ12sinαH
其中 θ 1 = α + β − θ \theta _{1} =\alpha+\beta -\theta θ1=α+βθ
θ 2 = 9 0 o − α \theta_{2} =90^o-\alpha θ2=90oα
代入③式可得:

Y r = sin ⁡ ( α + β − arctan ⁡ ( h y ) ) cos ⁡ ( β − arctan ⁡ ( h y ) ) ∗ H 2 sin ⁡ α ④ Yr = \frac{\sin(\alpha+\beta-\arctan (\frac{h}{y}))}{\cos( \beta-\arctan (\frac{h}{y}) )}* \frac{H}{2\sin\alpha } ④ Yr=cos(βarctan(yh))sin(α+βarctan(yh))2sinαH

sh上面等式要求满足以下条件:表现为对车尾局部区域不可见,即盲区如下图
y > h ∗ c o t ( α + β ) y> h*cot(α+β) y>hcot(α+β)
盲区
从上面公式可以看出来,当β越小,当β = 0;y趋向无穷远,上面等式约等于Yr = H/2;即最远距离图像在频幕上的显示高度不会超过屏幕高度一半;现在从实际出发,倒车时对camera可视距离的需求只是车尾3-5米,所以β 的角度一定存在,并且不会太小。

Xr对应屏幕宽度方向上的位置:(这里原博客求Xr时误差太大,已改经进)

在求Xr时,我们可以想像camera是可以转动的:

  • 当camera垂直地面时
    camera垂直
    根据上图建立的模型,我们可以计算出当camera垂直面向地面时的影像关系为:
    X r = x h tan ⁡ α ∗ W 2 ⑤ ( x 为 地 面 X 方 向 距 离 ) Xr =\frac{x}{h\tan \alpha} *\frac{W}{2} ⑤(x为地面X方向距离) Xr=htanαx2WxX

  • 当camera向上稍微转动,如上图二所示:即camera面向车尾后下方(具体车型安装角度不一):(这个图就不画了,根据已有的图发散想象一下)
    此时⑤式就不能满足;但是我们仍然可以从中发现规律,现在参考(camera垂直图)当camera角度转动后,w/2不变,α也不变,x在计算中是变量,只有h在变,并且h->h`是可以找到具体量化的关系的
    h 2 + y 2 = ( h ′ ) 2 ( y 为 地 面 Y 方 向 距 离 ) h^{2}+y^{2} =(h^{'})^{2} (y为地面Y方向距离) h2+y2=h2yY
    所以:
    X r = x h ′ tan ⁡ α ∗ W 2 Xr =\frac{x}{h^{'}\tan \alpha} *\frac{W}{2} Xr=htanαx2W
    最后得:

X r = x h 2 + y 2 tan ⁡ α ∗ W 2 ⑥ Xr =\frac{x}{\sqrt{h^{2}+y^{2}}\tan \alpha} *\frac{W}{2} ⑥ Xr=h2+y2 tanαx2W

计算轨迹的条件

从以上计算我们可以看到,需要计算出轨迹,必须提供以下参数:

1 摄像头的可视角范围2α

2 摄像头距离地面距离h

3摄像头中心线同水平面的夹角β

4输出屏幕的高度H和宽度W

5 汽车前后轮轴距L

6 汽车轴长w,后轮距离车尾的距离D

7前轮同水平方向的夹角φ

以上参数中除转角φ外对于固定的车型和安装方式都已经固定,转角φ的获取可以有两种方式:1 对于有方向盘角度信息的车型可以直接通过输出接口如can总线获取。2外加角度传感器获取角度信息。两种方式都需要对采集的信息作一定的校正。

下面是我自己在Android上验证结果:

注意
因为测试时众多参数都是我自己未经证实就设定的,导致整体看倒车轨迹线变化幅度有点浮夸(还未叠加倒车录像),轨迹线远小近大,符合生活经验,误差未具体计算,不过可以证实这个思路是正确的。

参考博客:https://blog.csdn.net/shuaiff/article/details/5411280
参考资料:[1] 张永亮 智能可视倒车系统 武汉科技大学硕士学位论文3.1倒车轨迹数学模型

demo源码GitHub地址,方便的话给个star,给blog点个赞,给我支持.希望我的blog可以给你提供点开发思路.

  • 30
    点赞
  • 112
    收藏
    觉得还不错? 一键收藏
  • 19
    评论
在使用Okhttp进行文件上传时,需要注意设置请求头的Content-Type为multipart/form-data。这是因为在文件上传时,需要将文件数据以多部分的形式进行传输。\[1\]你可以使用Okhttp3库来实现这个功能。首先,你需要引入Okhttp3的jar包,可以通过在pom.xml文件中添加以下依赖来引入Okhttp3库: ```xml <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.0.0</version> </dependency> ``` 接下来,你可以使用Okhttp3的RequestBody类来创建一个请求体,然后将文件数据添加到请求体中。在创建RequestBody时,你需要指定Content-Type为multipart/form-data。这样后台才能正确解析请求并接收到数据。\[2\]如果你在设置请求头的Content-Type后仍然无法成功上传文件,可能是因为你没有正确设置RequestBody的Content-Type。你可以尝试在创建RequestBody时设置Content-Type为multipart/form-data,这样可以确保请求体的Content-Type与请求头中的Content-Type一致,从而解决上传文件的问题。\[3\] #### 引用[.reference_title] - *1* *3* [通过Okhttp3 post方式上传文件 Content-Type=multipart/form-data](https://blog.csdn.net/qq_15327175/article/details/130533804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [SpringBoot2.1.x,okhttp3网络请求之MultipartFile方式上传文件,multipart/form-data表单多文件+多参数](https://blog.csdn.net/p812438109/article/details/107943319)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值