把度数转换成3个电机搬运工

2024-05-20 13:43:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个机器人,有三个马达(红色),每个马达都有一个全向(蓝色)(see example of omniwheel here)。如果我想让机器人向前移动,我可以同时启动1号和3号马达,2号的轮子将自由旋转,垂直于它的马达可以旋转的方向。在

我怎么能写一个函数,把度数作为输入,输出3个0-1(无电机转速,全电机转速)的值,这样机器人在朝着以度为单位的真实方位移动时面向同一方向?在

例如,输入45度,机器人在保持恒定旋转的同时,相对于图中的北方向东北移动。在

谢谢。在

Diagram - blue=wheels, red=motors


Tags: of函数hereexample机器人单位方向轮子
3条回答

有趣的问题! 这是否可行:

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)

符号惯例是,如果你的眼睛在中心,你看着旋转的轮子,那么正数对应逆时针旋转,负数对应顺时针旋转。如果需要的话,你可以除以标准。在

我不确定你是要求实际的代码编写还是数学来编写代码,但我可以帮你做数学。在

我从假设函数有一个输入期望的轴承功率因数开始,并为电机输出v1、v2和v3。在

v1、v2和v3以及所有元素都将是范围[-1,1]上的元素,-1将顺时针旋转机器人,而+1的输出将逆时针旋转。在

方位输入φ决定了机器人将移动的方向。你可以把它转换成x点和y点。θ点代表角旋转(它将是0)。在

xΒdot=-sin(φ)

y_dot=cos(φ)

θ点=0

点=v1+v2+v3+x

y点=v1+v2+v3

θ点=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_点=-sin(phi)=v1_x+v2_x+v3_x

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

θ点=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_点设为非零(正是逆时针方向,负方向是顺时针方向)。在这种情况下,你还必须考虑到旋转时参考系的变化。在

一些想法:

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

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

  V1 + V2 + V3 = 0

当力矩被补偿时,每一个电机都会产生沿OX或OY轴的力,对应于它的速度投射到轴上。在Fi方向以S速度移动:

^{pr2}$

正在检查是否向上移动

   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,则将所有速度除以该值,以确保它们在范围内

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

相关问题 更多 >