Innholdsfortegnelse:

Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trinn (med bilder)
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trinn (med bilder)

Video: Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trinn (med bilder)

Video: Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trinn (med bilder)
Video: Amazon Echo API w/ Alexa running on Raspberry Pi 2 2024, November
Anonim
Image
Image
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS

Hei! Jeg heter Armaan. Jeg er en 13 år gammel gutt fra Massachusetts. Denne opplæringen viser, slik du kan utlede av tittelen, hvordan du bygger en Raspberry Pi Drone. Denne prototypen demonstrerer hvordan droner utvikler seg og også hvor stor rolle de kan spille i fremtiden. Jeg kan definitivt se meg selv våkne om 10 år og be en drone om å få frokost til meg. Dronen bruker Amazon Alexa, Amazon Web Services, IoT (Internet of Things), og viktigst av alt en Raspberry Pi for å kjøre. Det er ment å demonstrere og informere om droner og hvordan de forbedres hver dag. Forhåpentligvis lykkes du og lærer om droner i prosessen. Lykke til og takk for at du leser. -Armensk

Rekvisita

For å bygge prototypen er det forskjellige maskinvare- og programvarebehov. Jeg brukte en online opplæring av The Drone Dojo for å bygge dronen og integrert teknologiene som er oppført. For dronen finner du delelisten her:

Liste over droner

Programvarekrav:

  • Amazon Web Services
  • En bærbar PC
  • Mission Planer Software
  • Balena Etcher
  • MicroSD -kort med Raspbian -fil finnes her
  • Amazon Alexa, fysisk eller virtuelt

Trinn 1: Samle og forstå deler

Samle og forstå deler
Samle og forstå deler

Hver del som er nevnt i forsyningslisten er nødvendig, og det er en klar forståelse av hver del. Du kan finne delene på nettet, og når du er samlet, fortsetter du å lese. En spilleliste av The Drone Dojo for en fullstendig forståelse av delene finner du her. En 4-minutters forklaring på min youtube-kanal finner du her. Når det gjelder droner, er de eneste delene, til tross for det de fleste tror, ikke bare motorer og propeller. Nedenfor er de grunnleggende formålene med hver del.

Raspberry Pi med Emlid Navio2

Denne delen er ganske mye en sentral prosessor og hovedpoenget med dronen. Raspberry Pi fungerer som CPU -en til en datamaskin som sender kommandoer til Navio2 for å utføre via PWM (Pulse Width Modulation Signals) til andre deler av dronen

2. ESC (elektroniske hastighetskontrollere)

Disse gule delene er funnet under rammen. De er 4 koblet til Navio, en for hver motor. Når de mottar PWM -signaler, roterer de motorene og begynner å fly.

3. Motorer

Motorer trenger ikke for mye forklaring fordi du sannsynligvis er kjent med dem. De roterer og spinner propellene for å skape skyvekraft.

4. Propeller

Propeller skaper fremdrift for dronen å fly. De snurrer i samme retning som motorene for å løfte kjøretøyet.

5. Batteri- og strømmodulen

LiPo -batteriet driver hele dronen gjennom rammen ved hjelp av strømmodulen. Det gir omtrent 15-20 minutter flytid og fungerer som en strømkilde.

6. GPS -en

GPS -en kommuniserer med satellitter for å bestemme dronens posisjon. Det bestemmer høyde, breddegrad og lengdegrad. Den kan brukes til geofencing, veipunkter og også til å flytte til bestemte posisjoner eller retninger.

7. Telemetri -modulen

Telemetri -modulen kobler dronen vår til en bakkekontrollstasjon, i vårt tilfelle Mission Planner, som skal overvåkes.

8. RC -kontrolleren og modulen sammen med PPM -koder

RC -kontrolleren bruker radio til å overføre signaler og kommandoer til RC -modulen for å styre dronen manuelt. PPM Encoder oversetter disse signalene for Navio + RPI å behandle og utføre.

9. Rammen

Denne røde og hvite rammen fungerer som en base eller plattform for de andre delene som skal plasseres. Rammen er aerodynamisk og lett, derfor perfekt for dronebygningen vår.

Nå med kunnskap om alle deler, kan vi endelig bygge dronen! Videre til neste trinn!

Trinn 2: Montering av dronen

Montering av dronen
Montering av dronen

Dette trinnet er trolig det vanskeligste når det gjelder fysisk innsats. Jeg anbefaler å ha en annen person til hjelp eller prøve å bruke den hjelpende hånden i delelisten. Prosessen er for lang til å demonstrere her, så jeg kommer med en annen lenke jeg brukte av The Drone Dojo.

Å bygge en Raspberry Pi Drone

Igjen, ettersom jeg ikke vil gå for mye i detalj, vil jeg bare markere det grunnleggende i hvert trinn.

1. Organiser forsyningene dine - Samle materialene våre og sørg for at de er lett tilgjengelige

2. Planlegg bygningen din - Organiser delene dine på rammen for å lage en tegning av det du vil bygge

3. Loddearbeid - Dette er arbeidet som er litt vanskelig å gjøre alene. Du må lodde de gylne kulekontaktene som følger med motorene til ESC -ene. Deretter må du ta den nedre delen av rammen og lodde ESC -ene til den nedre rammen eller Power Distribution Board. Batterimodulen blir også loddet videre til strømfordelingsbordet

4. Sette opp rammen - Du må deretter skru inn den øvre delen av rammen sammen med armene. Du kan deretter feste Raspberry Pi på toppen slik du vil. (Jeg brukte tape). Deretter kan du feste ESC-ene til armene med glidelåser. Nå er vi nesten ferdige.

5. Binde RC -kontrolleren til mottaker - Prøv å følge instruksjonene i spillelisten ovenfor for å binde RC -kontrolleren ved hjelp av en ESC.

6. Ferdigstilling av deler på rammen - Duct tape eller stropp på telemetri -modulen på rammen. Duct tape PPM Encoder også til en arm. Nå kan du koble ESC og PPM Encoder til Navio.

7. GPS -feste + batteri - Monter GPS -feste med de forskjellige skruene og brikkene. Fest glidelåsen til rammen ved hjelp av glidelåser. Jeg brukte ikke nødvendigvis GPS -feste på grunn av skjørheten, men det er opp til deg. Deretter kan du sette inn batteriet mellom Power Dist. Borde. Jeg festet og teipet på strømmodulen til rammen også. Nå er maskinvaren din ganske mye konfigurert. Nå til delen vi har ventet på!

8. Installere propellene !!! - Du kan stramme propellene ved hjelp av diagrammet som er nevnt i spillelisten. Deretter kan du koble ESC -ene til motorene, og vi er endelig ferdig med å bygge dronen.

Programvaren er neste, så videre!

Trinn 3: Konfigurering av Raspberry Pi og GCS (Mission Planner)

Konfigurere Raspberry Pi og GCS (Mission Planner)
Konfigurere Raspberry Pi og GCS (Mission Planner)

Igjen kan du finne mer detaljerte instruksjoner i spillelisten fra det siste trinnet. Imidlertid vet du sannsynligvis hvordan du konfigurerer RasPi. Men denne gangen gjør vi det hodeløst. Bruk Balena Etcher til å brenne operativsystemet fra Navio OS -nettstedet til MicroSD -kortet. Mens den er koblet til datamaskinen din, går du inn på wpa -supplikanten ved hjelp av notisblokk ++. Etter det skriver du inn ssid og passord for Raspberry Pi for å koble til WiFi. Deretter må du legge til en fil som heter SSH. Dette kan være gjennom kommandolinjen eller en annen metode. Nå kan vi SSH. Du kan bruke ledeteksten eller Putty. Jeg brukte ledeteksten og skrev "ssh pi@navio" for å koble til i mitt tilfelle, eller du kan finne IP -adressen og ssh på den måten. Når du kobler til, bruker du denne videoen til å sette opp og konfigurere Navio. For å konfigurere telemetrien må du først redigere Raspberry Pi. Følg dette for å redigere og prøve å koble til Mission Planner. Hvis telemetri ikke fungerer, kan du angre redigeringen og koble til ved hjelp av en UDB -tilkobling ved å skrive inn din GCS (Ground Control Station, for eksempel bærbar PC). Når du er koblet til Mission Planner, kan du bruke oppsettveiviseren til å kalibrere alle deler av dronen. Hvis du trenger hjelp, kan du se spillelisten igjen. Vanligvis, når du konfigurerer det, er det nesten alltid en feil. Feilsøking er en av de største delene av dette prosjektet. Jeg kan egentlig ikke hjelpe deg der, siden jeg ikke er klar over feilene dine, men de fleste feilene kan løses med hjelp fra internett. Etter at alt er klart, er dronen klar til å fly! Du kan konfigurere RC -kontrolleren og flymodusene på Mission Planner. Prøv å holde venstre pinne helt nederst til høyre i fem sekunder for å bevæpne dronen. Jeg anbefaler ikke å fly uten å se på en opplæring fordi dronen er veldig skjør og lett å bryte. For meg, første gang jeg fløy den, brøt jeg GPS -feste og noen propeller. Hvis du ikke trenger stemmekontroll, kan du stoppe her. For å lære om AWS og programmere dronen, fortsett!

Trinn 4: Programmering av dronen til å fly med Python

Programmering av dronen til å fly med Python
Programmering av dronen til å fly med Python

Før vi går inn på AWS, bør vi først forstå hvordan vi skal programmere dronen til å fly. Etter det første oppsettet burde integrering av talekontroll ikke være for vanskelig. Det første vi kan prøve å få en følelse av det er å lage et enkelt start- og landprogram. Etter å ha konfigurert Raspberry Pi, kan vi SSH inn i den igjen. Du kan se på spillelisten igjen eller følge instruksjonene mine.

1. La oss først laste ned ArduPilot -kildekoden i en katalog på Raspberry Pi

mkdir src

Deretter får du filene fra GitHub ved hjelp av git -klon

git klon -b Copter -3.6.11

La oss nå navigere til /src /ardupilot

cd src

cd ardupilot

La oss nå initialisere kildefilene

git -delmoduloppdatering --init --recursive

2. Deretter må vi kompilere fastvaren på Raspberry Pi

Sørg for å navigere til/src/ardupilot/med cd før du gjør neste trinn

Deretter for å konfigurere spesifikt til Navio ved hjelp av

./waf konfigurere --board = navio2

Deretter kan du kompilere med

./waf -målbøtte/arducopter

3. Vi kan nå installere kildekoden til Navio

La oss først navigere til riktig katalog.

cd/etc/systemd/system

Rediger deretter filen

sudo vi arducopter.service

Der det står ExecStart, sett inn følgende i stedet for det som allerede er der

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

Nå, for å sette ardupilot -kildekoden i verk, kan vi bruke

sudo systemctl daemon-reload

Så kan vi starte på nytt med

sudo systemctl start arducopter på nytt

Med det siste trinnet er vi endelig ferdig med å sette opp ArduPilot på vår drone

4. Installere DroneKit

DroneKit er programvaren som vi vil bruke til å programmere dronen til å fly. For å forstå noe av koden kan du finne dokumentasjonen her. Først må vi installere pakken på dronen vår før vi skriver et skript.

Vi kan installere python -pakken med

pip installere dronekit == 2.9.1

Dette er kanskje den nyeste versjonen, men kanskje ikke den nyeste versjonen, men det er den jeg brukte så jeg kan hjelpe deg med feilsøking.

For å sjekke om den er installert, kan vi gjøre en

pip fryse | grep dronekit

Nå er vi endelig klare til å lage vårt første python -skript

5. start_and_land.py

ADVARSEL! Jeg foreslår at du etablerer en grunnleggende forståelse av python, slik at du kan lære og forstå koden. Hvis du vil skrive programmet selv, følg denne videoen.

## La oss først opprette en katalog for å lagre denne koden

cd dk ## Hvis du vil gjøre det selv, kan du bruke vi takeoff_and_land.py ## til å lage et program

Ellers kan du ta en titt eller bruke den vedlagte filen og bruke en filoverføringsprotokoll. Vi kan prøve dette programmet etterpå. Først for å avklare at det er en python -fil vi må bruke

chmod +x start_and_land.py

Prøv deretter å bruke følgende kode for å kjøre

python takeoff_and_land.py -koble til 127.0.0.1:14550

Den første gangen fungerte det ikke for meg heller. Hvis det er en tidsavbrudd for koblingen, ikke bekymre deg, det er noe du kan gjøre. Åpne en annen melding og ssh. Du kan prøve å installere noe som heter mavproxy og prøve å kjøre det. Etter det kan du kjøre begge samtidig. Dette skal hjelpe til med å koble dronen. Når det er gjort, har jeg en utfordring for deg. Prøv å finne ut hva det andre programmet (set_velocity_body.py) gjør og hvordan du får det til å fungere. Hvis du gjør det, bra jobb.

6. Fremover!

Vi kan nå bruke denne kunnskapen til å gjøre dronen vår stemmestyrt. Alexa dronekontroll bruker mange av disse funksjonene og mer. Lykke til og videre!

Trinn 5: Bruk Amazon Alexa og Amazon Web Services til å integrere talekontroll

Bruke Amazon Alexa og Amazon Web Services til å integrere talekontroll
Bruke Amazon Alexa og Amazon Web Services til å integrere talekontroll
Bruke Amazon Alexa og Amazon Web Services til å integrere talekontroll
Bruke Amazon Alexa og Amazon Web Services til å integrere talekontroll

Dette trinnet er et av de mindre dokumenterte. Dette betyr at det vil være det vanskeligste å feilsøke. Bare det å få det til å fungere tok meg omtrent en måned, kanskje mer. Det viktigste her er å være tålmodig. Denne funksjonen, hvis den er implementert i det virkelige liv, kan være livsendrende. Du kan bare be Alexa om å kjøpe dagligvarer for deg i stedet for å gå selv. Tenk deg det! Så uten videre må vi komme inn på det!

1. Registrering av Raspberry Pi som en ting på AWS IoT

For å bruke IoT (Internet of Things) trenger vi en ting. Så vi må logge på AWS -konsollen for å bruke AWS IoT først. Gå deretter til IoT Core. Når du er der, bør du klikke på Administrer og deretter lage en ting. Etter å ha lagt til et navn, for å koble til, trenger vi et sertifikat. Jeg vil anbefale å klikke på ett-klikk-sertifiseringen. Etter at du har sett sertifikatskjermen, må du laste ned hver eneste nøkkel inkludert rot -CA. Deretter kan du gå og fullføre opprettelsen av tingen. Deretter må vi lage en policy. Gå tilbake til IoT Core. Klikk deretter på sikre og klikk på retningslinjer. Trykk deretter på opprett politikk. Du kan deretter opprette et navn og legge til ressurser. Under handling skriver du iot * og skriver * under ressurs og treffer tillatelse for effekt. Gå deretter tilbake til tingen din og gå til sertifikatet ditt. Når du er her, klikker du på retningslinjene. Du kan deretter legge ved politikken din for saken, og alt er klart!

2. Sette opp kode på Raspberry Pi og samhandle med IoT

For denne delen trenger du en SFTP -klient (jeg brukte WinSCP) for filoverføring. Ved tilkobling til Raspberry Pi må vi ha sertifikatnøklene for hånden. Du må overføre nøkkelfilene til Raspberry Pi. Du bør også installere AWSIoTPythonSDK pip på Raspberry Pi. Gå deretter inn i dk -katalogen på Raspberry Pi. Du bruker Alexa Drone Control -filen jeg ga for å kommunisere med IoT. For å bruke denne filen brukte jeg et Shell Script for oppstart. Jeg vil vise koden nedenfor da jeg av en eller annen grunn ikke kan laste opp filen. Hvis programmet ikke henter meldinger fra AWS IoT mens du tester, ikke bekymre deg! Dette kan være min feil, ettersom Alexa Drone Control File kanskje ikke passer din ting. Så for å fikse det, gå tilbake til AWS IoT og klikk på Lær på panelet til venstre. Følg instruksjonene, og du må kanskje starte på nytt. Beklager for det. Når IoT begynner å jobbe med programmet på RasPi, kan du integrere dronekit -koden fra Alexa Drone Control -filen jeg ga. Etter det, bruk Shell -skriptet jeg ga med sertifikatene dine og Rest API -endepunktet fra IoT.

# stopp script på feilsett -e # Sjekk om det finnes root CA -fil, last ned hvis ikke hvis [! -f./root-CA.crt]; deretter printf "\ nLast ned AWS IoT Root CA-sertifikat fra AWS … / n" krøll https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # installer AWS Device SDK for Python hvis det ikke allerede er installert hvis [! -d./aws-iot-device-sdk-python]; deretter printf "\ nInstallering av AWS SDK … / n" git-klon https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py installer popd fi

# kjør pub/deleksempelapp ved hjelp av sertifikater lastet ned i pakken

printf "\ nKjør pub/deleksempelapplikasjon … / 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

Dette vil ikke fungere for dere alle ettersom navnene er forskjellige. I stedet for nøklene som jeg brukte, erstattes de med nøkkelnavnene dine når du overfører filen. Sørg for å avslutte dk før du overfører filen! Det burde være alt du trenger å gjøre for nå.

3. Bygg din Alexa Skill

Dette trinnet virker mye vanskeligere enn det egentlig er. Først må vi logge deg på Alexa Developer -konsollen. Deretter er det bare å trykke på skape ferdigheter. Når den ber om å velge en modell for dine ferdigheter, er det bare å trykke på tilpasset. Når den ber om å velge en metode, trykker du på din egen. Du kan kalle det hva du vil. Ingen mal er nødvendig, så velg start fra bunnen av. Etter at du har opprettet ferdigheten din, bør du komme til Ferdighetsbygger -skjermen med en sjekkliste til høyre. Herfra kan vi begynne å bygge vår ferdighet. Først på sjekklisten er påkallingsnavnet. Dette er hva du vil fortelle Alexa å påkalle din ferdighet. For meg satte jeg bare mitt påkallingsnavn som drone. Nå kan vi gå til våre hensikter, ytringer og spor. Her kan du lage kommandoer for dronen, for eksempel å gå opp 1 meter eller gå til høyre eller ned. Min fungerer egentlig bare med en meter for nå. Du kan klikke på JSON Editor nederst i panelet til venstre. Du kan deretter lime inn følgende kode i den.

Etter at du har limt inn koden i JSON Editor, kan du klikke på det tredje trinnet i sjekklisten, og den vil bygge din interaksjonsmodell for deg. Med dette trinnet er du ferdig for nå. Du kan la endepunktssporet stå tomt for nå!

Trinn 4: Bygg din Lambda -funksjon

Nå er dette trinnet du må finne ut av selv. Jeg vil fortelle deg hvordan du kobler den til Alexa Skill, men du må kode den selv. Så, gå først til AWS -administrasjonskonsollen. Gå deretter til Lambda. Du kan deretter opprette en funksjon som navngir den hva du vil. Sørg for å skrive det fra bunnen av og gjør kjøretiden til hvilket programmeringsspråk du vil. Jeg brukte Node.js. For å legge til Alexa Skill, legg til en trigger og velg Alexa Skills Kit (ASK). Kopier Lambda ARN og gå tilbake til Alexa Skill. Gå nå til endepunktet. Du kan lime inn ARN, lagre og bygge en ny modell. Ta deretter Alexa Skill ID, og lim den inn i trigger -delen der den ber deg om Lambda. Deretter ruller du ned på Lambda og finner de grunnleggende innstillingene og gjør tidsavbruddet til 10 sekunder. Nå er det opp til deg å finne ut koden. For tips, kan du nettstedene nedenfor.

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

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

og du kan bruke filen jeg har vedlagt, men den er ufullstendig og vil ikke fungere.

/ *** Kontroller APM / Pixhawk quadcopter med stemmen din, ved hjelp av Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // denne enheten er egentlig kontrolleren 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 klient = null; // Rut den innkommende forespørselen basert på type (LaunchRequest, IntentRequest, etc.) JSON -kroppen til forespørselen er angitt i hendelsesparameteren. exports.handler = funksjon (hendelse, kontekst) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = kontekst; if (event.session.application.applicationId! == app_id) {ctx.fail ("Ugyldig applikasjons -ID"); } klient = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Connected to AWS IoT"); // tilbakeringing ();});

if (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } annet if (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } annet if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx.succeed (); }} catch (e) {console.log ("UNNTAK i handler:" + e); ctx.fail ("Unntak:" + e); }}; /*** Ringes når økten starter. */ function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Ringes når brukeren lanserer ferdigheten uten å spesifisere hva de vil ha. */ function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Send til ferdighetens lansering. getWelcomeResponse (tilbakeringing); } /*** Ringes når brukeren angir en intensjon for denne ferdigheten. */function onIntent (intentionRequest, session) {//, callback) {console.log ("onIntent requestId =" + intentionRequest.requestId + ", sessionId =" + session.sessionId); var intention = intentionRequest.intent, intentionName = intentionRequest.intent.name; console.log ("REQUEST to string =" + JSON.stringify (intentionRequest)); var tilbakeringing = null; // Send til ferdighetens intensjonsbehandlere hvis ("GoIntent" === intentionName) {doGoIntent (intention, økt); } annet hvis ("CommandIntent" === intentionName) {doCommandIntent (intention, session); } annet hvis ("TurnIntent" === intentionName) {doTurnIntent (intention, økt); } annet hvis ("HelpIntent" === intentionName) {getWelcomeResponse (); } else {throw "Ugyldig hensikt"; }} /*** Ringes når brukeren avslutter økten. * Blir ikke kalt når ferdigheten returnerer shouldEndSession = true. */ function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Legg til oppryddingslogikk her} // --------------- Funksjoner som styrer ferdighetens oppførsel -------------------- --- function getWelcomeResponse () {// Hvis vi ønsket å initialisere økten for å ha noen attributter, kunne vi legge dem til her. var sessionAttributes = {}; var cardTitle = "Velkommen"; var speechOutput = "Velkommen til DRONE CONTROL."; // TODO: er drone online eller offline? Hvis den er online, er den VÆPPET? var repromptText = "Drone klar for kommando."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } /*** håndterer GO -intensjoner. */ function doGoIntent (intensjon, økt, tilbakeringing) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; var direction = intention.slots. Direction.value; var distance = intention.slots. Distance.value; var unit = intention.slots. Unit.value; var validDirections = ["fremover", "fremover", "bakover", "bak", "høyre", "venstre", "opp", "ned", "rett", "fremover", "rett frem"]; var validUnits = ["fot", "fot", "meter", "meter", "gård", "meter"]; repromptText = "Fortell meg hvor langt du skal gå og i hvilken retning."; var fail = false; // validere innganger hvis (! (parseInt (distance)> = 1)) {speechOutput = "Jeg kunne ikke forstå avstanden du vil at jeg skal reise."; mislykkes = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Jeg kunne ikke forstå retningen du vil at jeg skal reise."; mislykkes = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Jeg kunne ikke forstå enheten du vil at jeg skal reise til."; mislykkes = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Drone going" + direction + "" + distance + "" + unit; speechOutput = "Går" + retning + "" + avstand + "" + enhet; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doCommandIntent (intensjon, økt, tilbakeringing) {

// var cardTitle = "Drone COMMAND …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Fortell meg hva som er kommandoen for dronen."; var task = intention.slots. Task.value; var validTasks = ["lansering", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "abort"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Jeg kunne ikke forstå kommandoen."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Utfører Drone -kommando" + oppgave; speechOutput = "Utfører kommando" + oppgave; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doTurnIntent (intensjon, økt, tilbakeringing) {

// var cardTitle = "Drone Turn …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Fortell meg hvordan du vil snu dronen."; var direction = intention.slots. Direction.value; var validDirections = ["høyre", "venstre", "rundt"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Jeg kunne ikke forstå retningen på svingen."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } annet {var cardTitle = "Drone snu" + retning; speechOutput = "Snu" + retning; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

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

{var strIntent = JSON.stringify (intention); 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 - tror det er gjort, vellykket."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("feil", (funksjon (feil, gitt) {console.log ("MQTT KUNDEFEIL !!" + feil);})); }

// --------------- Hjelpere som bygger alle svarene -----------------------

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}}

Anbefalt: