Tabla de contenido:

Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS: 6 pasos (con imágenes)
Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS: 6 pasos (con imágenes)

Video: Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS: 6 pasos (con imágenes)

Video: Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS: 6 pasos (con imágenes)
Video: 9) IoT - Internet de las Cosas - Alexa controlando mediante comando de voz a Tasmota. 2024, Mes de julio
Anonim
Image
Image
Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS
Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS
Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS
Drone Raspberry Pi controlado por voz de Alexa con IoT y AWS

¡Hola! Mi nombre es Armaan. Soy un chico de 13 años de Massachusetts. Este tutorial muestra, como puede inferir del título, cómo construir un Raspberry Pi Drone. Este prototipo demuestra cómo están evolucionando los drones y también el gran papel que podrían desempeñar en el futuro. Definitivamente puedo verme despertando en 10 años y pidiendo a un dron que me prepare el desayuno. El dron utiliza Amazon Alexa, Amazon Web Services, IoT (Internet de las cosas) y, lo más importante, una Raspberry Pi para funcionar. Está destinado a demostrar e informar sobre los drones y cómo mejoran cada día. Esperamos que tenga éxito y aprenda sobre los drones en el proceso. Buena suerte y gracias por leer. -Armaan

Suministros

Para construir el prototipo hay varias necesidades de hardware y software. Utilicé un tutorial en línea de The Drone Dojo para construir el dron e integré las tecnologías enumeradas. Para el dron, puede encontrar la lista de piezas aquí:

Lista de piezas de drones

Requisitos de Software:

  • Servicios web de Amazon
  • Un ordenador portátil
  • Software Mission Planer
  • Grabador Balena
  • Tarjeta MicroSD con archivo Raspbian que se encuentra aquí
  • Amazon Alexa, física o virtual

Paso 1: recopilación y comprensión de las piezas

Recopilación y comprensión de piezas
Recopilación y comprensión de piezas

Cada parte mencionada en la lista de suministros es necesaria, por lo que es una comprensión clara de cada parte. Puede encontrar las piezas en línea y, una vez reunidas, continuar leyendo. Aquí se puede encontrar una lista de reproducción de The Drone Dojo para una comprensión completa de las partes. Puede encontrar una explicación de 4 minutos en mi canal de youtube aquí. Cuando se trata de drones, las únicas partes, a pesar de lo que la mayoría de la gente piensa, no son solo motores y hélices. A continuación se muestran los propósitos básicos de cada parte.

La Raspberry Pi con Emlid Navio2

Esta parte es prácticamente un procesador central y el punto principal del dron. La Raspberry Pi actúa como la CPU de una computadora que envía comandos al Navio2 para que se ejecuten a través de PWM (señales de modulación de ancho de pulso) a otras partes del dron.

2. Los ESC (controladores electrónicos de velocidad)

Estas partes amarillas se encuentran debajo del marco. Son 4 enchufados al Navio, uno para cada motor. Al recibir señales PWM, hacen girar los motores y comienzan a volar.

3. Motores

Los motores no necesitan demasiada explicación porque probablemente esté familiarizado con ellos. Giran y hacen girar las hélices para crear empuje.

4. Hélices

Las hélices crean un empuje para que el dron vuele. Giran en la misma dirección que los motores para levantar el vehículo.

5. La batería y el módulo de alimentación

La batería LiPo alimenta todo el dron a través del marco utilizando el módulo de potencia. Proporciona unos 15-20 minutos de tiempo de vuelo y actúa como fuente de energía.

6. El GPS

El GPS se comunica con los satélites para determinar la posición del dron. Determina altitud, latitud y longitud. Se puede utilizar para geofencing, waypoints y también para moverse a ciertas posiciones o direcciones.

7. El módulo de telemetría

El módulo de telemetría conecta nuestro dron a una estación de control terrestre, en nuestro caso Mission Planner, para ser monitoreado.

8. El controlador y el módulo RC junto con el codificador PPM

El controlador RC usa radio para transmitir señales y comandos al módulo RC para pilotar el dron manualmente. El codificador PPM traduce estas señales para que Navio + RPI las procese y ejecute.

9. El marco

Este marco rojo y blanco actúa como base o plataforma para el resto de piezas a colocar. El marco es aerodinámico y liviano, por lo que es perfecto para nuestra construcción de drones.

Ahora, con el conocimiento de cada parte, ¡finalmente podemos construir el dron! ¡Adelante al siguiente paso!

Paso 2: Montaje del dron

Montaje del dron
Montaje del dron

Este paso es probablemente el más difícil en términos de esfuerzo físico. Recomiendo pedir ayuda a otra persona o intentar utilizar la mano amiga en la lista de piezas. El proceso es demasiado largo para demostrarlo aquí, así que proporcionaré otro enlace que utilicé en The Drone Dojo.

Construyendo un dron Raspberry Pi

Nuevamente, como no entraré en demasiados detalles, solo resaltaré los conceptos básicos de cada paso.

1. Organice sus suministros: reúna nuestros materiales y asegúrese de que sean de fácil acceso

2. Planifique su construcción: organice sus partes en el marco para hacer un plano de lo que va a construir.

3. Trabajo de soldadura: este es el trabajo que es un poco difícil de hacer solo. Debes soldar los conectores de bala dorada que vienen con los motores a los ESC. A continuación, debe tomar la parte inferior del marco y soldar los ESC al marco inferior o al tablero de distribución de energía. El módulo de batería también se soldará a la placa de distribución de energía.

4. Instalación del marco: luego debe atornillar la parte superior del marco junto con los brazos. Luego puede colocar la Raspberry Pi en la parte superior de la forma que desee (usé cinta adhesiva). Luego puede asegurar los ESC a los brazos con bridas. Ahora casi terminamos.

5. Vinculación del controlador RC al receptor: intente seguir las instrucciones de la lista de reproducción anterior para vincular el controlador RC mediante un ESC.

6. Finalización de las piezas en el marco: coloque cinta adhesiva o amarre el módulo de telemetría en el marco. Pegue con cinta adhesiva el codificador PPM a un brazo también. Ahora puede conectar los ESC y el codificador PPM al Navio.

7. Soporte para GPS + batería: monte el soporte para GPS con los distintos tornillos y piezas. Con bridas, conecte el GPS al marco. No utilicé necesariamente el soporte para GPS debido a su fragilidad, pero depende de usted. A continuación, puede insertar la batería entre Power Dist. Tablero. También até y pegué con cinta adhesiva el módulo de alimentación al marco. Ahora tu hardware está prácticamente configurado. ¡Ahora la parte que estamos esperando!

8. Instalación de las hélices !!! - Puede apretar las hélices usando la tabla mencionada en la lista de reproducción. Luego, puede conectar los ESC a los motores y finalmente terminamos de construir el dron.

El software es el siguiente, ¡así en adelante!

Paso 3: Configuración de Raspberry Pi y GCS (Mission Planner)

Configuración de Raspberry Pi y GCS (Mission Planner)
Configuración de Raspberry Pi y GCS (Mission Planner)

Nuevamente, puede encontrar instrucciones más detalladas en la lista de reproducción del último paso. Sin embargo, probablemente sepa cómo configurar RasPi. Pero esta vez, lo estamos haciendo sin cabeza. Utilice Balena Etcher para grabar el sistema operativo desde el sitio web de Navio OS en la tarjeta MicroSD. Mientras está conectado a su computadora, ingrese al suplicante wpa usando notepad ++. Después de eso, ingrese el ssid y la contraseña para que Raspberry Pi se conecte a su WiFi. Luego debe agregar un archivo llamado SSH. Esto puede ser a través de la línea de comandos u otro método. Ahora podemos SSH. Puede utilizar el símbolo del sistema o Putty. Usé el símbolo del sistema y escribí "ssh pi @ navio" para conectarme en mi caso, o puede encontrar la dirección IP y ssh de esa manera. Al conectarse, use este video para instalar y configurar el Navio. Para configurar la telemetría, primero debe realizar una edición en la Raspberry Pi. Siga esto para realizar la edición e intente conectarse a Mission Planner. Si la telemetría no funciona, puede deshacer la edición y conectarse usando una conexión UDB ingresando su IP de GCS (estación de control de tierra como computadora portátil). Una vez conectado a Mission Planner, puede utilizar el asistente de configuración para calibrar todas las partes del dron. Si necesita ayuda, consulte nuevamente la lista de reproducción. Por lo general, cada vez que configura, casi siempre hay un error. La resolución de problemas es una de las partes más importantes de este proyecto. Realmente no puedo ayudarlo porque no estoy al tanto de sus errores, pero la mayoría de los errores se pueden solucionar con la ayuda de Internet. Una vez que todo esté listo, ¡el dron estará listo para volar! Puede configurar su controlador RC y los modos de vuelo en Mission Planner. Intenta mantener el joystick izquierdo en la parte inferior derecha durante cinco segundos para armar el dron. No recomiendo volar sin mirar un tutorial porque el dron es muy frágil y fácil de romper. Para mí, la primera vez que lo volé, rompí el soporte del GPS y algunas hélices. Si no necesita control por voz, puede detenerse aquí. Para obtener más información sobre AWS y la programación del dron, ¡continúe!

Paso 4: programar el dron para volar con Python

Programando el dron para volar con Python
Programando el dron para volar con Python

Antes de ingresar a AWS, primero debemos entender cómo programar el dron para que vuele. Después de la configuración inicial, la integración del control por voz no debería ser demasiado difícil. Lo primero que podemos intentar es hacer un sencillo programa de despegue y aterrizaje. Después de configurar la Raspberry Pi, podemos SSH en ella nuevamente. Puede volver a ver la lista de reproducción o seguir mis instrucciones.

1. Primero descarguemos el código fuente de ArduPilot en un directorio de la Raspberry Pi

mkdir src

Luego, obtenga los archivos de GitHub usando git clone

git clone -b Copter-3.6.11

Ahora, naveguemos a / src / ardupilot

cd src

cd ardupilot

Ahora, inicialicemos los archivos fuente

actualización del submódulo git --init --recursive

2. A continuación, tenemos que compilar el firmware en la Raspberry Pi.

Asegúrese de navegar a / src / ardupilot / con cd antes de realizar los siguientes pasos

Luego, para cofigurar específicamente al Navio usando

./waf configure --board = navio2

Entonces puedes compilar con

./waf - destino bin / arducopter

3. Ahora podemos instalar el código fuente en Navio

Primero naveguemos al directorio correcto.

cd / etc / systemd / system

Luego edita el archivo

sudo vi arducopter.service

Donde dice ExecStart, inserte lo siguiente en lugar de lo que ya está allí

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

Ahora, para poner en acción el código fuente de ardupilot, podemos usar

sudo systemctl daemon-reload

Entonces podemos reiniciar con

sudo systemctl reiniciar arducopter

Con el último paso, finalmente hemos terminado de configurar ArduPilot en nuestro dron.

4. Instalación de DroneKit

DroneKit es el software que usaremos para programar el dron para que vuele. Para comprender parte del código, puede encontrar la documentación aquí. Primero debemos instalar el paquete en nuestro dron antes de escribir un script.

Podemos instalar el paquete python con

pip instalar dronekit == 2.9.1

Esta puede ser, o no, la versión más reciente, pero es la que utilicé para poder ayudar con la resolución de problemas.

Para comprobar si está instalado, podemos hacer un

pip freeze | dronekit grep

Ahora finalmente estamos listos para hacer nuestro primer script de Python

5. takeoff_and_land.py

¡ADVERTENCIA! Sugiero establecer una comprensión básica de Python, para que pueda aprender y comprender el código. Si quieres escribir el programa tú mismo, sigue este video.

## Primero no creemos un directorio para almacenar este código

cd dk ## Si quieres hacerlo tú mismo, usa vi takeoff_and_land.py ## para crear un programa

De lo contrario, puede echar un vistazo o utilizar el archivo adjunto y utilizar un protocolo de transferencia de archivos. Podemos probar este programa después. Primero para aclarar que es un archivo de Python que debemos usar

chmod + x takeoff_and_land.py

Luego, intente usar el siguiente código para ejecutar

python takeoff_and_land.py --connect 127.0.0.1:14550

La primera vez tampoco me funcionó. Si hay un tiempo de espera de enlace, no se preocupe, hay algo que puede hacer. Abra otro mensaje y ssh. Puede intentar instalar algo llamado mavproxy e intentar ejecutarlo. Después de eso, puede ejecutar ambos simultáneamente. Esto debería ayudar a conectar el dron. Una vez hecho esto, tengo un desafío para ti. Intente averiguar qué hace el otro programa (set_velocity_body.py) y cómo hacerlo funcionar. Si lo hace, buen trabajo.

6. ¡Adelante!

Ahora podemos usar este conocimiento para hacer que nuestro dron esté controlado por voz. El control de drones de Alexa utiliza muchas de estas características y más. ¡Buena suerte y en adelante!

Paso 5: uso de Amazon Alexa y Amazon Web Services para integrar el control por voz

Uso de Amazon Alexa y Amazon Web Services para integrar el control por voz
Uso de Amazon Alexa y Amazon Web Services para integrar el control por voz
Uso de Amazon Alexa y Amazon Web Services para integrar el control por voz
Uso de Amazon Alexa y Amazon Web Services para integrar el control por voz

Este paso es uno de los menos documentados. Esto significa que será el más difícil de solucionar. Hacerlo funcionar me llevó alrededor de un mes, tal vez más. Lo más importante aquí es tener paciencia. Esta característica, si se implementa en la vida real, puede cambiar la vida. Puedes decirle a Alexa que te haga las compras en lugar de ir tú mismo. ¡Imagina eso! ¡Así que sin más preámbulos, entremos en ello!

1. Registro de Raspberry Pi como una cosa en AWS IoT

Para usar IoT (Internet of Things), necesitamos algo. Por lo tanto, primero debemos iniciar sesión en la consola de AWS para usar AWS IoT. Luego vaya a IoT Core. Una vez allí, debe hacer clic en Administrar y luego crear una cosa. Después de agregar un nombre, para conectarse, necesitamos un certificado. Recomendaría hacer clic en la certificación de un clic. Luego, después de ver la pantalla del certificado, asegúrese de descargar todas y cada una de las claves, incluida la CA raíz. Entonces puedes ir y terminar la creación de la cosa. A continuación, tenemos que crear una política. Vuelva a IoT Core. Luego haga clic en seguro y haga clic en políticas. Luego presione crear política. Luego puede crear un nombre y agregar recursos. En acción, escriba iot * y escriba * debajo de recurso y presione permitir para efecto. Luego vuelve a lo tuyo y ve a tu certificado. Una vez aquí, haga clic en políticas. Luego puede adjuntar su póliza para la cosa y ¡todo está listo!

2. Configurar código en Raspberry Pi e interactuar con IoT

Para esta parte, necesitará un cliente SFTP (yo usé WinSCP) para la transferencia de archivos. Al conectarnos a nuestra Raspberry Pi, necesitaremos tener las claves del certificado a mano. Debe transferir los archivos clave a la Raspberry Pi. También debe instalar el AWSIoTPythonSDK en la Raspberry Pi. Luego, ingrese al directorio dk en la Raspberry Pi. Utiliza el archivo Alexa Drone Control que le di para comunicarse con IoT. Para usar este archivo, utilicé un Shell Script para iniciar. Mostraré el código a continuación ya que no puedo cargar el archivo por alguna razón. Si el programa no capta mensajes de AWS IoT durante la prueba, ¡no se preocupe! Esto podría ser culpa mía, ya que el archivo de control de Alexa Drone puede no ser adecuado para usted. Entonces, para solucionarlo, regrese a AWS IoT y presione aprender en el panel izquierdo. Siga las instrucciones y es posible que deba reiniciar. Lo siento por eso. Una vez que su IoT comienza a trabajar con el programa en el RasPi, puede integrar el código del kit de drone del archivo Alexa Drone Control que le di. Después de eso, use el script de Shell que le di con sus certificados y el punto final de la API de descanso de IoT.

# stop script on errorset -e # Compruebe si existe el archivo de CA raíz, descárguelo si no es [! -f./root-CA.crt]; luego printf "\ nDescarga del certificado de CA raíz de AWS IoT desde AWS… / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # instala AWS Device SDK para Python si aún no está instalado si [! -d./aws-iot-device-sdk-python]; luego printf "\ nInstalar AWS SDK… / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# ejecutar la aplicación de muestra pub / sub usando certificados descargados en el paquete

printf "\ nEjecutando la aplicación de muestra 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

Esto no funcionará para todos ustedes ya que los nombres son diferentes. En lugar de las claves que utilicé, reemplácelas con los nombres de sus claves cuando transfiera el archivo. ¡Asegúrese de salir de dk antes de transferir el archivo! Eso debería ser todo lo que tienes que hacer por ahora.

3. Desarrollar su habilidad de Alexa

Este paso parece mucho más difícil de lo que realmente es. Primero, debemos iniciar sesión en la consola de desarrollador de Alexa. Luego, simplemente presione Crear habilidad. Cuando le pida que elija un modelo para su habilidad, simplemente presione personalizado. Cuando te pida que elijas un método, presiona aprovisionar el tuyo. Puedes nombrarlo como quieras. No se requiere plantilla, así que elija comenzar desde cero. A continuación, después de crear su habilidad, debería llegar a la pantalla del Creador de habilidades con una lista de verificación a la derecha. A partir de aquí, podemos comenzar a desarrollar nuestra habilidad. Primero en la lista de verificación está el nombre de la invocación. Esto es lo que le dirás a Alexa que invoque tu habilidad. Para mí, solo puse mi nombre de invocación como dron. Ahora podemos ir a nuestras intenciones, expresiones y espacios. Aquí, puede hacer comandos para el dron, como subir 1 metro o ir hacia la derecha o hacia abajo. El mío solo funciona realmente con un medidor por ahora. Puede hacer clic en el Editor JSON en la parte inferior del panel izquierdo. Luego puede pegar el siguiente código en él.

Después de pegar el código en el Editor JSON, puede hacer clic en el tercer paso de la lista de verificación y creará su modelo de interacción para usted. Con este paso, habrá terminado por ahora. ¡Puede dejar la ranura del punto final en blanco por ahora!

Paso 4: creación de su función Lambda

Ahora, este paso es uno que tendrás que resolver por ti mismo. Te diré cómo conectarlo a Alexa Skill, pero tendrás que codificarlo tú mismo. Entonces, primero vaya a la consola de administración de AWS. Luego, vaya a Lambda. A continuación, puede crear una función con el nombre que desee. Asegúrese de crearlo desde cero y haga que el tiempo de ejecución sea el lenguaje de programación que desee. Usé Node.js. Para agregar Alexa Skill, agregue un disparador y seleccione Alexa Skills Kit (ASK). Copie su Lambda ARN y vuelva a la habilidad de Alexa. Ahora, vaya al punto final. Puede pegar su ARN, guardar y crear un nuevo modelo. Luego, tome el ID de habilidad de Alexa y péguelo en la sección del disparador donde le pregunta en el Lambda. A continuación, desplácese hacia abajo en Lambda y busque la configuración básica y haga que el tiempo de espera sea de 10 segundos. Ahora, depende de usted descubrir el código. Para obtener sugerencias, puede visitar los sitios web a continuación.

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

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

y puede usar el archivo que adjunto, pero está incompleto y no funcionará.

/ ** * Controle su quadcopter APM / Pixhawk con su voz, usando Amazon Alexa, Lambda, 2lemetry MQTT.* / var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // este dispositivo es realmente el controlador 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 = nulo; var cliente = nulo; // Enruta la solicitud entrante según el tipo (LaunchRequest, IntentRequest, etc.) El cuerpo JSON de la solicitud se proporciona en el parámetro de evento. export.handler = function (evento, contexto) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = contexto; if (event.session.application.applicationId! == app_id) {ctx.fail ("ID de aplicación no válida"); } cliente = awsIot.device (mqtt_config); client.on ("conectar", función () {console.log ("Conectado a AWS IoT"); // devolución de llamada ();});

if (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (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 ("EXCEPCIÓN en el controlador:" + e); ctx.fail ("Excepción:" + e); }}; / ** * Se llama cuando comienza la sesión. * / function onSessionStarted (sessionStartedRequest, sesión) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Se llama cuando el usuario inicia la habilidad sin especificar lo que quiere. * / function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Despacho al lanzamiento de tu habilidad. getWelcomeResponse (devolución de llamada); } / ** * Se llama cuando el usuario especifica una intención para esta habilidad. * / function onIntent (intentRequest, session) {//, callback) {console.log ("onIntent requestId =" + intentRequest.requestId + ", sessionId =" + session.sessionId); var intent = intentRequest.intent, intentName = intentRequest.intent.name; console.log ("SOLICITUD de cadena =" + JSON.stringify (intentRequest)); var callback = null; // Envío a los controladores de intenciones de su habilidad if ("GoIntent" === intentName) {doGoIntent (intención, sesión); } else if ("CommandIntent" === intentName) {doCommandIntent (intención, sesión); } else if ("TurnIntent" === intentName) {doTurnIntent (intención, sesión); } else if ("HelpIntent" === intentName) {getWelcomeResponse (); } else {throw "Intención no válida"; }} / ** * Se llama cuando el usuario finaliza la sesión. * No se llama cuando la habilidad regresa shouldEndSession = true. * / function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Agrega lógica de limpieza aquí} // --------------- Funciones que controlan el comportamiento de la habilidad -------------------- --- function getWelcomeResponse () {// Si quisiéramos inicializar la sesión para tener algunos atributos, podríamos agregarlos aquí. var sessionAttributes = {}; var cardTitle = "Bienvenido"; var speechOutput = "Bienvenido a DRONE CONTROL."; // TODO: ¿el dron está en línea o fuera de línea? Si está en línea, ¿está ARMADO? var repromptText = "Drone listo para el comando"; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } / ** * maneja la intención GO. * / function doGoIntent (intento, sesión, devolución de llamada) {// var cardTitle = "Drone GO…"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; var direction = intent.slots. Direction.value; var distancia = intent.slots. Distance.value; var unit = intent.slots. Unit.value; var validDirections = ["adelante", "adelante", "atrás", "atrás", "derecha", "izquierda", "arriba", "abajo", "recto", "adelante", "recto"]; var validUnits = ["pie", "pies", "metro", "metros", "yarda", "yardas"]; repromptText = "Dime qué tan lejos ir y en qué dirección"; var fail = false; // valida las entradas if (! (parseInt (distancia)> = 1)) {speechOutput = "No pude entender la distancia que quieres que viaje."; fallar = verdadero; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "No pude entender la dirección en la que quieres que viaje."; fallar = verdadero; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "No pude entender la unidad a la que quieres que viaje."; fallar = verdadero; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Drone yendo" + dirección + "" + distancia + "" + unidad; speechOutput = "Yendo" + dirección + "" + distancia + "" + unidad; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

función doCommandIntent (intención, sesión, devolución de llamada) {

// var cardTitle = "COMANDO Drone…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Dime cuál es el comando para el dron"; var task = intent.slots. Task.value; var validTasks = ["lanzar", "aterrizar", "r. t. l.", "mantener", "permanecer", "detener", "volver al lanzamiento", "abortar"]; if (validTasks.indexOf (task) == -1) {speechOutput = "No pude entender el comando."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Ejecutando el comando Drone" + tarea; speechOutput = "Ejecutando comando" + tarea; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doTurnIntent (intención, sesión, devolución de llamada) {

// var cardTitle = "Drone Turn…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Dime cómo quieres girar el dron"; var direction = intent.slots. Direction.value; var validDirections = ["derecha", "izquierda", "alrededor"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "No pude entender la dirección del giro"; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Drone girando" + dirección; speechOutput = "Giro" + dirección; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession)

{var strIntent = JSON.stringify (intención); console.log ("mqttPublish: INTENT text =" + strIntent); // client.publish ("ikw1zr46p50f81z / drone / echo", strIntent, false); client.publish (config.topic, strIntent, false); cliente.end (); client.on ("close", (function () {console.log ("MQTT CLIENT CLOSE - piensa que está hecho, con éxito."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("error", (función (err, concedida) {console.log ("MQTT CLIENT ERROR !!" + err);})); }

// --------------- Ayudantes que construyen todas las respuestas -----------------------

function buildSpeechletResponse (title, output, repromptText, shouldEndSession) {return {outputSpeech: {type: "PlainText", text: output}, card: {type: "Simple", title: title, content: output}, reprompt: {outputSpeech: {tipo: "PlainText", texto: repromptText}}, shouldEndSession: shouldEndSession}} function buildResponse (sessionAttributes, speechletResponse) {return {versión: "1.0", sessionAttributes: sessionAttributes, respuesta: speechletResponse}}

Recomendado: