绘制clothoid曲线

  • clothoid介绍
  • 绘制clothoid曲线
    • 积分近似
    • 以直代曲
  • 注意事项

clothoid介绍

  clothoid曲线是一种曲率半径与长度成线性关系的曲线,由于其曲率平滑过渡,在路径规划中有所应用。在直角坐标系中,clothoid曲线的微分方程如式(1)所示。
dk=adl(1)dk=adl \tag1 dk=adl(1)

  式(1)中,kkk表示曲率,lll表示曲线长度,aaa表示系数,可以明显地看到clothoid曲线的曲率与曲线长度成线性关系。

绘制clothoid曲线

积分近似

  通过对式(1)进行处理得到clothoid曲线在直角坐标系的参数方程(具体推导过程略),如式(2)所示。
x=1a∫0τcos(t2)dty=1a∫0τsin(t2)dt(2)\begin{array}{l} x=\frac{1}{a} \int _0^ \tau cos(t^2)dt \\ y=\frac{1}{a} \int _0^ \tau sin(t^2)dt \tag2 \end{array} x=a1​∫0τ​cos(t2)dty=a1​∫0τ​sin(t2)dt​(2)

  方程(2)虽然形式简单,但是一个超越方程,当前没有精确解。通过使用python定积分模块近似求解方程(2),并绘制图片如下。计算时间有点长,耐心等待即可。

# -*- coding: utf-8 -*-
import numpy
import matplotlib.pyplot as plt
from sympy import *
import mathfig = plt.figure()
ax1 = fig.add_subplot(111)
#ax1.set_title('Fig')
plt.xlabel('x(m)')
plt.ylabel('y(m)')if __name__ == '__main__':pi = 3.14159265a = 0.5x_list = [0]y_list = [0]t = symbols('t')for i in range(500):theta = (i + 1) * 2 * 3.14159265 / 360x = a * integrate(cos(t * t), (t, 0, theta))y = a * integrate(sin(t * t), (t, 0, theta))x_list.append(x)y_list.append(y)print(i, x, y)plt.plot(x_list, y_list, '.')plt.show()

以直代曲

  使用python求解虽然可以获得非常高的求解精度,但计算速度慢,便考虑使用更简便的方式求解,这里用“以直代曲”的方式绘制clothoid曲线。迭代公式如式(3)所示。
rn=2/(2kn−1+adl)kn=kn−1+adlθn=θn−1+dl/rnxn=xn−1+dlcos(θn)yn=yn−1+dlsin(θn)(3)\begin{array}{l} r_n=2/(2k_{n-1}+adl) \\ k_n=k_{n-1}+adl \\ \theta _n=\theta _{n-1} +dl/r_n \\ x_n=x_{n-1} + dlcos(\theta_n) \\ y_n=y_{n-1} + dlsin(\theta_n) \tag3 \end{array} rn​=2/(2kn−1​+adl)kn​=kn−1​+adlθn​=θn−1​+dl/rn​xn​=xn−1​+dlcos(θn​)yn​=yn−1​+dlsin(θn​)​(3)

# -*- coding: utf-8 -*-
import numpy
import matplotlib.pyplot as plt
from sympy import *
import mathfig = plt.figure()
ax1 = fig.add_subplot(111)
#ax1.set_title('Fig')
plt.xlabel('x(m)')
plt.ylabel('y(m)')if __name__ == '__main__':dl = 0.01a = 2k0 = 0x = 0y = 0theta= 0x_list = [0]y_list = [0]for i in range(500):r = 2 / (2 * k0 + a * dl)k0 += a * dltheta += dl / rx += dl * cos(theta)y += dl * sin(theta)x_list.append(x)y_list.append(y)dl = 0.01a = 1k0 = 0x = 0y = 0theta= 0x_list2 = [0]y_list2 = [0]for i in range(500):r = 2 / (2 * k0 + a * dl)k0 += a * dltheta += dl / rx += dl * cos(theta)y += dl * sin(theta)x_list2.append(x)y_list2.append(y)plt.plot(x_list, y_list, '-')plt.plot(x_list2, y_list2, '-')plt.show()

注意事项

  1. 精度要求高,相对求解时间长;
  2. 可以使用数值积分的方式对式(2)进行求解,如高斯——勒让德求积公式精度高,求解速度快;
  3. “以直代曲”虽然计算速度快,最终会有不收敛的问题,可以调整步长进行缓解;

绘制clothoid曲线相关推荐

  1. [Python|Clothoid]Clothoid曲线(回旋曲线)与直角坐标求解的python实现

    文章目录 前言 直角坐标系表达 python代码实现 总结 应用 前言 Clothoid曲线是一种曲率随着弧长线性变化的曲线.在直线段与其它曲线轨迹过渡的阶段采用这类曲线可以起到平滑曲率的作用.在车辆 ...

  2. R语言构建logistic回归模型并评估模型:模型预测结果抽样、可视化模型分类预测的概率分布情况、使用WVPlots包绘制ROC曲线并计算AUC值

    R语言构建logistic回归模型并评估模型:模型预测结果抽样.可视化模型分类预测的概率分布情况.使用WVPlots包绘制ROC曲线并计算AUC值 目录

  3. R语言使用pROC包绘制ROC曲线、获取最优阈值(threshold)及最优阈值对应的置信区间

    R语言使用pROC包绘制ROC曲线并获取最佳阈值(threshold)及最佳阈值对应的置信区间 #ROC曲线 ROC(receiver operating characteristic curve)接 ...

  4. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)

    R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal.density.fitdistr.logcondens.logcondens.smooth) ...

  5. R语言使用pROC包绘制ROC曲线实战:roc函数计算AUC值、plot.roc函数绘制ROC曲线、添加置信区间、为回归模型中的每个因子绘制ROC曲线并在同一个图中显示出来

    R语言使用pROC包绘制ROC曲线实战:roc函数计算AUC值.plot.roc函数绘制ROC曲线.添加置信区间.为回归模型中的每个因子绘制ROC曲线并在同一个图中显示出来 目录

  6. R使用pROC和ggplot2包绘制ROC曲线

    R使用ggplot2包绘制ROC曲线 目录 R使用ggplot2包绘制ROC曲线 logistic回归模型构建 使用pROC包

  7. 使用R构建Xgboost模型并绘制ROC曲线

    使用R构建Xgboost模型并绘制ROC曲线 xgboost算法论文全称为<XGBoost: A Scalable Tree Boosting System>,由陈天奇于2016年发表的, ...

  8. 验证曲线( validation curve)是什么?如何绘制验证曲线( validation curve)?验证曲线( validation curve)详解及实践

    验证曲线( validation curve)是什么?如何绘制验证曲线( validation curve)?验证曲线( validation curve)详解及实践 验证曲线( validation ...

  9. 通过交叉验证(Cross Validation)KFold绘制ROC曲线并选出最优模型进行模型评估、测试、包含分类指标、校准曲线、混淆矩阵等

    通过交叉验证(Cross Validation,CV)KFold绘制ROC曲线并选出最优模型进行模型评估.测试.包含分类指标.校准曲线.混淆矩阵等 Cross Validation cross val ...

最新文章

  1. 奇奇怪怪的冒泡排序 TOJ 2014: Scramble Sort
  2. Redis 6.0 新特性-多线程连环13问!
  3. 标准日本语初级上第一单元 第一课[李さんは 中国人です]
  4. Android系统中的进程管理:内存的回收
  5. linux tcp 包大小,linux – 通过大量连接和小数据包流量高的千兆网络提高TCP性能...
  6. 如何选择RabbitMQ和Kafka
  7. 红帽急了:新年的 RHEL 将有低成本或免费版
  8. 2018北科大计算机学院复试方案,2018年北京交通大学考研复试及录取办法
  9. Bailian2980 大整数乘法【大数】
  10. 行列式(determinant)的物理意义及性质
  11. 数据结构堆栈 内存堆栈_了解堆栈数据结构
  12. java虚拟机内存_java虚拟机内存区域的划分以及作用详解
  13. 浏览器控制台Network面板简述
  14. Excel 2010 VBA 入门 043 按自定义序列进行排序
  15. 广工Libero SoC安装教程
  16. TheDAO悲剧重演,SpankChain重入漏洞分析
  17. python爬虫如何防止IP屏蔽
  18. Win11环境 jdk1.8安装及配置详细教程
  19. SQL server数据库实验(三)数据库的嵌套查询和集合查询
  20. educoder C++实战训练

热门文章

  1. html5 css3雪花效果,HTML5 | CSS3水晶皇冠雪花形状
  2. ECCV2020 | 即插即用,涨点明显!FPT:特征金字塔Transformer
  3. QuadricSLAM: 面向机器人的物体级语义SLAM系统
  4. 汇总|医学图像数据集
  5. antd Drawer 如何实现自动刷新
  6. Linux(CentOS 7_x64位)系统下安装RDkit
  7. 如何使用ggplot2绘制左右分布的柱状图
  8. 内核函数输出怎么看到_谈谈如何学习Linux内核
  9. Galaxy v-21.01 发布,新的流程和历史栏体验
  10. 绝望!导师只给我一周时间.......