Как стать автором
Обновить

Комментарии 59

На каком языке написана прошивка?
Как я понял, никаних датчиков и обратных связей нет, все жестко завязано на время?
Писал на C под Microchip PIC18. Всю информацию получал прямиком с серво-приводов, благо набор индикаторов довольно богатый: угол, скорость, крутящий момент, вольтаж, температура и т.д. Дополнительных датчиков нет, хотя платы предусматривают расширение системы. Я оставил выходы к аналоговым/цифровым портам в виде pinhead'ов. Если память не изменяет, там около 10 свободный портов на каждую ногу, включая I2C.
А как закон движения у вас реализован? Учитываются ли в нем показания датчиков в приводах?
Какие реализованы защиты? Что будет например, если нога застрянет?
Все движение прописано в готовых gait'ах. Движется робот по модели alternating tripod — три ноги упираются в пол при движении. Задается точка в 3D пространстве для позиции кончика ноги, функция проверяет может ли нога дотянутся до заданной точки, если да, то высчитывает полярные углы для каждого из 3-х серво-приводов. Используются данные о стартовой позиции и скорости + постоянно проверятся закончила ли нога свое движение. Вся защита сводится к лимитированию углов поворота. К тому же, мотор просто отключится если напряжение превысит максимально допустимое, что может произойти в случае блокировки ноги. Все очень топорно, AI элементы отсутствуют.
> мотор просто отключится если напряжение превысит максимально допустимое

Думаю, напряжение никогда не превысит то, которое подается на питание. Может, имеется в виду ток (который таки может сильно возрастать, если двигатель заблокирован)?
Обучение на английском дает о себе знать. Имел в виду electric current — электрический ток.
Пользуясь случаем, хотел поблагодарить вас за вашу статью о создании гексапода. Очень круто и информативно. Признаюсь, что использовал ваш материал при написание собственного софта.
Спасибо, очень приятно узнать, что моя писанина кому-то как-то помогла. У вашего гекса перспективы побольше в плане мощности, а значит и носимого оборудования. Так что буду ждать развития .) У моего таскать камеру на себе — предел, и то недолговечный:

Что нового в этом проекте? Диссертация подразумевает научную новизну и оригинальность. Гексаподов же куча. Может, Вы, сделали какой-то новый закон движения? Может, Вы, корпус и ноги сделали из нового композитного материала? Может, Вы, переосмыслили принцип работы гексаподов? Нужно больше конкретики. Если просто взять готовый продукт и перестроить его, то это больше смахивает на курсовой, чем на диссертацию.
Да вы правы, это курсовая. В Англии они это диссертацией называют, странные они.
В Англии это называют thesis. И хотя каждая диссертация — это thesis, не каждый thesis — это диссертация (иногда, например, thesis — школьное сочинение).
Не злоупотребляйте термином, это обесценивает действительно научные работы.
Я тоже запутался, но вики вносит хоть какую-то ясность. Почитать можно тут. В моем случае — это диссертация на Bachelor of Engineering (BEng).
Действительно, необычно.
Тем не менее, вряд ли уместно использовать перевод-кальку вместо устоявшегося русского термина «дипломная/бакалаврская работа». Особенно, если калька сильно искажает смысл (как видно по комментариям, многие решили, что речь о кандидатской/PhD работе)
Буду аккуратней в будущем.
Эта магисторская диссера, сейчас к ней такие запросы.
Я не очень понял зачем все эти контроллеры?
Dynamixel AX-12 позволяют объединить в одну «сеть» до 254 сервомашинок. Остается сделать только конвертор из «сети Dynamixel» в что то более осмысленное и понятное PC и вперед с песней пиши на чем хочешь.

Верно, задумка состоит в том, что все вычисления производятся на каждой ноге отдельно, а центральный контролер только отдает команды. Некое подобие нейро сети.
Нейросеть тут как-то совсем не к месту, в ней узлы очень просты, с таким размахом и интернет можно нейросетью обозвать.
Получилась распределенная сеть контроллеров, та самая CAN.
Планировалось создать из этого нейросеть с дополнительными датчиками и заняться адаптационным движением, рефлексами и нейронным обучением.
Вопрос с подковыркой.
Назовите мне хоть один высший живой организм с распределенной нервной системой?
Человек?
Да вот в том то и проблема что нет таких существ на планете земля.
А как же позвоночные, у которых часть рефлексов обрабатываются спинным мозгом в обход мозга головного?
Ну я лично могу без проблем блокировать подобные рефлексы «верхнем утолщением спинного мозга».
IMHO вы просто перезагоняетесь.
Делая кучу низкоуровневых систем с обратными связями вы получаете крайне не устойчивую и плохо управляемую систему.
У вас подсистемы с ОС внутри другой под системы с ОС. А возможность наблюдаемости внутренних состояний еще только запутывает. У вас же вышестоящие циклы теоретически могут видеть что творится ниже.
Просто попробуйте смоделировать вашу систему правления и посмотрите не будет ли биений как будут затухать возмущения.
А так на одну серву: управляющие воздействия- направление, длительность ШИМ, входные: текущее положение (угол), ток потребляемый двигателем. Такой объем команд и датчиков умноженный на 18, с частой дискретизации 1000 Гц. Легко решается на одном контроллере.
Реализация приоритета в обработке сигналов — неотъемлемое свойство ЦНС, и используется в диагностике ее поражений, популярный пример — Рефлекс Бабинского — позволяет установить наличие поражений центрального двигательного нейрона. У взрослого здорового человека головной мозг подавляет реакцию спинного, у новорожденного и у человека с поврежденным двигательным нейроном такого подавления не возникает.

Что касается распределенной сети контроллеров — это очень правильное архитектурное решение, так как оно позволяет разгрузить центральный контроллер и существенно упростить его программу. Вместо команд «дать ток на двигатель 3 ноги 8» и постоянных запросов угла и тока, достаточно дать команду «ноге 8 встать на углы a1,a2,a3 к 1789 кадру синхронизации».
Вы привели отличный пример про «ток » и «кадр синхронизации». Пытаясь решить задачу перемещения по ровной поверхности шестиногой твари. Но
1 Задача имеет более простое решение -> колесо
2 Задач превращается в безумный механизм обработки асинхронных событий при движении по пересеченной местности.
Я это уже проходил. Что будет если нога застрянет? Или если нога провалится?
Приходится на верхнем уровне сразу принимать решения, на уровне ноги эти задачи не решишь. Уровень ноги это как уже говорил 2 команды и 2 датчика, еще можно добавить датчик касания.
Просто попробуйте описать представить ситуацию «Нога зацепилась и продолжает двигать тело машин, другие ноги видят что их пытаются дестабилизировать» все это охвачено как ваш ем случаям тройным контуром обратной связи и вот тут поверьте такая веселуха начинается. Даже когда в системе один контру обратной связи из-за разбросов параметров серв и механики такие чудеса лезут.
В случая централизованного контроля за движением централизовано как только один из показателей выходит за рамки планируемого движения. Текущий план движении сразу отбрасывается и начинает строится новый. И опять же централизованно.
А к вопрос разгрузить ЦП от задач первичного сбора и обработки данных за вас эту разгрузку уже делают мозги сервы.
И поверьте если вы сделает асинхронные сообщения от контроллеров серв вы просто умрете писать алгоритмы синхронизации там где они не нужны.
В целом, мы попали в аналог известного спора о микроядре и макроядре.

Что касается использования кучи жестких обратных связей — я думаю, стоит подумать о применении более совершенных регуляторов, основанных на более развитых, более сложных вариационных принципах.
По русски это называет «Вам шашечки или ехать».
Плохо Вы знаете себя самого :)
Человек, по сути, управляется именно распределённой нервной системой. Даже кишечник имеет свою «нейронную сеть».
Осьминоги вас устроят?
Человек, определённо.

Типичные здоровые человеки оборудованы, как минимум:
  1. Центральным процессором, с разными физически функционально выделенными элементами, а также с поддержкой многозадачности. Кстати, тот софт, который мы считаем главным, не имеет там рутовских привелегий.
  2. Спецпроцессором модели «medulla spinalis» по работе с периферией. Большей частью он представляет собой быстродействующую шину данных, но изрядная часть этих данных там тоже обрабатывается.
  3. Спецпроцессором по перевариванию пищи — т.н. рептильный мозг. Связан со спинным и ЦП специализированной шиной данных «Вагус».
  4. Системами сжатия данных, удаления артефактов и улучшения качества изображения в системах видеонаблюдения.
  5. Автономной аварийной системой обработки сокращений в главном кровяном насосе.
Было бы интересно увидеть продолжение.
Жаль, но робот остался в университете, а я с головой ушел в автомобильную инженерию с ее эргономикой. Не судьба, видать, стать создателем Skynet'а.
[зануда моде он]
Нужно — 18 движков
Др. Тони — 3 движка
Университет — 12 движков
18 != 3+12
Были еще участники проекта?
[зануда моде офф]
Тоже заметил несостыковку после отправки статьи в песочницу. По началу он взял шесть. Спустя четыре месяца докупил недостающие.
Забыл уточнить, что над проектом работал самостоятельно.
Пожалуй воснользуюсь модом предыдущего комментатора (BoxaShu), как наиболее подходящим.
[зануда моде он]
Это все интересно, но в диссертацинной работе должна быть научная и техническая новизна, а так же практическая значимость. Другими словами — зачем все это делалось? К слову говоря ни научной ни технической новизны я тоже не заметил.
[зануда моде офф]
Пожалуй воснользуюсь модом предыдущего комментатора (BoxaShu), как наиболее подходящим.
[зануда моде он]
Это все интересно, но в диссертацинной работе должна быть научная и техническая новизна, а так же практическая значимость. Другими словами — зачем все это делалось? К слову говоря ни научной ни технической новизны я тоже не заметил.
[зануда моде офф]

Забыли [нечитатель моде офф] :)
habrahabr.ru/post/241620/#comment_8092380
Тезис/Диссертация на Доктора, Магистра требует все то о чем вы упомянули. На бакалавра этих требований нет.
Тезис/Диссертация на … Магистра … бакалавра
По-русски это называется «дипломная работа» или «дипломный проект» (в зависимости от наличия практической части). Хотя… ниже пишут, что для магистров уже «диссертация», странно…
> На третьем курсе бакалавра электронной инженерии мне требовалось выбрать диссертационный проект

Так и надо было в заголовке писать: «бакалаврская работа» (пусть даже «дипломная», хоть дипломная — это для полноценного высшего). А то я уж грешным делом подумал, что на такой элементарщине ныне в к.т.н. выезжают…
Вот видите как, у вас бакалавр не полноценное высшее, а у нас вполне себе полноценное. Более того, в Англии на докторскую можно идти прямиком после бакалавра.
Россия тоже участвует в Болонском процессе, у нас степень бакалавра — полноценное высшее образование

// Если не изменяет память «диплом» бакалавра назывался «выпускная квалификационная работа бакалавра», у магов же «магистерская диссертация»
Добавил пояснение в конце статьи.
А о чем статья? Где тех подробности? Вы хотели построить, построили и приложили пару фото.
Взгляните на это с перспективы вступительной статьи. Если есть желание, могу продемонстрировать тех. подробности в развернутом виде в следующей статье.
И всё равно остаётся неясным, почему с динамикселями обращаются столь грубо — подключают через тройную винтовую колодку когда есть специализированный разъем? Слаба богу «обычное» каскадирование друг за другом (серва в серву, а последняя — в контролер) хоть реализовали.
И зачем использовать PIC, если даже производитель всё собирает на ATMega'х ?
В общем, как курсовик — волне себе, но как выпускная работа — явно «не дотягивает».

Не в качестве пиара, а чтобы стала ясна неголословность утверждения, вот пример того как наши студенты первого-второго курса с гексаподами возятся. Да и со всем остальным подобным добром.
ошибка доступа
Это и есть специализированный разъем. Тут должно быть видно:

image

PIC использовался, так как университет преподает используя именно эти микроконтроллеры, и это был один из критериев финансирования.
Буду рад почитать статью о ваших наработках, вконтакте не пускает, ошибка доступа.
Насчет разъема я имел ввиду другую сторону — драйвера. Там тройные винтовые разъемы на платах. Но теперь присмотрелся — вроде есть у Вас и «нормальные» для Динамикселей гнезда. Потому прошу прощения.
А PIC — «плохо» в данном конкретном случае, поскольку их основная ниша — управление периферией, то есть в качестве «мозга» они не подходят (концептуально — так сами Microchip позиционируются). А Вам ведь именно в этом направлении нужно развивать проект — в интеллектуальном управлении.

Материалы студентов «ВКонтакте» не мои, наверное, они закрыли публичный доступ. Исправимся.
Развивать, действительно, планировалось в этом направлении и использовать ARM в дальнейшем. Изначально хотелось на ARM выполнить проект, но еще раз повторюсь, был двухлетний опыт на PIC'ах и абсолютно никакого опыта с AVR & ARM. Причина выбора микроконтроллера диктовалась именно этим фактором.
И зачем использовать PIC


Вы говорите «PIC» так, как будто это что-то плохое.
PIC от Microchip — очень хорошие, но не подходящие в качестве SoC для задач управления роботами. Пики — для обработки ввода-вывода периферии. Нужен как минимум ещё один процессор «общего плана» для проведения расчётов и принятия решений.
Просто преподаватель, наверное, не хочет развивать в себе «новые навыки» — изучать другие типы процессорных архитектур, вот и даёт такие задачи (у нас такой был, кстати, уволили).
Так тут 18 серия, производительности хватит для всех.
Спасибо, что поделились опытом!

Для меня лично важно наличие в статье — «диссертационный проект», «робототехника», «своми руками» (надеюсь и у нас будет продвигаться это направление). Файлы проекта (если они открытые) можете выкладывать на github — думаю для людей будут интересны технические детали.
Всегда рад поделиться наработками, добавил в конце статьи ссылку на github.
Покопался. Такую вещь нашел:

Eusart1Mode(0);
Tx1Byte(rand()%255);	//Send random Byte
while(!TX1_STATUS);	

Мелочевка конечно, но байт будет несовсем случайным — числа 255 как раз не будет (остаток от деления всегда меньше делителя).
То есть правильно было бы делить на 256.
А тут вторая интересность — если бы берем остаток от деления по модулю, который является степенью основания системы счисления, мы можем этот остаток получить, просто убрав из числа лишние цифры.
Так что если мы хотим сэкономить десяток-другой тактов (и размера кода, подпрограмму подсчета остатка нужно же поместить в прошивку), стоит сделать
Tx1Byte(rand()&0xFF);

Нашелся фрагмент в «китайском стиле»
LegWriteStepBegin(5, 1);	//Send step begin command to a leg
LegWriteStepBegin(4, 0);	//Send step begin command to a leg
LegWriteStepBegin(3, 1);	//Send step begin command to a leg
LegWriteStepBegin(2, 0);	//Send step begin command to a leg
LegWriteStepBegin(1, 1);	//Send step begin command to a leg
LegWriteStepBegin(0, 0);	//Send step begin command to a leg

Что наводит на крамольные мысли о лимитировании минимального числа строк в исходниках, или о незнании того, что четность числа определяется младшим битом:
LegWriteStepBegin(i, i&0x1);	//Send step begin command to a leg


Но в целом, на исходники приятно смотреть.
Спасибо, за обзор кода. Замечание о «китайском стиле» очень к стати, и вызвано простейшим незнанием приведенного вами решения. Обязательно буду использовать в будущих работах.
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории