计算笔式绘图仪 x 和 y 速度的方程式,以确保笔速恒定
Equation to calculate x and y speed for pen plotter to ensure constant pen speed
我正在编写软件来控制笔式绘图仪,我希望我的笔以特定速度移动。我有两台电机,一台用于 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
电机控制接口
position 是移动的电机单位距离
速度是每秒的电机单位
x_axis_motor.run_to_rel_pos(speed=, position=delta_y*MOTOR_UNITS_PER_VIRTUAL_COORDINATE_Y)
我卡住的是计算"speed"
好吧,随着您使用过的 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]
中的频率相同。它只是一个毕达哥拉斯三角形,其中 x,y 轴和整个速度 v
之间的 [mm/s]
速度比与三角形长度相同,因此 sin,cos
以同样的方式应用到他们身上。我刚刚添加了转换 [mm/s] -> [step/s] = [Hz]
。我也 abs
结果,因为你的增量已经有迹象......出于同样的原因,你也可以使用 atan
而不是 atan2
a=atan(dy/dx);
但不要忘记处理 dx
接近 zero
的边缘情况!!!
如果你的步长是倒置的 [step/mm]
那么你只需乘以而不是除以它们。
此外,如果您没有随手可得的测角仪或者您不想使用它,您也可以使用三角形相似度:
l = sqrt( dx^2 + dy^2 )
sin(a) = dy/l
cos(a) = dx/l
所以:
vx=abs((v*dx)/(l*mx));
vy=abs((v*dy)/(l*my));
这也可以在整数上计算,并且计算起来也应该更快更精确......再次注意除以零(点而不是线)在这种情况下只需设置速度(l==0
)两个轴都为零。
我正在编写软件来控制笔式绘图仪,我希望我的笔以特定速度移动。我有两台电机,一台用于 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
电机控制接口
position 是移动的电机单位距离
速度是每秒的电机单位
x_axis_motor.run_to_rel_pos(speed=, position=delta_y*MOTOR_UNITS_PER_VIRTUAL_COORDINATE_Y)
我卡住的是计算"speed"
好吧,随着您使用过的 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]
中的频率相同。它只是一个毕达哥拉斯三角形,其中 x,y 轴和整个速度 v
之间的 [mm/s]
速度比与三角形长度相同,因此 sin,cos
以同样的方式应用到他们身上。我刚刚添加了转换 [mm/s] -> [step/s] = [Hz]
。我也 abs
结果,因为你的增量已经有迹象......出于同样的原因,你也可以使用 atan
而不是 atan2
a=atan(dy/dx);
但不要忘记处理 dx
接近 zero
的边缘情况!!!
如果你的步长是倒置的 [step/mm]
那么你只需乘以而不是除以它们。
此外,如果您没有随手可得的测角仪或者您不想使用它,您也可以使用三角形相似度:
l = sqrt( dx^2 + dy^2 )
sin(a) = dy/l
cos(a) = dx/l
所以:
vx=abs((v*dx)/(l*mx));
vy=abs((v*dy)/(l*my));
这也可以在整数上计算,并且计算起来也应该更快更精确......再次注意除以零(点而不是线)在这种情况下只需设置速度(l==0
)两个轴都为零。