Khepera III 工具箱/示例/里程计校准
在本教程中,您将学习如何校准机器人的里程计。有各种方法可以校准差速驱动机器人的里程计。我们这里展示的程序也许不是最精确的,但它肯定是最简单的方法之一,可以快速获得不错的校准值。
您的 Khepera III 机器人配备了两个直流电机,每个电机都带有一个编码器。这些编码器允许以非常小的增量(~ 2760 步对应一个轮子的转动)获得机器人的当前位置。通过记录轮子是如何转动的,就可以估计机器人的轨迹。此过程通常被称为里程计(或使用里程计进行位置估计),并在odometry_track程序中实现。
此过程的主要问题是误差累积。在每一步(每次您进行编码器测量时),位置更新都会涉及一些误差。此误差会随着时间的推移而累积,因此会使长距离(> 10 米)上的准确跟踪变得不可能。然而,在短距离(< 1 米,在平坦表面上),里程计可以提供非常精确的结果。
为了获得这些良好的结果,校准机器人至关重要。车轮直径的微小差异(~ 1 微米)会在几米后导致重大误差,如果它们没有被正确地考虑在内。请注意,每个机器人(如果您有多个)都必须单独校准,最好是在它之后将要使用的同类型的地板上。
启动 Khepera III 机器人,并确保它通过 WLAN 连接到您的计算机。在下文中,我们假设您使用的是机器人 203。
您将需要几个电机程序和odometry_goto程序来进行校准。使用以下命令将这些程序复制到您的机器人上:
cd Programs k3put +203 motor* odometry_goto
登录机器人(k3go +203)并初始化电机
cd your_username ./motors_initialize
您现在已准备好校准机器人的里程计。
在差速驱动系统中,有 3 个自由参数需要知道才能使用里程计估计位置:
- 左轮的每个增量距离(转换因子)。
- 右轮的每个增量距离(转换因子)。
- 两个轮子之间的距离(轴长)。
由于这些参数很难直接测量,因此我们将改为测量 4 个参数,这些参数可以让我们推导出上述参数。这 4 个参数按测量顺序排列如下:
- increments_per_tour:每个轮转数的增量数。
- axis_wheel_ratio:轴长与平均车轮直径的比率。
- diameter_left 和 diameter_right:两个车轮的直径,以缩放因子为单位。(实际上,是两个车轮直径之间的比率 - 这就是为什么这两个值只算作一个参数。)
- scaling_factor:一个缩放因子。
然后可以按如下方式推导出必要的参数:
distance_per_increment_left = wheel_diameter_left * scaling_factor * 2 * PI / increments_per_tour distance_per_increment_right = wheel_diameter_right * scaling_factor * 2 * PI / increments_per_tour axis_length = axis_wheel_ratio * (wheel_diameter_left + wheel_diameter_right) / 2 * scaling_factor
这些方程在calibration.pl中实现,它将创建一个校准文件并将其上传到机器人上。
每个轮转数的增量数是一个常数,仅取决于使用的编码器和齿轮箱。对于 Khepera III 机器人,此值为 2764.8(4 * 16 * 1.6 * 27)。
您可以通过在轮子上标记一个点,然后让它们移动这个增量数来实验验证这个数字:
./motor_setposition 0 0 ./motor_gotoposition 2765 2765
您的标记应该正好回到同一个位置。
轴长和车轮直径只能用标准测量工具进行近似测量。但是,它们的比率可以通过让机器人原地旋转并计算步数来非常精确地测量。此步数除以 2764.8 直接得到我们正在寻找的比率。当然,为了获得更精确的值,我们将让机器人进行多次旋转。
根据使用尺子的粗略测量,我们知道这个比率大约为 2.11(88.5 毫米 / 42 毫米),因此让我们从这个值开始,让机器人原地旋转 10 次。为此,位置值将为
10 * 2.11 * 2764.8 = 58337.28
将机器人放在地上,标记其方向,然后输入
./motor_setposition 0 0 ./motor_gotoposition -p 58337 -58337
-p 选项将启用梯形速度曲线。机器人停止后,它的方向应该几乎与开始时相同,但很可能会有几度的偏差。通过调整位置值,使其方向完全相同(只要您能用肉眼判断出来)。一旦您找到了一个好的值(假设为 58255),只需反向计算即可找出比率:
58255 / (10 * 2764.8) = 2.1070
如果您想获得更精确的值,可以重复上述实验,进行 100 次旋转。
为了实验找出两个车轮之间的直径差异,我们将加载当前的里程计模型到机器人上,然后让它在您的场地周围移动,同时跟踪它的位置。最后,我们让机器人移动回它认为的起点,并记录与真实初始位置的偏移量。
首先,我们需要上传当前的里程计值。编辑calibration.pl并执行它:
./calibration.pl
如果在此脚本中设置了机器人的 IP 地址,它将把里程计值上传到机器人上。(请注意,任何现有里程计值都将被无情地覆盖。)否则,您必须自己编辑机器人上的/etc/khepera/odometry文件。
您在开头上传的odometry_goto程序现在将使用这些值来跟踪位置。将机器人放在一个开放区域,周围至少有 1 米的空间,标记其位置,然后输入
./odometry_goto position 1 0 1 1 0 1 0 0
机器人现在将移动到一个宽度为 1 米的正方形的所有角点,因此将覆盖大约 4 米的距离。最后,机器人认为它回到了初始位置(尽管方向不同),但很可能偏离了 30 厘米。比较最终位置和初始位置(忽略方向),然后按如下方式调整车轮直径差异:
- 如果机器人位于其初始位置的右侧(即正方形没有闭合),则通过增加calibration.pl中的wheel_diameter_difference来增加右轮的直径。
- 如果机器人位于其初始位置的左侧,则通过减少calibration.pl中的wheel_diameter_difference来增加左轮的直径。
然后,上传新的里程计值并重复此步骤,直到初始位置和最终位置之间的距离小于 5 厘米。如果您有足够的空间,可以增加矩形的尺寸以获得更精确的测量结果。
缩放因子同样很容易找出。将机器人放在您的地板上,它前面有一个 1 米的开放区域,标记其初始位置,然后输入
./odometry_goto position 1 0
机器人将停在初始位置前大约 1 米处。用卷尺精确测量该距离,然后按如下方式计算相应的缩放因子:
scaling_factor = real_distance / 1 m
当然,如果您有足够的空间,可以选择更长的距离。
调整calibration.pl中的缩放因子,并再次执行该脚本,将最新的里程计校准值上传到机器人上。您的机器人现在已校准!