【cartographer源码分析】系列的第六部分【 mapping】。
现总结 mapping 文件夹涉及到的主要功能:
【1】 mapping/probability_values.h
probability_values.h定义了一系列与概率相关的函数–多个用于计算概率的mapping命名空间下的全局函数。cartographer所有的概率不是以0-1.0表示,而是通过浮点数到整数的映射: [1, 32767],避免浮点数运算。
全局函数
* inline float Odds(float probability) { //论文公式(2),求胜负比。y=x/(1-x) return probability / (1.f - probability); } * inline float ProbabilityFromOdds(const float odds) { //求概率,即x=y/(1+y) return odds / (odds + 1.f); } * constexpr float kMinProbability = 0.1f;//p最小是0.1 * constexpr float kMaxProbability = 1.f - kMinProbability;//最大是0.9 * inline float ClampProbability(const float probability);限制概率p在[0.1,0.9]之间 * constexpr uint16 kUnknownProbabilityValue = 0;//标记未初始化的概率 * constexpr uint16 kUpdateMarker = 1u << 15;// 32768 * inline uint16 ProbabilityToValue(const float probability) 将概率p映射为整数Value[1,32767] * extern const std::vector< float>* const kValueToProbability; 声明,定义在.cc文件。vector是value到p的映射 * inline float ValueToProbability(const uint16 value);映射 [1,32767]->[0.1,0.9]
std::vector< uint16> ComputeLookupTableToApplyOdds(float odds);//2份value:前一半对应没有hit,后一半对应hit。
之前没有hit过,则没有update,按论文公式(2)计算: 求p, 求[1,32767], 求[1,32767]+32768 push_back() 之前有hit过,则有update,按论文公式(3)计算: 求(*kValueToProbability)[cell]->[0.1,0.9]即原始p 求p'=odds*Odds(p) 求p'映射到[1,32767] push_back():[1,32767]+32768.
【2】id.h
该文件定义了一系列用于标记轨迹的数据结构,包括:
struct NodeId
{ int trajectory_id; int node_index; }
每一个轨迹trajectory上有多个节点node。节点标号:轨迹id+{0,1,2,…}.
struct SubmapId {
int trajectory_id; int submap_index; }
重建全局地图global map时,是由多个submap组成。submap标号: 轨迹id+ {0,1,2,3…}
NestedVectorsById
- 作用:嵌套存储多条轨迹线上的数据
- 数据成员:vector< vector > data_;
- 对外提供4个操作:
- IdType Append(int trajectory_id, const ValueType& value) 根据轨迹id和data添加数据
- const ValueType& at(const IdType& id)查询某轨迹对应的vector的data
- num_indices(),某轨迹对应的数据的大小
- int num_trajectories() 轨迹数量