我在我高中的FIRST机器人团队中,我们正在开发一个猕猴桃驱动机器人,其中三个全向轮安装在等边三角形配置中,如下所示:
问题是对机器人进行编程以驱动电机,使机器人在给定操纵杆输入的方向上移动。例如,要“向上”移动,电机 1 和 2 的功率将相等,而电机 3 将关闭。操纵杆位置以矢量的形式给出,我在想如果电机也用矢量表示,矢量投影可能就是我需要的。但是,我不确定这是否正确,如果是,我将如何应用它。我也有一种感觉,一个操纵杆位置可能有多种解决方案。任何帮助将不胜感激。
我在学校期间制造了 9 个机器人(1 个 FIRST,8 个 RoboCup)。我们使用与您相同的全能驱动布局。Beta 的答案看起来是正确的,但之后会为所有轮子添加旋转:
W1 = -1/2 X - sqrt(3)/2 Y + R
W2 = -1/2 X + sqrt(3)/2 Y + R
W3 = X + R
[这是Beta的公式,添加了一些旋转]
您需要考虑电机的可用范围。我猜它可以采用 +/-255 的 PWM 信号,因此必须对输入或输出进行一些调整。(没那么难……)
回答您的具体问题:矢量投影本质上就是您在这里所做的。您可以通过矩阵M、操纵杆I的输入和电机O的输出来应用它。因此O = M * I ;
M = [(-0.5 -sqrt(3)/2 +1)
(-0.5 +sqrt(3)/2 +1)
(1 0 +1)]
首先让我们定义一些术语。按照通常的约定,X 轴将指向右侧,y 轴将指向上方(因此轮子 3 的推力沿 X 轴)。我们将轮子的运动称为 W 1、 W 2和 W 3,每个都定义为 W i > 0 意味着轮子沿顺时针方向旋转。在您的示例中,如果 W 1 < 0、W 2 = W 1且 W 3 = 0,则机器人将沿 +Y 方向移动。
如果所有三个轮子都以相同的速度旋转(W 1 = W 2 = W 3),机器人将原地旋转。我猜你不希望这样,所以旋转的总和必须为零: W 1 + W 2 + W 3 = 0。
每个轮子的运动都有助于机器人的运动;它们作为向量相加:
W 1 = -1/2 X - sqrt(3)/2 Y
W 2 = -1/2 X + sqrt(3)/2 Y
W 3 = X
因此,如果您从操纵杆上知道所需的 X 和 Y,您就有 W 1、 W 2和 W 3。正如我们已经看到的,W 1和 W 2之间的差异是驱动 Y 运动的原因。它们的和驱动 X 中的运动。
虽然这个系统可以用数学方法求解,但在 2002 年,FIRST Team 857 选择了机械求解。我们的控制系统使用了三个操纵杆,它们的 X 轴形成一个等边三角形,手柄被替换为与 Y 形轭相连的球窝臂。将每个摇杆的X轴直接映射到一个电机速度,控制系统已经解决。作为一个优势,这个系统对于非专业人士来说非常直观——将轭推向你想去的方向,旋转它就可以转动。
正如您所认识到的,第一部分将找到一个合适的方程来表示任何电机设置的合成运动。根据您对电机速度的控制和反馈水平,我建议您彻底的过程应该从编写矢量方程开始:(将正 X 定义为直线前进)
-M1Cos(30)+M2Cos(30)=X(负数是因为 1 和 2 的功率必须相同,但正向运动的极性相反)
M1Sin(30)+M2Sin(30)-M3 = Y(因为在 1 和 2 上的逆时针运动将导致机器人在 Y 轴上向左移动,在 3 上的逆时针运动将导致机器人向右移动)
您需要添加的另一个输入是机器人所需的旋转,幸运的是,M1+M2+M3 = W(旋转速度)
您的操纵杆输入将为您提供 X、Y 和 W,因此您有 3 个方程和 3 个未知数。
从这里开始,它是联立方程,因此您最终可能会得到多个解,但这些解通常会受到可能的电机速度等的限制。
rec::robotino::com::OmniDrive 类就是一个例子——这个方法的源代码也是可用的......