Ubuntu20.04下ORB-SLAM2稠密建图+octomap生成八叉树地图(下)

前言

还是接着之前的,稠密建图后保存可以得到一个vslam.pcd的点云,需要借助octomap_server创建八叉树地图,还是会遇到一些问题,具体参考的这篇博客

octomap_server

octomap_server是ROS中的一个基于octomap的功能包。

开始安装:

打开一个终端.(ctrl+alt+T)输入下面指令安装octomap.
sudo apt-get install ros-kinetic-octomap-ros #安装octomap
sudo apt-get install ros-kinetic-octomap-msgs
sudo apt-get install ros-kinetic-octomap-server
 
安装octomap 在 rviz 中的插件
sudo apt-get install ros-kinetic-octomap-rviz-plugins

测试安装成功

#开一个终端输入
roscore
#再开一个终端
rviz

点击rviz的add如果看到多一个octomap_rviz_plugins模组,就安装成功了。

 下载源码

完整的代码用的是前面大佬提供的下载链接,这里的data文件里有两个他提供pcd点云文件,我测试了下都是可以用的,不过我用前面自己保存的那个slam.pcd,也是可以成功运行的。

不过还是需要做一些小修改:

先找一个工作空间,把上面的代码git clone过来。

git clone https://gitcode.com/RuPingCen/publish_pointcloud.git

进入 /src/publish_pointcloud/src下的publish_pointcloud.cpp,修改下面路径:

 修改下面这行代码,改成自己的点云路径
nh.param<std::string>("path", path, "/home/fast-drone/test.pcd");
nh.param<std::string>("frame_id", frame_id, "camera");
nh.param<std::string>("topic", topic, "/pointcloud/output");
nh.param<int>("hz", hz, 5);
   
ros::Publisher pcl_pub = nh.advertise<sensor_msgs::PointCloud2> (topic, 10);  

pcl::PointCloud<pcl::PointXYZ> cloud;  
sensor_msgs::PointCloud2 output;  
pcl::io::loadPCDFile (path, cloud);  
pcl::toROSMsg(cloud,output);// 转换成ROS下的数据类型 最终通过topic发布

然后运行下面代码启动点云发布节点,如果没有成功运行,进入工作空间后source一下再运行

#开一个终端启动ros
roscore
#再开一个终端
rosrun publish_pointcloud publish_pointcloud

正常应该是可以看到下图,成功发布点云数据的topic  /pointcloud/output

再开一个新的终端输入

#打开rviz
rviz

点击add,添加 "PointCloud2模块"

设置topic为 "/pointcloud/output"

设置FixedFram为"camera"(如果不能选就手动输入“camera”)

这时候应该能看到下图的点云了。

在/src/publish_pointcloud/launch下有两个launch文件,是作者写好的用来集成的,如果上面一步成功实现,这两个launch文件是可以直接用的。

octomaptransform.launch是用来启动 octomap_server,而demo.launch是整个集成(包括启动rviz),下面来试一下。

1.octomaptransform.launch

#开第一个终端启动ros
roscore

#进入publish_pointcloud所在的工作空间,开第二个终端
#source一下,这里mumu是我的工作空间,根据自己的自行替换
source ~/mumu/devel/setup.bash
rosrun publish_pointcloud publish_pointcloud

#同第二步,还是进入mumu空间开启第三个终端
source ~/mumu/devel/setup.bash
roslaunch publish_pointcloud octomaptransform.launch

#最后第四个终端开启rviz
rviz

全部执行成功会如下图所示:这里左下会显示一个警告,我尝试过解决,不过好像不影响最终的点云显示。

[ WARN] [1715308792.012699791]: Nothing to publish, octree is empty

最后在rviz 中添加一个 “OccupancyGrid” 模块(三维格点). 设置 topic 为"/octomap_full",即可以得到如下结果:

注意:点云图是倾斜的,查询了一下好像是坐标转换出了问题,点击rviz左边的Grid下的Plane,后面有个坐标轴,默认是XY,可以改成XZ看看,不过看着还是有些倾斜,准备后面找个空旷点的地方采集自己的数据集再试试。

就成功辣!

demo.launch就是把上面的几个步骤集成为一个launch文件,会方便很多,效果是一样的,只需要进入所在工作空间执行下面代码,这里就不放图了。

roslaunch publish_pointcloud demo.launch

总结

得到八叉树地图,下一步就可以用这个地图进行路径规划了,不过这个点云效果看着还不是很好,准备先去户外用D435i采集自己的点云数据生成pcd文件后,再做成八叉树地图看看效果。

### 高翔 ORB-SLAM2 稠密地图原理 高翔提出的基于 ORB-SLAM2稠密地图方法是一种扩展性的改进方案,其核心目标是在稀疏特征点的基础上进一步生成更详细的三维环境表示。以下是该方法的主要组成部分及其工作原理: #### 1. **基础框架** ORB-SLAM2 是一种视觉 SLAM(Simultaneous Localization and Mapping)算法,主要通过稀疏特征点实现相机姿态估计和稀疏地图。然而,在许多实际应用中,仅依赖于稀疏特征点无法满足需求,因此需要引入稠密地图来提供更加丰富的场景信息。 为了支持稠密地图生成,高翔在其基础上进行了修改,加入了额外的功能模块用于处理密集点云数据[^1]。 #### 2. **稠密地图生成的核心流程** - **跟踪线程 (Tracking Thread)** 在跟踪线程中,系统会实时接收输入像并计算当前帧的姿态。对于每一帧像,除了完成基本的位姿估计外,还会提取深度信息并与对应的 RGB 数据关联起来。这些深度信息通常来源于双目摄像头或深度传感器[^3]。 - **局部线程 (Local Mapping Thread)** 局部线程负责维护局部区域的地图结构,并在此过程中插入新的关键帧到全局地图中。针对稠密地图的需求,高翔在这一阶段增加了 `mpPointCloudMapping->InsertKeyFrame` 函数调用,以便及时更新点云模型中的新观测结果[^4]。 - **回环检测与优化 (Loop Closure & Optimization)** 当检测到闭环时,不仅会对稀疏地图进行全局重定位调整,也会同步修正已有的稠密点云位置关系,从而消除累积误差带来的影响[^2]。 #### 3. **技术细节分析** ##### (1)**点云映射机制** 为了高效管理大量点云数据,采用了分层存储策略——即按需创多个子网格单元格分别记录不同范围内的空间分布情况。每当有新增加的关键帧被纳入考虑范畴之内时,都会触发一次完整的融合操作以确保最终输出成果尽可能贴近真实世界状况。 ##### (2)**颜色纹理贴附** 不同于传统仅有几何坐标的表达形式,这里还特别强调了如何附加色彩属性给每一个独立节点对象之上。具体做法是从对应像素处采样获取RGB值作为参考依据之一;如此一来便能够呈现出更为直观可视化的效果出来供后续环节利用。 ##### (3)**性能考量因素** 尽管上述设计带来了显著优势但也伴随着一定代价成本付出比如内存消耗增加以及运算时间延长等问题存在。为此作者议适当减少参与计算的有效视野角度大小或者降低分辨率参数设定等方式缓解压力同时兼顾质量表现平衡两者之间取舍关系达到最优状态配置条件之下运作良好。 ```python def insert_keyframe_to_pointcloud(keyframe, point_cloud_mapping): """ 插入关键帧至点云映射器 参数: keyframe: 新增的关键帧实例 point_cloud_mapping: 点云映射类的对象 返回: None """ point_cloud_mapping.InsertKeyFrame(keyframe) # 调用函数执行逻辑操作 ``` --- ###
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值