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

一、概述

sdf_map.cpp负责map_ros.cpp内部主体函数的具体实现,主要功能包括:

  1. 融合输入的深度或点云图生成全局占据栅格地图
  2. 根据launch参数生成全局膨胀占据栅格地图
  3. 基于膨胀占据栅格地图采用欧式距离传输生成局部的ESDF地图
  4. 采用三线性插值的方式得到某点的esdf值及梯度

备注:map_ros.cpp的主要函数说明:fuel无人机自主探索代码解读1——map_ros.cpp【地图ros接口】

二、主要函数及作用

1、SDFMap::initMap

作用:sdf map初始化
1、地图launch参数读取及相关数据生成
2、膨胀地图参数读取及相关数据生成
3、珊格地图、膨胀珊格地图、esdf等向量初始化
4、探索相关数据赋值
5、地图ros接口类初始化
6、ray-cast参数设置

2、SDFMap::resetBuffer()

作用:缓存重置
1、地图下边界珊格-----》地图上边界珊格:将对应珊格的膨胀占据珊格地图置于0;esdf参数值变更为初始值0.0
2、对当前帧点云AABB包围框的下界变为【000】索引,上界变为各轴方向的珊格总个数

3、SDFMap::resetBuffer(const Eigen::Vector3d& min_pos, const Eigen::Vector3d& max_pos)

作用:地图下边界珊格-----》地图上边界珊格范围内:将对应珊格的膨胀占据珊格地图置于0;esdf参数值变更为初始值0.0

4、SDFMap::fillESDF

输入【以z轴进行esdf更新为例(esdf先z后y再x)】:
1、匿名函数1:输入当前珊格z值,若膨胀珊格被占据则返回0,否则返回无穷大     
2、匿名函数2:输入珊格z索引及对应的esdf值,作用对对应的珊格位置的buffer进行esdf赋值      3、最小z值    
4、最大z值    
52【地图某一维珊格数量】
作用:对某一维度的珊格进行esdf值的求解。

5、SDFMap::updateESDF3d()

作用:针对膨胀后的局部点云帧包围框采用欧式距离传输方法进行esdf的计算【最近障碍物距离,结果存储在distance_buffer_中】
注意:无符号esdf:占据或未知为0,空白为正     有符号esdf:障碍物边缘珊格值为0,内部珊格值为负数,空白珊格为正

6、SDFMap::setCacheOccupancy

输入:
1、某雷达近似点对应的栅格索引的一位数组坐标    
2、是否占据标志位置【0表示空、1表示占据】
作用:给定的一维数组坐标压入缓存体素【当前帧点云该位置被首次访问】;若栅格空闲则count_miss_对应位置置于1;若栅格占据则count_hit_对应位置+1

7、SDFMap::inputPointCloud

输入:
1、世界坐标系下深度点云     
2、点云个数      
3、world坐标系下相机位置
作用:
1、寻找点云点的近似点【考虑考虑地图最大边界限制、相机的最大照射范围】,将相机位置到近似点做连线ray-cast,确定该连线上栅格位置occupancy_buffer_值
2、确定当前帧点云AABB包围框的上下边界【xy膨胀,z不变】后的局部包围框尺寸【钳制与地图范围内】
3、当前帧激光雷达点云修正后的最小和最大范围【考虑当前帧点云位置、相机位置、上一次边界搜索时相机位置【时间间隔不长】】

8、SDFMap::closetPointInMap

输入:
1、某激光点云点【超出地图范围】     
2、传感器位姿
作用:以传感器为中心,给定激光雷达点连线与地图边界的交点【返回值】

9、SDFMap::clearAndInflateLocalMap()

作用:
1、遍历膨胀后的当前帧点云AABB包围框内珊格:对于占据珊格,沿着前后上下左右6个方向膨胀给定珊格个数,对膨胀珊格集合进行occupancy_buffer_inflate_置1操作,其余为0
2、如果天花板高度大于-0.5,将对当前帧点云AABB包围框的上下边界【xy膨胀,z不变】后的局部包围框的天花板位置的珊格的occupancy_buffer_状态置于2.197

10、SDFMap::getResolution()

作用:得到sdf地图的栅格分辨率

11、SDFMap::getVoxelNum()

作用:得到整个地图范围的栅格总数

12、SDFMap::getRegion

作用:
1、得到地图原点坐标【地图的中心点坐标为【00】,左下角为地图原点,高度为给定的地面高度-1.02、地图xyz三轴方向的尺寸

13、SDFMap::getBox

作用:
获取被探索区域的边界框【launch读取】(double):下界限     上界限

14、SDFMap::getUpdatedBox

输入:
13d向量【点云范围的最小坐标】     
23d向量【点云范围的最大坐标】     
3true
作用:
得到当前点云的最小坐标【3d】和最大坐标【3d】

15、SDFMap::getDistWithGrad

输入:
1、给定真实位置     
2、给定位置处的梯度值【欲求】
返回值:给定位置的esdf值【经过三线性插值处理】
作用:采用三线性插值的方式得到给定位置的esdf数值及对应梯度值

三、参考资料

1、ray-cast
2、esdf更新
3、三线性插值

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

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

相关文章

深度学习面试题整理

文章目录 1. TensorFlow是什么?2. 计算图3. pytorch tensorflow4. 节点与张量类型5. tensorboard6. tensflow三个工作组件7. 大多数 TensorFlow 算法的常用步骤是什么?8. 处理TensorFlow中过拟合的方法9. 为什么出现过拟合10. 交叉验证11. 学习率12. 特征…

Python SMTP发送邮件时如何设置邮件地址?

Python SMTP发送邮件如何添加附件?如何使用SMTP发信? Python则通过其内置的smtplib模块和email模块为我们提供了实现这一功能的工具。在发送邮件的过程中,正确设置邮件地址是至关重要的,AokSend就来详细探讨一下如何在Python SMT…

韵搜坊 -- 前端整合Axios(联调后端)

文章目录 安装配置发送请求 官网:https://www.axios-http.cn/docs/intro 安装 npm install axios配置 坐标:plugins/myAxios.ts import axios from "axios";const instance axios.create({baseURL: "http://localhost:8101/api"…

Python专题:十三、日期和时间(1)

Python 日期和时间处理模块 模块就是别人写好的代码,通过将模块引入到代码里,使用已经实现好的功能 math模块,import模块名 time模块 时间戳:从公元1970年1月1日0点0分0秒起,到现在总共经历过的秒杀

Page对象的学习

在ASP.NET中,Page是一个核心对象,它代表了一个ASP.NET Web Forms页面。每一个.aspx文件在运行时都会被编译成一个Page类的实例,这个实例承载了页面的所有功能,包括处理用户输入、与数据库交互、渲染HTML输出等。 在ASP.NET Web F…

第 8 章 机器人底盘Arduino端编码器驱动(自学二刷笔记)

重要参考: 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 8.4.3 底盘实现_02Arduino端编码器驱动 测速是整个PID闭环控制中的必须环节,我们必须修改代码适配…

设计模式之策略模式(一)

背景: 下单时有很多情况,有的是用户下单,有的是卡密下单,有的是下游下单,有的是需要唤起支付,有的不需要支付,这样就需要写很多下单接口,下面使用策略模式优化这种情况 代码结构 com.example.order ├── controller │ └── OrderController.java ├── service │ …

使用frp通过SSH访问内网机器

frp是一个开源的内网穿透反向代理工具,支持传输层的tcp/udp协议,也支持应用层的http/https协议。 服务端 服务端下载安装 在有公网地址的机器上下载并解压。 wget -c https://github.com/fatedier/frp/releases/download/v0.58.0/frp_0.58.0_linux_a…

odoo16 银行对账单导入改造

解决问题: odoo原生功能的话 是不能在系统上临时处理文件内容的,只会提示文件内容格式不对。 原始文件格式 在头部与尾部 格式问题,例如csv文件和 C53 文件,做一个前置弹框处理数据之后再导入 camt效果: csv效果:

汇聚荣电商:拼多多开店需要多少费用?

想要在拼多多这个巨大的电商平台上开一家属于自己的店铺,很多创业者都会关心一个问题:开店需要多少费用?答案并不复杂,但背后的经营哲学和策略却值得深究。接下来,让我们从四个不同的方面来详细探讨这个问题。 一、开店成本分析 …

通过vue2来类比学习vue3

需求:之前有vue2基础,需要学习使用vue3;当然小白也可以(建议先学习vue2) 思路:如果已经学习完vue2,那么vue3直接就是小case 一、vue3页面结构(归纳为三种) 1.传统的vu…

GPT-4o,AI实时视频通话丝滑如人类,Plus功能免费可用

不开玩笑,电影《她》真的来了。 OpenAI最新旗舰大模型GPT-4o,不仅免费可用,能力更是横跨听、看、说,丝滑流畅毫无延迟,就像在打一个视频电话。 现场直播的效果更是炸裂: 它能感受到你的呼吸节奏&#xf…

10G UDP协议栈 IP层设计-(6)IP TX模块

一、模块功能 1、上层数据封装IP报文头部 2、计算首部校验和 二、首部校验和计算方法 在发送方,先把IP数据报首部划分为许多16位字的序列,并把检验和字段置零。用反码算术运算把所有16位字相加后,将得到的和的反码写入检验和字段。接收方收…

C++(week2):C语言中高级

文章目录 (八) 指针0.概念1.指针基础(1)指针的声明(2)指针的两个基本操作①取地址运算符 &②解引用运算符 * (3)野指针①野指针②空指针③指针变量的赋值 vs 指针变量指向对象的赋值 (4)指针的应用①指针作为参数进行传递②指针作为返回值③拓展:栈帧 (5)常量指…

【面试干货】HTTPS 工作原理

【面试干货】HTTPS 工作原理 1、握手阶段(Handshake)2、密钥协商阶段3、加密通信阶段4、结束通信阶段 💖The Begin💖点点关注,收藏不迷路💖 HTTPS(HyperText Transfer Protocol Secure&#xff…

C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能

文章目录 前言一、注意二、源码1. test.c源文件2. contact.h头文件3. contact.c源文件 总结 前言 C语言实现通讯录,包括增删改查以及动态开辟内存,写入文件等功能 一、注意 在通讯录菜单栏使用枚举定义PeoInfo类型时,每个结构体类型的成员…

Java保证字符串唯一(不唯一加数字后缀)

在Java中,如果你有一个字符串列表,并希望确保每个字符串都是唯一的,那么可以通过检查重复项并为重复的字符串添加后缀数字来实现。下面是一个示例代码,展示了如何操作字符串以确保不重复: import java.util.;public cl…

手撸XXL-JOB(一)——定时任务的执行

SpringBoot执行定时任务 对于定时任务的执行,SpringBoot提供了三种创建方式: 1)基于注解(Scheduled) 2)基于接口(SchedulingConfigurer) 3)基于注解设定多线程定时任务 基于Scheduled注解 首…

基于51单片机的冰箱控制系统设计( proteus仿真+程序+设计报告+原理图+讲解视频)

基于51单片机冰箱控制系统设计( proteus仿真程序设计报告原理图讲解视频) 基于51单片机冰箱控制系统设计 1. 主要功能:2. 讲解视频:3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单&&下载链接资料下载链接: …

【C++】学习笔记——继承_2

文章目录 十二、继承5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承 未完待续 十二、继承 5. 继承与友元 友元关系不能继承,也就是说父类友元不能访问子类私有和保护成员 。除非子类也设置成友元。 6. 继承与静态成员 父类定义了 static 静态成…