- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
Gmapping(fastSlam)
获取激光数据并处理
如果是第一个激光数据,则初始化粒子,每个粒子维护一幅地图map,机器人的位姿pose,上个时刻的位姿previousPose,权重weight,权重总和weightSum。
地图包括的信息有:
m_center:地图中心点(x,y)、m_worldSizeX:地图长度、m_worldSizeY:地图宽度、
m_delta:网格边长代表的长度。单位[m/cell]
m_xmin、m_xmax、m_ymin、m_ymax,分别对应地图横坐标最小值和最大值、纵坐标最小值和最大值。
粒子初始化,初始信息都相同
TNode*node=newTNode(initialPose,0,0,0);
ScanMatcherMaplmap(Point(xmin+xmax,ymin+ymax)*.5,xmax-xmin,
ymax-ymin,delta);
for(unsignedinti=0;isize;i++){
m_particles.push_back(Particle(lmap));
m_particles.back().pose=initialPose;
m_particles.back().previousPose=initialPose;
m_particles.back().setWeight(0);
m_particles.back().previousIndex=0;
//thisisnotneeded
//m_particles.back().node=newTNode(initialPose,0,node,0);
//weusetherootdirectly
m_particles.back().node=node;
}
geometry_msgs/Twist.msg
#Thisexpressesvelocityinfreespacebrokenintoitslinearandangularparts.
Vector3linear
Vector3angular
//获取激光在里程计坐标系上的坐标
tf::Stampedtf::Transformodom_pose;
try
{
tf_.transformPose(odom_frame_,centered_laser_pose_,odom_pose);
}
处理激光数据
GridSlamProcessor::processScan(constRangeReadingreading,intadaptParticles)
对于第一条数据:
计算激光在每个粒子相应的位姿所扫描到的区域
ScanMatcher::computeActiveArea(ScanMatcherMapmap,constOrientedPointp,constdouble*readings)
对每一束激光束,设start为该激光束起点,end为激光束端点(障碍物位置),使用Bresenham划线算法确定激光束经过的网格,算法原理如下:
设start、end所在直线方程为y=kx+b,首先通过直线的斜率确定了在x方向进行单位步进还是y方向进行单位步进:当斜率k的绝对值|k|1时,在x方向进行单位步进;当斜率k的绝对值|k|1时,在y方向进行单位步进。
下面以|k|1时推导Bresenham算法的数学依据:
如上图,已知有一直线y=kx+b,|k|1。我们通过斜率确定了x方向为单位步进。当x=时,y=。那么当x执行一个单位步进时(即x=+1时),y等于还是等于+1更符合这个直线方程呢?单凭肉眼我们很难得出结论,最好的办法当然是比较和+1和真实的方程的y值的差是多少(即Yreal=k*(+1)+b),看看哪一个更靠近真实的方程的y值。
我们设
Dupper=+1-Yreal=+1-k*(+1)+b);表示+1和方程真实值的差
Ddown=Yreal-=k*(+1)+b)-;表示和方程真实值的差
那就是我们要比较Dupper和Ddown的大小。假设
Diff=Dupper-Ddown=(+1-k*(+1)+b))-(k*(+1)+b)-)
令△X为线段x方向的间距(即|end.x-start.x|),△Y为线段y方向的间距(|end.y-start.y|)。
=△X*Diff=2*△X*-2*△Y*-2*△Y-△X
文档评论(0)