• 上一次总结了深度图转点云的详细过程 这一次总结一下点云怎么转化为机器人能理解的地图信息

    文章目录

    • 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)点云转地图信息相关推荐

  1. 视觉导航(一)Learning Object Relation Graph and Tentative Policy for Visual Navigation

    Learning Object Relation Graph and Tentative Policy for Visual Navigation Abstract 视觉导航中最重要的是学习有用的视觉 ...

  2. 《Cognitive Mapping and Planning for Visual Navigation》读书笔记

    原文链接:Cognitive Mapping and Planning for Visual Navigation 他山之石:学界 | 谷歌提交新论文提出认知型地图构建器和规划器:同时应对视觉导航的几 ...

  3. (Visual Navigation)深度图像转点云

    深度图像即图像中包含深度信息(也就是距离信息)的单通道图像,每个像素反应的是图中的一点相对于相机的位置:左右位置 高度位置和深度位置 而视觉导航中比较常用的就是深度相机,通过深度相机的深度图像和rgb ...

  4. Visual Studio2010随云而动 特性大揭秘

    随着云计算时代的到来,软件开发模式和商业模型都将进入全面开放组合的新时代.微软云计算平台Windows Azure,这将把微软带入一个崭新的时代.Azure来源于法语,语意为天空一样的湛蓝色,这也正是 ...

  5. 论文阅读《Calculation Method for Visual Navigation Integrity Monitoring》

    目录 摘要 交叉参考相关专利申请 技术领域 1 背景 2 总结 3 图的简要说明 4 详细描述 摘要 本发明提供一种视觉导航完好性监测的计算方法.该方法利用合适的视觉定位模型.数学算法和丰富的导航测量 ...

  6. 重磅!微软发布 Visual Studio Online:Web 版 VS Code + 云开发环境

    今天(北京时间 2019 年 11 月 4 日),在 Microsoft Ignite 2019 大会上,微软正式发布了 Visual Studio Online 公开预览版! 概览 Visual S ...

  7. 【论文系列】Long-term Visual Localization using Semantically Segmented Images--语义位置识别/ICRA2018

    未经允许,不得转载 读Long-term Visual Localization using Semantically Segmented Images (语义位置识别) 这一篇是发表于ICRA201 ...

  8. 机器人学习--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 ...

  9. 宇宙最強的IDE - Visual Studio 25岁生日快乐

    每位开发者从入门开始或多或少都会接触过 Visual Studio , 现今的 Visual Studio 除了支持传统的 C++ , C# , Visual Basic.NET ,F# 的编程语言外 ...

最新文章

  1. 2014江苏省职称计算机,2014年江苏省职称计算机office多选题.doc
  2. 密度泛函DFT与神经网络
  3. ISE_软件基本使用流程(win10 的bug工程约束仿真烧写mcs固化)
  4. 转:WF中的跟踪服务(1):Sql跟踪数据库表,视图,存储过程等相关说明
  5. 微软发布新的 Azure Pipelines 功能和集成
  6. 肉体之爱的解释圣经_可以解释的AI简介,以及我们为什么需要它
  7. c语言读取文件到结构体数组,有关文件读写到结构体数组问题;
  8. 深度学习 GPU环境 Ubuntu 16.04 + Nvidia GTX 1080 + Python 3.6 + CUDA 9.
  9. Android开发笔记(二十七)对象序列化
  10. Task10.Bert
  11. 基于机器学习与BERT的在线招聘欺诈检测平台
  12. asp.net程序中最常用的三十三种编程代码(转自CSDN)
  13. 点击流日志分析项目实战开发流程
  14. PyQt5实现局域网聊天工具
  15. 人口流动趋势matlab,数学建模-人口模型-人口预测
  16. 关于CSDN书写的博客内容中图片不显示的问题
  17. python爬取携程网旅游_爬取携程网(ajax动态加载)
  18. 负载均衡主要的实现技术
  19. (javaweb-09) Filter
  20. 计算机在石油工程中应用文献综述,石油与天然气工程领域工程硕士专业学位基本要求第一部分概况.PDF...

热门文章

  1. 如何把word中的图片怎么导出来呢?
  2. 简单的matlab实现哈夫曼(Huffman)编码
  3. 【算法讲14:拉格朗日插值】拉格朗日插值入门 与 拉格朗日插值差分法
  4. JQuery_003_事件绑定与解绑
  5. 机器学习-数据科学库 11 泰坦尼克号生还情况案例
  6. 智能指针之shared_ptr易错点05
  7. Android app 飞花令
  8. WINDOWS下如何安装GCC(转载http://nirvana.cublog.cn;作者:北斗星君(黄庠魁))
  9. 从0到1快速搭建个人网站(域名备案 + https免费证书)
  10. 在html中图文结合的怎么写,HTML作业1(图文混排)