Хабрахабр

[Из песочницы] История о создании руки-сурдопереводчика

Предыстория

В начале этого учебного года (17-18) администрация нашего любимого лицея сказала нам: «В конце года каждый из вас должен защитить индивидуальный проект. У тех, кто не защитит проект, останется академ. задолженность и к гоcам (ГИА-9) они допущены не будут». Получается что-то вроде дипломной работы (в 9 классе, просто супер). Примерно с сентября по декабрь мы с моим другом Кириллом (kkirra) опрделялись, что за проект мы будем делать: хотелось что-то не очень сложное в исполнении, но вместе с тем что-то зрелищное и оригинальное. В конце концов мы определились: решили сделать модель человеческой руки, да еще такую, чтобы под управлением андроид устройства (именно в этом году мы с Кириллом случайно поступили в IT-школу Samsung на базе нашего лицея, поэтому хотели обязательно использовать в проекте полученные знания) она переводила введенный текст в язык жестов.

Программная часть

Android-приложение

Примерно за месяц до дедлайна мы начали работу над проектом. Первым этапом работы стала разработка андроид-приложения.

Сделать так, чтобы приложение выглядело одинаково красиво на всех устройствах также было довольно сложно. Если честно, самым сложным для меня было и остается разметка приложения: проблемы у меня с этими layout'ами и их типами (я все-таки девятикласник, да еще и из физмата).

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

Программа представляет из себя четыре активности: стартовый экран и по одной активности на каждый режим управления. Теперь немного про сам код (ссылка на GitHub в самом-самом конце статьи).

  • Первый режим управления — это режим ввода текста, когда пользователь вводит текст вручную
  • Второй — с помощью голоса, приложение распознает речь пользователя.
  • Третий — ручной режим. Пользователь может вручную изменить положение пальцев, чтобы изображать жесты, не предусмотренные программой.

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

Программирование Arduino

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

const int navigate [Hand::n][Hand::m]= ,//а
{225, 90, 0, 180, 180, 180},//б
{226, 0, 0, 0, 0, 0},//в
{227, 0, 90, 180, 180, 180},//г
{228, 180, 0, 0,180, 180},//д
{229, 90, 180, 180, 90, 90},//е
{230, 90, 180, 180, 90, 90},//ж
{231, 180, 0, 180, 180, 180},//з
{232, 180, 180, 180, 0, 0},//и
{233, 180, 180, 180, 0, 0},//й
{234, 180, 0, 0,180, 180},//к
{235, 180, 90, 90, 180, 180},//л
{236, 180, 90, 90, 90, 180},//м
{237, 180, 0, 0, 180, 0},//н
{238, 90, 180, 0, 0, 0},//о
{239, 180, 90, 90, 180, 180},//п
{240, 180, 0, 180, 0, 0},//р
{241, 90, 90, 90, 90, 90},//с
{242, 180, 90, 90, 90, 180},//т
{243, 0, 180, 180, 180, 0},//у
{244, 0, 90, 90, 90, 90},//ф
{245, 0, 0, 180, 180, 180},//х
{246, 180, 0, 0, 180, 180},//ц
{247, 0, 90, 180, 180, 180},//ч
{248, 180, 0, 0, 0, 180},//ш
{249, 180, 0, 0, 0, 180},//щ
{250, 0, 0, 180, 180, 180},//ъ
{251, 0, 90, 180, 180, 90},//ы
{252, 0, 0, 180, 180, 180},//ь
{253, 90, 90, 180, 180, 180},//э
{254, 0, 90, 90, 90, 0},//ю
{255, 90, 90, 90, 180, 180}};//я

«Hand» — это header-файл библиотеки (с расширением ".h" ), содержащий в себе прототипы функций и константы.

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

Метод перевода сиволов:

void Hand :: SymbolTranslate(unsigned char a){ //перевод символов в жесты int str=-1; int i; for(i=0; i<n; i++){ if(navigate[i][0]==(int)(a)){ str=i; break; } } if(str==-1){ return; } else{ First.write(navigate[str][1]); //высавляем сервоприводы в нужное положение Second.write(navigate[str][2]); Third.write(navigate[str][3]); Fourth.write(navigate[str][4]); Fifth.write(navigate[str][5]); delay(200); Serial.println(str); Serial.println("Succsessfull"); }
}

Метод перевода предложений:

void Hand :: SentenceTranslate(char* s){ //перевод предложения в жесты unsigned char a; for(int i=0; i< strlen(s); i++){ a=s[i]; SymbolTranslate(a); delay(2000); }
}

Методы также выводят в лог сообщения с принятым текстом и результатом перевода (печатается «Succsessfull»), что очень помогло нам при отладке неработающего ардуино-кода.

Аппаратная часть

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

Тогда мы решили собрать манипулятор из подручных материалов: предплечье из металлических пластин, пальцы из фанеры. Изначально, мы хотели распечатать детали манипулятора на 3D-принтере, чертежи взяли из окрытого французского банка проектов (свои тоже нарисовали, но позже решили, что лучше взять из open-source), но, отправив чертежи на печать, мы узнали, что для печати наших деталей потребуется несколько недель, которых у нас на тот момент не было. Примерный чертеж представлен ниже. Пальцы сгибались благодаря сервоприводам под управлением микроконтроллера Arduino.

image

  • Красный цвет — оси вращения пальцев, если смотреть на пальцы людей — это суставы
  • Зеленый цвет — небольшие резинки, которые возвращают пальцы в исходное положение (т.е. сухожилие)

Заключение

Подведем итоги. Мы собрали и запрограммировали манипулятор-сурдопереводчик (между собой коротко называем его «культяпка» за внешний вид). Наш проект позволяет людям, не знающим языка жестов, общаться с людьми с ограниченными возможностями слуха с помощью русского жестового алфавита. Реализация программного обеспечения позволяет быстро изменить код и, ничего при этом не сломав, добавить в него другие жестовые языки (например, английский).
В будущем мы планируем распечатать ранее выбранную модель на 3D-принтере и собрать ее (собираемся занятся этим, когда немного отдохнем от экзаменов и прочей чепухи).

Мы много научились, работая над этим проектом (например тому, что надо начинать работать над проектом, расчитаным на весь год, в начале года, а не за пару недель до сдачи) и за это очень благодарны преподавателям, которые нам помогали и особенно — Дамиру Муратовичу — нашему научруку, который помогал нам в решении большей часть проблем, связанных с проектом. В общем, получился довольно неплохой, пусть и не очень красивый с точки зрения прошивки и внешнего вида, но главное — рабочий проект.

Спасибо, что дочитали до конца!

Если вам стало интересно — все материалы проекта (включая текст работы, презентации, и т.д.) выложены в открытый доступ вот тут.

Еще раз спасибо за внимание!

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть