Проект шагающего робота

Алексей_Бутов
Offline
Зарегистрирован: 15.11.2015

Приветствую!

Сделал такой проект  -  http://www.youtube.com/watch?v=MD6YdmacAhI

Ищу идеи для его дальнейшего развития !

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А почто "шагание" делается только одной ногой по очереди? А сразу двумя по диагонали, как у всех животных - не получилось? Для устойчивости можно наклонять его немного вперед на оставшейся паре ног, ну и можно гироскоп прикрутить для контролю устойчивости. Это предложение в плане "куда двигаться". :)

Алексей_Бутов
Offline
Зарегистрирован: 15.11.2015

Спасибо за комментарий! 

Для того чтобы сделать этого робота я внимательно изучил вот это - http://roboticslib.ru/books/item/f00/s00/z0000016/st027.shtml

То что Вы говорите о животных для меня крайне интересно, но я не смог найти рабочий материал о том как это сделать. Буду признателен если дадите ссылку.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

? руками конечно же. Ну и головой тож. :)

Прикручиваете гироскоп и смотрите как бегают роботы-балансировщики о 2-х колесах.. по аналогии регулируете от гироскопа наклон вашего бота на тех ногах, на которых он сейчас стоит, а две оставшиеся - двигаете вперед одновременно, ну или "почти". И так "по очереди": 2 ноги ходят, две - держат равновесие от гироскопа. А за животными .. ну понаблюдайте за своим котом или собакой как они ходят. У них тоже 4 "ноги". Снимите кино и рассматривайте его в замедленном режиме .. много чего "обнаружите". :)

Алексей_Бутов
Offline
Зарегистрирован: 15.11.2015

В очередной раз очень познавательно :) Вы слышали что-нибудь о динамическом равновесии ? Погуглите, там не все так просто на самом деле. Вот ели бы Вы нашли статью описывающую методологию шагания с гироскопом где есть рассчеты, выкладки, алгоритм то я бы был благодарен. Я так ничего и не нашел. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну .. сейчас у нас задача сделать катающуюся тележку, перевозящую теннисные шарики по лабиринту... надо успеть до 20..25 ноября, к соревнованиям. А там, позже .. тоже займемся ибо "есть интерес" к шагающим изделиям. Описание наших поделок есть тут: http://arduino.ru/forum/proekty/lego-kirpich-iz-mega2560

Там же и буду продолжать ведение истории поделок далее.

Пока у нас небольшая проблема с механикой: самодельные редукторы, те что сделаны не выдают достаточную мех. мощность и либо "не тянут" (червячные - большая потеря из-за низкого КПД червяков) либо медленно едут и ломаются (недостаточная прочность корпуса редуктора из пластика от СД-дисков) .. а покупать леговские "жаба давит" да и не входит "в нашу программу освоения".

Я просто описал подход, который планирую использовать сам в таких поделках:

гироскоп следит за равновесием, и может регулировать оперативно наклон бота для удержания равновесия, пока остальные ноги "шагают". Уже собирали типового робота-балансировщика на паре колес. Думаю даже можно сделать даже что-то "самообучающееся" с эффектом памяти и упреждения потери равновесия. Примерно как сейчас, наш бот пытается "запомнить" лабиринт и уточнить набор движений по нему при повторных перевозках шариков с ростом скорости перемещения: каждый следующий проезд можно делать быстрее предыдущего.

Но у нас "мега" и "автоматное программирование" с отработкой всего что можно на прерываниях (замер расстояний, цвета, пути энкодерами, регулировка скорости моторов и т.д - всё это большей частью на прерываниях, изменяющих состояние нужных конечных автоматов и только) и аппаратном ШИМ .. возможностей экспериментировать несравненно больше. Пока, лабиринт, путь, конечные автоматы и т.д. всё умещается в 4 кила скетча и килобайт оперативы...

Алексей_Бутов
Offline
Зарегистрирован: 15.11.2015

Ну попробуйте с гироскопом, расскажете потом что получилось :)

Посмотрел я тему сделать из ардуино лего, мне кажется там очень много вопросов возникает. Я в свое время изучал этот вопрос и литературы нет никакой и у меня идей тоже особо не нашлось. Лего сам по себе громозкий и страшный выходит.  Я сторонник специализированных комплектов с минимальной массой и размерами. Вот у меня такой еще есть проект - 

http://www.youtube.com/watch?v=wUh0fVf7KjE 

Сделано на коленке но можно идею развить и сделать красиво. 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

С лего все на самом деле "не так просто" как кажется. И громоздко. Первая проблема в том, что есть 2 вида лего: обычное и техник. И переходные "балки", которых как всегда маловато. Есть ещё "роботы", но в силу их тяготения к техник отдельно можно не рассматривать. И вот тут засада в том, что система креплений у них принципиально различается, и крепить обычное лего достаточно надежно - "задача ещё та". Именно она "крадет вес". А техник - получается сильно неуклюжим и тоже недостаточно прочен, да и деталек накопить сложнее, а часть специфичных деталек, к сожалению, есть только в наборах Майндшторм, EV3 и им сопутствующим: разные "доп. наборы к". но именно они существенно упрощают задачи сборки "итого" - и это "вторая проблема". Уже задумался: а не склепать ли из второй уны 3D-принтер? Только врядли он сможет обеспечить требуемую точность изделий.

Ну и третья засада - это моторы. Потери мощности в лего соединениях - значительны, вес изделий тоже не мал .. моторы нужны от 500 гр*см, нормально в районе 2кг*см, и это при хороших оборотах ХХ: от 80-100rpm, нормально от 300rpm. Это "на выходе" редуктора. Наши 130-е моторы такую механическую мощность, если и тянут то где-то на пределе габаритов мотора .. пробовали перематывать (ребенок сам перемотал 2шт) .. все равно "маловато будет". Лучшее что пока получилось на сегодня, это останавливающий момент в 1.6-1.9кг*см при токе КЗ в 0.5А/9-11В и оборотах ХХ в 160-180rpm. Это примерно в 1.5-2.5 раза хуже чем моторы Lego EV3: момент в 3-4кг*см при оборотах ХХ в 220rpm с токами КЗ 1.5А/9В.

Но, с другой стороны, для целей обучения и освоения - все-таки, это "лучшее решение", имхо конечно. По Лего проходит много соревнований, оно распиарено и даже изучается в школе, на занятиях по робототехнике, есть соревнования по Ардуино, но они больше "для старших" .. наш пока ходит в кружок с Lego WeDo и занимаемся дома с Ардуинкой постепенно осваивая язык С и уже способен понимать "как" устроены картинки в стандартном программировании Лего. А чуть позже они тоже перейдут на Lego MindStorm и EV3, и это означает, что играясь с лего, даже в разрезе Ардуино дома, он вполне способен общаться со сверстниками на одном языке, что тоже далеко не маловажно.

Мне просто показалось несколько расточительным закупать домой майндшторм. Это надо потратить бюджет в районе 30-50тыс. руб. ибо с дополнениями. А без дополнений, как показывает гугление - это просто игрушка, надоедающая детям в течении 2-6 месяцев. И .. дабы потом переходить на Ардуино или куда ещё .. и выбросить всё это барахло (особенно если оказалось неинтересно!). На сегодня, все наши закупки вытянули менее чем на 12тыс. и это с учетом того, что примерно половину можно было пока и не брать: в частности, набор датчиков 37 в 1 - по сути лежит "без применений", разные реле, Rfid, индикаторы, разъемы, шаговики .. потом конечно пригодится, но сейчас - вот нафиг не нужно. И такого "в запас" получилось тысяч на 5.

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

 

Алексей_Бутов
Offline
Зарегистрирован: 15.11.2015

Управление через смартфон :)

вообще говоря для малышей ардуино - слишком сложно. Лего упрощенный адаптированный вариант. Я ориентируюсь на аудиторию от 12 лет. Проекты рисую в автокаре и заказываю лазерную резку. Смотрел шагающих Леговских роботов, с моим не котируются. Они все упрощают. Манипуляторы тоже слишком громоздкие. И все очень, очень дорого.... Я собираю ветку дешевых комплектов для рабочего класса, чтобы не дороже 1000 рублей, стараюсь нести свет в массы ;)

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Сложнее - да. Особенно если программировать на "чистом С/С++". Но, "мы пошли другим путем" :)

Каждое устройство - это конечный автомат с заготовленным комплектом "функций". Практически, сильно похоже на картиночное программирование в Лего: программа собирается из таких кирпичиков, разве что без картинок. Возможно "пока". Каждый кирпичик - просто переводит состояние конечного автомата, а исполнение действия - делается скрытно, в loop(), который практически "типовой": перечисление исполнения шага автомата, если "настало время". Просто надо "не забыть" воткнуть в loop() ещё и шаг "этого автомата".

Типа пример:

include "arhat.h" // подключаем библиотеку, заменяюущую вызовы Wiring на макросы

#define servo1 pin2
include "my_servo.h"  // создаем "объект" конечный автомат серводвигатель датчика"

#define servo2 pin2
include "my_servo.h"  // создаем конечный автомат серводвигателя выгрузки

#define echo 62
#define trig    14
#include "hcsr04" // создаем конечный автомат узв. датчика

void brain(){
  // если серва доехала - начинаем замер
  // если замер произведен - запоминаем его в массив текущих замеров
  // если все замеры завершены - усредняем, складываем в обзорный массив направлений
  // .. и запускаем серву на след. положение
  // ищем дырку куда ехать
  // если дырка есть прямо - запускаем моторы
  // если дырки нет - ищем следующую "по правой руке"
  // .. или по левой, смотря какая кнопка нажата - выбор режима
  // если моторы едут - коррекция по энкодерам,
  // .. коррекция по расстояниям до препятствий "сбоку"
  // .. контроль точек движения
  // если найден красный квадрат в лабиринте
  // .. открыть люк, выгрузить шарики, сменить обход точек на "обратно"
  // если в кузове пусто (изначально так) или вернулись к начальной точке
  // .. искать пункт погрузки и если нажат датчик препятствий - останов двигателей
  // .. .. и подсчет "упавших" шариков (нажатий датчика)
  // и т.д.
}

void loop(){
  tsc_step(servo1);
  tsc_step(motor[1]);
  tsc_step(hcsr04);
  tsc_step(servo2);
  ...
}

Все эти "функции" по сути просто вызов одной и той же команды tsc_next(автомат, номер состояния); разве что с "укладкой" каких-то параметров в структуру автомата: скорость, шаг, направление, угол вращения и т.д. Есть чисто вычислительные функции, типа "найти дырку" в массиве расстояний по направлениям и получить "направление" .. но они как раз пишутся мною пока ещё и даются ребенку уже готовыми к применению. :)

Функция tsc_step() тупо исполняет текущее состояние и выставляет время задержки до следующего исполнения. Видоизмененный классический макрос

if( millis() - startTime >= timeout ){ запомни следующую и делай_текущую_команду_автомата; }

, но позволяет "скрыть" исполнение последовательности команд, когда это необходимо. Например "плавный разгон мотора" - последовательное исполнение серии команд по изменению значения аппаратного ШИМ у счетчика с небольшими, типовыми задержками.

.. вполне по силам ребенку и он уже хорошо понимает, что "принципиальной разницы" между картинками лего и написанием названий функций - нет.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Дополню. Само программирование каждого конечного автомата, тоже по сути тривиально: это массив структур из "действия", "следующего состояния" и "времени  исполнения" (задержки). Поскольку следующее состояние фиксируется "до" исполнения действия - никто не запрещает изменить как "следующее дейтсвие" так и время исполнения текущего (следующая задержка) вручную в текущем действии автомата.

Выглядит типа так:

enum { MOTOR_FORWARD=0, MOTOR_BACK=3, ...};

TSC_Table motor_funcs[] = {
/* command  timeout next_state */
  { motor_start_forward, 50, 1}, // 0: запуск мотора, след. команда через 50мсек
  { motor_up_forward,    50, 1}, // 1: увеличиваем скорость до заданной, 50мсек
  { empty,                           5,   2}, // 2: мотор едет вперед - ничего не делаем. каждые 5мсек.
  ...
}

Тут выход из состояния 1 и переход в состояние 2 - разгон мотора, происходит за счет смены состояния внутри функции motor_up_forward() по достижению заданной скорости. Она тупо увеличивает ШИМ мотора и смотрит достиг ли он заданного предела.

Состояние 2 - "мотор едет вперед"  - пустая функция, с небольшой задержкой. Требуется дабы в loop() опрос автомата происходил с заданной частотой. Его состояние могло измениться внешним автоматом. Так, автомат "узв. датчик" по завершению замеров изменяет состояние своего серво двигателя с "доехал" на "повернись на угол".

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