碰撞检测 | 详解圆-矩形碰撞检测与N圆覆盖模型(附ROS C++可视化)

news2024/9/24 23:29:40

目录

  • 0 专栏介绍
  • 1 N N N圆覆盖碰撞模型
  • 2 圆与矩形的碰撞检测
  • 3 算法仿真与可视化
    • 3.1 核心算法
    • 3.2 仿真实验

0 专栏介绍

🔥课设、毕设、创新竞赛必备!🔥本专栏涉及更高阶的运动规划算法轨迹优化实战,包括:曲线生成、碰撞检测、安全走廊、优化建模(QP、SQP、NMPC、iLQR等)、轨迹优化(梯度法、曲线法等),每个算法都包含代码实现加深理解

🚀详情:运动规划实战进阶:轨迹优化篇


本期实现如下的碰撞检测效果

在这里插入图片描述


1 N N N圆覆盖碰撞模型

在车辆的路径规划过程中,需要评估和避开可能的障碍物。 N N N圆覆盖碰撞检测算法可以快速检测和响应路径上的障碍物,从而优化行驶路线。

直观地,如图所示,采用单个外接圆包围物体,此时只需要检查圆心和半径的关系即可实现碰撞检测。然而这种方法容易造成自由空间狭窄,更精细的做法是利用 个圆盘覆盖物体,对这些圆依次进行单圆碰撞检测,如图所示

在这里插入图片描述

形式化地,设自车后轴中心坐标为 ( x , y ) (x, y) (x,y),由几何关系可知

{ x i d i s c = x + ( 2 i − 1 2 N ⋅ ( L 1 + L 2 ) − L 1 ) cos ⁡ θ y i d i s c = y + ( 2 i − 1 2 N ⋅ ( L 1 + L 2 ) − L 1 ) sin ⁡ θ    i = 1 , 2 , ⋯   , N \begin{cases} x_{i}^{\mathrm{disc}}=x+\left( \frac{2i-1}{2N}\cdot \left( L_1+L_2 \right) -L_1 \right) \cos \theta\\ y_{i}^{\mathrm{disc}}=y+\left( \frac{2i-1}{2N}\cdot \left( L_1+L_2 \right) -L_1 \right) \sin \theta\\\end{cases}\,\,i=1,2,\cdots ,N {xidisc=x+(2N2i1(L1+L2)L1)cosθyidisc=y+(2N2i1(L1+L2)L1)sinθi=1,2,,N

其中 θ \theta θ是航向角; N N N是覆盖圆的数量, N N N越大碰撞检测越精细但同时计算负担更大。圆的半径由 N N N和自车几何形状唯一确定

R d i s c = ( L 1 + L 2 2 N ) 2 + ( W 2 ) 2 R^{\mathrm{disc}}=\sqrt{\left( \frac{L_1+L_2}{2N} \right) ^2+\left( \frac{W}{2} \right) ^2} Rdisc=(2NL1+L2)2+(2W)2

2 圆与矩形的碰撞检测

如图所示,核心原理是计算圆心与矩形的最短距离 ∣ u ∣ \left| \boldsymbol{u} \right| u,若 ∣ u ∣ < r \left| \boldsymbol{u} \right|<r u<r则两者相交。算法上,首先考虑无旋转的矩形,不失一般性地将圆投影到第一象限,得到

v = [ ∣ p x − c x ∣ ∣ p y − c y ∣ ] T \boldsymbol{v}=\left[ \begin{matrix} \left| p_x-c_x \right|& \left| p_y-c_y \right|\\\end{matrix} \right] ^T v=[pxcxpycy]T

其中 p \boldsymbol{p} p c \boldsymbol{c} c分别是矩形和圆的中心向量。设 l − l^- l w − w^- w分别为矩形长、宽的一半,则矩形中心到第一象限顶点向量为 h = [ l − w − ] \boldsymbol{h}=\left[ \begin{matrix} l^-& w^-\\\end{matrix} \right] h=[lw],从而得到最近距离向量

u = [ max ⁡ ( v x − h x , 0 ) max ⁡ ( v y − h y , 0 ) ] T \boldsymbol{u}=\left[ \begin{matrix} \max \left( v_x-h_x, 0 \right)& \max \left( v_y-h_y, 0 \right)\\\end{matrix} \right] ^T u=[max(vxhx,0)max(vyhy,0)]T

即将负数分量设为0;再比较 ∣ u ∣ \left| \boldsymbol{u} \right| u和圆的半径大小关系即可

在这里插入图片描述

推广到一般情形,设矩形旋转角度为 α \alpha α,则只需要将 v \boldsymbol{v} v反向旋转 α \alpha α角度即可转换为无旋转的场景,算法流程如下所示

在这里插入图片描述

3 算法仿真与可视化

3.1 核心算法

核心算法如下所示

  • 圆与矩形的碰撞检测

    auto other_rect = std::dynamic_pointer_cast<VRectangle>(other);
    
    for (const auto& disc : discs_)
    {
      auto v = disc.first - other_rect->center();
    
      // rotate ang project first quadrant
      float theta = -other_rect->angle();
      float rotate_vx = std::fabs(v.x * std::cos(theta) - v.y * std::sin(theta));
      float rotate_vy = std::fabs(v.x * std::sin(theta) + v.y * std::cos(theta));
    
      // right-top point of rectangle
      float h_x = std::fabs(other_rect->length()) / 2.0f;
      float h_y = std::fabs(other_rect->width()) / 2.0f;
    
      // closest vector
      float u_x = std::max(0.0f, rotate_vx - h_x);
      float u_y = std::max(0.0f, rotate_vy - h_y);
      if (std::hypot(u_x, u_y) < disc.second)
        return true;
    }
    return false;
    
  • 圆与圆的碰撞检测

    auto other_circle = std::dynamic_pointer_cast<VCircle>(other);
    const auto& other_circle_center = other_circle->center();
    const auto& other_circle_radius = other_circle->radius();
    
    for (const auto& disc : discs_)
    {
      if (std::hypot(other_circle_center.x - disc.first.x, other_circle_center.y - disc.first.y) <=
          disc.second + other_circle_radius)
        return true;
    }
    return false;
    

3.2 仿真实验

通过Rviz->Add New Tool添加Polygon Simulation插件

s

开启碰撞检测功能后,验证 N N N圆覆盖碰撞检测算法

  • 单圆碰撞与无碰撞情形

在这里插入图片描述

  • N N N圆覆盖模型与圆的碰撞检测

在这里插入图片描述

  • N N N圆覆盖模型与矩形的碰撞检测

在这里插入图片描述

完整工程代码请联系下方博主名片获取


🔥 更多精彩专栏

  • 《ROS从入门到精通》
  • 《Pytorch深度学习实战》
  • 《机器学习强基计划》
  • 《运动规划实战精讲》

👇源码获取 · 技术交流 · 抱团学习 · 咨询分享 请联系👇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2126392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HCIP--<OSPF2>

目录 一&#xff0c;OSPF的不规则区域 1&#xff09;远离骨干区域的非骨干区域 2&#xff09;不连续骨干区域(和上面一样) 二&#xff0c;OSPF数据库表 三。优化OSPF的LSA&#xff08;缺少LSA的更新量&#xff09; [1]手工汇总&#xff1a;减少骨干区域的LSA [2]特殊区域&…

from T2I to T2V

生成图片 在Stable Diffusion推理过程中&#xff0c;其使用unet对一个初始化的向量不断去噪&#xff0c;并编入条件信息 c c c &#xff0c;最后使用vae-decoder将其上采样为一张图片。 计算过程&#xff1a; f l a t e n t u n e t ( f l a t e n t ) , f l a t e n t ∈ R…

frida主动调用init_array中的函数

ida打开目标so&#xff0c;查看要主动调用的函数 前提是先过掉检测frida等等&#xff0c;然后控制台启动 输出so地址 Process.findModuleByName("libmod.so") New函数 var aa new NativeFunction(ptr(0x785e002000).add(0x134EC0),"void",[]) 主动调用 a…

三种方式可以将彩色图像转成灰度图对比

有三种方式可以将彩色图像转成灰度图 1、直接imread(“1.jpg” , 0)&#xff1b;直接读取灰度图像 2、读取彩色图像然后 灰度 0.299 * 红色 0.587 * 绿色 0.114 * 蓝色进行转换 3、调用cvtColor函数cvtColor(srcImg, imgShow, COLOR_BGR2GRAY); 通过测试来对比三者的区别&…

秋招面经9.11

1. JWT的过程解析 JWT&#xff08;JSON Web Token&#xff09;是一种基于 JSON 的开放标准&#xff08;RFC 7519&#xff09;实现的用于在各方之间传递信息的紧凑且自包含的方式。JWT 是一种 token&#xff0c;可以对信息进行数字签名&#xff08;例如使用 HMAC 算法或 RSA 加…

[leetcode-python]杨辉三角2

给定一个非负索引 rowIndex&#xff0c;返回「杨辉三角」的第 rowIndex 行。 在「杨辉三角」中&#xff0c;每个数是它左上方和右上方的数的和。 示例 1: 输入: rowIndex 3 输出: [1,3,3,1]示例 2: 输入: rowIndex 0 输出: [1]示例 3: 输入: rowIndex 1 输出: [1,1]提示…

Mycat2原理介绍

Mycat介绍 Mycat原理 Mycat 核心配置 Scheam.xml 逻辑数据库和节点对应关系配置Server.xml mycat的连接配置Rule.xml. 分片规则 自动分片auto-sharding-long&#xff0c;比如0-10000节点1 &#xff0c;10001-20000节点2枚举分片sahrding-bt-intfile ,比如beijing节点1…

【828华为云征文|如何使用华为云Flexus X实例搭建私人博客:从配置到发布全指南】

文章目录 华为云Flexus X实例介绍搭建专属私人博客准备工作具体操作指南服务器环境确认宝塔软件商店操作一键部署WordPress私人博客域名解析WordPress安装初始页数据库信息配置运行安装程序配置博客信息博客管理后台&#xff08;默认为wp-login.php页面&#xff09;博客前台页面…

c语言位运算符速成

本篇文章对c语言速成系列的补充&#xff0c;其中的内容会涉及原反补以及& 、| 、 ~ 、^、位运算等等。那么&#xff0c;闲话少叙&#xff0c;我们直接进入正题 首先我们先来讲讲原反补 进制转换&#xff08;前置知识&#xff09; 在学原反补之前我们先来学几个机制转换的…

网络高级(学习)2024.9.10

目录 一、Modbus简介 1.起源 2.特点 3.应用场景 二、Modbus TCP协议 1.特点 2.协议格式 3.MBAP报文头 4.功能码 5.寄存器 &#xff08;1&#xff09;线圈寄存器&#xff0c;类比为开关量&#xff0c;每一个bit都对应一个信号的开关状态。 &#xff08;2&#xff09…

C++——STL——栈(stack)

栈的定义 栈 &#xff08; stack &#xff09;是限定仅在表的一端进行插入和删除操作的线性表&#xff0c;允许插入和删除的一端称 为栈顶&#xff0c;另一端称为栈底&#xff0c;不含任何数据元素的栈称为空栈。 栈的示意图 因为栈只能够在一端进行插入和删除&#xff0c;所以…

【Lua学习】Lua入门

上一篇帖子【Lua学习】Lua最最基础的 – 经云的清净小站 (skycreator.top)讲了Lua是什么&#xff0c;Lua如何安装在Linux和Windows上。那么安装好之后&#xff0c;我们就要使用Lua实现我们的各种功能了。 首先&#xff0c;我们要先了解Lua一些最基本的内容&#xff0c;比如怎么…

杀毒软件 | Malware Hunter v1.189.0.816 绿色版

软件简介 Malware Hunter是由Glarysoft开发的一款专业安全防护软件。该软件的主要目的是保护用户的计算机免受恶意软件、病毒和其他网络威胁的侵害。它通过采用高效的云引擎和小红伞引擎&#xff0c;能够快速且全面地扫描电脑中的恶意软件&#xff0c;并进行强力清除&#xff…

5--SpringBoot、Mybatis

目录 Mybatis Mybatis入门操作步骤 1.准备工作 创建springboot工程 创建数据库表和实体类 连接数据库 创建接口XxxMapper 2.数据库连接池 Lombok 使用 Mybatis 准备工作 删除 日志输入 参数占位符 新增 更新 查询 驼峰命名 条件查询 XML 创建XML文件 编…

关于前端知识中框架概念部分的详细介绍

1、为什么要学习流行框架&#xff1f; 企业&#xff1a;为了提高效率&#xff0c;因为时间就是金钱。开发人员&#xff1a;提高了开发效率发展进程&#xff1a; JS>JQuery>模板引擎>框架时代&#xff08;Angular(2)、React、Vue&#xff09;好处&#xff1a;不用直接…

2.安卓逆向-初识java语言

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 上一个内容&#xff1a;1.安卓逆向-说明 关于java语言的介绍就不写了没啥用直接开始 首先java语言写的代码运行说明 …

kolors文生图框架安装

环境安装 根据Kolors【github】的指引&#xff0c;安装命令如下&#xff1a; apt-get install git-lfs git clone https://github.com/Kwai-Kolors/Kolors cd Kolors conda create --name kolors python3.8 conda activate kolors pip install -r requirements.txt python3 s…

Vue3+TS项目封装SVG图标显示组件vite-plugin-svg-icons插件使用

准备好svg文件 假设从iconfont-阿里巴巴矢量图标库下载了一个svg格式的图标&#xff0c;放在我们项目里&#xff0c;并重命名为ic_money.svg&#xff0c;相对路径为&#xff1a;src\assets\images\icons\ic_money.svg 安装vite-plugin-svg-icons插件 npm install vite-plugi…

常用电路及分析

前言 最近在研究一些简单的硬件知识&#xff0c;把在网上看到的一些常见电路分析总结了一下。 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com 串联稳压电路 三极管串联线性稳压电路原理详解及Multisim仿真_三极管稳压电路-CSDN博客 线性稳压电…

Java小白一文讲清Java中集合相关的知识点(八)

HashMap底层机制及源码剖析 HashMap底层维护了Node类型的数组table,默认为null 当创建对象时&#xff0c;将加载因子初始化为0.75&#xff1b; 当添加key-value时&#xff0c;通过key的哈希值得到在table的索引&#xff0c;然后判断该索引处是否有元素&#xff0c;如果没有元…