Оглавление:

Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS: 6 шагов (с изображениями)
Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS: 6 шагов (с изображениями)

Видео: Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS: 6 шагов (с изображениями)

Видео: Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS: 6 шагов (с изображениями)
Видео: Дрон с голосовым управлением Alexa — часть 1 2024, Июль
Anonim
Image
Image
Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS
Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS
Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS
Дрон Raspberry Pi с голосовым управлением Alexa с IoT и AWS

Привет! Меня зовут Армаан. Я 13-летний мальчик из Массачусетса. В этом руководстве показано, как вы можете сделать вывод из названия, как построить дрон Raspberry Pi. Этот прототип демонстрирует, как дроны развиваются, а также насколько большую роль они могут сыграть в будущем. Я определенно могу представить, как просыпаюсь через 10 лет и прошу дрон позавтракать. Дрон использует Amazon Alexa, Amazon Web Services, IoT (Интернет вещей) и, самое главное, Raspberry Pi для работы. Он предназначен для демонстрации и информирования о дронах и о том, как они улучшаются каждый день. Надеюсь, вы добьетесь успеха и узнаете о дронах в процессе. Удачи и спасибо за чтение. -Армаан

Запасы

Для создания прототипа требуется различное оборудование и программное обеспечение. Я использовал онлайн-руководство от The Drone Dojo для создания дрона и интегрировал перечисленные технологии. Для дрона вы можете найти список деталей прямо здесь:

Список запчастей дрона

Требования к программному обеспечению:

  • Веб-сервисы Amazon
  • Ноутбук
  • Программное обеспечение Mission Planer
  • Балена Этчер
  • Карта MicroSD с файлом Raspbian найдена здесь
  • Amazon Alexa, физический или виртуальный

Шаг 1: Сбор и понимание частей

Сбор и понимание частей
Сбор и понимание частей

Каждая деталь, упомянутая в списке поставки, необходима, равно как и четкое понимание каждой детали. Вы можете найти детали в Интернете и, собрав их, продолжить чтение. Плейлист от The Drone Dojo для полного понимания частей можно найти здесь. 4-минутное объяснение на моем канале YouTube можно найти здесь. Что касается дронов, то, вопреки мнению большинства людей, единственными частями являются не только двигатели и пропеллеры. Ниже приведены основные цели каждой части.

Raspberry Pi с Emlid Navio2

Эта часть в значительной степени является центральным процессором и главным элементом дрона. Raspberry Pi действует как центральный процессор компьютера, который отправляет команды Navio2 для выполнения через ШИМ (сигналы широтно-импульсной модуляции) другим частям дрона.

2. ESC (электронные регуляторы скорости)

Эти желтые части находятся под рамой. Их 4 подключены к Navio, по одному на каждый двигатель. Получив ШИМ-сигналы, они вращают двигатели и начинают полет.

3. Двигатели

Моторы не нуждаются в подробных объяснениях, потому что вы, вероятно, знакомы с ними. Они вращают и вращают пропеллеры, создавая тягу.

4. Пропеллеры

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

5. Батарея и силовой модуль.

LiPo батарея питает весь дрон через раму с помощью модуля питания. Он дает около 15-20 минут полета и действует как источник энергии.

6. GPS

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

7. Модуль телеметрии

Модуль телеметрии соединяет наш дрон с наземной станцией управления, в нашем случае с планировщиком миссии, для наблюдения.

8. RC-контроллер и модуль вместе с кодировщиком PPM.

RC-контроллер использует радио для передачи сигналов и команд в RC-модуль для ручного управления дроном. Кодировщик PPM преобразует эти сигналы в Navio + RPI для обработки и выполнения.

9. Рамка

Эта красно-белая рамка действует как основание или платформа для размещения других частей. Рама аэродинамическая и легкая, поэтому идеально подходит для нашей сборки дрона.

Теперь, зная каждую деталь, мы наконец можем построить дрон! Вперед к следующему шагу!

Шаг 2: Сборка дрона

Сборка дрона
Сборка дрона

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

Создание дрона на Raspberry Pi

Опять же, поскольку я не буду вдаваться в подробности, я просто выделю основы каждого шага.

1. Организуйте свои запасы - соберите наши материалы и убедитесь, что они легко доступны.

2. Спланируйте свою сборку. Расположите детали на раме, чтобы составить план того, что вы будете строить.

3. Пайка - это работа, которую сложно выполнить в одиночку. Вы должны припаять золотые соединители, идущие в комплекте с двигателями, к регуляторам скорости. Затем вы должны взять нижнюю часть рамы и припаять регуляторы скорости к нижней раме или плате распределения питания. Батарейный модуль также будет припаян к плате распределения питания.

4. Установка рамы - Затем вы должны прикрутить верхнюю часть рамы вместе с рычагами. Затем вы можете прикрепить Raspberry Pi сверху любым способом (я использовал изоленту). Затем вы можете прикрепить регуляторы к рукам с помощью стяжек. Мы почти закончили.

5. Привязка контроллера дистанционного управления к приемнику - попробуйте выполнить инструкции в списке воспроизведения выше, чтобы привязать контроллер дистанционного управления с помощью ESC.

6. Доработка деталей на раме - Прикрепите модуль телеметрии к раме изолентой или ремнем. Приклейте кодировщик PPM к руке клейкой лентой. Теперь вы можете подключить ESC и PPM Encoder к Navio.

7. Крепление GPS + аккумулятор - соберите крепление GPS с помощью различных винтов и деталей. Используя стяжки, прикрепите GPS к раме. Я не обязательно использовал крепление для GPS из-за его хрупкости, но решать вам. Далее вы можете вставить аккумулятор между Power Dist. Доска. Я также прикрепил и приклеил силовой модуль к раме. Теперь ваше оборудование в значительной степени настроено. Теперь о том, чего мы ждали!

8. Установка гребных винтов !!! - Вы можете затянуть пропеллеры, используя схему, указанную в плейлисте. Затем вы можете подключить регуляторы к двигателям, и мы, наконец, закончили сборку дрона.

Следующее программное обеспечение, так что вперед!

Шаг 3: Настройка Raspberry Pi и GCS (Планировщик миссий)

Настройка Raspberry Pi и GCS (Планировщик миссий)
Настройка Raspberry Pi и GCS (Планировщик миссий)

Опять же, вы можете найти более подробные инструкции в плейлисте с последнего шага. Однако вы, вероятно, знаете, как настроить RasPi. Но на этот раз мы делаем это без головы. Используйте Balena Etcher, чтобы записать ОС с веб-сайта Navio OS на карту MicroSD. Пока он подключен к вашему компьютеру, войдите в соискатель wpa с помощью notepad ++. После этого введите ssid и пароль для подключения Raspberry Pi к вашему Wi-Fi. Затем вы должны добавить файл с именем SSH. Это можно сделать из командной строки или другим способом. Теперь мы можем использовать SSH. Вы можете использовать командную строку или Putty. Я использовал командную строку и набрал «ssh pi @ navio» для подключения в моем случае, или вы можете найти IP-адрес и ssh таким образом. После подключения используйте это видео для настройки и настройки Navio. Чтобы настроить телеметрию, вы должны сначала отредактировать Raspberry Pi. Следуйте этим инструкциям, чтобы внести изменения, и попробуйте подключиться к Планировщику миссий. Если телеметрия не работает, вы можете отменить редактирование и подключиться с помощью соединения UDB, введя IP-адрес GCS (наземной станции управления, например, ноутбука). После подключения к Планировщику миссий вы можете использовать мастер настройки для калибровки всех частей дрона. Если вам нужна помощь, снова обратитесь к списку воспроизведения. Обычно при каждой настройке почти всегда возникает ошибка. Устранение неполадок - одна из самых больших частей этого проекта. Я не могу вам помочь, так как я не знаю ваших ошибок, но большинство ошибок можно исправить с помощью Интернета. После того, как все будет готово, дрон готов к полету! Вы можете настроить свой RC-контроллер и режимы полета в Планировщике миссий. Попытайтесь удерживать левый джойстик в самом нижнем правом углу в течение пяти секунд, чтобы активировать дрон. Я не рекомендую летать, не заглянув в учебное пособие, потому что дрон очень хрупкий и его легко сломать. Что касается меня, когда я впервые летал на нем, я сломал крепление GPS и некоторые пропеллеры. Если вам не требуется голосовое управление, то можете остановиться на этом. Чтобы узнать об AWS и программировании дрона, продолжайте!

Шаг 4: программирование дрона для полета с помощью Python

Программирование дрона для полета с помощью Python
Программирование дрона для полета с помощью Python

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

1. Сначала загрузим исходный код ArduPilot в каталог на Raspberry Pi.

mkdir src

Затем получите файлы с GitHub с помощью git clone

git clone -b Copter-3.6.11

Теперь перейдем в / src / ardupilot

cd src

cd ardupilot

Теперь давайте инициализируем исходные файлы

git обновление подмодуля --init --recursive

2. Далее нам нужно скомпилировать прошивку на Raspberry Pi.

Обязательно перейдите в / src / ardupilot / с помощью компакт-диска, прежде чем выполнять следующие шаги.

Затем, чтобы сконфигурировать специально для Navio, используя

./waf настроить --board = navio2

Затем вы можете скомпилировать

./waf --targets bin / arducopter

3. Теперь мы можем установить исходный код в Navio.

Сначала давайте перейдем в нужный каталог.

компакт-диск / и т. д. / systemd / system

Затем отредактируйте файл

sudo vi arducopter.service

Там, где написано ExecStart, вставьте следующее вместо того, что уже есть

ExecStart = / bin / sh -c "/ home / pi / src / arducopter / build / navio2 / bin / arducopter $ {ARDUPILOT_OPTS}"

Теперь, чтобы привести в действие исходный код ardupilot, мы можем использовать

sudo systemctl демон-перезагрузка

Затем мы можем перезапустить с

sudo systemctl перезапустить arducopter

На последнем этапе мы, наконец, закончили настройку ArduPilot на нашем дроне.

4. Установка DroneKit

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

Мы можем установить пакет python с помощью

pip install dronekit == 2.9.1

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

Чтобы проверить, установлен ли, мы можем сделать

замораживание пипса | grep dronekit

Теперь мы, наконец, готовы создать наш первый скрипт на Python.

5. takeoff_and_land.py

ПРЕДУПРЕЖДЕНИЕ! Я предлагаю получить базовые знания о Python, чтобы вы могли изучить и понять код. Если вы хотите написать программу самостоятельно, посмотрите это видео.

## Сначала давайте не будем создавать каталог для хранения этого кода

cd dk ## Если вы хотите сделать это самостоятельно, используйте vi takeoff_and_land.py ## для создания программы

В противном случае вы можете посмотреть или использовать прикрепленный файл и использовать протокол передачи файлов. Мы сможем опробовать эту программу позже. Сначала, чтобы уточнить, что это файл Python, мы должны использовать

chmod + x takeoff_and_land.py

Затем, чтобы попробовать использовать следующий код для запуска

python takeoff_and_land.py --connect 127.0.0.1:14550

Первый раз у меня тоже не вышло. Если время ожидания связи истекло, не волнуйтесь, вы можете кое-что сделать. Откройте другое приглашение и ssh. Вы можете попробовать установить что-то под названием mavproxy и попробовать запустить его. После этого вы можете запускать оба одновременно. Это должно помочь подключить дрон. Как только это будет сделано, у меня для вас будет задача. Попытайтесь выяснить, что делает другая программа (set_velocity_body.py) и как заставить ее работать. Если да, то хорошая работа.

6. Вперед!

Теперь мы можем использовать эти знания для голосового управления нашим дроном. Управление дроном Alexa использует многие из этих функций и многое другое. Удачи и вперед!

Шаг 5. Использование Amazon Alexa и Amazon Web Services для интеграции голосового управления

Использование Amazon Alexa и Amazon Web Services для интеграции голосового управления
Использование Amazon Alexa и Amazon Web Services для интеграции голосового управления
Использование Amazon Alexa и Amazon Web Services для интеграции голосового управления
Использование Amazon Alexa и Amazon Web Services для интеграции голосового управления

Этот шаг - один из наименее задокументированных. Это означает, что устранить неполадки будет сложнее всего. На то, чтобы заставить его работать, у меня ушло около месяца, а то и больше. Здесь самое главное - запастись терпением. Эта функция, если она будет реализована в реальной жизни, может изменить жизнь. Вы можете просто сказать Алексе, чтобы она принесла вам продукты, вместо того, чтобы идти сама. Представь это! Итак, без лишних слов, давайте перейдем к этому!

1. Регистрация Raspberry Pi как устройства в AWS IoT

Чтобы использовать IoT (Интернет вещей), нам нужна вещь. Поэтому нам нужно сначала войти в консоль AWS, чтобы использовать AWS IoT. Затем перейдите в IoT Core. Оказавшись там, вы должны нажать «Управление», а затем создать вещь. После добавления имени, для подключения нам понадобится сертификат. Я бы рекомендовал щелкнуть сертификацию в один клик. Затем, увидев экран сертификата, убедитесь, что вы загрузили каждый ключ, включая корневой ЦС. Затем вы можете закончить создание вещи. Далее нам нужно создать политику. Вернитесь к IoT Core. Затем нажмите «Безопасность» и «Политики». Затем нажмите «Создать политику». Затем вы можете создать имя и добавить ресурсы. Под действием введите iot *, введите * под ресурсом и нажмите "Разрешить эффект". Затем вернитесь к своей вещи и перейдите к своему сертификату. Оказавшись здесь, нажмите на политики. Затем вы можете прикрепить свой полис для вещи, и все готово!

2. Настройка кода на Raspberry Pi и взаимодействие с IoT.

Для этой части вам понадобится SFTP-клиент (я использовал WinSCP) для передачи файлов. После подключения к нашему Raspberry Pi нам понадобятся ключи сертификатов. Вы должны передать ключевые файлы на Raspberry Pi. Вы также должны установить AWSIoTPythonSDK на Raspberry Pi. Затем перейдите в каталог dk на Raspberry Pi. Вы используете файл Alexa Drone Control, который я предоставил для связи с IoT. Чтобы использовать этот файл, я использовал сценарий оболочки для запуска. Я покажу код ниже, так как по какой-то причине я не могу загрузить файл. Если программа не принимает сообщения от AWS IoT во время тестирования, не волнуйтесь! Это может быть моя вина, поскольку файл управления дроном Alexa может не подходить для вашей Вещи. Итак, чтобы исправить это, вернитесь в AWS IoT и нажмите «Обучение» на левой панели. Следуйте инструкциям, и, возможно, вам придется перезагрузить компьютер. Прости за это. Как только ваш Интернет вещей начнет работать с программой на RasPi, вы можете интегрировать код dronekit из предоставленного мной файла Alexa Drone Control. После этого используйте сценарий оболочки, который я предоставил с вашими сертификатами и конечной точкой Rest API из Интернета вещей.

# остановить скрипт при наборе ошибок -e # Проверить, существует ли корневой CA-файл, загрузить, если нет, если [! -f./root-CA.crt]; then printf "\ nЗагрузка сертификата корневого CA AWS IoT из AWS… / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # установить AWS Device SDK для Python, если он еще не установлен если [! -d./aws-iot-device-sdk-python]; затем printf "\ nУстановка AWS SDK… / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# запустить образец приложения pub / sub, используя сертификаты, загруженные в пакете

printf "\ nЗапуск приложения pub / sub… / n" python dk / AlexaDroneControl.py --connect 127.0.0.1:14550 -e "Your IoT ARN" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

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

3. Развитие навыков Alexa

Этот шаг кажется намного сложнее, чем есть на самом деле. Во-первых, мы должны войти в консоль разработчика Alexa. Затем просто нажмите «Создать навык». Когда он попросит выбрать модель для вашего навыка, просто нажмите Custom. Когда он попросит выбрать метод, нажмите «Подготовить свой собственный». Вы можете называть его как хотите. Шаблон не требуется, поэтому выберите "начать с нуля". Затем, после создания своего навыка, вы должны попасть на экран создания навыков с контрольным списком справа. Отсюда мы можем начать развивать наши навыки. Сначала в контрольном списке стоит имя вызова. Это то, что вы скажете Алексе, чтобы задействовать свои навыки. Для себя я просто ввел свое имя для вызова как дрон. Теперь мы можем перейти к нашим намерениям, высказываниям и временным интервалам. Здесь вы можете отдавать команды дрону, например, подняться на 1 метр, пойти вправо или вниз. Моя пока действительно работает только с одним метром. Вы можете нажать на редактор JSON в нижней части левой панели. Затем вы можете вставить в него следующий код.

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

Шаг 4: построение лямбда-функции

Теперь этот шаг - тот, который вам нужно выяснить самостоятельно. Я расскажу вам, как подключить его к Alexa Skill, но вам придется самому его кодировать. Итак, сначала перейдите в консоль управления AWS. Затем перейдите к Lambda. Затем вы можете создать функцию, называя ее как хотите. Обязательно создайте его с нуля и сделайте среду выполнения на любом языке программирования, который вам нужен. Я использовал Node.js. Чтобы добавить Alexa Skill, добавьте триггер и выберите Alexa Skills Kit (ASK). Скопируйте свой Lambda ARN и вернитесь к навыку Alexa. Теперь перейдите к конечной точке. Вы можете вставить свой ARN, сохранить и построить новую модель. Затем возьмите идентификатор навыка Alexa и вставьте его в раздел триггеров, где он запрашивает у вас лямбду. Затем прокрутите вниз по лямбде, найдите основные настройки и установите тайм-аут 10 секунд. Теперь вам нужно выяснить код. Подсказки можно найти на сайтах ниже.

github.com/aws/aws-iot-device-sdk-js

www.hackster.io/veggiebenz/voice-controlle…

и вы можете использовать прикрепленный мною файл, но он неполный и работать не будет.

/ ** * Управляйте своим квадрокоптером APM / Pixhawk своим голосом, используя Amazon Alexa, Lambda, 2lemetry MQTT.* / var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // это устройство действительно является контроллером var mqtt_config = {"keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, // + "-Lambda-" + (new Date (). getTime ()), "region": "us-east-1", "debug": true}; var ctx = null; var client = null; // Маршрутизация входящего запроса на основе типа (LaunchRequest, IntentRequest и т. Д.). Тело запроса в формате JSON предоставляется в параметре события. export.handler = функция (событие, контекст) {попробуйте {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = context; if (event.session.application.applicationId! == app_id) {ctx.fail («Неверный идентификатор приложения»); } client = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Connected to AWS IoT"); // callback ();});

if (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } если (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } else if (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } else if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx.succeed (); }} catch (e) {console.log ("ИСКЛЮЧЕНИЕ в обработчике:" + e); ctx.fail ("Исключение:" + e); }}; / ** * Вызывается при запуске сеанса. * / функция onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Вызывается, когда пользователь запускает навык без указания того, что он хочет. * / функция onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Отправка на запуск вашего умения. getWelcomeResponse (обратный вызов); } / ** * Вызывается, когда пользователь указывает намерение для этого навыка. * / function onIntent (intentRequest, session) {//, callback) {console.log ("onIntent requestId =" + intentRequest.requestId + ", sessionId =" + session.sessionId); var intent = intentRequest.intent, intentName = intentRequest.intent.name; console.log ("ЗАПРОС на строку =" + JSON.stringify (intentRequest)); var callback = null; // Отправка обработчикам намерений вашего навыка if ("GoIntent" === intentName) {doGoIntent (intent, session); } else if ("CommandIntent" === intentName) {doCommandIntent (намерение, сеанс); } else if ("TurnIntent" === intentName) {doTurnIntent (намерение, сеанс); } else if ("HelpIntent" === intentName) {getWelcomeResponse (); } else {throw "Недействительное намерение"; }} / ** * Вызывается, когда пользователь завершает сеанс. * Не вызывается, когда умение возвращает shouldEndSession = true. * / функция onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Добавьте сюда логику очистки} // --------------- Функции, управляющие поведением навыка -------------------- --- function getWelcomeResponse () {// Если мы хотим инициализировать сеанс, чтобы иметь некоторые атрибуты, мы могли бы добавить их сюда. var sessionAttributes = {}; var cardTitle = "Добро пожаловать"; var SpeechOutput = "Добро пожаловать в УПРАВЛЕНИЕ ДРОНАМИ."; // TODO: дрон онлайн или офлайн? Если онлайн, это ВООРУЖЕНО? var repromptText = "Дрон готов к командованию."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } / ** * обрабатывает намерение GO. * / function doGoIntent (intent, session, callback) {// var cardTitle = "Drone GO…"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var SpeechOutput = ""; var direction = intent.slots. Direction.value; var distance = intent.slots. Distance.value; var unit = intent.slots. Unit.value; var validDirections = [«вперед», «вперед», «назад», «назад», «вправо», «влево», «вверх», «вниз», «прямо», «вперед», «прямо вперед»]; var validUnits = [«фут», «футы», «метр», «метры», «ярд», «ярды»]; repromptText = "Скажите, как далеко идти и в каком направлении."; var fail = false; // проверяем вводимые данные if (! (parseInt (distance)> = 1)) {speechOutput = "Я не могу понять расстояние, на которое вы хотите, чтобы я проехал."; fail = true; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Я не могу понять, в каком направлении вы хотите, чтобы я ехал."; fail = true; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Я не могу понять, в какую единицу вы хотите, чтобы я путешествовал."; fail = true; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Дрон идет" + направление + "" + расстояние + "" + юнит; SpeechOutput = "Идти" + направление + "" + расстояние + "" + единица измерения; mqttPublish (намерение, атрибуты сеанса, cardTitle, SpeechOutput, repromptText, shouldEndSession); }}

функция doCommandIntent (намерение, сеанс, обратный вызов) {

// var cardTitle = "КОМАНДА ДРОНА…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var SpeechOutput = ""; repromptText = "Скажите, какая команда используется для дрона."; var task = intent.slots. Task.value; var validTasks = [«запустить», «приземлиться», «р. т. л.», «удерживать», «оставаться», «стоп», «вернуться к запуску», «прервать»]; if (validTasks.indexOf (task) == -1) {speechOutput = "Я не могу понять команду."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Выполнение команды Drone" + задача; SpeechOutput = "Выполнение команды" + задача; mqttPublish (намерение, атрибуты сеанса, cardTitle, SpeechOutput, repromptText, shouldEndSession); }}

функция doTurnIntent (намерение, сеанс, обратный вызов) {

// var cardTitle = "Drone Turn…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var SpeechOutput = ""; repromptText = "Скажите, как вы хотите повернуть дрон."; var direction = intent.slots. Direction.value; var validDirections = ["справа", "слева", "вокруг"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Я не могу понять направление поворота."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Поворот дрона" + направление; SpeechOutput = "Поворот" + направление; mqttPublish (намерение, атрибуты сеанса, cardTitle, speechOutput, repromptText, shouldEndSession); }}

функция mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession)

{var strIntent = JSON.stringify (намерение); console.log ("mqttPublish: INTENT text =" + strIntent); // client.publish ("ikw1zr46p50f81z / drone / echo", strIntent, false); client.publish (config.topic, strIntent, false); client.end (); client.on ("закрыть", (function () {console.log ("MQTT CLIENT CLOSE - думает, что сделано, успешно."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, SpeechOutput, repromptText, shouldEndSession)));})); client.on ("ошибка", (функция (ошибка, предоставлено) {console.log ("ОШИБКА КЛИЕНТА MQTT !!" + ошибка);})); }

// --------------- Помощники, которые создают все ответы -----------------------

функция buildSpeechletResponse (заголовок, вывод, repromptText, shouldEndSession) {return {outputSpeech: {type: "PlainText", text: output}, card: {type: "Simple", title: title, content: output}, reprompt: {outputSpeech: {type: "PlainText", текст: repromptText}}, shouldEndSession: shouldEndSession}} function buildResponse (sessionAttributes, SpeechletResponse) {return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse}}

Рекомендуемые: