Уравнение для расчета скорости x и y для перьевого плоттера для обеспечения постоянной скорости пера - PullRequest
1 голос
/ 05 июня 2019

Я пишу программное обеспечение для управления плоттером и хочу, чтобы моя ручка двигалась с определенной скоростью. У меня есть два мотора, один для х и один для у. Мне нужно знать, как быстро бегать, чтобы ручка двигалась со скоростью. Это зависит от того, насколько сильно изменились x и y. У меня есть возможность управлять этими моторами на расстоянии и скорости.

Я хотел бы сказать моему плоттеру, чтобы он перемещал перо из точки a (x1, y1) в точку b (x2, y2) со скоростью 100 единиц в секунду. Я не могу понять, как рассчитать, сколько единиц в секунду нужно двигать двигателями 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)

То, на чем я застрял - это вычисление "скорости"

1 Ответ

0 голосов
/ 08 июня 2019

Что ж, с обновлением используемого вами API я вижу это так. Вы получили желаемую скорость v [mm/s] и дельты dx,dy [mm] для перемещения и пошаговые размеры mx,my [mm/step] затем:

deltas

Итак, мы знаем, что:

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) равной нулю для обоих осях.

...