Рукоятка сервопривода своими руками с неправильной инверсной кинематикой не делает прямую линию

Я построил Servo-Arms с сервоприводом HS-422 (супер простые базовые серводвигатели, которые можно найти в стартовом комплекте), который получает угловые значения с инверсной кинематикой в ​​Обработке (java).

Инверсная кинематика (на компьютере) в порядке, и она основана на этом

Связь с arduino в порядке, в том смысле, что если я поставлю 2 сервопривода на 0°-0°, 90°-90°, 180°-180°, рычаги перейдут в правильное положение.

НО, если я рисую прямую линию в своих java-скетчах... 2 сервопривода рисуют... что-то вроде странной буквы "U".

Код инверсной кинематики здесь .

Но я думаю, что это правильно, и есть какая-то структурно-механическая проблема, которую я не могу понять. Кто-нибудь может мне что-нибудь посоветовать?

РЕДАКТИРОВАТЬ:

решено! были некоторые проблемы, вызванные неправильной инверсной кинематикой. и комментарий, и ответ были полезны, благодаря этому мощному сообществу!

Возможно: я предполагаю, что вы будете рисовать линии 0, 90, 180, 270 градусов. | Попробуйте нарисовать линии 45, 135, 225, 315 градусов вперед и назад и посмотрите, какие результаты симметричны, а какие асимметричны. например, если компонент имеет неправильный знак, вы можете обнаружить, что в некоторых квадрантах кривая результата идет влево, а в других — вправо. Создание рук одинаковой длины (они могут быть, а могут и не быть) упрощает изменения, которые могут повлиять на вещи. Я быстро просмотрел ваш код, но ничего очевидного. Можете ли вы упростить действия/код, чтобы удалить возможные источники ошибок.
спасибо за комментарий! Я пытаюсь просто набить. кстати мой серво только между 0°-180°!

Ответы (2)

Похоже, что скорость сервопривода не контролируется должным образом.

Можете ли вы замедлить движение руки вниз?

Помните, что для правильной работы инверсной кинематики необходим очень точный контроль скорости вращения. Если в вашей системе рычаг перемещается из одной точки в другую с максимально возможной скоростью, сервоприводы могут достигать максимальной скорости вращения. Таким образом, один сервопривод завершит свое движение раньше другого, что превратит вашу линию в серию сегментов дуги, которые частично сливаются вместе.

Попробуйте управлять системой так, чтобы рука перемещалась в точки в системе координат XY. Если рука может правильно перемещать перо в указанные точки, это проблема скорости сервопривода. Если нет, то это что-то другое.

Поскольку почти невозможно гарантировать, что любые два сервопривода будут двигаться с одинаковой скоростью, простым и универсальным решением будет создание траектории для координат вашего конечного эффектора (X,Y). Так, например, если вы хотите нарисовать прямую линию, просто создайте линейную траекторию вида y= mx + b (должна быть знакома большинству из вас). Просто сделайте xa функцией времени, поставив «x = t; t++;» в конце цикла. Конечно, вам нужно иметь фиксированное время цикла - если вам не нужно делать что-либо еще во время движения, просто используйте цикл while, который завершается при достижении желаемых координат. Еще одним преимуществом этого метода является то, что вы можете изменять скорость, с которой он рисует линию; например, вместо " t++ " вы можете поставить " t += 0.7 " для более низкой скорости.