r
和theta
将它们转换为极坐标系。其中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
来概括所有这些情况。我可以参考现有的任何作品吗?#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
评论
我假设您的意思是“如果theta = 180,那么left_speed = -r ...”是的,谢谢你指出这一点。编辑了问题