ORCA避障源码笔记
参考资料
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,
final double dotProduct1 = w.dotProduct(relativePosition);
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
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,
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的方向
RVOMath.det(lines.get(i).direction, lines.get(i).point.subtract(newVelocity)) > distance
这段代码用来判断是否需要修正速度,如果修正后的速度与当前line的距离大于前一个line的距离大,那么需要修正。
因为修正后速度将在角平分线上,一定距离当前line更近
ORCA避障源码笔记的更多相关文章
- Zepto源码笔记(一)
最近在研究Zepto的源码,这是第一篇分析,欢迎大家继续关注,第一次写源码笔记,希望大家多指点指点,第一篇文章由于首次分析原因不会有太多干货,希望后面的文章能成为各位大大心目中的干货. Zepto是一 ...
- redis源码笔记(一) —— 从redis的启动到command的分发
本作品采用知识共享署名 4.0 国际许可协议进行许可.转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/redis1 本博客同步在http://www.cnblog ...
- AsyncTask源码笔记
AsyncTask源码笔记 AsyncTask在注释中建议只用来做短时间的异步操作,也就是只有几秒的操作:如果是长时间的操作,建议还是使用java.util.concurrent包中的工具类,例如Ex ...
- Java Arrays 源码 笔记
Arrays.java是Java中用来操作数组的类.使用这个工具类可以减少平常很多的工作量.了解其实现,可以避免一些错误的用法. 它提供的操作包括: 排序 sort 查找 binarySearch() ...
- Tomcat8源码笔记(八)明白Tomcat怎么部署webapps下项目
以前没想过这么个问题:Tomcat怎么处理webapps下项目,并且我访问浏览器ip: port/项目名/请求路径,以SSM为例,Tomcat怎么就能将请求找到项目呢,项目还是个文件夹类型的? Tom ...
- Tomcat8源码笔记(七)组件启动Server Service Engine Host启动
一.Tomcat启动的入口 Tomcat初始化简单流程前面博客介绍了一遍,组件除了StandardHost都有博客,欢迎大家指文中错误.Tomcat启动类是Bootstrap,而启动容器启动入口位于 ...
- Tomcat8源码笔记(六)连接器Connector分析
根据 Tomcat8源码笔记(五)组件Container分析 前文分析,StandardService的初始化重心由 StandardEngine转移到了Connector的初始化,本篇记录下Conn ...
- Tomcat8源码笔记(五)组件Container分析
Tomcat8源码笔记(四)Server和Service初始化 介绍过Tomcat中Service的初始化 最先初始化就是Container,而Container初始化过程是咋样的? 说到Contai ...
- Tomcat8源码笔记(四)Server和Service初始化
上一章 简单说明下Tomcat各个组件: Server:服务器,Tomcat服务器,一个Tomcat只有一个Server组件; Service:业务层,是Server下最大的子容器,一个Server可 ...
- Tomcat8源码笔记(三)Catalina加载过程
之前介绍过 Catalina加载过程是Bootstrap的load调用的 Tomcat8源码笔记(二)Bootstrap启动 按照Catalina的load过程,大致如下: 接下来一步步分析加载过程 ...
随机推荐
- IIS Reverse Proxy 反向代理
前言 反向代理是这样的: 2 台 web server, A server, B server A server 是 public 的, 有 domain, 有 SSL (作为 B server 的代 ...
- 26.删除有序数组中的重复项 Golang实现
题目描述: 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度.元素的 相对顺序 应该保持 一致 .然后返回 nums 中唯 ...
- Python计算傅里叶变换
技术背景 傅里叶变换在几乎所有计算相关领域都有可能被使用到,例如通信领域的滤波.材料领域的晶格倒易空间计算还有分子动力学中的倒易力场能量项等等.最简单的例子来说,计算周期性盒子的电势能\(k\sum_ ...
- 技术分享 | 徐轶韬:从MySQL5.7升级到MySQL 8.0
在6月20日举办的[墨天轮数据库沙龙-MySQL 5.7 停服影响与应对方案]中,甲骨文MySQL解决方案首席工程师徐轶韬分享了<从MySQL5.7升级到MySQL 8.0>主题演讲,本文 ...
- 前端 vue.config.js 处理跨域问题 proxy 代理
问: 业务中的跨域问题是如何解决的? 这个的话我们公司⼤概分了俩种环境,⼀种是开发的时候,⼀种是上⽣产的时候,开发的时候因为要对 接的后端可能会⽐较多,他们配置不太⽅便,这个时候采取的是⽐较⽅便的前端 ...
- 小程序的image组件
mode属性:用来制定图片的裁剪和缩放模式:常用属性如下:
- 云原生周刊:Harbor v2.11 版本发布 | 2024.6.17
开源项目推荐 Descheduler Descheduler 是一个工具,可用于优化 Kubernetes 集群中 Pod 的部署位置.它可以找到可以移动的 Pod,并将其驱逐,让默认调度器将它们重新 ...
- ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇
作者:运维有术 前言 知识点 定级:入门级 KubeKey 安装部署 ARM 版 KubeSphere 和 Kubernetes ARM 版 KubeSphere 和 Kubernetes 常见问题 ...
- 这些HTTP协议状态码你知道吗?
使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务不可用 1x ...
- 常见Linux查看文件、文本命令
查看文件 find命令 按文件名 find 路径 -nmae "文件名" 按文件类型 find 路径 -type 类型 类型:普通文件 f 目录d 符号链接l 块设备文件b 字 ...