我正在编写控制笔式绘图仪的软件,我希望笔以特定的速度移动。我有两个电机,一个用于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)
我坚持要计算“速度”
答案 0 :(得分: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]
在 x,y 轴与整个速度v
之间的速比与三角形长度相同,因此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
)设置为零对于两个轴。