【cartographer源码分析】系列的第四部分【io源码分析】。
现总结io文件夹涉及到的主要功能:
【1】file_writer.h
file_writer.h定义了多个用于文件写入的类
- FileWriter
- FileWriter是负责文件写入的虚基类没有数据成员.只提供一系列抽象接口.
- 包括3个抽象接口:
- WriteHeader(),写入文件head
- Write(),写入数据
- Close(),关闭文件
StreamFileWriter
- StreamFileWriter 文件流写入类,继承自FileWriter
- 数据成员只有一个std::ofstream out_负责将文件写入磁盘.
- 包括3个成员函数:
- WriteHeader(),写入文件head
- Write(),写入数据
- Close(),关闭文件
全局函数:
- using FileWriterFactory =
std::function< std::unique_ptr< FileWriter >(const string& filename)>;
工厂模式,
创建一个FileWriter对象,由智能指针管理生命期,
返回值是std::unique_ptr,
函数参数是string.
【2】io/points_batch.h:
【3】流水线-points_processor
整个IO文件夹实现了对点云数据的读取和存储,并且为了模块化,cartographer使用流水线作业的方式对点云进行处理(pipeline)。不同的.h文件抽象了流水线不同的处理器processor。并且类似于链表,每个在流水线上的processor都含有一个Next指针,执行下一阶段的processor。以此来执行作业。在assets_writer_backpack_2d.lua文件中有各个pipeline的处理流程.
【4】io/points_processor.h
points_processor.h文件夹定义了一个抽象基类PointsProcessor,抽象了所有在流水线上的processor的公有接口。提供一种批量处理points的方法。
类内数据结构:
- enum class FlushResult {
kRestartStream,//重启流水线
kFinished,//已完成作业
};
用于表达本处理器的当前状态,枚举值
2个抽象接口:
- virtual void Process(std::unique_ptr points_batch) =0;纯虚函数,Process()负责对PointsBatch进行处理
- Flush()刷新点云数据.
【5】min_max_range_filtering_points_processor
MinMaxRangeFiteringPointsProcessor是PointsProcessor的第一个子类(1).
【6】counting_points_processor.h
CountingPointsProcessor是PointsProcessor的第二个子类(2).
- .lua配置,可修改
- pipeline = {
action = “dump_num_points”,
}
- 功能:继承自PointsProcessor点云虚基类.记录有多少 point被输出处理
- 数据成员:
- num_points_记录points数量
- PointsProcessor* next_:完成本轮Processor,接下来进行下一次Processor.
- kConfigurationFileActionName =”dump_num_points”:每个处理器processor用于标识自己的名称
.
- 构造函数
- CountingPointsProcessor(PointsProcessor* next); 指定流水线next指针。
- 成员函数:
- Process(std::unique_ptr batch);//不处理points,而是将num_points_加上batch.size(),即统计点云数据。然后直接流水线到下一PointsProcessor
- FlushResult Flush() override;调用next_->Flush(),依据下一阶段的状态重置本阶段的状态。
【7】xray_points_processor.h
XRayPointsProcessor是PointsProcessor的第三个子类(3).
.lua配置,可修改
VOXEL_SIZE = 5e-2
YZ_TRANSFORM = {
translation = { 0., 0., 0. },
rotation = { 0. , 0., math.pi, },
}
*{
action = “write_xray_image”,
voxel_size = VOXEL_SIZE,
filename = “xray_yz_all”,
transform = YZ_TRANSFORM,
}
类内数据结构:
- struct ColumnData {
double sum_r = 0.;
double sum_g = 0.;
double sum_b = 0.;
uint32_t count = 0;
};
- struct Aggregation {
mapping_3d::HybridGridBase voxels;
std::map
【8】intensity_to_color_points_processor.h
ColoringPointsProcessor是PointsProcessor的第四个子类(4).处理强度到color point 的强度变换类
【9】ply_writing_points_processor.h
PlyWritingPointsProcessor是PointsProcessor的第五个子类(5).
PlyWritingPointsProcessor负责将点云point以PLY的格式写入磁盘.
【10】coloring_points_processor.h
ColoringPointsProcessor是PointsProcessor的第六子类(6).
【11】fixed_ratio_sampling_points_processor.h
FixedRatioSamplingPointsProcessor是PointsProcessor的第七个子类(7).
FixedRatioSamplingPointsProcessor是采样过滤器
【12】 outlier_removing_points_processor.h
OutlierRemovingPointsProcessor是PointsProcessor的第八个子类(8).
- .lua配置,可修改
- 功能:继承自PointsProcessor点云虚基类.体素过滤器,Remove有移动痕迹的体素。只保留没有移动的体素
- 类内数据结构:
- struct VoxelData {
int hits = 0;
int rays = 0;
};
- enum class State {
kPhase1,
kPhase2,
kPhase3,
};
数据成员:
- const double voxel_size_;//体素大小
- State state_;
- mapping_3d::HybridGridBase voxels_;包含多个体素的网格Grid。
- PointsProcessor* next_:完成本轮Processor,接下来进行下一次Processor.
- kConfigurationFileActionName=”voxel_filter_and_remove_moving_objects”:每个处理器processor用于标识自己的名称
.
构造函数
- OutlierRemovingPointsProcessor(double voxel_size, PointsProcessor* next);初始化体素大小和流水线next指针。
成员函数:
- Process(std::unique_ptr batch);//删除移动的体素。
- FlushResult Flush() override;调用next_->Flush(),依据下一阶段的状态重置本阶段的状态。
【13】pcd_writing_points_processor.h
PcdWritingPointsProcessor是PointsProcessor的第九个子类(9).
- .lua配置,可修改
- 功能:继承自PointsProcessor点云虚基类.将点云按照pcd格式存储在pcd文件中.
- 类内数据结构:
- struct VoxelData {
int hits = 0;
int rays = 0;
};
- enum class State {
kPhase1,
kPhase2,
kPhase3,
};
数据成员:
- int64 num_points_; //点云数量
- bool has_colors_; //是否是彩色
- PointsProcessor* next_:完成本轮Processor,接下来进行下一次Processor.
- kConfigurationFileActionName=”write_pcd”:每个处理器processor用于标识自己的名称
.
构造函数
- PcdWritingPointsProcessor(std::unique_ptr file_writer,
PointsProcessor* next);初始化一个文件类名和流水线next指针。
成员函数:
- Process(std::unique_ptr batch);//负责将点云按照PCD格式写入文件
- FlushResult Flush() override;调用next_->Flush(),依据下一阶段的状态重置本阶段的状态。
【14】null_points_processor.h
NullPointsProcessor是PointsProcessor的第十个子类(10)
空操作类。通常用于pipline的尾端,丢弃所有的点云,表示整个处理流程已经完毕。
- 成员函数:
- Process(std::unique_ptr batch);不作任何事情
- FlushResult Flush() override;返回”kFinished”状态,此操作会传递给上一个流水线。
关于io文件夹的源码分析已经完毕,更详细细节可在 这里 查看注释版源码。
本文发于:
- slam源码分析微信公众号:slamcode
- CSDN