kinect_v1-RGBD相机depth深度图像三维重建及八叉图显示

1 kinect_v1相机拍摄的rgb和depth环境
郝奇图像匹配及三维重建
2 ROS的RVIZ显示相机点云
郝奇相机三维点云

3 使用相机拍摄的depth图进行三维重建,并使用八叉图显示
3.1 八叉图
  SLAM的目的有两个:估计机器人的轨迹,并建立正确的地图。地图有很多种表达方式,比如特征点地图、网格地图、拓扑地图等。VSLAM一般使用点云地图,在程序中,要根据优化后的位姿,拼接点云,最后构成地图。
  这种做法很简单,但有缺陷明显:点云地图通常规模很大,所以一个pcd文件也会很大。一张640x480的图像,会产生30万个空间点,需要大量的存储空间。即使经过一些滤波之后,pcd文件也是很大的。点云地图提供了很多不必要的细节。在构建点云时,我们直接按照估计位姿拼在了一起。在位姿存在误差时,会导致地图出现明显的重叠,难以用于导航.地图的用处第一就是导航,有了地图,就可以指挥机器人从A点到B点运动.但是点云地图怎么导航?怎么知道哪些地方可通过,哪些地方不可通过,因此光有点是不够的.
  octomap就是为此而设计的,它可以优雅地压缩、更新地图,还可以调节分辨率!它以octotree八叉树的形式存储地图,每个树节点都有八个子节点!八叉树地图是由很多个小方块组成的,当分辨率较高时,方块很小;分辨率较低时,方块很大。每个方块表示该格被占据的概率。因此你可以查询某个方块或点“是否可以通过”,从而实现不同层次的导航。
  不同分辨率的octomap建立的地图如下所示,最后一个图8个正方体只占用了6个:
郝奇八叉图1
郝奇八叉图2
郝奇八叉图3郝奇八叉图43.2 八叉图octomap库的安装/配置和使用
 八叉图octomap使用需要安装octomap库,具体在
 https://github.com/OctoMap/octomap,库主要包含octomap和octovis(可视化程序),安装前需要安装依赖:

 $sudo apt-get install doxygen
 $sudo apt-get install ros-<version>-octovis
 库下载后,解压缩,在build中直接
 cmake ..
 make
 sudo make install

使用时需要在CmakeLists.txt中添加库路径和程序链接库

# octomap 
find_package( octomap REQUIRED )
include_directories( ${OCTOMAP_INCLUDE_DIRS} )

add_executable(aa.cpp )
target_link_libraries( a ${OpenCV_LIBS} ${PCL_LIBRARIES} ${OCTOMAP_LIBRARIES} )

图像内容原创,转载请注明链接:https://blog.youkuaiyun.com/qq_39534332/article/details/89368335

<think>我们正在讨论ORB-SLAM3中的RGBD.DepthMapFactor参数。该参数在RGB-D模式中使用,用于将深度图像中的深度值转换为实际深度(米)。 深度图像通常存储为16位无符号整数,每个像素的值表示深度传感器到物体的距离。然而,这个值通常不是以米为单位的,而是需要经过一个缩放因子转换。 例如,在Kinect等传感器中,深度值可能以毫米为单位,因此缩放因子为0.001(即1/1000)将深度值转换为米。但是,在ORB-SLAM3中,这个缩放因子是通过参数DepthMapFactor来设置的。 具体来说,DepthMapFactor的默认值在RGB-D模式下通常设置为5000.0。这是因为一些数据集(如TUM数据集)的深度图像存储方式为:深度值 = 实际深度(米) * factor。在TUM数据集中,这个factor是5000,即: 深度值 = 深度(米) * 5000 因此,要从深度图像中的像素值得到实际深度(米),需要除以5000.0。所以,在ORB-SLAM3中,设置DepthMapFactor=5000.0,意味着在读取深度图像时,程序会执行: 实际深度(米) = 深度图像中的值 / DepthMapFactor 为什么是5000?因为深度图像通常以16位存储(0~65535),而实际场景的深度范围一般在0~10米左右。使用5000作为因子,10米对应的深度值为50000,仍在16位表示范围内(小于65535)。同时,这样的因子可以提供足够的精度(例如,0.002米的精度,因为1/5000=0.0002米,但实际精度还受传感器限制)。 因此,DepthMapFactor的作用是将深度图像的像素值转换为以米为单位的实际深度值。如果使用不同的深度传感器或不同的数据集,可能需要调整这个因子。 例如,如果深度图像以毫米为单位存储,那么DepthMapFactor应设置为1000,因为: 实际深度(米) = 深度值(毫米) / 1000 在ORB-SLAM3的代码中,这个参数在读取深度图像时被使用。具体在`ORB_SLAM3/System.cc`的`TrackRGBD`函数中,或者更早的在加载参数时读取。 总结: - 作用:将深度图像中的像素值转换为以米为单位的实际深度- 设置5000.0的意义:适用于像TUM数据集这样,深度图像中存储的是实际深度乘以5000的值。 引用说明:ORB-SLAM3源代码及TUM数据集介绍[^1]。 §§相关问题§§ 1. 在ORB-SLAM3中,如何根据不同的深度相机调整DepthMapFactor参数? 2. ORB-SLAM3的RGB-D模式中,深度处理还有哪些其他步骤? 3. 如果DepthMapFactor设置错误,会对SLAM结果产生什么影响?</think>### ORB-SLAM3 中 RGBD.DepthMapFactor 参数详解 #### 1. **参数作用** 在 ORB-SLAM3 的 RGB-D 模式中,`DepthMapFactor` 是**深度值缩放因子**,用于将深度图像Depth Map)中的原始像素值转换为**实际物理深度(单位:米)**。其核心关系为: $$ \text{实际深度(米)} = \frac{\text{深度图像像素值}}{\text{DepthMapFactor}} $$ 深度传感器(如 Kinect 或 RealSense)输出的深度图像通常以 **16 位整数**(0~65535)存储深度信息。该参数通过除法操作实现单位标准化,确保后续算法使用统一的米制单位进行三维重建和位姿计算。 #### 2. **设置为 5000.0 的意义** - **典型场景适配**: 在 TUM RGB-D 等标准数据集中,深度图像的存储规则为: $$ \text{像素值} = \text{实际深度(米)} \times 5000 $$ 例如,一个距离 1 米的物体会被记录为像素值 5000。设置 `DepthMapFactor=5000.0` 可正确还原物理深度: $$ \text{实际深度} = \frac{5000}{5000} = 1.0 \text{(米)} $$ - **精度与范围平衡**: 5000 的因子可覆盖 **0~13 米**的深度范围($65535/5000 \approx 13.1$),同时保持 **0.2 毫米**的理论精度($1/5000 = 0.0002$ 米),满足室内 SLAM 的需求。 - **数据兼容性**: 主流 RGB-D 传感器(如 Kinect v1/v2)和数据集均采用此缩放比例,确保算法开箱即用[^1]。 #### 3. **配置错误的影响** 若参数设置不当: - **比例错误**(如误设 1000): 导致所有深度值放大 5 倍,点云被拉伸,轨迹计算失效。 - **单位混淆**(如误用毫米): 若深度单位为毫米却未调整因子,重建尺度将缩小 1000 倍。 #### 4. **自定义传感器配置** 若使用非标准设备(如自定义深度相机): 1. 测量已知距离物体在深度中的像素值 $d_{\text{pixel}}$。 2. 计算因子: $$ \text{DepthMapFactor} = \frac{d_{\text{pixel}}}{\text{实际深度(米)}} $$ 3. 在配置文件 `RGBD.yaml` 中修改参数: ```yaml DepthMapFactor: 5000.0 # 改为自定义值 ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值