fuel无人机自主探索代码解读3——fast_exploration_fsm.cpp【状态机】

一、概述

fast_exploration_fsm.cpp订阅实时定位和目标点信息,每隔0.01s执行一次状态机,进行状态切换;每隔0.05s执行一次碰撞检测,按需进行重新规划;每0.5s执行一次边界回调定时器,对于处于WAIT_TRIGGER和FINISH状态的规划器进行边界生成、视点计算和代价求解等。核心为执行变量state_。

二、主要函数及作用

1、FastExplorationFSM::init

作用:
1、fsm参数及数据初始化
2、探索管理类及规划可视化类的初始化
3、状态机变量初始化
4、ros中订阅发布及定时器的声明

2、FastExplorationFSM::FSMCallback

作用:0.01s执行一次状态机切换判断,本质是根据各种触发条件完成规划器在各状态间的转移,具体状态切换过程见下图

3、FastExplorationFSM::callExplorationPlanner

作用:根据当前起点位置 起点速度  起点加速度  起点航向【yaw  yaw‘  yaw“】进行全流程的探索规划。如果探索规划成功【当前位置、速度、加速度、yaw-----》最优视点【位置、yaw】】,则进行fd_->newest_traj_【最新局部轨迹】的赋值:b样条曲线次数、起始时间、索引id、局部轨迹位置b样条控制点位置和节点向量、局部轨迹yaw的b样条的控制点和时间间隔
流程:                  1、基于当前帧点云的区域生长边界搜索、pca主成分分析拆分、过时边界删除,得到临时边界簇【珊格坐标、体素滤波后珊格坐标、AABB包围框的下边界、AABB包围框的上边界、平均位置】2、临时边界视点信息【位置、yaw【边界相对于视点位置】、可视珊格数】计算,并将其分裂为有效边界【按照可视边界珊格数进行视点排序】和无效边界,并进行【有效边界的索引更新】3、进行TSP的全局引导路径生成,基于dijsktra的局部视点修正,得到局部规划的终点位置和yaw【某视点位置与yaw】4、以当前点为起点,3中给点视点为终点,采用nlopt进行全参数的局部轨迹规划、b样条的yaw轨迹优化,更新局部轨迹信息【local_data_中除了start_time_未更新】
返回值:1、NO_FRONTIER:空间没有有效边界      2、FAIL:探索规划的起点和终点之间不存在A*无碰路径        3、FAIL:无碰A*路径的长度在最近和最远距离阈值范围之间:基于动力学路径搜索得到全局路径,采样后基于fast planner使用nlopt得到优化后的局部轨迹控制点位置、时间间隔,失败4、SUCCEED:成功完成本次探索规划

4、FastExplorationFSM::visualize

作用:
1、进行当前有效边界【立方体序列,涉及多余的失效边界的清空】的可视化显示【/planning_vis/frontier】
2、进行局部轨迹b样条采样点【时间间隔:0.01】和控制点【此处不显示】的可视化显示【球列:/planning_vis/trajectory】

5、FastExplorationFSM::clearVisMarker

作用:函数体为空

6、FastExplorationFSM::frontierCallback

作用:0.5s的边界回调定时器,当探索规划器状态机处于WAIT_TRIGGER和FINISH,进行环境边界簇更新、视点计算、cost计算、有效边界簇的可视化显示

7、FastExplorationFSM::triggerCallback

作用:子目标点序列订阅。若状态机当前状态为WAIT_TRIGGER,且目标点有效【大于-0.1时】,则状态机的当前状态由WAIT_TRIGGER-----》PLAN_TRAJ

8、FastExplorationFSM::safetyCallback

作用:0.05s执行一次的安全检测定时器:当前状态机处于EXEC_TRAJ状态,且与当前位置的6m范围内局部轨迹存在发生碰撞的轨迹点,则状态切入PLAN_TRAJ

9、FastExplorationFSM::odometryCallback

作用:odom定位的订阅【经过话题重映射】。无人机当前位置、速度、航向四元数及yaw的更新、标志位置于true【表明接受过定位数据】

10、FastExplorationFSM::transitState

输入:状态机的新状态值  字符串
作用:状态机的当前状态值更新为给定状态,并打印相关状态转移信息

三、状态机:状态转移图

在这里插入图片描述

四、FUEL链接

1、fuel无人机自主探索代码解读1——map_ros.cpp【地图ros接口】
2、fuel无人机自主探索代码解读2——sdf_map.cpp【占据栅格地图、膨胀占据栅格地图、ESDF】

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

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

相关文章

中国首台!紧随美国,重磅发布100比特中性原子量子计算机

2024年6月11日上午,“武汉量子论坛—2024”隆重开幕,国家自然科学基金委员会主任窦贤康院士,武汉大学校长张平文院士,以及叶朝辉、徐红星、祝世宁等院士出席大会。在会议上,中科酷原重磅发布国内首台原子量子计算机——…

【数据结构初阶】--- 栈和队列

栈 栈的定义 栈:只允许在一端进行插入或删除的操作 事实上,线性表和链表都可以实现栈,但栈的特点更符合用顺序表实现 顺序表的队尾相当于栈顶,对栈放入数据,相当于顺序表的下标arr[index] x,而栈弹出数…

threejs导入import报错

1.安装 three: npm install three -d 2.引入: import * as THREE from "three"import { OrbitControls } from "three/examples/controls/OrbitControls.js" 报错: 3.解决办法: 3.1引入: im…

车道偏离预警系统技术规范(简化版)

车道偏离预警系统技术规范(简化版) 1 系统概述2 预警区域3 功能条件4 显示需求5 指标需求1 系统概述 车道偏离预警系统工作在中高速驾驶的情况下,当驾驶员因注意力不集中导致车辆偏离本车道时,系统通过光学和声学信号对驾驶员进行提醒,减少因此导致的交通事故。功能主要依…

嵌入式操作系统_4.任务管理

1.任务的概念 任务管理是嵌入式操作系统最基本功能之一,这里的任务(task)是指嵌入式操作系统调度的最小单位,类似于一般操作系统进程或线程的概念。任务是运行中的一个程序,一个程序加载到内存后就变成任务&#xff1…

将自己md文件发布到自己的博客园实现文件的持久化存储

上传markdown文件到博客园 目录 【0】需求原因【1】功能【2】环境【最佳实践测试】 (1)查看 Typora 设置(2)配置 pycnblog 配置文件 config.yaml(3)运行 pycnblog 中的文件 cnblog_markdown.cmd&#xff0…

基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2)

3、hispark_taurus产品解决方案-Vendor 产品解决方案为基于开发板的完整产品,主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为:vendor/{产品解决方案厂商}/{产品名称}_。_产品解决方案也是一个特殊的组…

CentOs7 安装mysql5.7

1.卸载原系统中的mariadb…… 首先执行命令rpm -qa|grep mariadb查看是否有mariadb的安装包,没有可以不管 接下来,执行 rpm -e --nodeps mariadb-libs #删除掉下载mysql5.7安装包 1.前往官方网站复制yum源链接Mysql官网 然后鼠标右键粘贴 wget 执行…

信息系统架构风格-系统架构师(十)

1、信息系统架构风格是描述特定应用领域中系统组织方式的惯用模式。架构风格定义了一个系统家族,即一个架构定义()。 A一组设计原则 B一组模式 C一个词汇表和一组约束 D一组最佳实践 解析: 信息系统架构风格是描述某一特定 应…

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

文章目录 1. 初识1.1 到手开箱1.2 OrangePi Kunpeng Pro1.2 上电 2. 安装Ubuntu2.1 准备工作2.2 安装 3. 安装ROS23.1 设置支持UTF-8的locale编码3.2 添加证书3.3 安装ROS3.4 设置环境变量3.5 小海龟来啦 4. 运行实例4.1 安装Gazebo4.2 安装turtlebot 总结 1. 初识 1.1 到手开…

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中,说到了数据“相关性”的概念,但是在统计学中,不仅存在“相关性”还存在“独立性”等等,所以,本文主要对数据“相关性”进行一些补充。当然,如果这篇文章还能入得了各位“看官…

openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写

文章目录 openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写300.1 概述300.2 使用指导300.2.1 前提条件300.2.2 使用方法示例300.3 获取帮助300.4 命令参考300.5 常见问题处理openGauss学习笔记-300 openGauss AI特性-AI…

MySQL问题篇2:关于IN字段不按照顺序返回问题

一、发现问题 数据库表结构如下: 其查询语句如下: SELECT* FROMdepartment WHEREdepartment_id IN (5,4,2,3,1) 其返回结果如下: 到此处我们发现了问题,其中我in写的是(5,4,2,3,1),其返回结果顺…

vue+elementUI实现在表格中添加输入框并校验的功能

背景: vue2elmui 需求: 需要在一个table中添加若干个输入框,并且在提交时需要添加校验 思路: 当需要校验的时候可以考虑添加form表单来触发校验,因此需要在table外面套一层form表单,表单的属性就是ref…

单触控单输出触摸开关芯片PT2052A

1.产品概述 PT2052封装和丝印 PT2052A 是一款单通道触摸检测芯片。该芯片内建稳压电路,提供稳定电压给触摸感应电路使用,同时内部集成高效完善的触摸检测算法,使得芯片具有稳定的触摸检测效果。该芯片专为取代传统按键而设计,具有…

【LeetCode】4,寻找两个正序数组中的中位数

题目地址 B站那个官方解答视频实在看不懂,我就根据他那个代码和自己的理解写一篇文章 1. 基本思路 在只有一个有序数组的时候,中位数把数组分割成两个部分。中位数的定义:中位数,又称中点数,中值。中位数是按顺序排列…

【QT5】<总结> QT主要技术点

文章目录 前言 一、QT串口编程 二、QT网络编程 三、QT多线程 四、QT连接数据库 五、开发板上运行QT程序 前言 在学习QT的过程中,旨在更好地巩固所学到的知识,本篇总结QT在嵌入式开发中的主要技术点。 一、QT串口编程 思维导图: 知识点…

webrtc新版本无法连接peerconnection_server、无法音视频互通no incoming video...问题解决

问题1:无法连接peerconnection_server 在webrtc大概2022之后的版本,会出现无法连接peerconnection_server的现象,如下图: 在peerconnection_client界面点击Connect无法连接server. 解决办法 我们需要修改peerconnection_client的main.cc代码,如下图: 新添加的类代码…

Python第二语言(十一、Python面向对象(下))

目录 1. 封装 1.1 私有成员:__成员、__成员方法 2. 继承:单继承、多继承 2.1 继承的基础语法 2.2 复写 & 子类使用父类成员 3. 变量的类型注解:给变量标识变量类型 3.1 为什么需要类型注解 3.2 类型注解 3.3 类型注解的语法 3.…

LeetCode452用最少数量的箭引爆气球

题目描述 有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points ,其中points[i] [xstart, xend] 表示水平直径在 xstart 和 xend之间的气球。你不知道气球的确切 y 坐标。一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处…