参考资料

https://gamma.cs.unc.edu/ORCA/publications/ORCA.pdf

https://gamma.cs.unc.edu/RVO2/

数学知识

1.向量的点乘 dotProduct,计算方法:1.   2.

作用:点积如果为负,则a,b形成的角为钝角;如果为零,那么a,b垂直;如果为正,那么a,b形成的角为锐角

2.向量a,向量b,det(a,b)表示行列式的值,计算方法x1y2 - x2y1,同时也是叉乘的值

作用:1.以两个向量为邻边的平行四边形的有向面积,2.小于0表示b在a的顺时针方向,大于0表示b在a逆时针方向,等于0表示a,b平行

下图是碰撞需要修正,并且保证最短修正的两种情况,

1) 将速度修正到切线上

2) 将速度修正到圆

1,

  1. final double dotProduct1 = w.dotProduct(relativePosition);
  1. dotProduct1 < 0.0 && dotProduct1 * dotProduct1 > combinedRadiusSq * wLengthSq

这个代码是为了判断当前是哪种情况,

向量w = 相对速度 - 相对位置

dotProduct1小于0,表示向量w与相对位置的夹角为钝角,即AE与AO的角为锐角(需要先判断这个,只有锐角范围内cos单调递减)

dotProduct1 * dotProduct1 > combinedRadiusSq * wLengthSq,角OAE小于角OAD

推导:

cos在0-90单调递减

角OAE < 角OAD

=> cosOAE > cosOAD

=> OA*cosOAE > OA*cosOAD  (同时乘以OA)

=> OA*cosOAE > AD (OA*cosOAD = AD)

=> OA * AE * cosOAE > AE * AD (同时乘以AE)

=> dotProduct1 * dotProduct1 > combinedRadiusSq * wLengthSq

2

  1. direction = new Vector2D(relativePosition.getX() * leg - relativePosition.getY() * combinedRadius, relativePosition.getX() * combinedRadius + relativePosition.getY() * leg)

这段代码为了计算第一情况,修正速度的落点,

leg为OD的长度,假设direction为line的方向,即向量OD的单位向量DIR(a, b)顺时针的单位向量DIE (b, -a),A的坐标(x, y)

向量OA 点乘 向量DIR = 向量OA的长度 * 1 * cosAOD

=> x*a + y*b = leg

向量OA 点乘 向量DIE = 向量OA的长度 * 1 * cosOAD

=>x*b - y*a = combinedRadius

结合这两个式子就可以解a,b,

  1. RVOMath.det(relativePosition, w) > 0.0

这个在判断修正方向是在相对位置的左边还是右边

3

速度的可选区域为line方向的左侧, linearProgram2 找到可行域的交集,即line的交集

3.1

RVOMath.det(lines.get(lineNo).direction, lines.get(lineNo).point.subtract(newVelocity)) > 0.0

大于0说明newVelocity在line的右侧,不在line的可行域内,需要重新计算速度

3.2

如图,绿色为line i, 黑色为line no

final double denominator = RVOMath.det(lines.get(lineNo).direction, lines.get(i).direction);
final double numerator = RVOMath.det(lines.get(i).direction, lines.get(lineNo).point.subtract(lines.get(i).point));
final double t = numerator / denominator;

denominator为BCED的面积 = 2个DBC的面积 = 2 * 1/2 * BP2 * 高

numerator为PGFP2的面积 = 2个GPP2 的面积 = 2个DBP2的面积 = 2 * 1/2 * BC * 高

t = numerator / denominator = BP2 / BC = BP2

t 为line i 和 line no 的交点 到 line point 的距离

4

linearProgram3

如果找不到line的交集,则执行linearProgram3,从上次失败的line开始往后遍历

将line i 之前的line做一个修正,修正的方法是:(1)将point修正到交点,(2)将方向修正到角平分线,靠近i的方向

  1. RVOMath.det(lines.get(i).direction, lines.get(i).point.subtract(newVelocity)) > distance

这段代码用来判断是否需要修正速度,如果修正后的速度与当前line的距离大于前一个line的距离大,那么需要修正。

因为修正后速度将在角平分线上,一定距离当前line更近

ORCA避障源码笔记的更多相关文章

  1. Zepto源码笔记(一)

    最近在研究Zepto的源码,这是第一篇分析,欢迎大家继续关注,第一次写源码笔记,希望大家多指点指点,第一篇文章由于首次分析原因不会有太多干货,希望后面的文章能成为各位大大心目中的干货. Zepto是一 ...

  2. redis源码笔记(一) —— 从redis的启动到command的分发

    本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...

  3. AsyncTask源码笔记

    AsyncTask源码笔记 AsyncTask在注释中建议只用来做短时间的异步操作,也就是只有几秒的操作:如果是长时间的操作,建议还是使用java.util.concurrent包中的工具类,例如Ex ...

  4. Java Arrays 源码 笔记

    Arrays.java是Java中用来操作数组的类.使用这个工具类可以减少平常很多的工作量.了解其实现,可以避免一些错误的用法. 它提供的操作包括: 排序 sort 查找 binarySearch() ...

  5. Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目

    以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...

  6. Tomcat8源码笔记(七)组件启动Server Service Engine Host启动

    一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...

  7. Tomcat8源码笔记(六)连接器Connector分析

    根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...

  8. Tomcat8源码笔记(五)组件Container分析

    Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...

  9. Tomcat8源码笔记(四)Server和Service初始化

    上一章 简单说明下Tomcat各个组件: Server:服务器,Tomcat服务器,一个Tomcat只有一个Server组件; Service:业务层,是Server下最大的子容器,一个Server可 ...

  10. Tomcat8源码笔记(三)Catalina加载过程

    之前介绍过 Catalina加载过程是Bootstrap的load调用的  Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...

随机推荐

  1. C# – class, filed, property, const, readonly, get, set, init, required 使用基础

    前言 心血来潮,这篇讲点基础的东西. Field 比起 Property,Field 很不起眼,你若问 JavaScript,它甚至都没有 Field. 但在 C#,class 里头真正装 value ...

  2. OData – Get Started 搭建单侧环境

    前言 之前写过 EF Core – Get Started 搭建单侧环境, 这篇补上一个 WebApi + EF Core + OData 创建项目 dotnet new webapi -o EfCo ...

  3. CSS – z-index

    介绍 z-index 是用来设置 element 层次高低的 (当 element 重叠的时候) 参考: 4 reasons your z-index isn't working (and how t ...

  4. Google Analytics & Ads 学习笔记 2 (gtag 版本)

    gtag 是用来取代之前的 ga 的 但其实它底层就是调用 ga 而已. 只是封装了一个上层. 1. start up script <script async src="https: ...

  5. CSS – Flex

    前言 Flex 诞生在 Float 之后, Grid 之前, 它主要是取代 Float 来实现布局. 而它没有 cover 到的地方则由 Grid 弥补. 所以当前, 我们做布局时, 几乎不用 Flo ...

  6. 暑假集训CSP提高模拟 ∫[0,6] (x^2)/6 dx

    \[\text{暑假集训CSP提高模拟}\int^{6}_{0}\frac{x^{2}}{6}dx \] 关于这个东西怎么求的良心教程 含义:求出 \(f(x)=\frac{x^{2}}{6}\) 在 ...

  7. 修改Kubernetes主节点(控制节点)名称

    1.修改物理机主机名 hostnamectl set-hostname <hostname> 2.修改 /etc/kubernetes/manifests 目录下的文件,将文件内容包含旧主 ...

  8. [kubernetes]二进制方式部署单机k8s-v1.30.5

    前言 之前在单机测试k8s的kind最近故障了,虚拟机运行个几分钟后就宕机了,不知道是根因是什么,而且kind部署k8s不太好做一些个性化配置,干脆用二进制方式重新搭一个单机k8s. 因为是用来开发测 ...

  9. 搜广推算法校招面试:BOSS直聘 推荐搜索系统工程师

      本文介绍2024届秋招中,BOSS直聘的推荐/搜索系统工程师岗位一面的面试基本情况.提问问题等.   2023年12月,赶在秋招的末尾,投递了BOSS直聘的推荐/搜索系统工程师岗位,并不清楚所在的 ...

  10. Android USB 整条通知链分析

    以Android13 为例:在Android 13中,USB插入拔出事件的通知链从硬件层到应用层,依次经过硬件.内核.HAL.Framework.以及应用广播等多个模块,整个流程涉及的具体文件和逻辑如 ...