ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)

时间:2024-04-05 13:03:20

概述

AMCL的主要参数请参照http://wiki.ros.org/amcl,要了解参数详细意义还是读读论文吧,我也不是很懂,怕误导。这里主要讲几个amcl与导航堆栈联系较深的参数,以及如何理解和配置导航堆栈里的footprint参数,因为两者联系很紧密,就放到一起来讲了。

重要参数概览

默认订阅的话题:/scan
~transform_tolerance (double, default: 0.1 seconds)
~initial_pose_x (double, default: 0.0 meters)
~initial_pose_y (double, default: 0.0 meters)
~initial_pose_a (double, default: 0.0 radians)
~odom_frame_id (string, default: “odom”)
~base_frame_id (string, default: “base_link”)
~global_frame_id (string, default: “map”)

参数配置原则

~这个,代表参数的命名空间为/(默认命名空间)
~transform_tolerance:amcl要监听TF变化,这个值表示可以相信多少s前接收到的TF变化,一般略高于1/(TF发布频率)。

~initial_pose_x:代表将机器人初始化放在地图的哪个x坐标位置。
~initial_pose_y:同上。
~initial_pose_a:同上。
(0,0,0)代表你建图的起始出发点,此点即为map坐标系原点。

~odom_frame_id :里程计坐标系名
~base_frame_id :机器人“本体”坐标系,what is 本体,后面详细讲。
~global_frame_id:全局坐标系,一般为map坐标系。

需要的TF

需要的tf:base_link->laser_link、odom->base_link。

base_link的重要地位

base_link与base_footprint到底是什么,好像在什么地方都能看见它们的踪迹,以下几点有助于我们理解:
1、这里有一个重要默认:move_base默认base_link的z坐标为0。

2、除了上面1所述,base_link与base_footprint没有差别了。

3、base_link与base_footprint其中之一应放置在机器人的旋转中心,由1、2所述,它们z坐标通常不同,x、y坐标有时不同,这样设置的必要性见下。

4、上述的应放置的意思是大家一般都遵守这样的规范,以保证功能包有好的可移植性。

5、旋转中心是指对于机器人原地旋转的圆心(旋转时x、y坐标不变的那个轴上的点),差分轮式的机器人显然可以,麦克阿姆也可以。阿克曼型的应为机器人外形的几何中心。

6、上述3中设置的必要性在于:gazebo从xacro文件生成机器人时,机器人每一个link的坐标系所在的位置为该link的几何中心。比如对于一个球,其坐标系就在其球心,这不仅是一种原理,更是我们在编写xacro文件时需要注意的问题。很多时候如果我们只用一个base_link去对应机器人的本体的话,那么base_link将在本体中心,由陈述1知:机器人的下半部分本体z值将为负数,这意味着什么?,倒不是什么致命错误,只是在rviz中显示时机器人会有一半沉在地下,不太优美。为了解决这个问题,我们将base_footprint设为机器人本体坐标系,然后将base_footprint这个坐标系设置在base_link“上方”,由陈述1知base_link的z为0,这样机器人本体的中心不就上去了吗?就不会导致机器人沉入地底了。这样的设置方式是陈述4中应设置的详细解释。

7、上述3中base_link需要设置在旋转中心的必要性在于:陈述6已经讨论出来了base_footprint与base_link之间的设置方法。这里选择base_link设置在旋转中心来说明其必要性,指向答案的问题是:机器人原地旋转时,我导航堆栈、amcl如何知道你是原地旋转而不是其它动作?,思考一下导航堆栈的必需与amcl的必需就知道,是TF!,也就是说机器人本体坐标(假设其是任意的)在原地旋转过程中应该只能有角度上的变化,而不应该有x、y(位置)上的变化,只有一根轴满足这样的条件,那就是机器人的旋转中心轴,而这根轴上z为0的点只有一个,对于一个机器人来说这是唯一的,这个唯一的点所在之处,move_base给了它一个名字叫base_link(默认值),所以它是特殊的,对于一个机器人来说也是唯一的。怎样知道base_link在哪里呢?,TF嘛,所以导航堆栈也好、amcl也罢,都需要TF变化。同样也可以设置base_footprint在旋转中心轴上,注意因为这不是默认,需要告诉amcl与move_base你要使用base_footprint来定位机器人。如果没有满足上述的设置原则,导航堆栈、地图就会有莫名其妙的问题、漂移啊这些就出现了。

如图:
ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)
ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)
ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)

我的小车的两个差速轮不在车的中心,而是在车的后面,所以必须设置base_link到车的旋转中心,为什么不设置base_footprint为?请看前面陈述6,我机器人本体不想用base_footprint用其它名字可以吗?可以,但请参照陈述4。

绿色的框框是什么,这就是footprint啊!

还记得前面说的旋转中心的那个点吗,唯一的、默认为base_link的,它既是base_link所在,也是计算footprint这个框框的原点,如图:
ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)
大多数差速小车是2这样的,旋转中心在外形的几何中心。
我的小车是1这样的,这里推荐使用右手坐标系,与base_link坐标系一致,取点方向为顺时针。也可以随意取,只要保证原点是base_link。
我的取值应是:
footprint: [[0.7, 0.25], [0.7, -0.25], [-0.1, -0.25], [-0.1, 0.25]]
这个是需要输入给导航堆栈的,这个参数对于方形机器人很重要,如果想更加保证机器人的安全,可以把footprint设置得肥一点。

回到amcl

有了上述预备知识,我们就知道了,~base_frame_id 这个参数应该设置成在机器人旋转中心的那个坐标系(base_link或base_footprint),如果我们的机器人这两个坐标系没有一个在,那么就需要遵循前面说的原则设置,配置好后才能发挥amcl的全部力量。否则无论是amcl还是导航堆栈都会出现致命错误

TF小小结

ROS中amcl配置需要特别注意的问题(base_link、base_footprint、footprint的联系)
base_frame建议就按照以上原则设置成base_link。
amcl估计出了base_frame在地图中位置。
而我们由发布了一个odom_frame到base_frame的tf变化,由于tf树只能有一个父节点的原则,amcl于是就发布map到odom的变化啦。

为什么不直接发布map到base_link的变化,非得需要odom?
odom、map的配置以及与base_link的联系? 请见我其它博客。