Создаем робота в домашних условиях / Хабр

Создаем робота в домашних условиях / Хабр Машинки

Введение

Итак. Что же такое робот? В большинстве случаев это автоматическое устройство, которое реагирует на какие-либо действия окружающей среды. Роботы могут управляться человеком или выполнять заранее запрограммированные действия. Обычно на роботе располагают разнообразные датчики (расстояния, угла поворота, ускорения), видеокамеры, манипуляторы.

Электронная часть робота состоит из микроконтроллера (МК) – микросхема, в которую заключён процессор, тактовый генератор, различная периферия, оперативная и постоянная память. В мире существует огромное количество разнообразных микроконтроллеров для разных областей применения и на их основе можно собирать мощных роботов.

Для любительских построек широкое применение нашли микроконтроллеры AVR. Они, на сегодняшний день, самые доступные и в интернете можно найти много примеров на основе этих МК. Чтобы работать с микроконтроллерами тебе нужно уметь программировать на ассемблере или на Cи и иметь начальные знания в цифровой и аналоговой электронике.

В нашем проекте мы будем использовать Cи. Программирование для МК мало чем отличается от программирования на компьютере, синтаксис языка такой же, большинство функций практически ничем не отличаются, а новые довольно легко освоить и ими удобно пользоваться.

А что с реальной рукой?

Переместимся из мира 3D моделей в суровую реальность. У нас есть собранный ранее манипулятор. Хотелось бы его как-то подвигать. Сделаем это с помощью Arduino UNO и Power Shield.

Смотрите про коптеры:  Цифровые мультиметры "нищебродов в_прыжке" / Блог им. well-man2000 / Сообщество

Подключим первый моторчик манипулятора (который снизу) к 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 имеет еще пару занимательных моментов, которые могут быть не совсем очевидны с самого начала. Сведем их все воедино.

Что нам нужно

Для начала наш робот будет уметь просто объезжать препятствия, то есть повторять нормальное поведение большинства животных в природе. Всё что нам потребуется для постройки такого робота можно будет найти в радиотехнических магазинах. Решим, как наш робот будет передвигаться.

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

От этого танка тебе понадобится только платформа с гусеницами и моторы с редукторами, остальное ты можешь смело открутить и выкинуть. Так же нам потребуется микроконтроллер, мой выбор пал на ATmega16 – у него достаточно портов для подключения датчиков и периферии и вообще он довольно удобный. Ещё тебе потребуется закупить немного радиодеталей, паяльник, мультиметр.

Что же нам нужно купить?


Все цены привожу на момент написания статьи (июль 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. У хомута отрезаем края, чтобы получилась лента.Крутые самоделки для летней рыбалки своими руками
  2. На проволоку надеваем 3 кусочка от капельницы. В трубки продеваем подготовленный хомут. Путем его перемещения можно регулировать жёсткость плеча кивка.Крутые самоделки для летней рыбалки своими руками
  3. Рычаг делаем длиной по 10 см.Крутые самоделки для летней рыбалки своими руками
  4. На хомут приклеиваем кембрики под леску.Крутые самоделки для летней рыбалки своими руками
  5. На край хомута клеим ценник.Крутые самоделки для летней рыбалки своими руками
  6. Крепим кивок к бланку.Крутые самоделки для летней рыбалки своими руками

Остается зафиксировать леску на краю удилища, пропустить ее через кембрики на хомуте и привязать мормышку.

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

Всесезонная жерлица

Наиболее сложным в поимке хищником является щука. Ее поведение отличается мгновенным броском на малька, которого она хватает поперек и проплывает несколько метров. После щука останавливается на короткое время, переворачивает живца во рту и заглатывает головой вперед. Предлагаемая конструкция жерлицы может использоваться как для летней, так и зимней ловли, с берега или лодки.

Для изготовления жерлицы подготавливаем:

  • труба ПВХ диаметром 32 мм;
  • толстая леска;
  • грузило-оливка;
  • крючок-тройник.

Процесс изготовления:

  1. Из пластиковой трубы нарезаем заготовки длиной 10 см.Крутые самоделки для летней рыбалки своими руками
  2. Обрабатываем края напильником или наждачной бумагой.
  3. Нагреваем гвоздь и проделываем 3 отверстия: два с одной стороны заготовки диаметром 3 мм и одно с другой стороны не более 1 мм.Крутые самоделки для летней рыбалки своими руками
  4. Из проволоки диаметром 1 мм делаем стопор лески. Он не будет давать ей сходить с трубы.Крутые самоделки для летней рыбалки своими руками
  5. Из лески 0,5 мм делаем подвес, который заканчивается петлей. Она позволит быстро подвесить жерлицу к любой палке, удилищу, прутку. Длина основной лески должна быть до 10 м. Если ловля будет проходить на водоеме с корягами, то для работы оставляют не более 5 м лески. На водоемах с большой глубиной потребуется подготовить жерлицы с леской большей длины.Крутые самоделки для летней рыбалки своими руками
  6. Пропускаем свободный конец лески в грузило и делаем петлю длиной 30 см, фиксируем тройник.Крутые самоделки для летней рыбалки своими руками

Поскольку у снасти отсутствует металлический поводок, ее уловистость повышается в разы.

Датчики препятствий

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

Принцип такой: когда перед датчиком нет преграды, то ик-лучи не попадают на фототранзистор и он не открывается. Если перед датчиком препятствие, тогда лучи от него отражаются и попадают на транзистор – он открывается и начинает течь ток. Недостаток таких датчиков в том, что они могут по-разному реагировать на различные поверхности и не защищены от помех — от посторонних сигналов других устройств датчик, случайно, может сработать. От помех может защитить модулирование сигнала, но пока мы этим заморачиватся не будем. Для начала, и этого хватит.

Создаем робота в домашних условиях / Хабр
Первый вариант датчиков моего робота

Делаем 3d модель


Класс! Рука у нас есть, но ведь ей же нужно как-то управлять. Хочется максимально использовать достижения человечества, поэтому установим себе

Для того, чтобы полноценно работать с манипулятором в ROS – нужно сделать его URDF модель. Она будет нам необходима для того, чтобы управлять робо-рукой с помощью пакета MoveIT!На момент написания статьи последняя стабильная сборка доступна для Melodic/Ubuntu 18.04, чем и объясняется мой выбор версии системы и фреймворка в начале статьи.

Построение URDF модели – довольно трудоемкая (и, на мой взгляд, самая скучная) часть данного проекта. Нужно немного допилить напильником stl модели компонентов и соединить их воедино в XML-образном файле, вручную подбирая правильные коэффициенты смещения деталей друг относительно друга.

Кто хочет – может проделать работу самостоятельно, всем остальным поберегу нервы и просто дам ссылку на свой готовый файл:

Делаем плату с мк

Создаем робота в домашних условиях / ХабрСхема робота

В нашем случае микроконтроллер будет выполнять функции мозга, но начнём мы не с него, а с питания мозга робота. Правильное питание – залог здоровья, поэтому мы начнём с того, как правильно кормить нашего робота, потому что на этом обычно ошибаются начинающие роботостроители.

А для того, чтобы наш робот работал нормально нужно использовать стабилизатор напряжения. Я предпочитаю микросхему L7805 – она предназначена, чтобы на выходе выдавать стабильное напряжение 5В, которое и нужно нашему микроконтроллеру. Но из-за того, что падение напряжения на этой микросхеме составляет порядка 2,5В к нему нужно подавать минимум 7,5В.

Вместе с этим стабилизатором используются электролитические конденсаторы, чтобы сгладить пульсации напряжения и в цепь обязательно включают диод, для защиты от переполюсовки.Теперь мы можем заняться нашим микроконтроллером. Корпус у МК — DIP (так удобнее паять) и имеет сорок выводов.

На борту имеется АЦП, ШИМ, USART и много другого, что мы пока использовать не будем. Рассмотрим несколько важных узлов. Вывод RESET (9-ая нога МК) подтянут резистором R1 к «плюсу» источника питания – это нужно делать обязательно! Иначе твой МК может непреднамеренно сбрасываться или, проще говоря – глючить.

Так же желательной мерой, но не обязательной является подключение RESET’а через керамический конденсатор C1 к «земле». На схеме ты так же можешь увидеть электролит на 1000 мкФ, он спасает от провалов напряжения при работе двигателей, что тоже благоприятно скажется на работе микроконтроллера.

Кварцевый резонатор X1 и конденсаторы C2, C3 нужно располагать как можно ближе к выводам XTAL1 и XTAL2.О том, как прошивать МК, я рассказывать не буду, так как об этом можно прочитать в интернете. Писать программу мы будем на Cи, в качестве среды программирования я выбрал CodeVisionAVR. Это довольно удобная среда и полезна новичкам, потому что имеет встроенный мастер создания кода.

Создаем робота в домашних условиях / Хабр
Плата моего робота

Как подвигать наш манипулятор?

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 и программировать любые крутые штуки. Но это уже рассказ для отдельной статьи (и не одной). Данное же повествование подошло к концу, спасибо за внимание!

Код прошивки:

/*****************************************************
Прошивка для робота

Тип МК : ATmega16
Тактовая частота : 16,000000 MHz
Если у тебя частота кварца другая, то это нужно указать в настройках среды:
Project -> Configure -> Закладка "C Compiler"
*****************************************************/

#include <mega16.h>
#include <delay.h>

void main(void)
{
//Настраиваем порты на вход
//Через эти порты мы получаем сигналы от датчиков
DDRB=0x00;
//Включаем подтягивающие резисторы
PORTB=0xFF;

//Настраиваем порты на выход
//Через эти порты мы управляем двигателями
DDRC=0xFF;

//Главный цикл программы. Здесь мы считываем значения с датчиков
//и управляем двигателями
while (1)
{
//Едем вперёд
PORTC.0 = 1;
PORTC.1 = 0;
PORTC.2 = 1;
PORTC.3 = 0;
if (!(PINB & (1<<PINB.0))) // Проверяем правый датчик
{
//Едем назад 1 секунду
PORTC.0 = 0;
PORTC.1 = 1;
PORTC.2 = 0;
PORTC.3 = 1;
delay_ms(1000);
//Заворачиваем
PORTC.0 = 1;
PORTC.1 = 0;
PORTC.2 = 0;
PORTC.3 = 1;
delay_ms(1000);
}
if (!(PINB & (1<<PINB.1))) // Проверяем левый датчик
{
//Едем назад 1 секунду
PORTC.0 = 0;
PORTC.1 = 1;
PORTC.2 = 0;
PORTC.3 = 1;
delay_ms(1000);
//Заворачиваем
PORTC.0 = 0;
PORTC.1 = 1;
PORTC.2 = 1;
PORTC.3 = 0;
delay_ms(1000);
}
};
}

Колеблющаяся блесна

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

При помощи тисов придаем заготовке форму блесны. Затем полируем поверхность детали войлоком с пастой ГОИ. В колебалке сверлим отверстие под заводное кольцо и тройник. Стоит учесть, что наиболее уловистой считается серебристая блесна.

По видео в деталях можно разобраться, как сделать колеблющуюся блесну и какие есть тонкости и хитрости в ее изготовлении.

Конкурентные решения на рынке


Опишу, однако, кратко примеры того, что я рассматривал на рынке:

О моём роботе

В данный момент мой робот практически завершён.

Создаем робота в домашних условиях / Хабр

На нём установлена беспроводная камера, датчик расстояния (и камера и этот датчик установлены на поворотной башне), датчик препятствия, энкодер, приёмник сигналов с пульта и интерфейс RS-232 для соединения с компьютером. Работает в двух режимах: автономном и ручном (принимает сигналы управления с пульта ДУ), камера также может включаться/выключаться дистанционно или самим роботом для экономии заряда батарей. Пишу прошивку для охраны квартиры (передача изображения на компьютер, обнаружение движений, объезд помещения).

Простой поплавок из камыша

Для изготовления поплавка понадобятся:

  • акриловые краски;
  • камыш;
  • столярный клей;
  • эпоксидка;
  • кисточка;
  • наждачка;
  • ножницы;
  • шпажки;
  • ткань;
  • малярная лента.

Пошаговое изготовление:

  1. Нарезаем камыш, для чего выбираем толстые и сухие побеги.Крутые самоделки для летней рыбалки своими руками
  2. Делаем заготовки длиной по 12 см и шлифуем наждачной бумагой.Крутые самоделки для летней рыбалки своими руками
  3. При помощи клея и шпажек делаем антенну и киль. Для этого от шпажки отрезаем 6 см, а от ткани тонкую полоску. Клей наносим на ткань и оборачиваем ее вокруг антенны и киля, после чего вставляем в заготовку из камыша как на фото.Крутые самоделки для летней рыбалки своими руками
  4. Раскрашиваем поплавок, чтобы поклевки были хорошо видны. Цвета красок можно подобрать на свое усмотрение. В примере используется красный для верхней части поплавка и черный для нижней.Крутые самоделки для летней рыбалки своими руками
  5. После высыхания краски поплавок покрываем эпоксидкой.Крутые самоделки для летней рыбалки своими руками

Прошивка робота

Чтобы оживить робота, для него нужно написать прошивку, то есть программу, которая бы снимала показания с датчиков и управляла двигателями. Моя программа наиболее проста, она не содержит сложных конструкций и всем будет понятна. Следующие две строки подключают заголовочные файлы для нашего микроконтроллера и команды для формирования задержек:

#include <mega16.h>#include <delay.h>

Следующие строки условные, потому что значения PORTC зависят от того, как ты подключил драйвер двигателей к своему микроконтроллеру:

PORTC.0 = 1;PORTC.1 = 0;PORTC.2 = 1;PORTC.3 = 0;

Значение 0xFF означает, что на выходе будет лог. «1», а 0x00 – лог. «0».

Следующей конструкцией мы проверяем, есть ли перед роботом препятствие и с какой оно стороны:

if (!(PINB & (1<<PINB.0))){…}

Если на фототранзистор попадает свет от ик-диода, то на ноге микроконтроллера устанавливается лог. «0» и робот начинает движение назад, чтобы отъехать от препятствия, потом разворачивается, чтобы снова не столкнуться с преградой и затем опять едет вперёд.

Так как у нас два датчика, то мы проверяем наличие преграды два раза – справа и слева и потому можем узнать с какой стороны препятствие. Команда «delay_ms(1000)» указывает на то, что пройдёт одна секунда, прежде чем начнёт выполняться следующая команда.

Прыгающая приманка

Среди множества рыболовных самоделок для летней рыбалки можно выделить простую прыгающую приманку «Жабка». Ее поведение при проводке довольно реалистичное. Если поблизости окажется хищник, то он непременно отреагирует на такую игру. Процесс сборки приманки достаточно простой.

Понадобится такой перечень материалов и инструментов:

  • кусок деревяшки из мягкой древесины;
  • оловянное грузило;
  • проволока из нержавейки и меди;
  • резинки;
  • краска и лак в аэрозоле;
  • нож;
  • ножовочное полотно;
  • карандаш;
  • линейка;
  • наждачка;
  • суперклей.

Приманку делаем таким образом:

  1. От бруска отрезаем небольшой кусочек длиной 35 мм. Канцелярским ножом придаем деревяшке форму как на фото. Чтобы форма была гладкой, доводим ее наждачкой.Крутые самоделки для летней рыбалки своими руками
  2. По длине заготовки ножовкой делаем пропил, в который укладываем поводок из нержавейки. В поводке с обеих сторон делаем петли. Затем пропил присыпаем опилками и проливаем суперклеем. После высыхания клея обрабатываем деталь наждачкой.Крутые самоделки для летней рыбалки своими руками
  3. Снизу заготовки делаем несквозное отверстие, в которое помещаем грузик. Он будет обеспечивать правильное положение приманки на воде. Грузик заделываем по аналогии с поводком.Крутые самоделки для летней рыбалки своими руками
  4. Чтобы сделать заготовку более крепкой, пропитываем ее полностью суперклеем, а после шлифуем наждачкой. Окрашиваем приманку краской из баллончика, а для защиты от воды и повреждений покрываем лаком.Крутые самоделки для летней рыбалки своими руками
  5. Для формирования хвоста набираем пучок тонких резинок и связываем их медной проволокой.Крутые самоделки для летней рыбалки своими руками

Во время проводки такой хвост будет хорошо привлекать хищника.

  1. На петле закрепляем крючок.Крутые самоделки для летней рыбалки своими руками

Сборка

Отлично! Мы закупили все, что нам нужно (вероятно, дольше всего ждали доставки моторчиков, мне их везли больше месяца).

Что дальше?

1) Напечатаем детали для манипулятора на 3D принтере.

Качаем STL файлы отсюда

2) Собираем воедино с моторчиками. Проблем со сборкой быть не должно, но если они вдруг появятся, можно воспользоваться вот этой инструкцией

Управление двигателями

Не менее важным компонентом в нашем роботе является драйвер двигателей, который облегчает нам задачу в управлении им. Никогда и ни в коем случае нельзя подключать двигатели напрямую к МК! Вообще мощными нагрузками нельзя управлять с микроконтроллера напрямую, иначе он сгорит.

Пользуйтесь ключевыми транзисторами. Для нашего случая есть специальная микросхема – L293D. В подобных несложных проектах всегда старайтесь использовать именно эту микросхему с индексом «D», так как она имеет встроенные диоды для защиты от перегрузок.

Этой микросхемой очень легко управлять и её просто достать в радиотехнических магазинах. Она выпускается в двух корпусах DIP и SOIC. Мы будем использовать в корпусе DIP из-за удобства монтажа на плате. L293D имеет раздельное питание двигателей и логики.

Поэтому саму микросхему мы будем питать от стабилизатора (вход VSS), а двигатели напрямую от аккумуляторов (вход VS). L293D выдерживает нагрузку 600 мА на каждый канал, а этих каналов у неё два, то есть к одной микросхеме можно подключить два двигателя.

Но, чтобы перестраховаться, мы объединим каналы, и тогда потребуется по одной микре на каждый двигатель. Отсюда следует, что L293D сможет выдержать 1.2 А. Чтобы этого добиться нужно объединить ноги микры, как показано на схеме. Микросхема работает следующим образом:

когда на IN1 и IN2 подаётся логический «0», а на IN3 и IN4 логическая единица, то двигатель вращается в одну сторону, а если инвертировать сигналы – подать логический ноль, тогда двигатель начнёт вращаться в другую сторону. Выводы EN1 и EN2 отвечают за включение каждого канала.

Их мы соединяем и подключаем к «плюсу» питания от стабилизатора. Так как микросхема греется во время работы, а установка радиаторов проблематична на этот тип корпуса, то отвод тепла обеспечивается ногами GND — их лучше распаивать на широкой контактной площадке. Вот и всё, что на первое время тебе нужно знать о драйверах двигателей.

Заключение

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

Так же не помешает установить энкодер – простое устройство, которое поможет точно располагать и знать расположение твоего робота в пространстве. Для наглядности возможна установка цветного или монохромного дисплея, который может показывать полезную информацию – уровень заряда аккумулятора, расстояние до препятствия, различную отладочную информацию.

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

Для того, чтобы робот мог реагировать на звук, было бы неплохо установить микрофоны с усилителем. Но по-настоящему интересным, я считаю, установка камеры и программирование на её основе машинного зрения. Есть набор специальных библиотек OpenCV, с помощью которых можно запрограммировать распознавание лиц, движения по цветным маякам и много всего интересного. Всё зависит только от твоей фантазии и умений.

Оцените статью
Радиокоптер.ру
Добавить комментарий