2024-05-20 13:43:18 发布
网友
我有一个机器人,有三个马达(红色),每个马达都有一个全向(蓝色)(see example of omniwheel here)。如果我想让机器人向前移动,我可以同时启动1号和3号马达,2号的轮子将自由旋转,垂直于它的马达可以旋转的方向。在
我怎么能写一个函数,把度数作为输入,输出3个0-1(无电机转速,全电机转速)的值,这样机器人在朝着以度为单位的真实方位移动时面向同一方向?在
例如,输入45度,机器人在保持恒定旋转的同时,相对于图中的北方向东北移动。在
谢谢。在
有趣的问题! 这是否可行:
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速度移动:
正在检查是否向上移动
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,则将所有速度除以该值,以确保它们在范围内
(当然,现实生活中的动态更复杂)
有趣的问题! 这是否可行:
符号惯例是,如果你的眼睛在中心,你看着旋转的轮子,那么正数对应逆时针旋转,负数对应顺时针旋转。如果需要的话,你可以除以标准。在
我不确定你是要求实际的代码编写还是数学来编写代码,但我可以帮你做数学。在
我从假设函数有一个输入期望的轴承功率因数开始,并为电机输出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为完全逆时针旋转。在
马达产生旋转力矩。要排除机器人的旋转,力矩之和应为零。对于平等的腿
当力矩被补偿时,每一个电机都会产生沿OX或OY轴的力,对应于它的速度投射到轴上。在Fi方向以S速度移动:
^{pr2}$正在检查是否向上移动
一般情况下:求解三个线性方程组,得到V1,V2,V3
求解45度得到
一些转换以获得封闭形式的解决方案:
如果计算后某些速度的绝对值V超过1.0,则将所有速度除以该值,以确保它们在范围内
(当然,现实生活中的动态更复杂)
相关问题 更多 >
编程相关推荐