阅读gmapping参数文档发现表达上存在歧义,为了设置更好的建图参数,构建适合用于导航的栅格地图,对存在歧义的参数结合gmapping源码进行解析。
最后提供行室内建图的参数设置策略
以及个人DIY的全向轮小车建图结果展示
PART1 Gmapping参数分析
反转激光雷达数据,默认为false,当激光雷达反向安装时需要
用来求余的除数,越大则忽略的激光数据越多
参考下面的源码容易理解
laser_count_++;
if ((laser_count_ % throttle_scans_) != 0)
return;
默认除数为1,所有的被除数都可以整除,laser_count%throttle_scans余数都为0,所以激光数据会继续运算,不会return进行忽略
机器人的自身坐标系
建图的全局坐标系
里程计坐标系
栅格地图的建图时间间隔,因为耗费计算资源,所以默认值为5s生成一次栅格地图
激光雷达的最大探测距离
激光雷达的使用距离.源码中默认等于maxRange,与使用说明冲突
// setting maxRange and maxUrange here so we can set a reasonable default
// 设置激光雷达的最大观测距离和最大使用距离
ros::NodeHandle private_nh_("~");
if(!private_nh_.getParam("maxRange", maxRange_))
maxRange_ = scan.range_max - 0.01;
if(!private_nh_.getParam("maxUrange", maxUrange_))
maxUrange_ = maxRange_;
scan-match扫描匹配过程的标准偏差
/*设置匹配的参数*/
void ScanMatcher::setMatchingParameters
(double urange, double range, double sigma, int kernsize, double lopt, double aopt, int iterations, double likelihoodSigma, unsigned int likelihoodSkip)
{
m_usableRange=urange; //传感器的使用范围
m_laserMaxRange=range; //传感器的最大范围
m_kernelSize=kernsize; //kernsize主要用在计算score时搜索框的大小
m_optLinearDelta=lopt; //优化时的线性步长
m_optAngularDelta=aopt; //优化时的角度步长
m_optRecursiveIterations=iterations; //优化时的迭代次数
m_gaussianSigma=sigma; //计算socre时的方差
m_likelihoodSigma=likelihoodSigma; //计算似然时的方差
m_likelihoodSkip=likelihoodSkip; //计算似然时,跳过的激光束
}
扫描匹配过程的搜索窗口大小
scan-match中的optimization距离优化步长
scan-match中的optimization角度优化步长
scan-match中的optimization迭代次数
scan-match的似然计算的标准偏差
评估可能性时使用的增益,用于平滑重采样效果
对于一帧激光雷达数据来说 只取每第(n+1)个激光束 这个是相对于scan-match来说的。
如果n等于0 则取每第1帧激光束
如果n等于1 则取每第2帧激光束 也就是说使用的激光束变成原来的1/2
如果n等于2 则取每第3帧激光束 也就是说使用的激光束变成原来的1/3
scan-matching结果接受的最小得分
机器人的运动模型的相关的噪声参数,inear noise component (x and y)
机器人的运动模型的相关的噪声参数,angular noise component (theta)
机器人的运动模型的相关的噪声参数,linear -> angular noise component
机器人的运动模型的相关的噪声参数,angular -> linear noise component
只有当机器人至少移动了linearUpdate米,机器人才会处理新的测量数据,进行scan-match
只有当机器人至少旋转了angularUpdate弧度,机器人才会处理新的测量数据,进行scan-match
如果距离上次scan-match时间大于temporalUpdate(秒),则进行scan-match,负值则不更新
// process a scan only if the robot has traveled a given distance or a certain amount of time has elapsed
/*只有当机器人走过一定的距离 或者 旋转过一定的角度 或者过一段指定的时间才处理激光数据*/
if (! m_count
|| m_linearDistance>=m_linearThresholdDistance
|| m_angularDistance>=m_angularThresholdDistance
|| (period_ >= 0.0 && (reading.getTime() - last_update_time_) > period_))
{
粒子重新采样的阈值。更高意味着更频繁的重采样
粒子滤波的粒子个数
初始地图x方向最小尺寸
初始地图y方向最小尺寸
初始地图x方向最大尺寸
初始地图y方向最大尺寸
栅格地图分辨率,每个栅格为边长0.05m的正方形
scan-match中似然估计的平移采样范围
scan-match中似然估计的平移采样的步长
scan-match中似然估计的角度采样范围
scan-match中似然估计的角度采样的步长
发布map->odom的坐标转换关系,如果不需要发布坐标变换,则设置为0
栅格地图的占用阈值,超过则认为栅格被占用
下面进行主要参数设置的说明
设置激光雷达的探测距离,已知激光雷达测量范围是8m,为了避免边缘误差以及减小计算量,设置为5m
scan-matching结果接受的最小得分,如果scan-match中的optimize位姿优化得分score大于minimumScore,则认为优化成功,接受新的优化位姿作为粒子的位姿,否则使用里程计位姿。
推荐50-600,太高会导致无法优化成功,此处设置为100
激光雷达的发布频率为8Hz,为了充分利用激光数据提高定位优化效果,此处应结合机器人运动速度进行设置,考虑激光频率8Hz,运动速度0.3m/s,0.5rad/s,取0.2s扫描一次,则参数分别设置为0.1m和0.2rad
考虑室内环境设置30m*30m范围
测试两个参数linearUpdate和angularUpdate,以它们为变量设计实验表格,对全向轮小车的建图效果进行测试
参数 | 实验一 | 实验二 |
linearUpdate | 0.2m/s | 0.1m/s |
angularUpdate | 0.3rad/s | 0.2rad/s |
实验一和实验二的栅格地图如下
实验一和实验二建图效果相差不大
但是在实验二的建图过程中,由于0.3m/s的运动速度下更新较快,经常会出现程序卡顿现象,导致定位出现跳跃,但是由于Gmapping的定位优化,定位结果修正后符合实际位置。
实验一建图过程流畅,定位准确,无位姿跳跃情况
综合参数设置和实际建图效果可知,建图参数设置应当与小车速度,以及CPU计算性能相结合来设置