ORCA-3D避障算法解析
二维ORCA原理参考:
https://zhuanlan.zhihu.com/p/669426124
ORCA原理图解
1. 找到避障速度增量 u
碰撞处理分为三种情况:
(1)没有发生碰撞,且相对速度落在小圆里
(2)没有发生碰撞,且相对速度落在圆锥里
(3)发生碰撞,马上做出反应
timeStep 决定了仿真每一步的时间更新间隔,是系统的时间推进基础。较小的 timeStep 可以提高仿真的精度,但会增加计算量。
timeHorizon 决定了智能体在进行避障计算时预测的时间范围。较大的 timeHorizon 值使得智能体可以更早预测潜在碰撞,但会减少它的速度选择自由度。
timeStep 是碰撞时需要计算的调整u所需的时间
timeHorizon 是未发生碰撞时,需要计算的u所化的时间,他是一种提前预测
2. 添加速度障碍平面
表示一个平面需要法向量和平面上的点
1和2对应代码如下
// 它使用ORCA(Optimal Reciprocal Collision Avoidance)方法来计算智能体之间的避碰行为void Agent::computeNewVelocity(){orcaPlanes_.clear(); // 清空ORCA平面列表const float invTimeHorizon = 1.0f / timeHorizon_; // 计算时间视野的倒数/* 创建智能体的ORCA平面 */for (size_t i = 0; i < agentNeighbors_.size(); ++i){ // 遍历每个邻居智能体const Agent *const other = agentNeighbors_[i].second; // 获取邻居智能体指针//这里的position_是在rvo->updateState添加的当前agent的位置// 改这块就好了===============================const Vector3 relativePosition = other->position_ - position_; // 计算相对位置const Vector3 relativeVelocity = velocity_ - other->velocity_; // 计算相对速度// const Vector3 relativePosition = relative_position_; // 计算相对位置// const Vector3 relativeVelocity = relative_velocity_; // 计算相对速度const float distSq = absSq(relativePosition); // 计算相对位置的平方距离const float combinedRadius = radius_ + other->radius_; // 计算合并半径const float combinedRadiusSq = sqr(combinedRadius); // 计算合并半径的平方Plane plane; // 定义一个平面对象Vector3 u; // 定义速度调整向量if (distSq > combinedRadiusSq){ // 如果没有发生碰撞// w表示给定时间视野TimeHorizon内,两个智能题之间的相对速度偏移量const Vector3 w = relativeVelocity - invTimeHorizon * relativePosition; // 计算从截断中心到相对速度的向量const float wLengthSq = absSq(w); // 计算w向量的平方长度const float dotProduct = w * relativePosition; // 计算w向量和相对位置的点积// 1. 如果投影在截断圆上// dotProduct表示相差的速度和相差的位置的点乘,要是点乘小于0,表示在靠近if (dotProduct < 0.0f && sqr(dotProduct) > combinedRadiusSq * wLengthSq){ const float wLength = std::sqrt(wLengthSq); // 计算w向量的长度const Vector3 unitW = w / wLength; // 计算w向量的单位向量plane.normal = unitW; // 设置平面的法向量u = (combinedRadius * invTimeHorizon - wLength) * unitW; // 计算速度调整向量}// 2. 如果投影在圆锥上else{ const float a = distSq; // 设置系数aconst float b = relativePosition * relativeVelocity; // 设置系数bconst float c = absSq(relativeVelocity) - absSq(cross(relativePosition, relativeVelocity)) / (distSq - combinedRadiusSq); // 设置系数c// t表示圆锥中心线到斜线的距离 对于 半径的倍数const float t = (b + std::sqrt(sqr(b) - a * c)) / a; // 计算t值const Vector3 w = relativeVelocity - t * relativePosition; // 计算w向量const float wLength = abs(w); // 计算w向量的长度const Vector3 unitW = w / wLength; // 计算w向量的单位向量plane.normal = unitW; // 设置平面的法向量u = (combinedRadius * t - wLength) * unitW; // 计算速度调整向量}}// 3. 如果发生碰撞else{ const float invTimeStep = 1.0f / sim_->timeStep_; // 计算时间步长的倒数const Vector3 w = relativeVelocity - invTimeStep * relativePosition; // 计算w向量const float wLength = abs(w); // 计算w向量的长度const Vector3 unitW = w / wLength; // 计算w向量的单位向量plane.normal = unitW; // 设置平面的法向量u = (combinedRadius * invTimeStep - wLength) * unitW; // 计算速度调整向量}// 有多少个neighbor,就有多少个orca平面plane.point = velocity_ + 0.5f * u; // 计算平面上的点orcaPlanes_.push_back(plane); // 将平面添加到ORCA平面列表中}const size_t planeFail = linearProgram3(orcaPlanes_, maxSpeed_, prefVelocity_, false, newVelocity_); // 计算新的速度,如果失败返回失败的平面索引if (planeFail < orcaPlanes_.size()){ // 如果存在失败的平面linearProgram4(orcaPlanes_, planeFail, maxSpeed_, newVelocity_); // 调用备用算法处理失败的平面}}
3. 线性规划求解出最优速度
linearProgram几个函数实现了一套线性规划(Linear Programming, LP)求解方法,目的是在有多个平面约束(即避障条件)的情况下找到最优的速度向量,以确保多个智能体不会发生碰撞。
linearProgram1()
:寻找线与圆形区域的交点
linearProgram2()
:解决单个平面约束的最优速度
linearProgram3()
:求解所有平面的初步速度
linearProgram4()
:处理多个平面之间的约束冲突
相关文章:

ORCA-3D避障算法解析
二维ORCA原理参考: https://zhuanlan.zhihu.com/p/669426124 ORCA原理图解 1. 找到避障速度增量 u 碰撞处理分为三种情况: (1)没有发生碰撞,且相对速度落在小圆里 (2)没有发生碰撞࿰…...

CentOS 7停更官方yum源无法使用,更换阿里源
CentOS 7官方源已经停止维护,导致无法使用yum更新软件。通过尝试使用阿里云、清华大学等第三方源解决,现以阿里云第三方源进行配置: 1、备份原有的yum源配置文件 # cp -a /etc/yum.repos.d /etc/yum.repos.d.bak 2、删除原有的yum源配置文…...

Introduction结构
写好论文的**Introduction(引言)**部分是至关重要的,因为它为读者提供了背景信息,并引导他们进入论文的核心主题。一个优秀的引言应该具备以下几个关键要素: 1. 背景介绍 概述问题:首先,你需要…...

基于SpringBoot实现SpringMvc上传下载功能实现
SpringMvc上传下载功能实现 1.创建新的项目 1)项目信息填写 Spring Initializr (单击选中)Name(填写项目名字)Language(选择开发语言)Type(选择工具Maven)Group()JDK(jdk选择17 &…...

vue 控制组件是否显示
在Vue中,控制组件的显示通常使用v-if、v-else-if、v-else或v-show指令。 1.v-if:条件性地渲染元素,如果条件为假,元素甚至不会被渲染到DOM中。 <template><div><MyComponent v-if"showMyComponent" /&…...

生产部门不给力?精益化生产管理咨询公司为您出谋划策
问题背景 近年来,许多企业的生产部门面临着各种挑战和困难。生产效率低下、产品质量不稳定、生产成本过高等问题频频出现,给企业的发展带来了困扰。面对这一现状,许多企业开始寻求专业的管理咨询公司的帮助,以期能够通过精益生产…...

HTML+CSS - 网页布局之网格布局
1. dispaly设置 display是 CSS 中用于设置元素的显示方式的属性。它决定了元素如何被渲染到页面上。不同的display值会改变元素的显示行为,包括布局、排版以及对其他元素的影响。 其中网格容器是最常用的几种方式之一,在文档中创建类似于网格的效果&…...

基于51单片机的16X16点阵显示屏proteus仿真
地址: https://pan.baidu.com/s/1JQ225NSKweqf1Zlad_f1Mw 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectro…...

【目标检测数据集】厨房常见的水果蔬菜调味料数据集4910张39类VOC+YOLO格式
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4910 标注数量(xml文件个数):4910 标注数量(txt文件个数):4910 标注…...

在Python中统计字符串中每个字符出现的次数
在Python中统计字符串中每个字符出现的次数 在Python编程中,处理字符串是一个常见的任务。统计字符串中每个字符出现的次数不仅能考察候选人的编程能力,还能展示他们对Python内置数据结构和算法的理解。本文将详细介绍如何编写一个函数来统计字符串中每个字符出现的次数,并…...

关于 vue/cli 脚手架实现项目编译运行的源码解析
1.vue项目运行命令解析 在日常开发中,vue 项目通过vue-cli-service脚手架包将项目运行起来,常用的命令例如: npm run serve npm run build 上述执行命令实际一般对应为项目中 package.json 文件的 scripts属性中编写的脚本命令,在…...

C++笔记---继承(上)
1. 继承的简单介绍 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许我们在保持原有类特性的基础上进行扩展,增加方法(成员函数)和属性(成员变量),这样产生新的类,称派生类。 继承呈…...

气膜体育馆:为学校打造智能化运动空间—轻空间
随着教育体制的逐步升级,学校在提升学生综合素质方面的需求日益增长,特别是在体育场地方面。气膜体育馆作为一种新型的运动空间形式,正在迅速成为学校体育设施的优选方案。凭借其快速搭建、节能环保等优势,气膜馆在全国各地的校园…...

JVM 调优篇5 jvm性能监控
一 jvm性能监控 1.1 概述 性能诊断是软件工程师在日常工作中需要经常面对和解决的问题,在用户体验至上的今天,解决好应用的性能问题能带来非常大的收益。 体会1:使用数据说明问题,使用知识分析问题,使用工具处理问…...

一. Unity实现虚拟摇杆及屏幕自适应功能
手游里面很多类型的游戏都需要用到遥感功能,例如王者荣耀,和平精英等,之前的摇杆功能都是用类似于Easy Touch的插件进行开发的,今天不借助任何插件来实现虚拟摇杆的功能。 一般虚拟摇杆的组成都是由轮盘和遥感的点组成,…...

【达梦数据库】mysql 和达梦 tinyint 与 bit 返回值类型差异
测试环境 mysql5.7.44 达梦2024Q2季度版 前言 在mysql 中存在 tinyint(1)的用法来实现存储0 1 作为boolean的标识列;但是在达梦并不允许使用 tinyint(1)来定义列,只能使用 tinyint 即 取值范围为ÿ…...

VUE工程中axios基本使用
安装axios npm install axios -s在main.js中引入 import http from axios Vue.prototype.$http = http将其绑定在VUE的prototype属性中 vue工程目录下,新建config文件夹,在config文件夹下新建index.js export default {...

跨服务器执行PowerShell脚本
本机和远程机都要执行 Enable-PSRemoting -Force 远程端关闭公用网络 Get-NetConnectionProfile Set-NetConnectionProfile -Name "未识别的网络" -NetworkCategory Private 本机和远程机都要执行 winrm quickconfig 将远程机ip加入信任列表 cd WSMan::localhost\…...

linux_L2_linux删除文件
linux 删除文件 在Linux下删除文件有多种实现方法,以下是其中几种常见的方法: 方法一:使用rm命令删除单个文件 rm 文件路径例如,删除当前目录下的文件file.txt: rm file.txtQuestion :当你在Linux系统中使用rm命令删…...

系统架构设计师 - 项目管理
项目管理 项目管理(1-3分,案例分析 25分)立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…...

Spring Boot基础
项目创建 项目启动 请求响应 RestController 1.返回值处理 RestController:这个注解结合了Controller和ResponseBody的功能。它默认将所有处理请求的方法的返回值直接作为响应体内容返回,主要用于构建RESTful API。返回的数据格式通常是JSON或XML&…...

C语言 | Leetcode C语言题解之第402题移掉K位数字
题目: 题解: char* removeKdigits(char* num, int k) {int n strlen(num), top 0;char* stk malloc(sizeof(char) * (n 1));for (int i 0; i < n; i) {while (top > 0 && stk[top] > num[i] && k) {top--, k--;}stk[top]…...

使用Visual Studio Code配置C/C++开发环境的全面指南
目录 引言 一、准备工作 1. 安装Visual Studio Code 2. 安装C/C编译器 3. 配置环境变量(仅Windows用户) 二、在VS Code中安装C/C扩展 三、创建您的第一个C/C项目 1. 创建项目文件夹 2. 打开项目文件夹 3. 创建源文件 四、配置任务(…...

算法练习题26——多项式输出(模拟)
输入格式 输入共有 2 行 第一行 1 个整数,n,表示一元多项式的次数。 第二行有 n1 个整数,其中第 i 个整数表示第 n−i1 次项的系数,每两个整数之间用空格隔开。 输出格式 输出共 1 行,按题目所述格式输出多项式。…...

卷积神经网络经典模型架构简介
【图书推荐】《PyTorch深度学习与企业级项目实战》-CSDN博客 《PyTorch深度学习与企业级项目实战(人工智能技术丛书)》(宋立桓,宋立林)【摘要 书评 试读】- 京东图书 (jd.com) ImageNet是一个包含超过1 500万幅手工标记的高分辨率图像的数据…...

【Kubernetes】常见面试题汇总(十三)
目录 39.简述 Kubernetes Scheduler 使用哪两种算法将 Pod 绑定到 worker 节点? 40.简述 Kubernetes kubelet 的作用? 41.简述 Kubernetes kubelet 监控 Worker 节点资源是使用什么组件来实现的? 39.简述 Kubernetes Scheduler 使用哪两种算…...

嵌入式QT开发:构建高效智能的嵌入式系统
摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面…...

Linux抢占调度
目录 抢占流程 抢占时机 用户态抢占时机 1、 从系统调用返回用户空间 2、 从中断返回用户空间 内核态抢占时机 1、中断处理程序返回内核空间 可以看到最终是到了 preempt_schedule_irq 2、当内核从non-preemptible(禁止抢占)状态变成pr…...

k8s中,为什么把pod的服务以deployment的形式通过nodeport对外发布,以及容器和虚拟机的一些区别
deployment是个控制器 主要负责管理pod,来代表k8s集群向外提供稳定的服务。 说,k8s有很多优点。 说k8s的优点,可能先需要说容器提供的便利。 同样的硬件资源 跑几个虚拟机,每个虚拟机上跑几个服务。 就挺重了。风扇呼呼叫 …...

PMP--一模--解题--41-50
文章目录 14.敏捷--方法--回顾--回顾是最重要的一个实践,原因是它能让团队学习、改进和调整其过程。41、 [单选] 新项目中的所有团队成员都希望通过尽快交付价值来获得客户的信任。项目经理了解到一个资源已经在其他项目中与发起人一起工作。某资源似乎在使用个人影…...