文章目录

  • 前言
  • 直角坐标系表达
  • python代码实现
  • 总结
  • 应用

前言

Clothoid曲线是一种曲率随着弧长线性变化的曲线。在直线段与其它曲线轨迹过渡的阶段采用这类曲线可以起到平滑曲率的作用。在车辆行驶轨迹设计中,如果使用这类曲线,可以减少曲率突变对转向控制的要求,降低控制难度,改善控制效果。这篇文章主要用于工程应用,而非理论推导

直角坐标系表达

Clothoid曲线的数学表达式如下,其中a为常数,l为曲线长度, k为曲率;

如果将曲线上k=0的点作为原定建立直角坐标系(简称为“标准坐标系”),a>0时候的图像为:

进一步,求解微分方程可以得到clothoid曲线上所有点的坐标:


注意这里的前提假设就是原点位于曲率为0的地方,即x0=0, y0=0, s0=0, k0=0,并且这是一个无穷级数。但是,在平时的应用中,不可能每次都从曲率为0的地方开始,比如要连接两段圆弧曲线的时候,曲率就是从一个非零曲率到另一个非零曲率(中间曲率不一定过渡到0)。这时候,上面这个表达式就有限制。然而,如果直角坐标系原点不建立在曲率为零(简称为非标准坐标系)的地方,直接去推导直角坐标公式对于非数学专业的人来说估计很难,涉及复变函数积分。这里提供一种思路:将标准坐标系中的一段曲线截断(红色部分),然后在截断的起点处建立一个非标准坐标系,将截断部分曲线在标准坐标系中的坐标通过坐标转换到非标准坐标系里面。

其中,角度alpha为标准坐标系clothoid曲线上点的航向角。曲率原始定义为曲线上某点切线方向随弧长的变化率

结合上面Clothoid曲线曲率与弧长的关系,很容易计算出标准坐标系中任意一点的航向角。知道航线角以后,就知道非标准坐标系xoy和标准坐标系XOY的坐标转换矩阵:

则两个坐标系坐标的转换关系为:

Xo和Yo为非标准坐标系xoy原点o在XOY坐标系中的坐标,则反过来,XOY中的红色曲线段的坐标映射到xoy坐标系中为:

按照上述思路,要想得到一条非标准坐标系中的cothoid曲线,只需要给定一个初始点曲率,一个终止点曲率和该曲线的长度即可。首先,按照标准坐标系计算处该段曲线上所有点的坐标,然后在变换得到非标准坐标系下的坐标。

但在实际应用中,发现上述思路还存在一定的约束,即给定初始曲率和终止曲率后,曲线的长度并不是给定任意值就可以的:
1、首先, 上面计算标准坐标系下曲线的点坐标采用的是无穷计算展开进行计算,在实际的计算机上面是不可能实现的,因此就必须近似求解,也就是对上面的迭代次数n选取,n太大计算太慢,太小精度不够
2、观察这个无穷技术,其中最高阶次项为弧长l的4n+3次方,对于python来说,最大的浮点数阶次为300左右,因此有:

3、另外,将k=al带入级数当中的y坐标得到:

进一步化简可得:

可以发现,对于计算机计算而言,当n给定以后,要想让上述的级数在有限的迭代次数内收敛较好的一个必要不充分条件(能收敛一定要小于1,但小于1不一定收敛):

进一步,将上述结论强化,拆分分别得到两个约束条件:

则:


这里k0和kt分别为截取的曲线起点和终点的曲率。注意,上面是通过坐标y推出的约束条件, 用x坐标推导得到:


因为2n阶乘的(1/2n)次方为递增函数,最终弧长的约束为:


所以,截取的曲线的允许的最大长度为:

python代码实现

计算非标准坐标系下的坐标点

def clothoid(curveStart, curveEnd, curveLength, distance):#curveLength为截取曲线的长度,distance为相对于截取段起始点s0处的距离,给定一个distance就返回该distance处的XY坐标A = (curveEnd - curveStart) / curveLengths0 = curveStart / AX0, Y0 = clothoidcooridnate(A, s0)heading0 = A / 2 * s0 ** 2transferMatrix = np.linalg.inv(transfercoordinate(heading0))X, Y = clothoidcooridnate(A, distance + s0)local = np.dot(transferMatrix, np.array([[X], [Y]]) - np.array([[X0], [Y0]]))x = local[0, 0]y = local[1, 0]heading = A / 2 * distance ** 2 + curveStart * distancereturn x, y, heading, math.cos(heading), math.sin(heading)

计算标准坐标系下的坐标点

def clothoidcooridnate(A: float, distance: float):x = 0.0y = 0.0for n in range(30):x += math.pow(-1, n) * math.pow(A, 2 * n) * math.pow(distance, 4 * n + 1) / \(math.factorial(2 * n) * (4 * n + 1) * math.pow(2, 2 * n))y += math.pow(-1, n) * math.pow(A, 2 * n + 1) * math.pow(distance, 4 * n + 3) / \(math.factorial(2 * n + 1) * (4 * n + 3) * math.pow(2, 2 * n + 1))return x, y

坐标转换矩阵

def transfercoordinate(heading: float = 0.0) -> np.ndarray:return np.array([[math.cos(heading), -math.sin(heading)],[math.sin(heading), math.cos(heading)]])

主程序

if __name__=="__main__":curStart = 0.4#截取曲线起点曲率curEnd = 0.5##截取曲线终点曲率n = 30#设置的迭代步长30l2 = 4*n + 1l3= math.pow(10, 300/(4*n+1))lk0 = min(2* math.pow(math.factorial(2*n), 1 / (2*n))/abs(curStart + 1e-5), l2, l3)lkt = min(2*math.pow(math.factorial(2*n), 1 / (2*n))/abs(curEnd + 1e-5), l2, l3)'''允许设置的曲线长度'''allowsCurveLength = abs(lk0+lkt) if curEnd*curStart<=0 else abs(lkt-lk0)print("The allowed curve length is {}".format(allowsCurveLength))'''实际设置的曲线长度'''curveLength = 15print("The given curve length is {}".format(curveLength))x = []y = []heading = []distance = np.linspace(0, curveLength, 1000)for i in distance:X, Y, Heading, W, D = clothoid(curStart, curEnd, curveLength, i)x.append(X)y.append(Y)heading.append(Heading)plt.plot(x, y)plt.show()


可以看到,当设置长度小于允许的最大长度时候,曲线是可以正常表达的。反正,当设置长度大于允许长的时候:

curveLength = 25


但是,设置曲线长度为20时:

curveLength = 20


虽然设置的长度小于允许的长度,但曲线还是发散了。这是因为,我们的推导结果是必要不充分条件,所以并不是小于允许值的所有长度都可以,这里在实际应用的时候应该注意,可以设置一个安全边界来避免。

将初始点曲率设置为-0.4:

curStart = -0.4
curveLength = 160

同样,将长度设置为220,曲线发散

    curveLength = 220

总结

本文介绍了一种通过计算机在直角坐标系中绘制任意曲率的Clothoid曲线的方法。通过给定期望曲线的初始曲率、终止曲率、迭代步长、计算机能表示的最大浮点数位数,可以计算得到一个允许的曲线长度;当给定的期望曲线的长度大于该允许长度时候,该曲线将会发散,无法生成;当给定长度小于允许的曲线长度的时候,此时不一定能生成合理的曲线,但这个允许长度给出了一个参考,可以采用二分法来尝试。

追加:在后续使用中发现,l2,l3在n取值30的时候,通常都有l2和l3都小于lk,导致曲线允许的长度为0。这时候,可以去掉l2和l3,直接以lk作为判断曲线长度的条件。

l2 = 4*n + 1
l3= math.pow(10, 300/(4*n+1))
lk0 = min(2* math.pow(math.factorial(2*n), 1 / (2*n))/abs(curStart + 1e-5), l2, l3)
lkt = min(2*math.pow(math.factorial(2*n), 1 / (2*n))/abs(curEnd + 1e-5), l2, l3)

应用

Clothoid曲线在ADAS测试方面的应用以及Matlab源代码

[Python|Clothoid]Clothoid曲线(回旋曲线)与直角坐标求解的python实现相关推荐

  1. python生成数独_数独生成与求解,Python实现

    2.[文件] Generate.py ~ 3KB 下载(44) #!/usr/bin/env python # -*- coding: utf-8 -*- # written by Kurt Wang ...

  2. 机器学习之支持向量机SVM之python实现ROC曲线绘制(二分类和多分类)

    目录 一.ROC曲线 二.TP.FP.TN.FN 三. python绘制ROC曲线(二分类) 1.思路 2.关键代码 3.完整代码 四. python绘制ROC曲线(多分类) 五.参考文献 一.ROC ...

  3. Python+Matplotlib绘制曲线并实现鼠标跟随的放大镜

    开学第一课:一定不要这样问老师Python问题 董付国老师Python系列教材推荐与选用参考 3000道Python习题免费在线练习 ============= 推荐教材: <Python数据分 ...

  4. python 画pr曲线

    roc曲线: python 画roc曲线_jacke121的专栏-CSDN博客 import _pickle as cPickle import matplotlib.pyplot as pltxxx ...

  5. python画函数曲线-python画蝴蝶曲线图的实例

    蝴蝶曲线是由Temple H・Fay发现的可用极坐标函数表示的蝴蝶曲线. 由于此曲线优美, 因此就想把它作为博客favicon.ico,这里我使用pytho matplotlib.pyplot包来绘制 ...

  6. python画曲线-python绘制动态曲线教程

    从txt种获取数据 并且通过动态曲线显示 import numpy as np import matplotlib.pyplot as plt import matplotlib.animation ...

  7. Python绘制简单函数曲线(包括坐标范围限制、刻度指定)

    python绘制简单函数曲线,包括坐标范围限制.刻度指定 ################### 二维曲线图 ################## import numpy as np import ...

  8. python 曲线分析_大数据分析之Python计算KS值并绘制KS曲线

    本篇教程探讨了大数据分析之Python计算KS值并绘制KS曲线,希望阅读本篇文章以后大家有所收获,帮助大家对相关内容的理解更加深入. python实现KS曲线,相关使用方法请参考上篇博客-R语言实现K ...

  9. python画PR曲线(precision-recall曲线)

    使用python画precision-recall曲线的代码是: sklearn.metrics.precision_recall_curve(y_true, probas_pred, pos_lab ...

最新文章

  1. RxJava 源码解析之观察者模式
  2. php与ajax技术
  3. ssl charles 参数看不到_SSL证书=安全?小心,别错漏了TA……
  4. 大连公交客运集团认真安排做好2007年防台防汛准备工作
  5. QDoc关联事物Relating Things
  6. Java:数值-字符串转换(String转Double)
  7. HBase 数据迁移
  8. 测试自己幸运数字的软件,心理测试:选一个你的幸运数字,测一下你最近会有什么好事发生?...
  9. 定期定量采购_采购的四种方法
  10. JS 浏览器差异(IE和FF)
  11. http各类攻击及tcpcopy工具
  12. python的pandas行数和索引_python – 使用索引值访问Pandas Data Frame行
  13. 2022年全国职业院校技能大赛网络安全竞赛试题 A-1样题
  14. 方舟服务器怎么去地牢拿芯片,方舟生存进化怎么拿芯片
  15. windows开机老显示请选择要启动的操作系统
  16. 《全基因组测序WGS数据分析——2.FASTA和FASTQ》学习笔记
  17. 【收藏】亲测奥维互动地图如何导入2023谷歌地图
  18. word或excel图片没有另存为怎么办
  19. 洛谷P1458 [USACO2.1]顺序的分数 Ordered Fractions
  20. JDBC学习笔记(1)---B站尚硅谷宋红康

热门文章

  1. Codeforces1063 C. Dwarves, Hats and Extrasensory Abilities(交互,二分)
  2. Python基础练习题--第一章 Python语言入门
  3. R语言 提取数据中的任意子集
  4. python爬虫(6)——Selenium的使用
  5. linux配置编译指定库,Linux——dropbear编译安装
  6. 基于STM32开发的CO2浓度、温湿度、气压监测系统
  7. 雷观(五):认准的事情,要做就做到极致
  8. 初三计算机word 操作题,信息技术中考word操作题.doc
  9. hdu 4210 Su-domino-ku
  10. 计算机网络(IP/TCP/HTTP)