这个程序可以把PCL点云压缩成带颜色的八叉树地图。

先看一下输入数据,是一个咖啡厅的一小部分:

程序运行后会生成带颜色的八叉树地图,使用octovis查看:

把输出结果按高度染色:

输入:任意PCL点云 <pointcloud.pcd> 

输出:八叉树地图 <pointcloud.ot>

运行:编译后在cmd里带参数才能运行         <pointcloud.pcd>        <pointcloud.ot>

示例:program,exe sample.pcd sample.ot

视频演示:https://www.bilibili.com/video/BV15NVb6zENo/

代码:

#include <iostream>
#include <assert.h>

//pcl
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>

//octomap 
#include <octomap/octomap.h>
#include <octomap/ColorOcTree.h>

using namespace std;

int main( int argc, char** argv )
{
    if (argc != 3)
    {
        cout<<"Usage: pcd2colorOctomap <input_file> <output_file>"<<endl;
        return -1;
    }

    string input_file = argv[1], output_file = argv[2];
    pcl::PointCloud<pcl::PointXYZRGBA> cloud;
    pcl::io::loadPCDFile<pcl::PointXYZRGBA> ( input_file, cloud );

    cout<<"point cloud loaded, piont size = "<<cloud.points.size()<<endl;

    //声明octomap变量
    cout<<"copy data into octomap..."<<endl;
    // 创建带颜色的八叉树对象,参数为分辨率,这里设成了0.05
    octomap::ColorOcTree tree( 0.05 );

    for (auto p:cloud.points)
    {
        // 将点云里的点插入到octomap中
        tree.updateNode( octomap::point3d(p.x, p.y, p.z), true );
    }

    // 设置颜色
    for (auto p:cloud.points)
    {
        tree.integrateNodeColor( p.x, p.y, p.z, p.r, p.g, p.b );
    }

    // 更新octomap
    tree.updateInnerOccupancy();
    // 存储octomap, 注意要存成.ot文件而非.bt文件
    tree.write( output_file );
    cout<<"done."<<endl;

    return 0;
}

参考:SLAM拾萃(1):octomap - 半闲居士 - 博客园

Logo

聚焦RDK与具身智能,汇集机器人开发教程、开源案例和技术交流

更多推荐