Сразу оговоримся, что совсем дешево делать не будем, т.к. не хочется убивать нервные клетки, делая доморощенные энкодеры для моторчиков + хочется упростить создание 3D модели, которая нужна для управления через ROS (ссылка на готовую модель – ниже в статье).
На момент написания статьи ориентировочная конечная стоимость изделия составляет ~70 000 руб. Если у вас есть 3D принтер, то можно смело вычесть из нее 20 000 руб. Если принтера нет, то его появление станет приятным бонусом. Все расходы я буду описывать исходя из того, что у нас нет ничего, кроме денег.
Как выглядит результат:
Также нужно отметить, что для программирования руки нам понадобится компьютер с установленными ОС Linux (я использую Ubuntu 18.04) и фреймворком ROS (я использую Melodic).
Может возникнуть вопрос «почему 70К рублей – это дешево?»
Отвечаю. Изначально я не хотел заморачиваться с созданием роборуки и думал просто купить что-нибудь простенькое, но достаточно функциональное в сборе.
Что являлось для меня критериями функциональности и минимальной допустимой простотой (т.е. почему НЕ подойдут манипуляторы с алиэкспресса) – можно обсудить в комментариях, чтобы не грузить тех, кому это очевидно и/или не интересно.
Опишу, однако, кратко примеры того, что я рассматривал на рынке:
1) top3dshop.ru/robots/manipulators/dobot-magician-basic.html
176 000 руб. DOBOT можно купить не только в этом магазине, но обычно он стоит еще больше. Наверняка есть шанс найти его где-нибудь дешевле, но все равно это будет сильно дороже, чем 70 000 руб.
2) robotbaza.ru/product/robot-manipulyator-widowx-robotic-arm-mark-ii
280 000 руб. Еще дороже. Вообще, манипуляторы от TossenRobotics прямо у производителя стоят супервменяемых денег. Вот только доставку в Россию (а я-то именно тут) из их магазина не заказать.
Забегая немного вперед скажу, что делать мы будем копию робо-руки PhantomX Pincher Robot Arm Kit Mark II, которая производится именно компанией TossenRobotics.
Итого, видим, что 70 000 руб – это совсем не так дорого.
Все цены привожу на момент написания статьи (июль 2020 года):
1) 6 моторчиков DYNAMIXEL AX-12A
Я покупал по цене 7200 руб за 1 штуку, но, кажется, можно найти и за 6000 при большом желании. Будем считать, что вам не повезет и вы тоже купите за 7200.
Суммарная стоимость: 43 200 руб
2) 3D принтер
Подойдет любой простенький, можно уложиться в 20 000 руб.
3) Arduino Uno + Power Shield
Стоимость: ~4 000 руб
4) Опционально (но я очень рекомендую): Лабораторный источник питания
Стоимость: ~3 500 руб
Отлично! Мы закупили все, что нам нужно (вероятно, дольше всего ждали доставки моторчиков, мне их везли больше месяца).
Что дальше?
1) Напечатаем детали для манипулятора на 3D принтере.
Качаем STL файлы отсюда
2) Собираем воедино с моторчиками. Проблем со сборкой быть не должно, но если они вдруг появятся, можно воспользоваться вот этой инструкцией
Класс! Рука у нас есть, но ведь ей же нужно как-то управлять. Хочется максимально использовать достижения человечества, поэтому установим себе ROS.
Для того, чтобы полноценно работать с манипулятором в ROS – нужно сделать его URDF модель. Она будет нам необходима для того, чтобы управлять робо-рукой с помощью пакета MoveIT!
На момент написания статьи последняя стабильная сборка доступна для Melodic/Ubuntu 18.04, чем и объясняется мой выбор версии системы и фреймворка в начале статьи.
Построение URDF модели – довольно трудоемкая (и, на мой взгляд, самая скучная) часть данного проекта. Нужно немного допилить напильником stl модели компонентов и соединить их воедино в XML-образном файле, вручную подбирая правильные коэффициенты смещения деталей друг относительно друга.
Кто хочет – может проделать работу самостоятельно, всем остальным поберегу нервы и просто дам ссылку на свой готовый файл:
github.com/vladmiron85/armbot/blob/master/catkin_ws/src/armbot_description/urdf/base.urdf
В данной модели пока нет захватывающего устройства, однако, до того момента, чтобы захватывать предметы в реальном мире нам еще далеко. Для остальных задач этой модели более чем достаточно.
Выглядит модель вот так:
Из полученного URDF файла мы сделаем конфиг MoveIT!, который позволит нам моделировать движения манипулятора и отправлять управляющие команды на реальную робо-руку.
Для создания конфига есть отличный туториал (ссылка)
Тут я могу опять сэкономить время и предоставить свой конфиг. Лежит он вот тут:
github.com/vladmiron85/armbot/tree/master/catkin_ws/src/armbot_moveit_config
Можно скачать конфиг с гитхаба и запустить следующей командой:
Примерно так можно будет управлять нашей реальной робо-рукой через rviz, когда мы подключим ее к ROS:
Переместимся из мира 3D моделей в суровую реальность. У нас есть собранный ранее манипулятор. Хотелось бы его как-то подвигать. Сделаем это с помощью Arduino UNO и Power Shield.
Подключим первый моторчик манипулятора (который снизу) к Power Shield'у и блоку питания следующим образом:
Да, data pin моторчика мы соединим сразу с 3 и 4 выводом Arduino. Пытливый читатель мануала Dynamixel (вот он) сразу заметит, что связь с внешним миром у моторчика организована по Half Duplex Asynchronous Serial Communication, а это означает, что data pin используется сразу и для получения команд и для ответа.
По умолчанию, на аппаратном уровне Arduino умеет работать только с Full Duplex UART. Эту проблему можно обойти, используя Soft Serial библиотеку, что мы и сделаем. Именно использование Half Duplex режима объясняет подключение data pin мотора к 3 и 4 выводам шилда одновременно.
Помимо полудуплексного обмена работа с Dynamixel через Arduino имеет еще пару занимательных моментов, которые могут быть не совсем очевидны с самого начала. Сведем их все воедино.
1) Сначала скачаем нужную библиотеку. Она называется ardyno и ее можно получить через Arduino Library Manager, либо тут (ссылка)
2) По умолчанию Dynamixel AX-12A хотят работать с baud rate = 1000000. Однако Software Serial Interface не потянет такую скорость, поэтому baud rate стоит снизить до 57600. Таким образом, начало файла с вашей программой будет выглядеть примерно вот так:
3) Все наши моторчики соединены друг с другом последовательно. Значит, чтобы обращаться к каждому из них — нужно знать его ID? Это действительно так, объект DynamixelMotor при инициализации получает два параметра: interface (одинаков для всех, его мы задали в предыдущем пункте) и id (должен быть у всех разный, иначе поведение будет у манипулятора весьма странное)
Id каждому моторчику придется задать вручную. Кажется, что будучи соединенными последовательно, они могли бы и сами рассчитаться по номерам от 1 до 6, но этого не предусмотрено. Поэтому нужно каждый моторчик отдельно подключить к Arduino (отключив от остальных) и выполнить следующую программу:
Изначально все моторчики имеют id=1, именно поэтому мы и указываем вверху
NEW_ID для каждого моторчика нужно заменить на число от 1 до 6 (да, ок, первый моторчик можно не трогать). Нумеруем их в порядке от нижнего к верхнему.
Ура! у нас есть полноценный манипулятор, который мы можем двигать, а также имеется 3D модель к нему. Можно брать ROS и программировать любые крутые штуки. Но это уже рассказ для отдельной статьи (и не одной). Данное же повествование подошло к концу, спасибо за внимание!
На момент написания статьи ориентировочная конечная стоимость изделия составляет ~70 000 руб. Если у вас есть 3D принтер, то можно смело вычесть из нее 20 000 руб. Если принтера нет, то его появление станет приятным бонусом. Все расходы я буду описывать исходя из того, что у нас нет ничего, кроме денег.
Как выглядит результат:
Также нужно отметить, что для программирования руки нам понадобится компьютер с установленными ОС Linux (я использую Ubuntu 18.04) и фреймворком ROS (я использую Melodic).
Может возникнуть вопрос «почему 70К рублей – это дешево?»
Отвечаю. Изначально я не хотел заморачиваться с созданием роборуки и думал просто купить что-нибудь простенькое, но достаточно функциональное в сборе.
Что являлось для меня критериями функциональности и минимальной допустимой простотой (т.е. почему НЕ подойдут манипуляторы с алиэкспресса) – можно обсудить в комментариях, чтобы не грузить тех, кому это очевидно и/или не интересно.
Конкурентные решения на рынке
Опишу, однако, кратко примеры того, что я рассматривал на рынке:
1) top3dshop.ru/robots/manipulators/dobot-magician-basic.html
176 000 руб. DOBOT можно купить не только в этом магазине, но обычно он стоит еще больше. Наверняка есть шанс найти его где-нибудь дешевле, но все равно это будет сильно дороже, чем 70 000 руб.
2) robotbaza.ru/product/robot-manipulyator-widowx-robotic-arm-mark-ii
280 000 руб. Еще дороже. Вообще, манипуляторы от TossenRobotics прямо у производителя стоят супервменяемых денег. Вот только доставку в Россию (а я-то именно тут) из их магазина не заказать.
Забегая немного вперед скажу, что делать мы будем копию робо-руки PhantomX Pincher Robot Arm Kit Mark II, которая производится именно компанией TossenRobotics.
Итого, видим, что 70 000 руб – это совсем не так дорого.
Что же нам нужно купить?
Все цены привожу на момент написания статьи (июль 2020 года):
1) 6 моторчиков DYNAMIXEL AX-12A
Я покупал по цене 7200 руб за 1 штуку, но, кажется, можно найти и за 6000 при большом желании. Будем считать, что вам не повезет и вы тоже купите за 7200.
Суммарная стоимость: 43 200 руб
2) 3D принтер
Подойдет любой простенький, можно уложиться в 20 000 руб.
3) Arduino Uno + Power Shield
Стоимость: ~4 000 руб
4) Опционально (но я очень рекомендую): Лабораторный источник питания
Стоимость: ~3 500 руб
Сборка
Отлично! Мы закупили все, что нам нужно (вероятно, дольше всего ждали доставки моторчиков, мне их везли больше месяца).
Что дальше?
1) Напечатаем детали для манипулятора на 3D принтере.
Качаем STL файлы отсюда
2) Собираем воедино с моторчиками. Проблем со сборкой быть не должно, но если они вдруг появятся, можно воспользоваться вот этой инструкцией
Делаем 3D модель
Класс! Рука у нас есть, но ведь ей же нужно как-то управлять. Хочется максимально использовать достижения человечества, поэтому установим себе ROS.
Для того, чтобы полноценно работать с манипулятором в ROS – нужно сделать его URDF модель. Она будет нам необходима для того, чтобы управлять робо-рукой с помощью пакета MoveIT!
На момент написания статьи последняя стабильная сборка доступна для Melodic/Ubuntu 18.04, чем и объясняется мой выбор версии системы и фреймворка в начале статьи.
Построение URDF модели – довольно трудоемкая (и, на мой взгляд, самая скучная) часть данного проекта. Нужно немного допилить напильником stl модели компонентов и соединить их воедино в XML-образном файле, вручную подбирая правильные коэффициенты смещения деталей друг относительно друга.
Кто хочет – может проделать работу самостоятельно, всем остальным поберегу нервы и просто дам ссылку на свой готовый файл:
github.com/vladmiron85/armbot/blob/master/catkin_ws/src/armbot_description/urdf/base.urdf
В данной модели пока нет захватывающего устройства, однако, до того момента, чтобы захватывать предметы в реальном мире нам еще далеко. Для остальных задач этой модели более чем достаточно.
Выглядит модель вот так:
Из полученного URDF файла мы сделаем конфиг MoveIT!, который позволит нам моделировать движения манипулятора и отправлять управляющие команды на реальную робо-руку.
Для создания конфига есть отличный туториал (ссылка)
Тут я могу опять сэкономить время и предоставить свой конфиг. Лежит он вот тут:
github.com/vladmiron85/armbot/tree/master/catkin_ws/src/armbot_moveit_config
Можно скачать конфиг с гитхаба и запустить следующей командой:
roslaunch armbot_moveit_config demo.launch
Примерно так можно будет управлять нашей реальной робо-рукой через rviz, когда мы подключим ее к ROS:
А что с реальной рукой?
Переместимся из мира 3D моделей в суровую реальность. У нас есть собранный ранее манипулятор. Хотелось бы его как-то подвигать. Сделаем это с помощью Arduino UNO и Power Shield.
Подключим первый моторчик манипулятора (который снизу) к Power Shield'у и блоку питания следующим образом:
Да, data pin моторчика мы соединим сразу с 3 и 4 выводом Arduino. Пытливый читатель мануала Dynamixel (вот он) сразу заметит, что связь с внешним миром у моторчика организована по Half Duplex Asynchronous Serial Communication, а это означает, что data pin используется сразу и для получения команд и для ответа.
По умолчанию, на аппаратном уровне Arduino умеет работать только с Full Duplex UART. Эту проблему можно обойти, используя Soft Serial библиотеку, что мы и сделаем. Именно использование Half Duplex режима объясняет подключение data pin мотора к 3 и 4 выводам шилда одновременно.
Помимо полудуплексного обмена работа с Dynamixel через Arduino имеет еще пару занимательных моментов, которые могут быть не совсем очевидны с самого начала. Сведем их все воедино.
Как подвигать наш манипулятор?
1) Сначала скачаем нужную библиотеку. Она называется ardyno и ее можно получить через Arduino Library Manager, либо тут (ссылка)
2) По умолчанию Dynamixel AX-12A хотят работать с baud rate = 1000000. Однако Software Serial Interface не потянет такую скорость, поэтому baud rate стоит снизить до 57600. Таким образом, начало файла с вашей программой будет выглядеть примерно вот так:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
SoftwareDynamixelInterface interface(3, 4);
3) Все наши моторчики соединены друг с другом последовательно. Значит, чтобы обращаться к каждому из них — нужно знать его ID? Это действительно так, объект DynamixelMotor при инициализации получает два параметра: interface (одинаков для всех, его мы задали в предыдущем пункте) и id (должен быть у всех разный, иначе поведение будет у манипулятора весьма странное)
DynamixelMotor motor(interface, id);
Id каждому моторчику придется задать вручную. Кажется, что будучи соединенными последовательно, они могли бы и сами рассчитаться по номерам от 1 до 6, но этого не предусмотрено. Поэтому нужно каждый моторчик отдельно подключить к Arduino (отключив от остальных) и выполнить следующую программу:
#include "DynamixelMotor.h"
// communication baudrate
const long unsigned int baudrate = 57600;
// id of the motor
const uint8_t id=1;
SoftwareDynamixelInterface interface(3, 4);
DynamixelMotor motor(interface, id);
void setup()
{
interface.begin(baudrate);
delay(100);
// check if we can communicate with the motor
// if not, we turn the led on and stop here
uint8_t status=motor.init();
if(status!=DYN_STATUS_OK)
{
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, HIGH);
while(1);
}
motor.changeId(NEW_ID);
}
void loop()
{}
Изначально все моторчики имеют id=1, именно поэтому мы и указываем вверху
const uint8_t id=1;
NEW_ID для каждого моторчика нужно заменить на число от 1 до 6 (да, ок, первый моторчик можно не трогать). Нумеруем их в порядке от нижнего к верхнему.
Ура! у нас есть полноценный манипулятор, который мы можем двигать, а также имеется 3D модель к нему. Можно брать ROS и программировать любые крутые штуки. Но это уже рассказ для отдельной статьи (и не одной). Данное же повествование подошло к концу, спасибо за внимание!
FForth
Какое применение планируется? (для кружка робототехники?)
, и не думаю, что эта конструкция интересней таких настольных манипуляторов.
mironov_vlad Автор
Да, если бы я нашел манипулятор как в видео по приемлемой цене — я бы его купил. Но не нашел(
Собственно, идея делать самостоятельно пришла именно после пары дней поисков.
Применение — исключительно for fun. Хочется поработать с компьютерным зрением (через Kinect), чтобы научиться распознавать и перекладывать с места на место автоматически различные предметы.
mmMike
Мда… игрушка за 70 тыс.
Я делал когда то подобное (https://www.youtube.com/watch?v=iq8M-esM4QQ)
Однако поигрался с неделю и забросил. Совершенно непрактичное и непонятно зачем.
Хотя сделал не за такие деньги. Можно же и попроще..
mironov_vlad Автор
Классный агрегат у вас на видео!
Единственное — непонятно из видео — есть ли обратная связь от моторов? Т.е. можно ли автоматически (без пульта) управлять. Я как раз хочу связать руку с компьютерным зрением, чтобы робот сам мог подъехать (да, шасси я тоже буду делать) и взять/положить что-то без помощи человека.
mmMike
Обратная связь от моторов не дает нужной точности для позиционирования. Особенно при поворотах "по тракторному". Накапливается ошибка и существенная.
Проще уж "компьютерное зрение". Но только:
mironov_vlad Автор
В схеме с dynamixel моторами ошибка не накапливается. Мотор сообщает информацию не о дельте своего перемещения, а о своей позиции. Т.е. есть какая-то погрешность, но она константная.
Маленькая платформа тут — это только для сопряжения с моторами. Я планирую ее подключать как ноду ROS к мощному компу, на котором будут гоняться алгоритмы computer vision
mmMike
Речь идет о "чтобы робот сам мог подъехать". Т.е. о моторах колес, а не "руки".
Энкодер на моторе колеса может быть сколько угодны точным. Ошибка накапливается в проскальзывании "шин" по полу. Особенно в поворотах и т.п.
mironov_vlad Автор
а, да, для тележки, конечно, нужно использовать компьютерное зрение, лидары и пр. для позиционирования
atd
> 7200 руб за 1 штуку
а вариант купить в US по $45 и отправить через мейл-форвардера не рассматривался?
в две посылки по 4 сервы (или 4+3), получится 45*4+20+45*3+20 = $355, даже по курсу 75р/$ это будет по 3800 за штуку.
P.S.: проверил сайты магазинов, нужно добавить ещё $8-12 domestic shipping, но всё равно это будет сильно меньше чем 7200 * 7.
> (вероятно, дольше всего ждали доставки моторчиков, мне их везли больше месяца).
даже с нерасторопным форвардером это будет недели 3, так что смысла брать у местных барыг (если у них нет прямо сейчас в наличии) нет вообще никакого.
mironov_vlad Автор
Да, моторчики вполне реально дешевле купить, даже без мейл-форвардера можно на али найти за 6К руб (когда я покупал — не было, искал там).
Но лично я с такими схемами пересылки (мейл-форвардинг) пока ни разу не работал и что-то страшно было начинать сразу с такой большой покупки.
Кто умеет правильно закупать компоненты — конечно же сможет справиться еще дешевле. Кто не умеет — могут пройти мой путь.
Canelow
Спасибо за подробную статью
mironov_vlad Автор
На здоровье! В следующей статье научу руку посылать в ROS сведения о своем положении в пространстве
sav13
Мне кажется, полноценный манипулятор может выполнять какие то полезные действия. В статье я этого не увидел.
Просто подвигать можно было и на сервах SG90 собрать копеечных. На Али готовые манипуляторы которыми можно двигать стоят как два ваших двигателя )))
aliexpress.ru/item/32807947938.html
mironov_vlad Автор
Статья про то, как манипулятор собрать. Чтобы его по-умному подвигать — нужно научиться отдавать обратную связь в ROS про положение манипулятора в пространстве (что с копеечными сервомоторчиками не получится). Этот код у меня в процессе написания. Как только закончу — выдам на суд публики продолжение истории.
В этом тексте хотелось дать:
1) Примерное понимание во сколько обойдется создание манипулятора — не игрушки (на али как раз игрушки, которые только подвигать и можно). В комментариях выше есть советы, как справиться еще дешевле (и это здорово).
2) Дать для него 3D модель ROS (т.к. это действительно геморрой и это то, что вы из коробки получите, покупая серьезный манипулятор)
3) Рассказать про некоторые базовые моменты подключения, которые лично у меня отняли много времени. Например, то, что софт сериал интерфейс не тянет 1000000 бодрейта — не очевидная вещь, которую совсем не просто раздебажить.
sav13
То что софтсериал на Ардуине не даст высокой скорости — это как раз очевидно. Не случайно нормальные принтеры сейчас собирают на SMT32 у которых аппаратных UART не меньше трех и даже аппаратные USB бывают. Ну и 32-бит для пересчета координат в реальном времени на дельта принтерах — просто необходимость
А вот то что пластик даст нужную жесткость — для меня как раз не очевидно. Мне кажется, что хороший манипулятор — это сталь и дорогие подшипники.
В качестве точных движков — шаговики с нормальной механикой
anprs
Нужна обратная связь. Шаговик с ОС — серва.
andreyiq
Лет пять назад, тоже собирал руку. Только у меня бюджет был в разы меньше, максимум 10000р. + Прикручивал к ней две камеры для определения расстояния до объектов. Потом заменил на одну камеру и дальномер. Научил находить шарик, определять расстояние до него, захватывать и класть в корзину.
mironov_vlad Автор
Круто! А какие моторчики использовались, если не секрет?
andreyiq
Кажется sg90, но они для этого очень слабые. Их кое-как хватало чтобы рука двигалась.
jaiprakash
Из всей статьи не понял в чём проблема поднять half-duplex на нормальном UART микроконтроллера? Сам так делал, и всё работало. Под gcc, без ардуины.
atd
Ваш коммент ввёл меня в ступор. Потом я ещё раз перечитал этот кусок в статье.
Дествительно, непонятно. Можно было заюзать родной уарт, если уж соединяем пины. И аккуратно менеджить тристейт или положить туда транзистор.
С другой стороны, если тащим софт-уарт, то непонятно зачем два пина тратить, можно и одним ограничиться.
mironov_vlad Автор
С тристейтом изначально как раз хотел положить транзистор, но потом вот увидел, что можно без него (как в итоге и сделал).
Родной уарт тут еще пригодится — чтобы связать ардуину с ROS через wiki.ros.org/rosserial_arduino/Tutorials
anonymous
Немного погуглив можно понять, что есть такая фирма, которая производит роботов на этих самых динамикселях — Robotis.
Там же есть библиотека для платы Arbotix (на базе Arduino) в которой есть поддержка динамикселей.
А вместе с ней приходит и целый набор инструментов общения с этими сервами, позволяющими читать-писать более трех десятков параметров, в том числе тягу, углы, температуры, нагрузки и прочее.
А ещё можно найти российских ребят, которые производят совместимые контроллеры. И роботов. И прошивки. И многое выкладывают в OpenSource.
robotgeeks.ru
Не реклама, а информация, чтобы не переизобретать велосипеды.
VIPDC
Ценник конечно великоват для just 4fun. Везде нужно отталкиваться от цели, поиграть и таким можно