参数说明来源于 Mapper.cpp 中的 void Mapper::InitializeParameters() 方法。
m_pUseScanMatching = new Parameter(
// 是否使用扫描匹配方法进行匹配
"UseScanMatching",
"When set to true, the mapper will use a scan matching algorithm. "
"In most real-world situations this should be set to true so that the "
"mapper algorithm can correct for noise and errors in odometry and "
"scan data. In some simulator environments where the simulated scan "
"and odometry data are very accurate, the scan matching algorithm can "
"produce worse results. In those cases set this to false to improve "
"results.",
true,
GetParameterManager());
m_pUseScanBarycenter = new Parameter(
// 使用scan末端点的坐标的平均值 作为一帧scan与另一帧scan距离偏差的判定
"UseScanBarycenter",
"Use the barycenter of scan endpoints to define distances between "
"scans.",
true, GetParameterManager());
m_pMinimumTimeInterval = new Parameter(
// 2帧有效scan间的时间间隔,不满足这个时间间隔将舍弃最新scan
"MinimumTimeInterval",
"Sets the minimum time between scans. If a new scan's time stamp is "
"longer than MinimumTimeInterval from the previously processed scan, "
"the mapper will use the data from the new scan. Otherwise, it will "
"discard the new scan if it also does not meet the minimum travel "
"distance and heading requirements. For performance reasons, it is "
"generally it is a good idea to only process scans if a reasonable "
"amount of time has passed. This parameter is particularly useful "
"when there is a need to process scans while the robot is stationary.",
3600, GetParameterManager());
m_pMinimumTravelDistance = new Parameter(
// 2帧有效scan间的距离间隔,不满足这个距离间隔将舍弃最新scan
"MinimumTravelDistance",
"Sets the minimum travel between scans. If a new scan's position is "
"more than minimumTravelDistance from the previous scan, the mapper "
"will use the data from the new scan. Otherwise, it will discard the "
"new scan if it also does not meet the minimum change in heading "
"requirement. For performance reasons, generally it is a good idea to "
"only process scans if the robot has moved a reasonable amount.",
0.2, GetParameterManager());
m_pMinimumTravelHeading = new Parameter(
// 2帧有效scan间的角度间隔,不满足这个角度间隔将舍弃最新scan
"MinimumTravelHeading",
"Sets the minimum heading change between scans. If a new scan's "
"heading is more than MinimumTravelHeading from the previous scan, the "
"mapper will use the data from the new scan. Otherwise, it will "
"discard the new scan if it also does not meet the minimum travel "
"distance requirement. For performance reasons, generally it is a good "
"idea to only process scans if the robot has moved a reasonable "
"amount.",
math::DegreesToRadians(10), GetParameterManager());
m_pScanBufferSize = new Parameter(
// running scan 保存scan的个数,想要保存20米范围的雷达数据,用20/2帧雷达的最小距离值 得到个数
"ScanBufferSize",
"Scan buffer size is the length of the scan chain stored for scan "
"matching. \"ScanBufferSize\" should be set to approximately "
"\"ScanBufferMaximumScanDistance\" / \"MinimumTravelDistance\". The "
"idea is to get an area approximately 20 meters long for scan "
"matching. For example, if we add scans every MinimumTravelDistance == "
"0.3 meters, then \"scanBufferSize\" should be 20 / 0.3 = 67.)",
70, GetParameterManager());
m_pScanBufferMaximumScanDistance = new Parameter(
// running scan 保存 雷达数据的最大距离,第一帧与最新一帧间的距离偏差最大为20m
"ScanBufferMaximumScanDistance",
"Scan buffer maximum scan distance is the maximum distance between the "
"first and last scans in the scan chain stored for matching.",
20.0, GetParameterManager());
m_pLinkMatchMinimumResponseFine = new Parameter(
// response值超过这个阈值才算的上 是2个接近的scan,才能作为一个link chain
// 多机器人协同建图时,2个机器人的scan的匹配得分高于这个值才算 接近的位姿
"LinkMatchMinimumResponseFine",
"Scans are linked only if the correlation response value is greater "
"than this value.",
0.8, GetParameterManager());
m_pLinkScanMaximumDistance = new Parameter(
// 在 当前scan 10m的范围内找 near chain ,之后添加边
"LinkScanMaximumDistance",
"Maximum distance between linked scans. Scans that are farther apart "
"will not be linked regardless of the correlation response value.",
10.0, GetParameterManager());
//
// Loop Closing
m_pLoopSearchMaximumDistance = new Parameter(
// 在当前scan周围4米范围内寻找 可能的回环
"LoopSearchMaximumDistance",
"Scans less than this distance from the current position will be "
"considered for a match in loop closure.",
4.0, GetParameterManager());
m_pDoLoopClosing = new Parameter(
// 是否做回环检测
"DoLoopClosing",
"Enable/disable loop closure.",
true, GetParameterManager());
m_pLoopMatchMinimumChainSize = new Parameter(
// 作为一个有效的 chain 的最小scan 的个数
"LoopMatchMinimumChainSize",
"When the loop closure detection finds a candidate it must be part of "
"a large set of linked scans. If the chain of scans is less than this "
"value we do not attempt to close the loop.",
10, GetParameterManager());
m_pLoopMatchMaximumVarianceCoarse = new Parameter(
// 做 回环检测 时,粗 匹配的 最大的 协方差 的阈值
"LoopMatchMaximumVarianceCoarse",
"The co-variance values for a possible loop closure have to be less "
"than this value to consider a viable solution. This applies to the "
"coarse search.",
math::Square(0.4), GetParameterManager());
m_pLoopMatchMinimumResponseCoarse = new Parameter(
// 做 回环检测 时,粗 匹配的 最小 响应值 的阈值
"LoopMatchMinimumResponseCoarse",
"If response is larger then this, then initiate loop closure search at "
"the coarse resolution.",
0.8, GetParameterManager());
m_pLoopMatchMinimumResponseFine = new Parameter(
// 做 回环检测 时,精 匹配的 最小阈值(响应值)(匹配得分)
"LoopMatchMinimumResponseFine",
"If response is larger then this, then initiate loop closure search at "
"the fine resolution.",
0.8, GetParameterManager());
//
// CorrelationParameters correlationParameters;
m_pCorrelationSearchSpaceDimension = new Parameter(
// 匹配器使用的搜索网格的大小。搜索网格的大小将为 0.3 * 0.3
"CorrelationSearchSpaceDimension",
"The size of the search grid used by the matcher. The search grid will "
"have the size CorrelationSearchSpaceDimension * "
"CorrelationSearchSpaceDimension",
0.3, GetParameterManager());
m_pCorrelationSearchSpaceResolution = new Parameter(
// 扫描匹配所用网格的分辨率 0.01m
"CorrelationSearchSpaceResolution",
"The resolution (size of a grid cell) of the correlation grid.",
0.01, GetParameterManager());
m_pCorrelationSearchSpaceSmearDeviation = new Parameter(
//
"CorrelationSearchSpaceSmearDeviation",
"The point readings are smeared by this value in X and Y to create a "
"smoother response.",
0.03, GetParameterManager());
//
// CorrelationParameters loopCorrelationParameters;
m_pLoopSearchSpaceDimension = new Parameter(
// 用于回环检测的scan match的网格的初始化数据,网格大小: 8m * 8m
"LoopSearchSpaceDimension",
"The size of the search grid used by the matcher.",
8.0, GetParameterManager());
m_pLoopSearchSpaceResolution = new Parameter(
// 用于回环检测的scan match的网格的初始化数据,网格的分辨率 0.05m
"LoopSearchSpaceResolution",
"The resolution (size of a grid cell) of the correlation grid.",
0.05, GetParameterManager());
m_pLoopSearchSpaceSmearDeviation = new Parameter(
// 用于回环检测的scan match的网格的初始化数据,
"LoopSearchSpaceSmearDeviation",
"The point readings are smeared by this value in X and Y to create a "
"smoother response.",
0.03, GetParameterManager());
//
// ScanMatcherParameters;
m_pDistanceVariancePenalty = new Parameter(
// 扫描匹配时 偏离里程计坐标的 惩罚因子
// kt_double distancePenalty = 1.0 - (DISTANCE_PENALTY_GAIN (0.2) * squaredDistance / m_pDistanceVariancePenalty );
"DistanceVariancePenalty",
"Variance of penalty for deviating from odometry when scan-matching. "
"The penalty is a multiplier (less than 1.0) is a function of the "
"delta of the scan position being tested and the odometric pose.",
math::Square(0.3), GetParameterManager());
m_pAngleVariancePenalty = new Parameter(
// 角度偏差的惩罚因子
"AngleVariancePenalty",
"See DistanceVariancePenalty.",
math::Square(math::DegreesToRadians(20)), GetParameterManager());
m_pFineSearchAngleOffset = new Parameter(
// 精扫描匹配的角度搜索范围 0.2度
"FineSearchAngleOffset",
"The range of angles to search during a fine search.",
math::DegreesToRadians(0.2), GetParameterManager());
m_pCoarseSearchAngleOffset = new Parameter(
// 粗扫描匹配的角度搜索范围,20度
"CoarseSearchAngleOffset",
"The range of angles to search during a coarse search.",
math::DegreesToRadians(20), GetParameterManager());
m_pCoarseAngleResolution = new Parameter(
// 粗扫描匹配的角度分辨率,2度
"CoarseAngleResolution",
"Resolution of angles to search during a coarse search.",
math::DegreesToRadians(2), GetParameterManager());
m_pMinimumAnglePenalty = new Parameter(
// 角度惩罚值的最小值
"MinimumAnglePenalty",
"Minimum value of the angle penalty multiplier so scores do not become "
"too small.",
0.9, GetParameterManager());
m_pMinimumDistancePenalty = new Parameter(
// 距离惩罚值的最小值
"MinimumDistancePenalty",
"Minimum value of the distance penalty multiplier so scores do not "
"become too small.",
0.5, GetParameterManager());
m_pUseResponseExpansion = new Parameter(
// 如果最初没有找到合适的匹配项,是否增加搜索空间
"UseResponseExpansion",
"Whether to increase the search space if no good matches are initially "
"found.",
false, GetParameterManager());
}