ego(4)---检测B样条轨迹的障碍物进入点与退出点

障碍物进出点检测的作用

在经过 B 样条的控制点采样后,接下来是绕障的环节,绕障使用的是 Astar ,但在使用 Astar 之前,需要进行障碍物进出点的检测与标记。通俗点讲,这部分的作用就是为 Astar 绕障碍做前置准备。

检测进出点的步骤

采样步长计算

ego 中使用采样步长,或者叫分辨率来检测是否经过障碍物:

double step_size = grid_map_->getResolution() / ((init_points.col(0) - init_points.rightCols(1)).norm() / (init_points.cols() - 1)) / 2;

grid_map_->getResolution() 表示栅格地图的分辨率,step_size 用来确认采样步长,保证采样点的密度不低于栅格精度,就可以避免越过障碍物。

步长计算:栅格分辨率 / (轨迹总长度 / 控制点数量) / 2。

检测是否碰撞

在 ego 中采用了一个小状态机来标记是否发生碰撞,使用内外两层检测,外层只检测初始轨迹的关键区间(中间的 2/3 段,认为首尾段无障碍)。

内层根据分辨率来逐个插值采样,然后判断是否是进入点或退出点,当进入点与退出点都找到时,才会记录。

在检测判断时,都会检测连续状态的次数,在 ego 中是使用的这个变量:

constexpr int ENOUGH_INTERVAL = 2;  // 碰撞次数,超过此阈值才会认为碰撞到障碍物

检测逻辑示意

检测逻辑示意图:

进入退出点示意图:

对应的 ego 代码(添加了部分注释):

/*** Segment the initial trajectory according to obstacles ***/
/** 定位初始轨迹的障碍段 **/
constexpr int ENOUGH_INTERVAL = 2;  // 碰撞次数,超过此阈值才会认为碰撞到障碍物
// 计算轨迹采样步长,确保采样密度足够,不会越过障碍物  步长计算:栅格分辨率 / (轨迹总长度/控制点数量)
double step_size = grid_map_->getResolution() / ((init_points.col(0) - init_points.rightCols(1)).norm() / (init_points.cols() - 1)) / 2;
int in_id, out_id;
vector<std::pair<int, int>> segment_ids;
int same_occ_state_times = ENOUGH_INTERVAL + 1;
bool occ, last_occ = false;
bool flag_got_start = false, flag_got_end = false, flag_got_end_maybe = false;// 遍历初始轨迹的关键区间(仅检查中间的 2/3 段控制点,认为首尾段无障碍) 
int i_end = (int)init_points.cols() - order_ - ((int)init_points.cols() - 2 * order_) / 3; // only check closed 2/3 points.
for (int i = order_; i <= i_end; ++i)
{// 采样当前控制点与下一个控制点之间的轨迹for (double a = 1.0; a >= 0.0; a -= step_size){// 计算采样点坐标,然后判断采样点是否在障碍物区域内   采样点的线性插值类似低通滤波的公式,根据分辨率插值采样,求解出采样点坐标occ = grid_map_->getInflateOccupancy(a * init_points.col(i - 1) + (1 - a) * init_points.col(i));// cout << setprecision(5);// cout << (a * init_points.col(i-1) + (1-a) * init_points.col(i)).transpose() << " occ1=" << occ << endl;// 上次不是碰撞点,当前是,则认为碰撞状态切换,检测是否是进入点if (occ && !last_occ){if (same_occ_state_times > ENOUGH_INTERVAL || i == order_){in_id = i - 1;    // 进入点坐标对应前面的坐标点flag_got_start = true;    // 标记已经获取到进入点}same_occ_state_times = 0;flag_got_end_maybe = false; // terminate in advance}// 上次是碰撞点,当前不是,检测是否是退出点else if (!occ && last_occ){out_id = i;flag_got_end_maybe = true;  // 标记可能是退出点same_occ_state_times = 0;}else{++same_occ_state_times; // 连续相同状态检测}// 确认退出点:连续 ENOUGH_INTERVAL 次未占用,避免临时跳出if (flag_got_end_maybe && (same_occ_state_times > ENOUGH_INTERVAL || (i == (int)init_points.cols() - order_))){flag_got_end_maybe = false;flag_got_end = true;    // 标记获取到退出点}last_occ = occ;// 记录障碍段的进入点与退出点if (flag_got_start && flag_got_end){flag_got_start = false;flag_got_end = false;segment_ids.push_back(std::pair<int, int>(in_id, out_id));}}
}

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

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

相关文章

在springboot中使用mock做controller层单元测试,请求示例包括GET(带参数)、POST(带请求头)、下载文件、上传文件等

以下是SpringBoot中使用MockMvc进行Controller层单元测试的完整示例,涵盖GET带参数、POST带请求头、文件下载和文件上传等场景: GET请求测试(带路径参数) @Test void testGetWithPathParam() throws Exception {mockMvc.perform(MockMvcRequestBuilders.

领码SPARK融合平台 · TS × Java 双向契约:构建稳定可演进的全栈系统——落地篇|配置即契约,守卫即护栏

系列总引 本系列致力于构建可复制、可演进的低代码平台类型治理闭环&#xff0c;从原理到落地、AI 驱动到性能治理。落地篇聚焦工程实践&#xff0c;通过“契约单源 → 自动生成 → 前后端守卫协同 → CI/CD 管控”的完整流水线&#xff0c;将原理篇的类型方法论落到生产环境中…

Gradio全解11——Streaming:流式传输的视频应用(8)——Gemini Live API:实时音视频连接

Gradio全解11——Streaming&#xff1a;流式传输的视频应用&#xff08;8&#xff09;——Gemini Live API&#xff1a;实时音视频连接11.8 Gemini Live API&#xff1a;实时音视频连接11.8.1 Live API——入门1. Live API技术与功能介绍2. 选择音频生成架构和实施方案3. 异步发…

事务学习总结

目录 事务四大特性 事务四种隔离级别 事务七种传播行为 事务四大特性 原子性Atomicity 要么同时成功&#xff0c;要么同时失败。事务一旦发生失败就会回滚到原来最初的样子&#xff0c;仿佛没有发生过一样 一致性Consistency 事务处理前后&#xff0c;数据完整性要保持一…

JavaWeb--day4--WebHttp协议Tomcat

&#xff08;以下内容全部来自上述课程及课件&#xff09; 这里maven我学过了&#xff0c;可见&#xff1a;Maven项目管理–基础篇&#xff0c;所以跳过 SpringBootWeb 1. 需求 需求&#xff1a;基于SpringBoot的方式开发一个web应用&#xff0c;浏览器发起请求/hello后&…

网络相关知识整理

负载均衡负载均衡&#xff08;Load Balancing&#xff09;是一种分布式系统技术&#xff0c;核心作用是将网络流量、计算任务或数据请求均匀分配到多个服务器&#xff08;或资源节点&#xff09;&#xff0c;避免单个节点因负载过高而性能下降或崩溃&#xff0c;从而提升系统的…

C++(继承和多态)

目录 访问权限&#xff1a; 继承&#xff1a; 示例&#xff1a; 构造和析构顺序&#xff1a; 多态&#xff1a; 示例&#xff1a; 非虚函数重写&#xff1a; 虚函数&#xff1a; 示例&#xff1a; 纯虚函数&#xff1a; 继承是C中面向对象编程的核心特性之一&#xf…

07_Softmax回归、损失函数、分类

1. Softmax回归 ① Softmax回归虽然它的名字是回归&#xff0c;其实它是一个分类问题。2. 回归VS分类3. Kaggle分类问题4. 回归到分类5. 交叉熵损失6. 总结7. 损失函数 ① 三个常用的损失函数 L2 loss、L1 loss、Huber’s Robust loss。8. L2 Loss ① 蓝色曲线为当y0时&#xf…

UFO²:微软推出的新一代桌面 Agent 操作系统,深度整合 Windows 与智能自动化

本文转载自&#xff1a;https://www.hello123.com/ufo ** 一、微软 UFO&#xff1a;Windows 桌面智能体操作系统的革新与实战解析 &#x1f4bb; 微软 UFO&#xff08;Unified Functional Optimization Operating System&#xff09;是微软在 2025 年对其开源智能体系统 Agen…

C语言入门指南:字符函数和字符串函数

目录 前言&#xff1a; 一. 字符分类函数&#xff1a;精准识别字符的“身份” 1.1 ​​​​​​​核心函数 1.2 经典应用示例&#xff1a; 二、 字符转换函数&#xff1a;优雅地改变字符形态 三、strlen&#xff1a;计算长度的基石与无符号陷阱 3.1 关键特性 3.2 致命陷…

闪电科创-交通信号灯仿真SUMO

闪电科创计算机人工智sci/ei会议/ccf/核心&#xff0c;擅长机器学习&#xff0c;深度学习&#xff0c;神经网络&#xff0c;语义分割等计算机视觉&#xff0c;精通大小论文润色修改&#xff0c;代码复现&#xff0c;创新点改进等等

2025智能制造研发效率提升指南:从“项目-流程-数据”闭环看工具选型

一、引言&#xff1a;12年智能制造老兵的一线观察我在智能制造领域从业12年&#xff0c;先后主导过5家制造企业的研发流程数字化转型&#xff0c;从汽车零部件到高端装备制造&#xff0c;见证了太多研发团队因工具选型不当导致的效率损耗&#xff1a;项目进度卡在审批流程里、测…

spring中case一直返回else中的值-问题和原理详解

目录 案例背景 问题现象 问题根源 解决过程 最终结论 经验总结 案例背景 在基于 Spring Boot MyBatis 的项目中&#xff0c;需要通过 SQL 的 CASE WHEN 语句生成 user_Name字段&#xff08;表示是否有关联用户名称&#xff0c;1 为有关联&#xff0c;0 为无关联&#xf…

Apache IoTDB V1.3.5 发布|优化加密算法,优化内核稳定性,修复社区反馈问题

Release AnnouncementVersion 1.3.5 Apache IoTDB V1.3.5 已经发布&#xff01;V1.3.5 作为之前 1.3.x 的 bugfix 版本升级&#xff0c;主要调整用户密码加密算法&#xff0c;进一步强化数据访问安全&#xff0c;同时优化内核稳定性&#xff0c;修复社区反馈问题。欢迎点击阅读…

开源好用的博客系统简介和详细安装教程

目录 看效果 ① 搜索一键安装包 ② 填写安装信息 ③ 使用界面安装向导 ④ 安装完成 使用普通模式安装 看效果 下面直接来安装教程 ① 搜索一键安装包 登录宝塔后台系统&#xff0c;进入软件商店 → 一键部署&#xff0c;搜索 “ModStart”。 ② 填写安装信息 点击“一键…

医院高值耗材智能化管理路径分析(下)

医保协同:政策适配与编码联动的精准付费 国家医保局"带码采购、带码使用、带码结算"政策推动下,AI系统通过编码映射与实时规则引擎实现医保支付的动态适配。国医科技构建的UDI编码、医保编码与收费编码三码联动体系,可在耗材使用时自动匹配国家医保医用耗材分类与…

硬件开发2-ARM裸机开发1-I.MX6ULL - 汇编点灯

一、概念概要1、LED原理图2、内核中对应的引脚 — GPIO&#xff08;1&#xff09;概念GPIO&#xff08;通用输入/输出&#xff09;详解GPlO&#xff08;General-PurposeInput/Output&#xff09;是嵌入式系统和微控制器中最基本的外设接口&#xff0c;用于 实现数字信号的输入和…

Qwen3-80B-A3B混合注意力机制

一、注意力机制背景&#xff1a; 在Transformer架构中&#xff0c;自注意力&#xff08;Self-Attention&#xff09;是核心组件。其基本公式为&#xff1a; 其中&#xff1a; Q (Query)&#xff1a;查询向量&#xff0c;表示问询量。用于与其他位置的Key交互&#xff0…

数据库(一)数据库基础及MySql 5.7+的编译安装

文章目录前言一、数据库概述1.1 前置知识1.1.1 LAMP / LNMP 架构1.1.2 数据库的定位1.2 数据库基本概念1.2.1 数据1.2.2 表1.2.3 数据库1.2.4 数据库管理系统&#xff08;DBMS&#xff09;1.2.5 数据库系统&#xff08;DBS&#xff09;1.3 数据库发展史1.3.1 第一阶段&#xff…

Elasticsearch HTTPS访问错误解决指南

文章目录&#x1f50d; 原因分析✅ 正确的访问方式&#xff1a;使用 curl -k https://...&#x1f510; 你需要知道 elastic 用户的密码方法 1&#xff1a;查看首次生成的密码&#xff08;如果刚安装&#xff09;方法 2&#xff1a;重置密码✅ 成功示例&#x1f389; 总结&…