回旋曲线的定义

回旋曲线是缓和曲线的一种,而缓和曲线的线型多种多样,如回旋线、三次抛物线、七次四项式型、半波正弦型、一波正弦型、双纽线、多心复曲线……,公路中推荐使用的是回旋曲线,因为回旋曲线的曲率变化率是定值,故在遇到直线驶入圆弧或者圆弧驶入直线的场景下,方向盘转角匀速变化,符合人类驾驶习惯且行驶较为顺滑。
回旋曲线也叫羊角螺线(clothoid),本质特点是:曲率与长度成线性关系

                                                              dk/ds = c(常数)其中,k是曲率,s是回旋曲线的长度,c是曲率的变化率。

回旋曲线的坐标计算公式(重点,代码实现的公式来源)

最核心的公式的前提假设:

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

满足上述前提假设的前提下,回旋曲线上任意一点坐标以及切线角度的计算公式如下:


其中, =,即回旋曲线上任一点(xk,yk)处切线的角度。

工程应用中的处理方式

在实际工程应用中,进行2处的简化处理:
1,级数和累加次数N一般取50,100次,根据精度需要进行取值近似。
2,将Sk进行离散化处理
通过上述简化,即可求得回旋曲线的全部轨迹点。

实例:已知两点坐标,曲率以及角度,求对应的回旋曲线。(泊车场景,用于平滑直线和圆弧,曲线的曲率连续)

一,根据约束条件求解回旋曲线

起始和结束两端点的约束为:
1,坐标:起点为(x1,y1) = (0,0),终点为(x2,y2)=(10,5),
2,曲率:起点的曲率为0,终点的曲率为R = 4.0,
3,方向角度:起点为0(0度方向),终点为pi/2(90度方向)

根据上述约束条件2和3,结合上述任一点的切线角度公式(11),可确定唯一的回旋曲线长度S(S = 2Rpi/2 )。回旋曲线的S一旦确定,根据起始和终点的曲率,即可算出C,则回旋曲线被唯一确定,如下图所示

二,产生的问题及工程解决办法:

产生的问题:
由上述约束条件2和3可唯一地确定回旋曲线,但如上图所示,回旋曲线的终点坐标不是(x2,y2)=(10,5),而是(9.7,5.2),即满足约束条件2和3,且起点坐标一定时,无法再约束终点的坐标,终点的坐标根据上述回旋曲线的坐标公式(9)、(10)计算得到。但泊车场景下必须约束终点坐标,即终点坐标是固定唯一确定下来的,故直接用上述的回旋曲线无法满足要求,必须进行近似优化才能在工程中使用。
解决办法:(重点)
将上述求解出的回旋曲线的坐标横纵向进行缩放,保证起点和终点的坐标是预期设定的起点和终点坐标,即起点为(x1,y1) = (0,0),终点为(x2,y2)=(10,5)。

源码下载链接:https://download.csdn.net/download/ChenGuiGan/81749994?spm=1001.2014.3001.5503

Clothoid回旋曲线在APA路径优化中的工程应用实例及其C++源码分析与下载相关推荐

  1. Linux中mknod命令实现原理以及源码分析

    本篇文章以mknod创建字符设备文件进行讲解 字符设备驱动的Demo例子可参考该篇文章 Linux 编写简单驱动并测试 1. mknod 命令 mknod /dev/hello c 520 0 该命令 ...

  2. java中的==、equals()、hashCode()源码分析(转载)

    在java编程或者面试中经常会遇到 == .equals()的比较.自己看了看源码,结合实际的编程总结一下. 1. ==  java中的==是比较两个对象在JVM中的地址.比较好理解.看下面的代码: ...

  3. Android研发中对String的思考(源码分析)

    1.常用创建方式思考: String text = "this is a test text "; 上面这一句话实际上是执行了三件事  1.声明变量 String text; 2. ...

  4. LinkedList中查询(contains)和删除(remove)源码分析

    一.contains源码分析 本文分析双向链表LinkedList的查询操作源码实现.jdk中源程序中,LinkedList的查询操作,通过contains(Object o)函数实现.具体见下面两部 ...

  5. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析]

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  6. 详解SpringMVC中Controller的方法中参数的工作原理[附带源码分析] good

    目录 前言 现象 源码分析 HandlerMethodArgumentResolver与HandlerMethodReturnValueHandler接口介绍 HandlerMethodArgumen ...

  7. 线程中task取消_Rust Async: async-task源码分析

    async-std是rust异步生态中的基础运行时库之一,核心理念是合理的性能 + 用户友好的api体验.经过几个月密集的开发,前些天已经发布1.0稳定版本.因此是时候来一次深入的底层源码分析.asy ...

  8. Java并发包中Semaphore的工作原理、源码分析及使用示例

    简介: 在多线程程序设计中有三个同步工具需要我们掌握,分别是Semaphore(信号量),countDownLatch(倒计数门闸锁),CyclicBarrier(可重用栅栏) 欢迎探讨,如有错误敬请 ...

  9. 集合的get方法中参数从多少开始_源码分析CopyOnWriteArrayList 中的隐藏知识,你Get了吗?...

    欢迎点击 "未读代码" ,关注公众号,文章每周更新 杭州-阿里园区墙 前言 本觉 CopyOnWriteArrayList 过于简单,寻思看名字就能知道内部的实现逻辑,所以没有写这 ...

最新文章

  1. BERT可视化工具bertviz体验
  2. IDEA加密文件Base64转换String传输以及报文摘要MD5防止恶意篡改
  3. 计算机维护方面的知识和技巧,电脑硬件维护常识和方法【图文详解】
  4. javascript 运算+
  5. where to find fundings as an MPhil student?
  6. '$.browser.msie' 为空或不是对象
  7. 简单地利用canvas载入视频
  8. 【转】C#中StreamWriter与BinaryWriter的区别兼谈编码。
  9. Android官方教程翻译(2)——运行第一个程序
  10. 反应测试_SUPERCRC 微反应量热仪DARC差分加速量热仪 PT-DSC压力跟踪差示扫描量热仪...
  11. 计算机查找dll文件,怎么查看进程正在调用哪些DLL文件
  12. unity识别图片颜色并把颜色数量排序
  13. 为什么要学习Go语言?
  14. 通用评估神经网络鲁棒性方法—CLEVER
  15. 使用CMD隐藏文件夹
  16. 通俗解释什么是NFT,NFT到底是什么
  17. Bitwise Operation
  18. echarts+vue中国地图,点击进入省级地图
  19. Android 版本 相关参数修改(SpreadTrum)
  20. java months between,java 8-chronounit.months.between(fromdate,todate)不能按预期工作

热门文章

  1. formData上传文件(传参附带其他参数)
  2. java从json数组中提取数据,从JSON数组中提取数据
  3. Windows搭建SMB服务
  4. 原神私服 grasscutter搭建及食用教程 v3.3
  5. 数据结构之链表 - 动图演示
  6. android dy 完结篇(0x3)
  7. 更新mysql表结构,同步数据库表结构
  8. 女生要不要去北航学计算机,在北航读书有个女朋友是种怎样的体验?
  9. 2014-2022年4月全国空气质量数据分析
  10. 基于SVM的数据分类预测——意大利葡萄酒种类识别