Я построил Servo-Arms с сервоприводом HS-422 (супер простые базовые серводвигатели, которые можно найти в стартовом комплекте), который получает угловые значения с инверсной кинематикой в Обработке (java).
Инверсная кинематика (на компьютере) в порядке, и она основана на этом
Связь с arduino в порядке, в том смысле, что если я поставлю 2 сервопривода на 0°-0°, 90°-90°, 180°-180°, рычаги перейдут в правильное положение.
НО, если я рисую прямую линию в своих java-скетчах... 2 сервопривода рисуют... что-то вроде странной буквы "U".
Код инверсной кинематики здесь .
Но я думаю, что это правильно, и есть какая-то структурно-механическая проблема, которую я не могу понять. Кто-нибудь может мне что-нибудь посоветовать?
решено! были некоторые проблемы, вызванные неправильной инверсной кинематикой. и комментарий, и ответ были полезны, благодаря этому мощному сообществу!
Похоже, что скорость сервопривода не контролируется должным образом.
Можете ли вы замедлить движение руки вниз?
Помните, что для правильной работы инверсной кинематики необходим очень точный контроль скорости вращения. Если в вашей системе рычаг перемещается из одной точки в другую с максимально возможной скоростью, сервоприводы могут достигать максимальной скорости вращения. Таким образом, один сервопривод завершит свое движение раньше другого, что превратит вашу линию в серию сегментов дуги, которые частично сливаются вместе.
Попробуйте управлять системой так, чтобы рука перемещалась в точки в системе координат XY. Если рука может правильно перемещать перо в указанные точки, это проблема скорости сервопривода. Если нет, то это что-то другое.
Поскольку почти невозможно гарантировать, что любые два сервопривода будут двигаться с одинаковой скоростью, простым и универсальным решением будет создание траектории для координат вашего конечного эффектора (X,Y). Так, например, если вы хотите нарисовать прямую линию, просто создайте линейную траекторию вида y= mx + b (должна быть знакома большинству из вас). Просто сделайте xa функцией времени, поставив «x = t; t++;» в конце цикла. Конечно, вам нужно иметь фиксированное время цикла - если вам не нужно делать что-либо еще во время движения, просто используйте цикл while, который завершается при достижении желаемых координат. Еще одним преимуществом этого метода является то, что вы можете изменять скорость, с которой он рисует линию; например, вместо " t++ " вы можете поставить " t += 0.7 " для более низкой скорости.
Рассел МакМахон
нкинт