Índice:

Alexa Voice Controlled Raspberry Pi Drone com IoT e AWS: 6 etapas (com imagens)
Alexa Voice Controlled Raspberry Pi Drone com IoT e AWS: 6 etapas (com imagens)

Vídeo: Alexa Voice Controlled Raspberry Pi Drone com IoT e AWS: 6 etapas (com imagens)

Vídeo: Alexa Voice Controlled Raspberry Pi Drone com IoT e AWS: 6 etapas (com imagens)
Vídeo: Robot Attacks Factory Worker! #shorts 2024, Julho
Anonim
Image
Image
Alexa Voice Controlado Raspberry Pi Drone com IoT e AWS
Alexa Voice Controlado Raspberry Pi Drone com IoT e AWS
Alexa Voice Controlado Raspberry Pi Drone com IoT e AWS
Alexa Voice Controlado Raspberry Pi Drone com IoT e AWS

Oi! Meu nome é Armaan. Eu sou um menino de 13 anos de Massachusetts. Este tutorial mostra, como você pode deduzir do título, como construir um Raspberry Pi Drone. Este protótipo demonstra como os drones estão evoluindo e também o quão importante eles podem desempenhar no futuro. Eu posso definitivamente me ver acordando em 10 anos e pedindo a um drone para pegar o café da manhã para mim. O drone usa Amazon Alexa, Amazon Web Services, IoT (Internet of Things) e, o mais importante, um Raspberry Pi para ser executado. O objetivo é demonstrar e informar sobre os drones e como eles estão melhorando a cada dia. Esperamos que você tenha sucesso e aprenda sobre drones no processo. Boa sorte e obrigado pela leitura. -Armaan

Suprimentos

Para construir o protótipo, existem várias necessidades de hardware e software. Usei um tutorial online do The Drone Dojo para construir o drone e integrei as tecnologias listadas. Para o drone, você pode encontrar a lista de peças aqui:

Lista de peças do drone

Requisitos de software:

  • Amazon Web Services
  • Um laptop
  • Software Mission Planer
  • Balena Etcher
  • Cartão MicroSD com arquivo Raspbian encontrado aqui
  • Amazon Alexa, física ou virtual

Etapa 1: Reunir e compreender as partes

Coletando e compreendendo as partes
Coletando e compreendendo as partes

Cada parte mencionada na lista de suprimentos é necessária e, portanto, um entendimento claro de cada parte. Você pode encontrar as peças online e, uma vez reunidas, continue lendo. Uma lista de reprodução do The Drone Dojo para uma compreensão completa das partes pode ser encontrada aqui. Uma explicação de 4 minutos no meu canal do youtube pode ser encontrada aqui. Quando se trata de drones, as únicas peças, apesar do que a maioria das pessoas pensa, não são apenas motores e hélices. Abaixo estão os objetivos básicos de cada parte.

O Raspberry Pi com o Emlid Navio2

Esta parte é basicamente um processador central e o ponto principal do drone. O Raspberry Pi atua como a CPU de um computador que envia comandos ao Navio2 para executar através de PWM (sinais de modulação por largura de pulso) para outras partes do drone

2. Os ESC (controladores eletrônicos de velocidade)

Essas partes amarelas são encontradas abaixo da moldura. Eles são 4 plugados ao Navio, um para cada motor. Ao receber os sinais PWM, eles giram os motores e começam o vôo.

3. Motores

Os motores não precisam de muitas explicações porque provavelmente você os conhece. Eles giram e giram as hélices para criar impulso.

4. Hélices

As hélices criam impulso para o drone voar. Eles giram na mesma direção que os motores para levantar o veículo.

5. A bateria e o módulo de alimentação

A bateria LiPo alimenta todo o drone através da estrutura usando o módulo de energia. Dá cerca de 15-20 minutos de tempo de vôo e atua como uma fonte de energia.

6. O GPS

O GPS se comunica com os satélites para determinar a posição do drone. Ele determina altitude, latitude e longitude. Ele pode ser usado para geofencing, waypoints e também para mover para certas posições ou direções.

7. O Módulo de Telemetria

O módulo de telemetria conecta nosso drone a uma estação de controle de solo, no nosso caso, o Planejador de Missão, para ser monitorado.

8. O Controlador RC e o Módulo junto com o Codificador PPM

O Controlador RC usa rádio para transmitir sinais e comandos para o Módulo RC para pilotar o drone manualmente. O codificador PPM traduz esses sinais para o Navio + RPI processar e executar.

9. O quadro

Esta moldura vermelha e branca atua como uma base ou plataforma para as outras peças a serem colocadas. O quadro é aerodinâmico e leve, portanto perfeito para a construção de nosso drone.

Agora, com o conhecimento de todas as partes, podemos finalmente construir o drone! Avante para a próxima etapa!

Etapa 2: montagem do drone

Montando o Drone
Montando o Drone

Esta etapa é provavelmente a mais difícil em termos de esforço físico. Eu recomendo ter outra pessoa para ajudar ou tentar usar a mão amiga na lista de peças. O processo é muito longo para ser demonstrado aqui, então irei fornecer outro link que usei pelo The Drone Dojo.

Construindo um Drone Raspberry Pi

Novamente, como não irei entrar em muitos detalhes, apenas destacarei o básico de cada etapa.

1. Organize seus suprimentos - Reúna nossos materiais e certifique-se de que eles sejam facilmente acessíveis

2. Planeje sua construção - Organize suas peças na estrutura para fazer um projeto do que você construirá

3. Trabalho de solda - Este é o trabalho um pouco difícil de fazer sozinho. Você deve soldar os conectores bala dourados que vêm com os motores para os ESC's. Em seguida, você deve pegar a parte inferior da estrutura e soldar os ESC na estrutura inferior ou na placa de distribuição de energia. O módulo de bateria também será soldado à placa de distribuição de energia

4. Configurando a estrutura - você deve aparafusar a parte superior da estrutura junto com os braços. Você pode então prender o Raspberry Pi na parte superior da maneira que quiser (usei fita adesiva). Em seguida, você pode prender os ESCs aos braços com laços. Agora estamos quase terminando.

5. Vinculando o Controlador RC ao Receptor - Tente seguir as instruções na lista de reprodução acima para vincular o Controlador RC usando um ESC.

6. Finalizando as peças na estrutura - fita adesiva ou cinta do módulo de telemetria na estrutura. Cole o codificador PPM em um braço também. Agora você pode conectar o codificador ESC e PPM ao Navio.

7. Suporte GPS + Bateria - Monte o Suporte GPS com os vários parafusos e peças. Usando zip-tie, prenda o GPS ao Frame. Não usei necessariamente o GPS Mount por causa de sua fragilidade, mas depende de você. Em seguida, você pode inserir a bateria entre o Power Dist. Borda. Eu amarrei e fixei o módulo de energia na estrutura também. Agora seu hardware está praticamente configurado. Agora vamos para a parte que estamos esperando!

8. Instalando as Hélices !!! - Você pode apertar as hélices usando o gráfico mencionado na lista de reprodução. Em seguida, você pode conectar os ESCs aos motores e finalmente terminaremos de construir o drone.

O próximo software, e assim por diante!

Etapa 3: Configurando Raspberry Pi e GCS (planejador de missão)

Configurando Raspberry Pi e GCS (planejador de missão)
Configurando Raspberry Pi e GCS (planejador de missão)

Novamente, você pode encontrar instruções mais detalhadas na lista de reprodução da última etapa. No entanto, você provavelmente sabe como configurar o RasPi. Mas desta vez, estamos fazendo isso sem cabeça. Use Balena Etcher para gravar o sistema operacional do site do sistema operacional Navio no cartão MicroSD. Enquanto ele está conectado ao seu computador, vá para o suplicante wpa usando o notepad ++. Depois disso, insira o ssid e a senha do Raspberry Pi para se conectar ao seu WiFi. Então você deve adicionar um arquivo chamado SSH. Isso pode ser por meio da linha de comando ou outro método. Agora podemos fazer SSH. Você pode usar o prompt de comando ou Putty. Usei o prompt de comando e digitei "ssh pi @ navio" para conectar no meu caso, ou você pode encontrar o endereço IP e o ssh dessa forma. Ao conectar, use este vídeo para instalar e configurar o Navio. Para configurar a telemetria, você deve primeiro fazer uma edição no Raspberry Pi. Siga isto para fazer a edição e tente conectar-se ao Mission Planner. Se a telemetria não funcionar, você pode desfazer a edição e conectar usando uma conexão UDB inserindo o IP do GCS (Ground Control Station, como laptop). Uma vez conectado ao Mission Planner, você pode usar o assistente de configuração para calibrar todas as partes do drone. Se precisar de ajuda, consulte novamente a lista de reprodução. Normalmente, sempre que você configura, quase sempre há um erro. A solução de problemas é uma das maiores partes deste projeto. Não posso realmente ajudá-lo, pois não estou ciente de seus erros, mas a maioria dos erros pode ser corrigida com a ajuda da Internet. Depois que tudo estiver pronto, o drone estará pronto para voar! Você pode configurar seu controlador RC e modos de vôo no Mission Planner. Tente manter o controle esquerdo bem no canto inferior direito por cinco segundos para armar o drone. Não recomendo voar sem olhar um tutorial porque o drone é muito frágil e fácil de quebrar. Para mim, a primeira vez que voei, quebrei o suporte do GPS e algumas hélices. Se você não precisa de controle de voz, pode parar aqui. Para aprender sobre AWS e programar o drone, continue!

Etapa 4: Programando o Drone para voar com Python

Programando o Drone para voar com Python
Programando o Drone para voar com Python

Antes de entrar na AWS, devemos primeiro entender como programar o drone para voar. Após a configuração inicial, integrar o controle de voz não deve ser muito difícil. A primeira coisa que podemos tentar ter uma noção disso é fazer um programa simples de decolagem e aterrissagem. Depois de configurar o Raspberry Pi, podemos usar o SSH nele novamente. Você pode olhar a lista de reprodução novamente ou seguir minhas instruções.

1. Primeiro, vamos baixar o código-fonte do ArduPilot em um diretório no Raspberry Pi

mkdir src

Em seguida, obtenha os arquivos do GitHub usando o clone do git

git clone -b Copter-3.6.11

Agora, vamos navegar para / src / ardupilot

cd src

cd ardupilot

Agora, vamos inicializar os arquivos de origem

git submodule update --init --recursive

2. Em seguida, temos que compilar o firmware no Raspberry Pi

Certifique-se de navegar para / src / ardupilot / com cd antes de realizar as próximas etapas

Em seguida, para cofigurar especificamente para o Navio usando

./waf configure --board = navio2

Então você pode compilar com

./waf --targets bin / arducopter

3. Agora podemos instalar o código-fonte no Navio

Primeiro, vamos navegar para o diretório certo.

cd / etc / systemd / system

Em seguida, edite o arquivo

sudo vi arducopter.service

Onde diz ExecStart, insira o seguinte em vez do que já está lá

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

Agora, para colocar o código-fonte do ardupilot em ação, podemos usar

sudo systemctl daemon-reload

Então podemos recomeçar com

sudo systemctl restart arducopter

Com a última etapa, finalmente concluímos a configuração do ArduPilot em nosso drone

4. Instalando DroneKit

DroneKit é o software que usaremos para programar o drone para voar. Para entender parte do código, você pode encontrar a documentação aqui. Primeiro, devemos instalar o pacote em nosso drone antes de escrever um script.

Podemos instalar o pacote python com

pip install dronekit == 2.9.1

Esta pode ser ou não a versão mais recente, mas é a que usei para poder ajudar na solução de problemas.

Para verificar se instalado, podemos fazer um

pip freeze | grep dronekit

Agora estamos finalmente prontos para fazer nosso primeiro script Python

5. takeoff_and_land.py

AVISO! Eu sugiro estabelecer um entendimento básico de python, para que você possa aprender e entender o código. Se você quiser escrever o programa sozinho, siga este vídeo.

## Primeiro, não vamos criar um diretório para armazenar este código

cd dk ## Se você quiser fazer isso sozinho, use vi takeoff_and_land.py ## para criar um programa

Caso contrário, você pode dar uma olhada ou usar o arquivo anexado e usar um protocolo de transferência de arquivos. Podemos experimentar este programa depois. Primeiro, para esclarecer que é um arquivo python que devemos usar

chmod + x takeoff_and_land.py

Em seguida, tente usar o seguinte código para executar

python takeoff_and_land.py --connect 127.0.0.1:14550

Na primeira vez, também não funcionou para mim. Se houver um tempo limite de link, não se preocupe, há algo que você pode fazer. Abra outro prompt e ssh. Você pode tentar instalar algo chamado mavproxy e tentar executá-lo. Depois disso, você pode executar os dois simultaneamente. Isso deve ajudar a conectar o drone. Feito isso, tenho um desafio para você. Tente descobrir o que o outro programa (set_velocity_body.py) faz e como fazê-lo funcionar. Se você fizer isso, bom trabalho.

6. Avante!

Agora podemos usar esse conhecimento para tornar nosso drone controlado por voz. O controle de drones Alexa usa muitos desses recursos e muito mais. Boa sorte e avante!

Etapa 5: usando Amazon Alexa e Amazon Web Services para integrar o controle de voz

Usando Amazon Alexa e Amazon Web Services para integrar o controle de voz
Usando Amazon Alexa e Amazon Web Services para integrar o controle de voz
Usando Amazon Alexa e Amazon Web Services para integrar o controle de voz
Usando Amazon Alexa e Amazon Web Services para integrar o controle de voz

Esta etapa é uma das menos documentadas. Isso significa que será o mais difícil de solucionar. Só para fazer funcionar levei cerca de um mês, talvez mais. O mais importante aqui é ser paciente. Esse recurso, se implementado na vida real, pode mudar vidas. Você pode simplesmente dizer a Alexa para pegar seus mantimentos para você, em vez de ir sozinha. Imagine isso! Então, sem mais delongas, vamos entrar nisso!

1. Registrando o Raspberry Pi como uma coisa no AWS IoT

Para usar IoT (Internet of Things), bem, precisamos de uma coisa. Portanto, temos que fazer login no AWS Console para usar o AWS IoT primeiro. Em seguida, vá para o IoT Core. Uma vez lá, você deve clicar em Gerenciar e, em seguida, criar uma coisa. Depois de adicionar um nome, para conectar, precisamos de um certificado. Eu recomendaria clicar na certificação One-click. Depois de ver a tela do certificado, certifique-se de fazer o download de todas as chaves, incluindo a CA raiz. Então você pode ir e terminar a criação da coisa. Em seguida, temos que criar uma política. Volte para o IoT Core. Em seguida, clique em políticas de segurança e clique. Em seguida, clique em criar política. Você pode então criar um nome e adicionar recursos. Em ação, digite iot * e digite * em recurso e clique em permitir efeito. Em seguida, volte ao seu trabalho e vá ao seu certificado. Uma vez aqui, clique em políticas. Você pode anexar sua política para a coisa e está tudo pronto!

2. Configurando o código no Raspberry Pi e interagindo com a IoT

Para esta parte, você vai precisar de um SFTP Client (usei WinSCP) para a transferência de arquivos. Ao conectar-se ao nosso Raspberry Pi, precisaremos ter as chaves do certificado em mãos. Você deve transferir os arquivos-chave para o Raspberry Pi. Você também deve instalar o AWSIoTPythonSDK no Raspberry Pi. Em seguida, vá para o diretório dk no Raspberry Pi. Você usa o arquivo Alexa Drone Control que forneci para se comunicar com a IoT. Para usar este arquivo, usei um Shell Script para a inicialização. Vou mostrar o código abaixo porque não consigo fazer o upload do arquivo por algum motivo. Se o programa não pegar mensagens do AWS IoT durante o teste, não se preocupe! Isso pode ser minha culpa, pois o arquivo de controle Alexa Drone pode não se adequar ao seu caso. Portanto, para corrigir isso, volte para AWS IoT e clique em aprender no painel esquerdo. Siga as instruções e talvez seja necessário reiniciar. Desculpe por isso. Uma vez que sua IoT comece a trabalhar com o programa no RasPi, você pode integrar o código do dronekit do arquivo Alexa Drone Control que eu dei. Depois disso, use o Shell Script que dei com seus certificados e o Rest API Endpoint da IoT.

# interrompa o script no conjunto de erros -e # Verifique se o arquivo CA raiz existe, faça o download, se não, se [! -f./root-CA.crt]; então printf "\ nTransferindo o certificado AWS IoT Root CA da AWS… / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # install AWS Device SDK para Python se ainda não estiver instalado E se [! -d./aws-iot-device-sdk-python]; então printf "\ nInstalando AWS SDK… / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# execute o aplicativo de amostra pub / sub usando certificados baixados no pacote

printf "\ nExecutando aplicativo de amostra 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

Isso não funcionará para todos vocês, pois os nomes são diferentes. Em vez das chaves que usei, substitua pelos nomes das suas chaves ao transferir o arquivo. Certifique-se de sair do dk antes de transferir o arquivo! Isso deve ser tudo que você precisa fazer por agora.

3. Construindo sua habilidade Alexa

Esta etapa parece muito mais difícil do que realmente é. Primeiro, devemos entrar no console Alexa Developer. Então, basta clicar em criar habilidade. Quando pedir para escolher um modelo para sua habilidade, basta clicar em custom. Quando ele pedir para escolher um método, clique em provisionar seu próprio. Você pode nomeá-lo como quiser. Nenhum modelo é necessário, então escolha começar do zero. Em seguida, após criar sua habilidade, você deve chegar à tela do Construtor de habilidades com uma lista de verificação à direita. A partir daqui, podemos começar a desenvolver nossa habilidade. O primeiro da lista de verificação é o nome da invocação. Isso é o que você dirá a Alexa para invocar sua habilidade. Para mim, apenas coloquei meu nome de invocação como drone. Agora podemos ir para nossas intents, enunciados e slots. Aqui, você pode fazer comandos para o drone, como subir 1 metro ou ir para a direita ou para baixo. O meu só funciona realmente com um metro por enquanto. Você pode clicar no Editor JSON na parte inferior do painel esquerdo. Em seguida, você pode colar o código a seguir nele.

Depois de colar o código no Editor JSON, você pode clicar na terceira etapa da lista de verificação e ele construirá seu modelo de interação para você. Com esta etapa, você estará pronto por agora. Você pode deixar o slot do endpoint em branco por enquanto!

Etapa 4: Construindo Sua Função Lambda

Agora, esta etapa é aquela que você terá que descobrir por si mesmo. Vou lhe dizer como conectá-lo à habilidade Alexa, mas você mesmo terá que codificá-lo. Portanto, primeiro vá para o console de gerenciamento da AWS. Então, vá para Lambda. Você pode então criar uma função com o nome que desejar. Certifique-se de criá-lo do zero e fazer com que o tempo de execução seja a linguagem de programação que você deseja. Usei Node.js. Para adicionar a habilidade Alexa, adicione um gatilho e selecione Alexa Skills Kit (ASK). Copie seu Lambda ARN e volte para a habilidade Alexa. Agora, vá para o ponto final. Você pode colar seu ARN, salvar e construir um novo modelo. Em seguida, pegue o Alexa Skill ID e cole-o na seção de gatilho onde ele pergunta a você no Lambda. Em seguida, role para baixo no Lambda e encontre as configurações básicas e faça o tempo limite de 10 segundos. Agora, depende de você descobrir o código. Para obter dicas, você pode acessar os sites abaixo.

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

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

e você pode usar o arquivo que anexei, mas está incompleto e não funcionará.

/ ** * Controle seu quadricóptero APM / Pixhawk com sua voz, usando Amazon Alexa, Lambda, 2lemetry MQTT.* / var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // este dispositivo é realmente o 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 = null; var client = null; // Roteie a solicitação de entrada com base no tipo (LaunchRequest, IntentRequest, etc.) O corpo JSON da solicitação é fornecido no parâmetro do evento. exportações.handler = função (evento, contexto) {tentar {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = contexto; if (event.session.application.applicationId! == app_id) {ctx.fail ("ID de aplicativo inválido"); } cliente = awsIot.device (mqtt_config); client.on ("conectar", function () {console.log ("Conectado ao AWS IoT"); // callback ();});

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 ("EXCEÇÃO no manipulador:" + e); ctx.fail ("Exceção:" + e); }}; / ** * Chamado quando a sessão começa. * / function onSessionStarted (sessionStartedRequest, sessão) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Chamado quando o usuário inicia a habilidade sem especificar o que deseja. * / function onLaunch (launchRequest, sessão, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Despache para o lançamento de sua habilidade. getWelcomeResponse (retorno de chamada); } / ** * Chamado quando o usuário especifica uma intenção para esta habilidade. * / function onIntent (intentRequest, sessão) {//, retorno de chamada) {console.log ("onIntent requestId =" + intentRequest.requestId + ", sessionId =" + session.sessionId); var intent = intentRequest.intent, intentName = intentRequest.intent.name; console.log ("REQUEST to string =" + JSON.stringify (intentRequest)); var callback = null; // Despacha para os manipuladores de intent de sua habilidade if ("GoIntent" === intentName) {doGoIntent (intent, sessão); } else if ("CommandIntent" === intentName) {doCommandIntent (intent, sessão); } else if ("TurnIntent" === intentName) {doTurnIntent (intent, sessão); } else if ("HelpIntent" === intentName) {getWelcomeResponse (); } else {joga "Intenção inválida"; }} / ** * Chamado quando o usuário encerra a sessão. * Não é chamado quando a habilidade retorna shouldEndSession = true. * / function onSessionEnded (sessionEndedRequest, sessão) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Adicione lógica de limpeza aqui} // --------------- Funções que controlam o comportamento da habilidade -------------------- --- function getWelcomeResponse () {// Se quiséssemos inicializar a sessão para ter alguns atributos, poderíamos adicioná-los aqui. var sessionAttributes = {}; var cardTitle = "Bem-vindo"; var speechOutput = "Bem-vindo ao DRONE CONTROL."; // TODO: o drone está online ou offline? Se estiver online, é ARMED? var repromptText = "Drone pronto para o comando."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } / ** * lida com a intenção GO. * / function doGoIntent (intent, sessão, 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 = ["para a frente", "para a frente", "para trás", "para trás", "direita", "esquerda", "para cima", "para baixo", "em linha reta", "em frente", "em frente"]; var validUnits = ["pé", "pés", "metro", "metros", "jarda", "jardas"]; repromptText = "Diga-me até onde ir e em que direção."; var fail = false; // valida as entradas if (! (parseInt (distance)> = 1)) {speechOutput = "Não entendi a distância que você quer que eu viaje."; falha = verdadeiro; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Não entendi a direção que você quer que eu viaje."; falha = verdadeiro; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Não entendi a unidade que você quer que eu viaje."; falha = verdadeiro; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Drone indo" + direção + "" + distância + "" + unidade; speechOutput = "Indo" + direção + "" + distância + "" + unidade; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doCommandIntent (intent, sessão, callback) {

// var cardTitle = "Drone COMMAND…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Diga-me qual é o comando para o drone."; var task = intent.slots. Task.value; var validTasks = ["lançar", "pousar", "r. t. l.", "manter", "ficar", "parar", "retornar ao lançamento", "cancelar"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Não entendi o comando."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Executando comando Drone" + tarefa; speechOutput = "Executando comando" + tarefa; mqttPublish (intenção, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doTurnIntent (intent, sessão, callback) {

// var cardTitle = "Drone Turn…"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Diga-me como você deseja virar o drone."; var direction = intent.slots. Direction.value; var validDirections = ["right", "left", "around"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Não entendi a direção da curva."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Drone girando" + direção; speechOutput = "Girando" + direção; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

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

{var strIntent = JSON.stringify (intenção); console.log ("mqttPublish: INTENT text =" + strIntent); // client.publish ("ikw1zr46p50f81z / drone / echo", strIntent, false); client.publish (config.topic, strIntent, false); client.end (); client.on ("close", (function () {console.log ("MQTT CLIENT CLOSE - pensa que foi feito, com sucesso."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("erro", (função (errar, concedido) {console.log ("MQTT CLIENT ERROR !!" + err);})); }

// --------------- Assistentes que constroem todas as respostas -----------------------

function buildSpeechletResponse (title, output, repromptText, shouldEndSession) {return {outputSpeech: {type: "PlainText", text: output}, card: {type: "Simple", title: title, content: output}, reprompt: {outputSpeech: {type: "PlainText", text: repromptText}}, shouldEndSession: shouldEndSession}} function buildResponse (sessionAttributes, speechletResponse) {return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse}}

Recomendado: