Math 用于计算笔式绘图仪x和y速度以确保恒定笔速的方程式

Math 用于计算笔式绘图仪x和y速度以确保恒定笔速的方程式,math,linear-algebra,Math,Linear Algebra,我正在编写控制笔式绘图仪的软件,我希望我的笔能以特定的速度移动。我有两个马达,一个用于x,一个用于y。我需要知道运行每一个的速度有多快,以使笔以一个速度值移动。这取决于x和y的变化量。我有能力在一定距离和速度下运行这些电机 我想告诉我的绘图仪以每秒100个单位的速度将笔从点a(x1,y1)移动到点b(x2,y2)。我无法计算出如何计算每秒移动x和y电机以达到所需的画笔速度的单位数,因为画笔将以一定角度移动。这比我想象的要困难得多 我正在使用的代码 常数 PEN_VIRTUAL_COORDINAT

我正在编写控制笔式绘图仪的软件,我希望我的笔能以特定的速度移动。我有两个马达,一个用于x,一个用于y。我需要知道运行每一个的速度有多快,以使笔以一个速度值移动。这取决于x和y的变化量。我有能力在一定距离和速度下运行这些电机

我想告诉我的绘图仪以每秒100个单位的速度将笔从点a(x1,y1)移动到点b(x2,y2)。我无法计算出如何计算每秒移动x和y电机以达到所需的画笔速度的单位数,因为画笔将以一定角度移动。这比我想象的要困难得多

我正在使用的代码

常数

PEN_VIRTUAL_COORDINATES_PER_SECOND = 7
MOTOR_UNITS_PER_VIRTUAL_COORDINATE_X = 3
MOTOR_UNITS_PER_VIRTUAL_COORDINATE_Y = 6

整数变量。这是笔每一步需要移动的虚拟坐标数

delta_x
delta_y
电机控制接口
位置是电机单位行驶距离
速度是每秒的电机单位

x_axis_motor.run_to_rel_pos(speed=, position=delta_y*MOTOR_UNITS_PER_VIRTUAL_COORDINATE_Y)

我一直坚持的是计算“速度”

随着您使用的API的更新,我看到它是这样的。你得到了想要的速度
v[mm/s]
和增量
dx,dy[mm]
来移动和步长
mx,my[mm/step]
,然后:

因此,我们知道:

a=atan2(dy,dx);
vx=abs(v*cos(a)/mx);
vy=abs(v*sin(a)/my);
其中,
vx,vy[step/s]
是电机的单独速度,
[step/s]
[Hz]
中的频率相同。它只是一个毕达哥拉斯三角形,
[mm/s]
轴与全速
v
之间的速度比与三角形长度相同,因此
sin,cos
也同样适用于它们。我刚刚添加了转换
[mm/s]->[step/s]=[Hz]
。我还
abs
结果,因为您的delta已经有符号了。。。出于同样的原因,您也可以使用
atan
而不是
atan2

a=atan(dy/dx);
但是当
dx
接近
零时,不要忘记处理边缘情况

如果您的步长是反向的
[step/mm]
,那么您只需乘以它们,而不是除以它们

此外,如果您没有使用测角仪,或者您不想使用测角仪,您也可以使用三角形相似性:

l = sqrt( dx^2 + dy^2 )
sin(a) = dy/l
cos(a) = dx/l
因此:


它也可以在整数上计算,而且应该更快更精确地计算。。。再次注意除以零(点而不是线)在这种情况下,只需将两个轴的速度(
l==0
)设置为零。

随着您使用的API的更新,我看到了这样的情况。你得到了想要的速度
v[mm/s]
和增量
dx,dy[mm]
来移动和步长
mx,my[mm/step]
,然后:

因此,我们知道:

a=atan2(dy,dx);
vx=abs(v*cos(a)/mx);
vy=abs(v*sin(a)/my);
其中,
vx,vy[step/s]
是电机的单独速度,
[step/s]
[Hz]
中的频率相同。它只是一个毕达哥拉斯三角形,
[mm/s]
轴与全速
v
之间的速度比与三角形长度相同,因此
sin,cos
也同样适用于它们。我刚刚添加了转换
[mm/s]->[step/s]=[Hz]
。我还
abs
结果,因为您的delta已经有符号了。。。出于同样的原因,您也可以使用
atan
而不是
atan2

a=atan(dy/dx);
但是当
dx
接近
零时,不要忘记处理边缘情况

如果您的步长是反向的
[step/mm]
,那么您只需乘以它们,而不是除以它们

此外,如果您没有使用测角仪,或者您不想使用测角仪,您也可以使用三角形相似性:

l = sqrt( dx^2 + dy^2 )
sin(a) = dy/l
cos(a) = dx/l
因此:

它也可以在整数上计算,而且应该更快更精确地计算。。。再次注意被零除(点而不是线)只需将两个轴在这种情况下的速度(
l==0
)设置为零