两个差速器轮中的每一个都有一个增量传感器。两个传感器都确定距离$ \ Delta左$。 $ \ Delta right $的轮子在已知的时间$ \ Delta t $滚动。
首先,让我们假设两个轮子之间的中心标志着机器人的位置。在这种情况下,可以将位置计算为:
$$
x = \ frac {x_ {left} + x_ {right}} {2} \\
$$
“推导”这些方程式的前提是两个轮子都沿一条直线滚动(这应该大约是正确的距离),我得到:
$$
\ frac {\ Delta x} {\ Delta t} = \ frac {1} {2} \ left(\ frac {\ Delta左} {\ Delta t} + \ frac {\ Delta右} {\ Delta t} \ right)cos(\ theta)\\
\ frac {\ Delta y} {\ Delta t} = \ frac {1} {2} \ left(\ frac {\ Delta左} {\ Delta t} + \ frac {\ Delta右} {\ Delta t} \ right)sin(\ theta)
$$
其中$ \ theta $是机器人的定向角度。对于这个角度的变化,我找到了等式
$$
\ frac {\ Delta \ theta} {\ Delta t} = \ frac {1} {w} \ left(\ frac {\ Delta left} {\ Delta t}-\ frac {\ Delta right} {\ Delta t} \ right)
$$$
其中$ w $是两者之间的距离
由于$ \ Delta x $和$ \ Delta y $取决于$ \ theta $,我想知道是否应该先通过添加$ \ Delta \ theta $来计算新的$ \ theta $还是我宁愿使用“旧” $ \ theta $?
然后,让我们假设两个轮子之间的中心未标记机器人的位置。相反,我想使用一个标记机器人边界框的几何中心的点。然后$ x $和$ y $更改为:
$$
x = \ frac {x_ {left} + x_ {right}} {2} + l \,cos(\ theta)\\
y = \ frac {y_ {left} + y_ {right}} {2} + l \,sin(\ theta)
$$
”派生“第一个给出:
$$
\ frac {\ Delta x} {\ Delta t} = \ frac {1} {2} \ left(\ frac {\ Delta left} {\ Delta t} + \ frac {\ Delta right} {\ Delta t} \ right)cos(\ theta)-l \,sin(\ theta)\,\ frac {\ Delta \ theta} {\ Delta t}
$$
现在依赖于$ \ Delta \ theta $。这是使用“新” $ \ theta $的原因吗?
是否有更好的方法来进行位置和方向的模拟更新?可能使用复数(与3D中的四元数相同的方法?)还是齐次坐标?
#1 楼
回答您的第一个问题:如果您真的想找到差动驱动的真正运动学方程,则我不会通过假设每个车轮都沿直线运动来开始近似。相反,找到转弯半径,计算圆弧的中心点,然后计算机器人的下一个点。如果机器人笔直移动,则转弯半径将是无限的,但是在笔直的情况下,数学运算很简单。因此,想象一下,在每个时间步长或每次计算增量传感器的变化时,机器人都会沿着这样的弧线从A点移动到B点:
下面是一些简化了数学的示例代码:
// leftDelta and rightDelta = distance that the left and right wheel have moved along
// the ground
if (fabs(leftDelta - rightDelta) < 1.0e-6) { // basically going straight
new_x = x + leftDelta * cos(heading);
new_y = y + rightDelta * sin(heading);
new_heading = heading;
} else {
float R = unitsAxisWidth * (leftDelta + rightDelta) / (2 * (rightDelta - leftDelta)),
wd = (rightDelta - leftDelta) / unitsAxisWidth;
new_x = x + R * sin(wd + heading) - R * sin(heading);
new_y = y - R * cos(wd + heading) + R * cos(heading);
new_heading = boundAngle(heading + wd);
}
我在模拟器中使用了类似的数学方法来演示不同的操纵方式:http:// www。 cs.utexas.edu/~rjnevels/RobotSimulator4/demos/SteeringDemo/
#2 楼
对于重复计算,在将$ \ theta $应用于$ \ Delta {x},\ Delta {y} $计算之前或之后,找到$ \ Delta \ theta $都没有关系。您将始终在位置和方向计算之间切换。从实际意义上讲,在计算$ \ Delta {x},\ Delta {y} $之后,最好计算$ \ Delta \ theta $,因为第一次遍历循环需要$ \ theta $的初始值。
请记住,无论如何,这是一种容易出错的测量方法-它是一对1D测量值,可提供3D世界的2D近似值。即使您能够获得非常接近$ 0 $的$ \ Delta {t} $,它仍然不会考虑车轮打滑和不平坦的地形。
评论
$ \ begingroup $
搜索“差动驱动车辆的正向运动学”应提供大量有关此问题的更多数学方法的文章。
$ \ endgroup $
–伊恩
13年7月25日在18:27
评论
$ \ begingroup $
上面的代码段中使用的方程式在此处得出:rossum.sourceforge.net/papers/DiffSteer
$ \ endgroup $
– kamek
2014年7月26日19:04
$ \ begingroup $
很好的解释!模拟器链接已损坏
$ \ endgroup $
–傻笑的人
19年8月8日在13:13