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个:
3.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.csdn.net/qq_39534332/article/details/89368335