roboforum.ru

Технический форум по робототехнике.

Нужна помощь с четвероногом

Re: Нужна помощь с четвероногом

newbe » 18 авг 2017, 01:20

Angel71 писал(а)::ROFL: вас оказывается трое - один иногда читать умеет, второй даже немного писать, третий делает
if (direction == 1) degreeCurrent1 = degreeStart1 + (int)(degPerMs1 * thisCycleExeTime_ms);
else degreeCurrent1 = degreeEnd1 - (int)(degPerMs1 * thisCycleExeTime_ms);


передайте третьему, что будет весело, когда дело дойдёт до попытки обрабатывать данные о токе, напряжении и нажатии кнопочек.

Да, мозги просто в разное время суток по разному работают :D
Похоже это то о чем я подумал, только на человеческом коде))
Я пытался с начала до конца отследить связь в вашем коде, который вы мне прислали, но запутался. Покажу на неделе брату-программисту, может что растолкует.
Я конечно мог бы обратиться и к нему за всеми вопросами, подумаете вы. Но программисты народ специфичный, он не знает как писать код для того что бы что-то шевелилось на яву, а в кибер-пространсьве пожалуйста) Жаль конечно
DegreeCurrent // я так понял это угл в данный момент вреиени
DegreeStart начальное положение сервы
DegreeEnd конечное положение?
Direction может быть 1 и -1, является началом работы и меняется по ее окончанию?

Добавлено спустя 12 минут 20 секунд:
Angel71 писал(а):передайте третьему, что будет весело, когда дело дойдёт до попытки обрабатывать данные о токе, напряжении и нажатии кнопочек

А это вы напрасно) Я делал разные проекты с кнопочками, блютусами, ик пультами и просто джойстиками, просто таких проблем не возникало. А с электричеством и напряжением у меня полный порядок, я ядерный закончил, по специальности эдектрические станции :D. Думаю с расчетами было бы даже веселее

Re: Нужна помощь с четвероногом

Angel71 » 18 авг 2017, 03:43

глубоко фиолетово, физический бот или виртуальный. юнити3д/анриал/край ставит и играючись делает движения. хочет во фрейме, будет на подобии прерывания или как в loop с delay. хочет, может в отдельный поток вынести. необходимости сильно муторную физическую модель собакена и окружающей среды делать, нет и не предвидится. а простенькой физики для начала с ушами хватит и сделать не сложно. или не на игровом движке сделает, а просто под винду/линукс программку напишет, всё-равно ардуина годится максимум как переферийный контроллер хоть начнёте нормально делать.
покажите, может он тоже вам скажет, что не хотите вы эту бредятину и таки созреете на что-то более нормальное. хотя... хз, может и проморозится, как никак вы же хотите с собакеном возится, ему чего в это всё лесть.
да не напрасно, просто смешно было про ток и кнопочки, когда вы в паре строчек кода теряетесь и ещё не можете примитивненький код набросать для движения лап, а уже хотите лесть в установление зависимости между током/напряжением и чем-то ещё (скорость вращения вала сервы или вычислять положение или ещё что, тут угадывать сложно), потом всякие нажития кнопочек ещё прилепить и как-то это всё при управлении сервами учитывать. не, кнопочки/тензорезисторы, акселерометры, камеры, лидары и т.д. это всё очень полезно и нужно, но пока могу повторить "будет весело, когда дело дойдёт до попытки".

Re: Нужна помощь с четвероногом

loox » 18 авг 2017, 09:21

Newbe
Вот и славно, что у Вас уже есть опыт работы. ?.
1. Серво не может реализовать движение 0-60 с интервалом в 1 градус за 10 миллисек, так как цикл обащения к серве 20 мсек. Управляющие воздействия поступают не чаще чем 20мсек.
2.Я полагаю, что Вы знаете, чтобы медленно двигать, нужно подать поседовательность:
myservo.write(угол);
myservo.write(угол+дельта);
....
myservo.write(угол+n*дельта);
Такая конструкция позволяет двигать серву медленно.
В зависимости от величины дельта, иногда придется за write ()вставлять delay чтобы серво успевало достчь
своего значения.
Внутри этой конструкции можно включить еще сколь угодно других серво и все будет двигаться одновременно. Следут помнить, сто при маленьких углах поворота и нагруженной серве, момнт у сервы падает.
3. Я не совсем понимаю, почему вы так привязаны к интевалам, к временной цикличности.
4. Программные конструкции по управению и заданию параметров угла у Вас очень сложные, я покажу как сделать проще, но сначала давайте справимся с алгоритмом управления
5. Так, что же не получается или непонятно
Loox

Re: Нужна помощь с четвероногом

newbe » 18 авг 2017, 13:58

loox писал(а):Newbe
Вот и славно, что у Вас уже есть опыт работы. ?.
1. Серво не может реализовать движение 0-60 с интервалом в 1 градус за 10 миллисек, так как цикл обащения к серве 20 мсек. Управляющие воздействия поступают не чаще чем 20мсек.
2.Я полагаю, что Вы знаете, чтобы медленно двигать, нужно подать поседовательность:
myservo.write(угол);
myservo.write(угол+дельта);
....
myservo.write(угол+n*дельта);
Такая конструкция позволяет двигать серву медленно.
В зависимости от величины дельта, иногда придется за write ()вставлять delay чтобы серво успевало достчь
своего значения.
Внутри этой конструкции можно включить еще сколь угодно других серво и все будет двигаться одновременно. Следут помнить, сто при маленьких углах поворота и нагруженной серве, момнт у сервы падает.
3. Я не совсем понимаю, почему вы так привязаны к интевалам, к временной цикличности.
4. Программные конструкции по управению и заданию параметров угла у Вас очень сложные, я покажу как сделать проще, но сначала давайте справимся с алгоритмом управления
5. Так, что же не получается или непонятно
Loox

Просто понимаете, если задавать углы через временные задержки, получится так, что если дать команду на движение вперед, то пока он не выполнит действие в теле программы, другую команду не возможно будет отправить, он ее попросту не распознает.
На счет мс, вы правы, я вчера уже увидел это опытным путем.
Побскажите пожалуйста про классы.
Что бы создать класс, мне нужно создать отдельный файл с расширением aaa.h где будет находится программа скажем для одной сервы? Первая строчка в классе должна совпадать с названием файла?(class aaa)
А в отдельном скетче потом вызывать класс через #define <ааа.h>?
Я нашел инфу о классах, но там учат созданию, а все эти мелочи про создание отдельных файлов, библиотек упущены из виду

Re: Нужна помощь с четвероногом

loox » 18 авг 2017, 15:42

Newbe
1. Классы. Все что Вы написали про классы, когда задавали вопрос, очень плохо, так спашиыать нельзя.
Не умеете писать классы, не пишите, и так справитесь или садитесь за учебники по программировни.
К стати бибилиотека servo - эо класс.
2. Ваше суждение - задал команду, он не остановиться пока не выполнит - это заблуждение.
Пример:
Возмем двухногий идеальный механизм.
Должен выполнять команды : вперед, стоп назад.
Команда стоп, аналогична команде исходное состояние, две ноги рядом.
Из этого состояния может исполнять команды: вперед, назад, стоп
Команда вперед: пол шага с правой шаг леыой,шаг правой шаг левой. .....
Из состояния стоп, вперед всегда шагаю с правой ноги - прияно волевым решением
Обратите снимание - при начале движения Вы всегда пол шага (пол шага условно, попобуйте самому пойтись)
Во время движения пришла команда - стоп. Теперь поанализируйте когда вы можете и как выполнить действие. Например: Вы получили команду стоп, а у Вас поднята правая нога, соответсенно стоп вы выполнить не можте- тогда вы заканчивате движение, а это шаг, приставляете левую ногу- делаете пол наша леыой ногой. Для того чтобы понимать в каком состоянии у Вас находится механизм -длжно быть чот то, из которого управляющая пограама может почитать состояние механизма. Команды, если Вы используете стандартный механизм приема данных uart, то он работает асинхронно от пограммы про него не надо беспокоиться, всегда легко провериь есть ли команда из вне. Вы можете поверять наличие новой команды, каждый раз, когда закончили элементарное дейстыие своим межанизмом.
Вам необходимо разработать и зафиксировать элементарные действия, после выполнения которых возможно изменеие выполнеия предыдущего движени.
Извините за ошибки, еду в машине.... Давайте вопосы
Loox

Re: Нужна помощь с четвероногом

newbe » 19 авг 2017, 22:31

Так, в общем после недели мороки, я написал все-таки код и в итоге зациклировал движение. Небольшие поправки по раскачке корпуса в бок и будет смотреться более чем хорошо) Сделал все же без delay.
Loox, а по поводу того, что вы говорите можно делать движения с дилэй и в то же время проверять, нет ли других команд в настоящее время. Вы имеете ввиду делать опрос, после каждого движения ноги? Тоесть передвинул ногу, опросил нет ли новой информации из вне и снова и снова?
В принципе тоже логично, так можно сделать.
Сегодня я купил 4 мини нажимных датчика. Хочу немного переделать движения. Будет мне кажется проще. Нога будет выпрямляться до тех пор пока значение нажимного контакта не будет равна 1. Так он сможет двигаться, даже если под ногами будет не ровная поверхность) Это я себе нашел новую головную боль. А после нее пойдет трехосевой акселерометр с гироскопом, что бы понимал свое положение в пространстве. Если все это будет удачно реализовано, можно будет делать копию в несколько раз больше, с более хорошими и мощными сервами

Re: Нужна помощь с четвероногом

loox » 20 авг 2017, 09:40

Newbe
Вы почти поняли идеологию...
1. Я предлогаю Вам, все время опрашивать, в главном цикле, нет ли изменения предыдущей команды, и на этом фоне осуществлять текущую команду.
Изменение текщей команды на движение может поступать от оператора, датчика препятствий и прочее...
Цикл движения должен быть разбит на элементарные неделимые части, из которых робот может, при изменении команды управления, может перейти к выплнению другой команды. Например: двухногий робот - двигается вперед, поднял правую ногу, датчик препятствий показал наличие препятствия - что делать?
Если программа не проверяет датчики до окончания движения, то авария. Если вы часто проверяете состояние окружающего мира, то из этого положения программа легко справиться.
Механизмы, как у Вас, представляют собой так называемые цифровые автоматы. Они описываются множнством состояний положения механизмов, из каждого положения которого есть счетное множество переходов к другому положению механизма в зависимости от внених условий. Вернемся к примеру - двигался вперед, поднял ногу для движения вперед, поступило сообщение - препятсвие, что обозначает двигаться вперед нельзя - далее, напрмер, вернутся к предыдущему состоянию, из него идти назад 2 шага, повернуть направо и далее по программе. Почему 2 шага назад, да потому, что такая траектория движения при попороте направо, при которой робот минует зафиксированное припятствие (пример)
2. Следует помнить, что при проектировании механизмов, подобных Вашему, особенно с малым количесвом ног, нужно тщательно балансировать механизм, проводить специальные расчеты и иследования.
Чем мощнее серво, тем выше вес и потребление. Расположенные на ногах сервопривода помимо большого веса, при движени создают приличный момент, который очень трудно сбалансировать.
Питание серво, например 8 семи киллограмовых сервоприводов будут потреблять около 1,5 ампер по 6 вольтам - большая прибавка веса.
По поводу гироскопов, аксельрометров, датчиков касания - дело благое, но очень не простое.
Loox
Давай вопросы, все сделаем красиво

Добавлено спустя 18 минут 39 секунд:
Кстати, посмотри вот здесь http://3dtoday.ru/we-print/novogodnyaya ... 17-3d-god/
Пример не удачного баланса, считал небрежно, думал и так сойдет.. плохо вышло, ходит геудачно
Loox

Re: Нужна помощь с четвероногом

newbe » 20 авг 2017, 17:41

loox писал(а):Добавлено спустя 18 минут 39 секунд:
Кстати, посмотри вот здесь http://3dtoday.ru/we-print/novogodnyaya ... 17-3d-god/
Пример не удачного баланса, считал небрежно, думал и так сойдет.. плохо вышло, ходит геудачно
Loox

Не красиво, потому что он не заморачивался постановкой походки и переката центра тяжести тела итп. Я так все колени себе уже стер об ковер, имитируя движения которые я бы хотел видить и пытаясь их реализовать)) Сегодня внесу поправки, запишу видео для наглядности, может будут какие-то советы на этот счет.
И еще Loox, не могли бы вы набросать код для двух серв, что бы они плавно и одновременно двигались на разные углы, один к примеру от 0<60, а другой от 180>60, используя delay. Я ранее пытался делать это через for, но получалось только поочередно или одновременно, но никакой плавности. Мне для наглядности. Потому что с миллис я сделал цикличный шаг и не запутался, только благодаря мане небесной

Re: Нужна помощь с четвероногом

loox » 20 авг 2017, 23:56

Newbe
На самом деле он, это я, заморачивался с плааностью хода и переносом центра тяжести, а внешняя угловатость и резкость в движении связана с упрощенной кинематикой движения, малыми размерами, большм весом и целевой задачей - это игрушка для маленкого ребенка. Об ошибках кинматики позже.
Вам следут знать, то что Вы применяете и называете сервоприводами на самом деле - рулевые машинки, из отрасли дистанционно управляемых самолетов, параходов и прочее. ....
Они очень медленные ( с точки зрения работотехники) , с ростом моментов существенно растет их вес и потребление энергии. Очень слржно осуществлять плавные жвижения, при этом иметь заявленный момент при малых углах поворота.
Я не совсем понимаю, почему Вам не удается относительно плавно управлять несколькими серво. Почему у вас не работает вот такой механизм, пока для одной сервы:
?
.......
void setup()
{
.....
....
/усановим серву в 0 градусов, дождемся когда она уверенно встанет в ноль
myservo.write(0);
delay(80); // подберите это значение, минимальное значение времени, которое нужно серве вернуться
// в 0 из крайнего положения
}
void loop ()
{
// теперь будем двигаться от 0 к 60 градусам по 10 градусов
myservo.write(10); // эту величину можно попобовать любую
delay(100); // эту величину необходимо подобрать таким образом, чтобы визульно небыло
// остановки движения
myservo.wrire(20);
delay(100);
......
myservo.write(60);
while(1) {};

}
Это должно работать, если это работает то две сервы
void setup()
{


myservoA.write(90);
myservoB.write(90);
delay(80) // теперь исходное состояние 90 градусов
}
void loop()
{
myservoA.write(90+10);
myservoB.write(90-10);
delay(100); // все аналогично примеру для одной сервы
......
myservoA.write(90+60);
myservoB.write(90-60);
while(1) {};
}
п
вот такой тест должен работать, он обязательно должен работать. Его необходимо повести для поиска угла и времени задержки для обеспечения плавности движения.
Как оргигинально напсать код напишу позже. Отпишите почему у Вас не работает такая конструкция
Loox

Re: Нужна помощь с четвероногом

loox » 21 авг 2017, 10:34

Newbe
Теперь по поводу кода
В с++ есть некоторе понятие - структра. Структура - это ( помню еще из детского сада) объединенное в единое целое множество поименованных элементов в общем случае разных типов.
Создадим для серво структуру:
typedef struct // объявление структуры
{
int num; // это номер сервопрвода
int degree; // это угол на который необходимо повернуть серво
int pause; // это программная задержка, необходимая для достижения серво указанного
// значения угла
} step_t // имя структуры

Добавлено спустя 20 минут 9 секунд:
Указатель на эту структуру, мы будем подавать в обработчик движения.
#include <Servo.h>
#define gtyServo 12 //это количествр приводов
..... // тут пишете все что вам необходимо
Servo myservo[qtyServo] ; // это массив номеров серво, необходим для обработки серво через цкл for
type struct
{
int num;
int degree;
int pause;
} step_t ; // это наша структура

void moves(step_t steps[]); // это объявление процедуры обработки движения

Добавлено спустя 18 минут 22 секунды:
// здесь мы напишем структуру для исходного слстояния
step_t *reset = (step_t[])
{
{0,60,0}, // установить первый сервоприво на угол 60, пусть двигается с
{1,90,0}, // установит вторую серву на угол 90, пусть даигается
.....
{11,90,80}, // установить двенадцатую серво на угол, приосьановить выполнение программы на 80 мс
// дождаться пока все серво встанут в исходное состояние
{-5,0,0} // это несуществующая серво с номером -5 по которому обработчик движения будет
// понимать что данные в стуктуре закончились, Структура может быть призвоьной
// длины, номера серво могут быть не по порядку, повторятся в любом порядке, сколько
// угодно раз
};
// извини продолжу позже, сажусь в самолет

Re: Нужна помощь с четвероногом

loox » 22 авг 2017, 09:58

/* далее аналогично Вы можене написать любые движения
значения могут записываться как в столбик так и в строку
*/
step_t *foward = (step_t[])
{
···········
{-5,0,0}
};
// процедура движения
void moves(step_t steps[])
{
int i;
while(1)
{
if (steps[i].num < -1) break;

Добавлено спустя 12 минут 5 секунд:
myservo[steps[i].num].wrire(steps[i].degree);
// . writeMicrosecpnds(steps[i].degree);
// это если значения задаются угла задаются в микросекундах
if (steps[i].pause >0) delay(steps[i].pause);
i++;
}
}

Добавлено спустя 16 минут 7 секунд:
......
void setup()
/* тут вы произвожите всяку инициадизацию
Переменных, и прочее
*/

// установим в исходное состояние механизм
moves(reset);
}
void loop()
{
moves(forvard);
while(1) {};

}
/*
Ну вот так примерно
В основном цикле вы можее опрашивать канал связи, датчики, на их основе выбирать путь движения
Извините за орфографичкские ошибки пину с планшета - ужасно неудобная клавиатура.
*/

Re: Нужна помощь с четвероногом

newbe » 03 сен 2017, 01:51

2 loox
Спасибо за старания, обязательно посижу, обдумаю ваш вариант, думаю так будет и кода меньше и путаницы тоже.
Кому интересно вот видео с первой манерой ходьбы, можно сказать приставной, в конце он возвращается в исходное положение https://vk.com/video297994095_456239029
Видео снималось пару недель назад. Сейчас я сделал уже более нормальный вариант с двумя перемещениями корпуса вперед за цикл.
И сегодня разобрался с нажимными контактами и распремлением ноги. Как только контакт замыкается, лапа прекращает движение. Думаю за неделю напишу для всех четырех лап.

Re: Нужна помощь с четвероногом

Robo_hobo » 17 янв 2020, 13:04

Времени прошло много, но все пошло, даже было реализовано выравнивание корпуса во время ходьбы, когда поверхность имела наклон или под ногу попадалась возвышенность + были сделаны датчики позволяющие определять наступила лапа на что-то или нет, не знаю как но я это все как-реализовал)) Как итог, код в полторы тысячи строк ушел за ручку с моим HDD..
В общем времени много прошло, возможности поменялись, как и желания. Прототип стоит на полке, неся гордое знамя основоположника.
Сейчас настала пора прототипа номер 2, иных размеров и качества, не на коленке с на девкой, как в прошлый раз) Все будет на mg996, в связке с ардуино и Raspberry Pi 3.
Данные аккаунта своего не смог восстановить.

Re: Нужна помощь с четвероногом

Robo_hobo » 25 мар 2020, 17:08

Значит продолжаем тему, если кто-то сюда заглянет, будет отлично. Четвероног-реинкарнация включает в себя, как я уже говорил
Из логики: ардуино про мини, первой шилд на атмеге 48, распберри 3 А+.
Из механики:12 mg996
Куча всякой мелочи, но это упустим.
На выходных собрал две ноги и стенд, на котором можно уже начинать что-то отрабатывать. Теперь встал вопрос, берем одну ногу и с помощью инверсной кинематики находим углы и пытаемся для начала скаблить пол из точки А в точку Б, не выше не ниже, четко по земле.
С прошлым животным я мучился - мучился с кинематикой, так ничего и не вышло, кроме прямой. Сейчас я вроде нашел нужную информацию и даже написал код, правда на Питоне, где можно ввести длинную конечностей, точку x,y и в итоге получить угл для плеча и предплечья, в одной плоскости в 2dof.
Информацию брал из этого источника:
http://robocraft.ru/blog/mechanics/756.html
Если есть какие-нибудь ресурсы, где может это описано подробнее или проще математически, рад буду получить ссылку или совет.
Фото половины прилагаю
Вложения
IMG_20200325_160321.jpg
IMG_20200325_160247.jpg
IMG_20200325_160214.jpg

Re: Нужна помощь с четвероногом

Aseris » 25 мар 2020, 18:07

Обратная кинематика для шестинога, вроде даже на форуме было. или гуглить inverse kinematic
Тот же open dog смотреть


Rambler\'s Top100 Mail.ru counter