(Visual Navigation)点云转地图信息
- 上一次总结了深度图转点云的详细过程 这一次总结一下点云怎么转化为机器人能理解的地图信息
文章目录
- Bin_Point
- 效果
- 基本思路
- 实现流程
- 代码实现
- 函数讲解
- 障碍判断
- torch.scatter
- 基本思路
- 代码实现
- 函数详解
- 有了地图信息机器人就需要[路径规划](https://blog.csdn.net/KNIGHT_HOY/article/details/122768199?spm=1001.2014.3001.5501)到达目标点
Bin_Point
效果
- 此时Z轴代表高度 Y代表深度 X代表左右
- 使用的是Facebook的开源仿真平台Habitat
- baseline参考/depth_utils.py
基本思路
- 按照高度信息将点云分为三类
- 将每一类都放到一个通道
- 获取到一个点则相应三通道矩阵的位置++
- 所以得到一个三通道的矩阵 包含空间位置信息和在高度三个层出现的次数
实现流程
- 输入(256,256,1)的depth img
- 分割出空间点云矩阵(256,256,3)三个通道分别代表X Y Z信息
- 根据高度信息将Z的数据归类到0 1 2 0代表底层 1代表中间层 2代表高层
- 将(256,256,3)转化为(1201,1201,3)的全局地图信息 转换过程使用np.bincount
代码实现
def bin_points(XYZ_cms, map_size, z_bins, xy_resolution):"""Bins points into xy-z binsXYZ_cms is ... x H x W x3Outputs is ... x map_size x map_size x (len(z_bins)+1)"""sh = XYZ_cms.shape# (1*256*256*3)XYZ_cms = XYZ_cms.reshape([-1, sh[-3], sh[-2], sh[-1]])n_z_bins = len(z_bins)+1 #3counts = []isvalids = []for XYZ_cm in XYZ_cms:isnotnan = np.logical_not(np.isnan(XYZ_cm[:,:,0]))# np.round 四舍五入X_bin = np.round(XYZ_cm[:,:,0] / xy_resolution).astype(np.int32)Y_bin = np.round(XYZ_cm[:,:,1] / xy_resolution).astype(np.int32)# np.digitize 有点归一化的意思 大概就是将数值映射到特定的范围里# 这里z_bins = 【20,150】所以小于20为0 20-150为1 大于150为2Z_bin = np.digitize(XYZ_cm[:,:,2], bins=z_bins).astype(np.int32)# 设置点云的范围# (256,256,7)isvalid = np.array([X_bin >= 0, X_bin < map_size, Y_bin >= 0, Y_bin < map_size,Z_bin >= 0, Z_bin < n_z_bins, isnotnan])# np.all()判断给定轴向上的所有元素是否都为True# np.any()判断给定轴向上是否有一个元素为True# (256,256)isvalid = np.all(isvalid, axis=0)# 编码ind = (Y_bin * map_size + X_bin) * n_z_bins + Z_binind[np.logical_not(isvalid)] = 0# np.bincount(x):返回一个数组,元数个数为x中最大的数 每个bin给出了它的索引值在x中出现的次数'''我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7x = np.array([0, 1, 1, 3, 2, 1, 7])索引0出现了1次,索引1出现了3次......索引5出现了0次......np.bincount(x)因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])如果minlength被指定,那么输出数组中bin的数量至少为它指定的数'''# ravel()方法将数组维度拉成一维数组count = np.bincount(ind.ravel(), isvalid.ravel().astype(np.int32),minlength=map_size*map_size*n_z_bins)count = np.reshape(count, [map_size, map_size, n_z_bins])counts.append(count)isvalids.append(isvalid)counts = np.array(counts).reshape(list(sh[:-3]) + [map_size, map_size, n_z_bins])isvalids = np.array(isvalids).reshape(list(sh[:-3]) + [sh[-3], sh[-2], 1])return counts, isvalids
函数讲解
- np.digitize()
# np.digitize 有点归一化的意思 大概就是将数值映射到特定的范围里# 这里z_bins = 【20,150】所以小于20为0 20-150为1 大于150为2Z_bin = np.digitize(XYZ_cm[:,:,2], bins=z_bins).astype(np.int32)
- np.bincount()
# np.bincount(x):返回一个数组,元数个数为x中最大的数 每个bin给出了它的索引值在x中出现的次数'''我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7x = np.array([0, 1, 1, 3, 2, 1, 7])索引0出现了1次,索引1出现了3次......索引5出现了0次......np.bincount(x)因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])如果minlength被指定,那么输出数组中bin的数量至少为它指定的数'''# ravel()方法将数组维度拉成一维数组count = np.bincount(ind.ravel(), isvalid.ravel().astype(np.int32),minlength=map_size*map_size*n_z_bins)
障碍判断
- obstacle 会在转化回来的Map(即count)的第一高度层判断是否叠加大于2
self.map = self.map + count(上文所得)
obstacle = self.map[:,:,1] >= 2
torch.scatter
基本思路
- 此处Z指向深度 Y指向高度 X指向左右
- 将rgb-d图像放进一个cnn得到 img-feature
- 将原来depth img下采样对应 img-feature的大小
- 将subsample depth img 转化为全局地图的点云
- 故地图信息为img-feature
代码实现
- 参考habitat_baselines/rl/models/projection.py
- 代码每一段都配上了图解
- _ss后缀为下采样后矩阵
- spatial_loc为点云信息
函数详解
- torch.scatter.scatter_max
有了地图信息机器人就需要路径规划到达目标点
(Visual Navigation)点云转地图信息相关推荐
- 视觉导航(一)Learning Object Relation Graph and Tentative Policy for Visual Navigation
Learning Object Relation Graph and Tentative Policy for Visual Navigation Abstract 视觉导航中最重要的是学习有用的视觉 ...
- 《Cognitive Mapping and Planning for Visual Navigation》读书笔记
原文链接:Cognitive Mapping and Planning for Visual Navigation 他山之石:学界 | 谷歌提交新论文提出认知型地图构建器和规划器:同时应对视觉导航的几 ...
- (Visual Navigation)深度图像转点云
深度图像即图像中包含深度信息(也就是距离信息)的单通道图像,每个像素反应的是图中的一点相对于相机的位置:左右位置 高度位置和深度位置 而视觉导航中比较常用的就是深度相机,通过深度相机的深度图像和rgb ...
- Visual Studio2010随云而动 特性大揭秘
随着云计算时代的到来,软件开发模式和商业模型都将进入全面开放组合的新时代.微软云计算平台Windows Azure,这将把微软带入一个崭新的时代.Azure来源于法语,语意为天空一样的湛蓝色,这也正是 ...
- 论文阅读《Calculation Method for Visual Navigation Integrity Monitoring》
目录 摘要 交叉参考相关专利申请 技术领域 1 背景 2 总结 3 图的简要说明 4 详细描述 摘要 本发明提供一种视觉导航完好性监测的计算方法.该方法利用合适的视觉定位模型.数学算法和丰富的导航测量 ...
- 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境
今天(北京时间 2019 年 11 月 4 日),在 Microsoft Ignite 2019 大会上,微软正式发布了 Visual Studio Online 公开预览版! 概览 Visual S ...
- 【论文系列】Long-term Visual Localization using Semantically Segmented Images--语义位置识别/ICRA2018
未经允许,不得转载 读Long-term Visual Localization using Semantically Segmented Images (语义位置识别) 这一篇是发表于ICRA201 ...
- 机器人学习--Hans Moravec在斯坦福博士论文1980年-Obstacle Avoidance and Navigation in the Real World by a Seeing Ro
Hans Moravec,占用栅格地图的发明人. Obstacle Avoidance and Navigation in the Real World by a Seeing Robot Rover ...
- 宇宙最強的IDE - Visual Studio 25岁生日快乐
每位开发者从入门开始或多或少都会接触过 Visual Studio , 现今的 Visual Studio 除了支持传统的 C++ , C# , Visual Basic.NET ,F# 的编程语言外 ...
最新文章
- 2014江苏省职称计算机,2014年江苏省职称计算机office多选题.doc
- 密度泛函DFT与神经网络
- ISE_软件基本使用流程(win10 的bug工程约束仿真烧写mcs固化)
- 转:WF中的跟踪服务(1):Sql跟踪数据库表,视图,存储过程等相关说明
- 微软发布新的 Azure Pipelines 功能和集成
- 肉体之爱的解释圣经_可以解释的AI简介,以及我们为什么需要它
- c语言读取文件到结构体数组,有关文件读写到结构体数组问题;
- 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.
- Android开发笔记(二十七)对象序列化
- Task10.Bert
- 基于机器学习与BERT的在线招聘欺诈检测平台
- asp.net程序中最常用的三十三种编程代码(转自CSDN)
- 点击流日志分析项目实战开发流程
- PyQt5实现局域网聊天工具
- 人口流动趋势matlab,数学建模-人口模型-人口预测
- 关于CSDN书写的博客内容中图片不显示的问题
- python爬取携程网旅游_爬取携程网(ajax动态加载)
- 负载均衡主要的实现技术
- (javaweb-09) Filter
- 计算机在石油工程中应用文献综述,石油与天然气工程领域工程硕士专业学位基本要求第一部分概况.PDF...
热门文章
- 如何把word中的图片怎么导出来呢?
- 简单的matlab实现哈夫曼(Huffman)编码
- 【算法讲14:拉格朗日插值】拉格朗日插值入门 与 拉格朗日插值差分法
- JQuery_003_事件绑定与解绑
- 机器学习-数据科学库 11 泰坦尼克号生还情况案例
- 智能指针之shared_ptr易错点05
- Android app 飞花令
- WINDOWS下如何安装GCC(转载http://nirvana.cublog.cn;作者:北斗星君(黄庠魁))
- 从0到1快速搭建个人网站(域名备案 + https免费证书)
- 在html中图文结合的怎么写,HTML作业1(图文混排)