将度数转换为3马达运动

时间:2018-06-14 04:10:30

标签: python math robotics

我有一个带三个马达(红色)的机器人,每个都有一个全向(蓝色)(see example of omniwheel here)。如果我希望机器人向前移动,我可以激活电机1和3,2处的轮子将自由旋转,垂直于电机可以旋转的方向。

如何编写一个将度数作为输入并输出0到0(无电机速度,电机全速)的3个值的函数,因此机器人朝向以度数指定的真实轴承朝向相同的方向?

E.g。输入45度并且机器人在图中相对于北向东北移动,同时保持恒定旋转。

感谢。

Diagram - blue=wheels, red=motors

3 个答案:

答案 0 :(得分:2)

一些想法:

电机转速V1..V3应在-1..1范围内,其中-1表示顺时针旋转,1表示CCW完全旋转。

汽车产生旋转力矩。要排除机器人的旋转,矩的总和应为零。对于平等的腿

  V1 + V2 + V3 = 0

当补偿力矩时,每个电机都会沿着OX或OY轴产生力,对应于将其速度投影到轴上。提供速度为S的方向Fi:

- V1 * Sqrt(3)/2 + V2  - V3 * Sqrt(3)/2 = S * Cos (Fi)   //OX axis
 -V1 / 2 + V3 / 2  = S * Sin (Fi)                         //OY axis   

检查向上移动

   Fi  = Pi/2
   V1, V2, V3 = -1, 0, 1
   V1 + V2 + V3 = 0  //moment is OK
   Sqrt(3)/2 - Sqrt(3)/2 = 0  //zero speed or OX
   1/2 + 1/2 = S  //S speed for OY

一般来说:求解三个线性方程组,得到V1,V2,V3

  V1 + V2 + V3 = 0
- V1 * Sqrt(3)/2 + V2  - V3 * Sqrt(3)/2 = S * Cos (Fi)  
 -V1 / 2 + V3 / 2  = S * Sin (Fi)        

求解45度

   > solve({v1+v2+v3=0,-0.87*v1+v2-0.87*v3=0.71,-0.5*v1+0.5*v3=0.71},{v1,v2,v3});
   {v1 = -.90, v2 = .38, v3 = .52}

获得封闭式解决方案的一些转换:

  V2 = -V1 - V3
- V1 * Sqrt(3)/2 -V1 - V3  - V3 * Sqrt(3)/2 = S * Cos (Fi)  
  V1 + V3 =  - 2 * S * Cos (Fi) / (2 + Sqrt(3))
  V3 - V1 =  2 * S * Sin(Fi)
  and finally
  V3 = S * (Sin(Fi) - Cos (Fi) / (2 + Sqrt(3)))
  V1 = - S * (Sin(Fi) + Cos (Fi) / (2 + Sqrt(3))) 
  V2 = -V1 - V3

如果在计算后某些速度的绝对值V超过1.0,则将所有速度除以此值以确保它们在范围内

(当然,现实生活中的动态更复杂)

答案 1 :(得分:1)

有趣的问题! 这会有用吗?

import math
def three_motors(degree):
    theta1, theta2, theta3 = 150.0, 270.0, 30.0
    motor1 = math.sin((degree-theta1)*(math.pi/180.0))
    motor2 = math.sin((degree-theta2)*(math.pi/180.0))
    motor3 = math.sin((degree-theta3)*(math.pi/180.0))
    return motor1, motor2, motor3

three_motors(0)
Out[40]: (-0.49999999999999994, 1.0, -0.49999999999999994)

符号惯例是,如果您的眼睛位于中心并且您正在观察旋转轮,则正数对应于逆时针旋转,负数对应于顺时针旋转。如果需要,你可以除以标准。

答案 2 :(得分:1)

我不确定您是否要求实际编写代码或编写代码的数学,但我可以帮助您完成数学计算。

我假设该功能具有所需的输入轴承Phi,并为电机输出v1,v2和v3。

v1,v2和v3都将成为范围[-1,1]上的元素,其中-1将顺时针旋转机器人,+1的输出将逆时针旋转。

轴承输入Phi确定机器人将移动的方向。您可以将其转换为x_dot和y_dot。 Theta点表示角度旋转(它将为0)。

x_dot = -sin(phi)

y_dot = cos(phi)

theta_dot = 0

x_dot = v1_x + v2_x + v3_x

y_dot = v1_y + v2_y + v3_y

theta_dot = v1 + v2 + v3 = 0

(对于下面的等式,我将它们构造成直线向上为零度,并且逆时针增加,以便您可以更容易地推广到其他车轮放置位置)

v1 = v1_x + v1_y = - v1 * sin(135)i + v1 * cos(135)j

v2 = v2_x + v2_y = - v2 * sin(270)i + v2 * cos(270)j

v3 = v3_x + v3_y = - v3 * sin(45)i + v3 * cos(45)j

现在您需要设置一个方程组。

x_dot = -sin(phi)= v1_x + v2_x + v3_x

y_dot = cos(phi)= v1_y + v2_y + v3_y

theta_dot = 0 = v1 + v2 + v3

这是一个包含3个未知数的3个方程组,你的未知数是v1,v2和v3。等式的矩阵形式看起来像A * v = x,解决方案将是v = A ^ -1 * x。

这将为您提供v向量的值(v1,v2,v3)。在输出这些值之前,我会通过除以max(abs(v1,v2,v3))对它们进行标准化(以防它们不是)。

如果您想进一步编辑代码以允许机器人在移动时改变其面向的方向,只需使Theta_dot非零(正向逆时针,顺时针方向为负)。在这种情况下,您还必须在旋转时考虑参考框架的更改。