我正在尝试使用Android应用程序通过应用程序UI中的基于触摸的操纵杆控件来控制Rover 5机器人。我想计算移动操纵杆时流动站中左右电机的速度。我用rtheta将它们转换为极坐标系。其中r的范围是0到100,θ的范围是0到360。速度值也在[0; 100]范围内。

现在,这是我到目前为止所发现的。对于(r, theta)的任何值,

如果(left_speed, right_speed),则r(当场右转)
如果theta = 0,则left_speed = r, right_speed = -r(以速度r向前移动)
如果theta = 90,则left_speed = r, right_speed = r(左转)当场)
如果theta = 180然后left_speed = -r, right_speed = r(以速度r向后移动)

对于其他值,我希望它同时移动和旋转。例如,

如果theta = 270然后left_speed = -r, right_speed = -r(右转时向前移动)
因此,基本上对于任何theta = 45,我都可以将速度设置为> left_speed = alpha*r, right_speed = beta*r

我需要建立一个方程式,在其中可以通过基于(r, theta)找到(left_speed, right_speed) = (alpha*r, beta*r)alpha来概括所有这些情况。我可以参考现有的任何作品吗?

评论

我假设您的意思是“如果theta = 180,那么left_speed = -r ...”

是的,谢谢你指出这一点。编辑了问题

#1 楼

您正在尝试找到一个公式,将给定的$(r,\ theta)$转换为左右推力百分比,其中$ r $表示油门百分比。天真的实现是将函数基于100%的油门:


在$ 0 ^ {\ circ} $处,左右推力等于$ r $
在$ \ pm45 ^ {\ circ} $,一侧的推力等于$ r $,另一侧的推力等于0
在$ \ pm 90 ^ {\ circ} $,一侧的推力等于$ r $,另一侧的推力等于$ -r $
在$ 180 ^ {\ circ} $处,左右推力等于$ -r $

这会产生如下函数:



此实现的问题在于,仅当$ \ theta $恰好是$ 90 ^ {\ circ} $的整数倍时,才提供所需的$ r $。在其他所有方面,您都会牺牲总速度来进行控制。您可以在图表中看到:“绝对推力”,即两个电动机传递的推力的量,在这种情况下不是(也不能是)恒定的。仅缩放此函数并不是最佳选择。

当$ r = 50 \%$时,会在$ \ theta $的整个范围内维持最大绝对推力-这就是您的函数根据。



在此实现中,总推力在$ \ pm45 ^ {\ circ} $之间保持恒定,并且无论选择哪个方向,绝对推力都是恒定的-电机需要权衡它们的推力以维持所需的r $。在$ r = 50 \%$以上时,总推力可以满足$ r $的角度范围开始缩小-您开始牺牲对速度的控制。

这会产生类似python的python函数以下:

# assumes theta in degrees and r = 0 to 100 %
# returns a tuple of percentages: (left_thrust, right_thrust)
def throttle_angle_to_thrust(r, theta):
    theta = ((theta + 180) % 360) - 180  # normalize value to [-180, 180)
    r = min(max(0, r), 100)              # normalize value to [0, 100]
    v_a = r * (45 - theta % 90) / 45          # falloff of main motor
    v_b = min(100, 2 * r + v_a, 2 * r - v_a)  # compensation of other motor
    if theta < -90: return -v_b, -v_a
    if theta < 0:   return -v_a, v_b
    if theta < 90:  return v_b, v_a
    return v_a, -v_b


结果如下:


评论


$ \ begingroup $
谢谢伊恩。据我了解,您正在尝试平衡两个电动机上的负载,对吗?
$ \ endgroup $
– Punit Soni
13年3月3日在8:12

$ \ begingroup $
不完全是。您试图使$(\ text {left_speed} + \ text {right_speed})/ 2 = r $,而不是使其依赖于$ \ theta $。请注意,当$ r> 50 \%$时,紫色虚线相对于$ \ theta $不再恒定。您要最小化此影响。
$ \ endgroup $
–伊恩
13年3月3日,17:13



$ \ begingroup $
您是如何制作这些花哨的情节的?
$ \ endgroup $
–乔什·范德·胡克(Josh Vander Hook)
13年4月4日在14:45

$ \ begingroup $
我在Microsoft Excel中进行了绘制,并在Gimp中制作了动画。
$ \ endgroup $
–伊恩
13年4月4日在22:01

$ \ begingroup $
很好的回答,谢谢。有一个小错字,如果theta <0:返回v_a,-v_b,则应读取,如果theta <0:返回-v_a,v_b,则应读取(符号相反)
$ \ endgroup $
–傻笑的人
18-2-20在19:46



#2 楼

您想要的是角速度与该角度的余弦成正比,似乎在右边为正,在左边为负。

因此,由于我们知道角速度是由$ \ frac {V_l-V_r} {D} $给出的,其中$ D $是机器人的直径,因此我们都已设定。试试这个: />
如果$ \ theta <0 $和$ \ theta \ geq-90 $:$ V_r \ gets -r $和$ V_l \ get r \ sin(2 \ theta + 90)$

交换其他象限的速度。请注意,这不会像驾驶汽车那样“感觉”,因为将操纵杆移至右下角将向后旋转并向右旋转,而向右转而反向的汽车将向后移动并向左转。只是有些奇怪的差速器驱动器...您可以通过将第四象限规则应用于第三象限$ \ theta $和反之亦然进行调整。

我在$ [theta \ in [ -180,+ 180] $,您可以通过以下方式获得:

$ \ theta \ gets \ text {atan2}(\ sin \ theta,\ cos \ theta)$(不过请注意您的单位, atan2通常是弧度。

评论


$ \ begingroup $
这看起来不错。我直觉地想到了这个解决方案。我将尝试一下,看看驾驶时的实际感觉。谢谢。
$ \ endgroup $
– Punit Soni
13年5月5日在19:58