Indholdsfortegnelse:

Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trin (med billeder)
Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trin (med billeder)

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

Video: Alexa Voice Controlled Raspberry Pi Drone Med IoT og AWS: 6 trin (med billeder)
Video: CS50 2013 - Week 10, continued 2024, Juli
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

Hej! Mit navn er Armaan. Jeg er en 13-årig dreng fra Massachusetts. Denne vejledning viser, som du kan udlede af titlen, hvordan man bygger en Raspberry Pi Drone. Denne prototype demonstrerer, hvordan droner udvikler sig, og også hvor stor en rolle de kan spille i fremtiden. Jeg kan helt sikkert se mig selv vågne om 10 år og bede en drone om at få morgenmad til mig. Dronen bruger Amazon Alexa, Amazon Web Services, IoT (Internet of Things) og vigtigst af alt en Raspberry Pi til at køre. Det er meningen at demonstrere og informere om droner, og hvordan de forbedres hver dag. Forhåbentlig får du succes og lærer om droner i processen. Held og lykke og tak fordi du læste med. -Armaansk

Forbrugsvarer

For at bygge prototypen er der forskellige hardware- og softwarebehov. Jeg brugte en online -tutorial fra The Drone Dojo til at bygge dronen og integrere de angivne teknologier. For dronen kan du finde delelisten lige her:

Liste over droner

Softwarekrav:

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

Trin 1: Indsamling og forståelse af dele

Indsamling og forståelse af dele
Indsamling og forståelse af dele

Hver del, der er nævnt i forsyningslisten, er nødvendig, og det er en klar forståelse af hver del. Du kan finde delene online, og når de er samlet, skal du fortsætte med at læse. En afspilningsliste af The Drone Dojo for en fuld forståelse af delene findes her. En 4-minutters forklaring på min youtube-kanal findes her. Når det kommer til droner, er de eneste dele, på trods af hvad de fleste tror, ikke kun motorer og propeller. Nedenfor er de grundlæggende formål med hver del.

Raspberry Pi med Emlid Navio2

Denne del er stort set en central processor og hovedpunktet i dronen. Raspberry Pi fungerer som CPU'en på en computer, der sender kommandoer til Navio2 for at udføre via PWM (Pulse Width Modulation Signals) til andre dele af dronen

2. ESC'erne (elektroniske hastighedsregulatorer)

Disse gule dele findes under rammen. De er 4 tilsluttet Navio, en for hver motor. Når de modtager PWM -signaler, roterer de motorerne og begynder at flyve.

3. Motorer

Motorer behøver ikke for meget forklaring, fordi du sikkert kender dem. De roterer og drejer propellerne for at skabe tryk.

4. Propeller

Propeller skaber fremdrift for dronen til at flyve. De drejer i samme retning som motorerne for at løfte køretøjet.

5. Batteri- og strømmodulet

LiPo -batteriet driver hele dronen gennem rammen ved hjælp af strømmodulet. Det giver cirka 15-20 minutters flyvetid og fungerer som en strømkilde.

6. GPS'en

GPS'en kommunikerer med satellitter for at bestemme dronens position. Det bestemmer højde, breddegrad og længdegrad. Det kan bruges til geofencing, waypoints og også flytte til bestemte positioner eller retninger.

7. Telemetri -modulet

Telemetri -modulet forbinder vores drone til en jordkontrolstation, i vores tilfælde Mission Planner, der skal overvåges.

8. RC -controlleren og modulet sammen med PPM Encoder

RC -controlleren bruger radio til at overføre signaler og kommandoer til RC -modulet til at styre dronen manuelt. PPM Encoder oversætter disse signaler, så Navio + RPI kan behandle og udføre.

9. Rammen

Denne røde og hvide ramme fungerer som en base eller platform for de andre dele, der skal placeres. Rammen er aerodynamisk og let, derfor perfekt til vores drone -konstruktion.

Nu med viden om alle dele, kan vi endelig bygge dronen! Videre til næste trin!

Trin 2: Montering af dronen

Montering af dronen
Montering af dronen

Dette trin er nok det sværeste med hensyn til fysisk indsats. Jeg anbefaler at have en anden person til hjælp, eller prøv at bruge den hjælpende hånd i delelisten. Processen er for lang til at demonstrere her, så jeg vil give et andet link, jeg brugte af The Drone Dojo.

Bygger en Raspberry Pi Drone

Igen, da jeg ikke vil gå for meget i detaljer, vil jeg bare fremhæve det grundlæggende i hvert trin.

1. Organiser dine forsyninger - Saml vores materialer, og sørg for, at de er let tilgængelige

2. Planlæg din bygning - Organiser dine dele på rammen for at lave en plan over, hvad du vil bygge

3. Lodning Arbejde - Dette er det arbejde, der er lidt svært at gøre alene. Du skal lodde de gyldne kuglestik, der følger med motorerne, til ESC'erne. Dernæst skal du tage den nederste del af rammen og lodde ESC'erne til bundrammen eller Power Distribution Board. Batterimodulet vil også blive loddet videre til Power Distribution Board

4. Opsætning af rammen - Du skal derefter skrue den øverste del af rammen sammen med armene. Du kan derefter vedhæfte Raspberry Pi ovenpå, som du vil. (Jeg brugte tape). Derefter kan du fastgøre ESC'erne til armene med lynlåse. Nu er vi næsten færdige.

5. Binding af RC -controlleren til modtager - Prøv at følge instruktionerne i afspilningslisten ovenfor for at binde RC -controlleren ved hjælp af en ESC.

6. Afslutning af dele på ramme - Gaffatape eller rem på telemetri -modulet på rammen. Duct tape PPM Encoder også til en arm. Nu kan du koble ESC'erne og PPM -encoderen til Navio.

7. GPS -mount + batteri - Saml GPS -mount med de forskellige skruer og stykker. Ved hjælp af lynlåse sættes GPS'en til rammen. Jeg brugte ikke nødvendigvis GPS -mount på grund af dets skrøbelighed, men det er op til dig. Dernæst kan du indsætte batteriet mellem Power Dist. Bestyrelse. Jeg spændte og tapede også strømmodulet til rammen. Nu er din hardware stort set konfigureret. Nu til den del, vi har ventet på!

8. Installation af propellerne !!! - Du kan stramme propellerne ved hjælp af diagrammet, der er nævnt i afspilningslisten. Derefter kan du tilslutte ESC'erne til motorerne, og vi er endelig færdige med at bygge dronen.

Software er den næste, så videre!

Trin 3: Konfiguration af Raspberry Pi og GCS (Mission Planner)

Konfiguration af Raspberry Pi og GCS (Mission Planner)
Konfiguration af Raspberry Pi og GCS (Mission Planner)

Igen kan du finde mere detaljerede instruktioner i afspilningslisten fra det sidste trin. Du ved dog sikkert, hvordan du konfigurerer RasPi. Men denne gang gør vi det hovedløst. Brug Balena Etcher til at brænde operativsystemet fra Navio OS -webstedet til MicroSD -kortet. Mens den er tilsluttet din computer, skal du gå ind på wpa -supplereren ved hjælp af notesblok ++. Derefter skal du indtaste ssid og adgangskode for Raspberry Pi for at oprette forbindelse til din WiFi. Derefter skal du tilføje en fil kaldet SSH. Dette kan være via kommandolinjen eller en anden metode. Nu kan vi SSH. Du kan bruge kommandoprompt eller Putty. Jeg brugte kommandoprompt og skrev "ssh pi@navio" for at oprette forbindelse i mit tilfælde, eller du kan finde IP -adressen og ssh på den måde. Ved tilslutning skal du bruge denne video til at konfigurere og konfigurere Navio. For at konfigurere telemetrien skal du først foretage en redigering på Raspberry Pi. Følg dette for at foretage redigeringen, og prøv at oprette forbindelse til Mission Planner. Hvis telemetri ikke virker, kan du fortryde redigeringen og oprette forbindelse via en UDB -forbindelse ved at indtaste din GCS (Ground Control Station, f.eks. Bærbar) IP. Når du er forbundet til Mission Planner, kan du bruge installationsguiden til at kalibrere alle dele af dronen. Hvis du har brug for hjælp, kan du se afspilningslisten igen. Normalt er der næsten altid en fejl, når du konfigurerer. Fejlfinding er en af de største dele af dette projekt. Jeg kan ikke rigtig hjælpe dig der, da jeg ikke er opmærksom på dine fejl, men de fleste fejl kan rettes med hjælp fra internettet. Når alt er klar, er dronen klar til at flyve! Du kan konfigurere din RC -controller og flyvetilstande på Mission Planner. Prøv at holde venstre pind helt nede til højre i fem sekunder for at bevæbne dronen. Jeg anbefaler ikke at flyve uden at se på en tutorial, fordi dronen er meget skrøbelig og let at bryde. For mig, første gang jeg fløj det, brød jeg GPS -mount og nogle propeller. Hvis du ikke har brug for stemmestyring, kan du stoppe her. For at lære om AWS og programmering af dronen fortsæt!

Trin 4: Programmering af dronen til at flyve med Python

Programmering af dronen til at flyve med Python
Programmering af dronen til at flyve med Python

Inden vi går ind på AWS, bør vi først forstå, hvordan man programmerer dronen til at flyve. Efter den første opsætning burde integrering af stemmestyring ikke være for svært. Den første ting, vi kan prøve at få en fornemmelse af, er at lave et simpelt start- og landprogram. Efter at have konfigureret Raspberry Pi, kan vi SSH til den igen. Du kan se på afspilningslisten igen eller følge min instruktion.

1. Lad os først downloade ArduPilot -kildekoden i et bibliotek på Raspberry Pi

mkdir src

Hent derefter filerne fra GitHub ved hjælp af git -klon

git klon -b Copter -3.6.11

Lad os nu navigere til /src /ardupilot

cd src

cd ardupilot

Lad os nu initialisere kildefilerne

git submodul opdatering --init -rekursiv

2. Dernæst skal vi kompilere firmwaren på Raspberry Pi

Sørg for at navigere til/src/ardupilot/med cd, før du udfører de næste trin

Derefter for at konfigurere specifikt til Navio vha

./waf konfigurer --board = navio2

Derefter kan du kompilere med

./waf -målbakke/arducopter

3. Vi kan nu installere kildekoden til Navio

Lad os først navigere til den rigtige mappe.

cd/etc/systemd/system

Rediger derefter filen

sudo vi arducopter.service

Hvor der står ExecStart, skal du indsætte følgende i stedet for det, der allerede er der

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

Nu, for at sætte ardupilot -kildekoden i aktion, kan vi bruge

sudo systemctl daemon-reload

Så kan vi genstarte med

sudo systemctl genstart arducopter

Med det sidste trin er vi endelig færdige med at konfigurere ArduPilot på vores drone

4. Installation af DroneKit

DroneKit er den software, vi vil bruge til at programmere dronen til at flyve. For at forstå noget af koden kan du finde dokumentationen her. Først skal vi installere pakken på vores drone, før vi skriver et script.

Vi kan installere python -pakken med

pip installer dronekit == 2.9.1

Dette er måske eller måske ikke den nyeste version, men det er den, jeg brugte, så jeg kan hjælpe med fejlfinding.

For at kontrollere, om det er installeret, kan vi lave en

pip fryse | grep dronekit

Nu er vi endelig klar til at lave vores første python -script

5. start_og_land.py

ADVARSEL! Jeg foreslår at etablere en grundlæggende forståelse af python, så du kan lære og forstå koden. Hvis du vil skrive programmet selv, skal du følge denne video.

## Lad os først oprette et bibliotek for at gemme denne kode

cd dk ## Hvis du vil gøre det selv, skal du bruge vi takeoff_and_land.py ## til at oprette et program

Ellers kan du tage et kig eller bruge den vedhæftede fil og bruge en filoverførselsprotokol. Vi kan prøve dette program bagefter. Først for at præcisere, at det er en python -fil, vi skal bruge

chmod +x start_and_land.py

Prøv derefter at bruge følgende kode til at køre

python start_and_land.py -forbind 127.0.0.1:14550

Første gang virkede det heller ikke for mig. Hvis der er en timeout for et link, skal du ikke bekymre dig, der er noget, du kan gøre. Åbn en anden prompt og ssh. Du kan prøve at installere noget kaldet mavproxy og prøve at køre det. Derefter kan du køre begge samtidigt. Dette skal hjælpe med at forbinde dronen. Når det er gjort, har jeg en udfordring til dig. Prøv at finde ud af, hvad det andet program (set_velocity_body.py) gør, og hvordan du får det til at fungere. Hvis du gør det, godt arbejde.

6. Fremad!

Vi kan nu bruge denne viden til at gøre vores drone stemmestyret. Alexa drone control bruger mange af disse funktioner og mere. Held og lykke og fremover!

Trin 5: Brug af Amazon Alexa og Amazon Web Services til at integrere stemmestyring

Brug af Amazon Alexa og Amazon Web Services til at integrere stemmestyring
Brug af Amazon Alexa og Amazon Web Services til at integrere stemmestyring
Brug af Amazon Alexa og Amazon Web Services til at integrere stemmestyring
Brug af Amazon Alexa og Amazon Web Services til at integrere stemmestyring

Dette trin er et af de mindre dokumenterede. Det betyder, at det vil være det sværeste at foretage fejlfinding. Bare det at få det til at fungere tog mig cirka en måned, måske mere. Det vigtigste her er at være tålmodig. Denne funktion kan, hvis den implementeres i det virkelige liv, ændre liv. Du kan bare fortælle Alexa at få dine dagligvarer til dig i stedet for at gå selv. Forestil dig det! Så lad os komme ind i det uden videre!

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

For at bruge IoT (Internet of Things) har vi brug for en ting. Så vi skal logge ind på AWS -konsollen for først at bruge AWS IoT. Gå derefter til IoT Core. Når du er der, skal du klikke på Administrer og derefter oprette en ting. Efter at have tilføjet et navn, skal vi have et certifikat til at forbinde. Jeg vil anbefale at klikke på One-click certificering. Efter at have set certifikatskærmen, skal du sørge for at downloade hver eneste nøgle inklusive root -CA. Derefter kan du gå og afslutte oprettelsen af tingen. Dernæst skal vi oprette en politik. Gå tilbage til IoT Core. Klik derefter på sikker og klik på politikker. Tryk derefter på Opret politik. Du kan derefter oprette et navn og tilføje ressourcer. Under handling skal du skrive iot * og skrive * under ressource og trykke på tillad effekt. Gå derefter tilbage til din ting og gå til dit certifikat. Når du er her, skal du klikke på politikker. Du kan derefter vedhæfte din politik for sagen, og det er klar!

2. Opsætning af kode på Raspberry Pi og interaktion med IoT

Til denne del skal du bruge en SFTP -klient (jeg brugte WinSCP) til filoverførsel. Ved forbindelse til vores Raspberry Pi skal vi have certifikatnøglerne ved hånden. Du skal overføre nøglefilerne til Raspberry Pi. Du bør også installere AWSIoTPythonSDK pip på Raspberry Pi. Gå derefter ind i dk -biblioteket på Raspberry Pi. Du bruger Alexa Drone Control -filen, jeg gav til kommunikation med IoT. For at bruge denne fil brugte jeg et Shell Script til opstart. Jeg viser koden herunder, da jeg af en eller anden grund ikke kan uploade filen. Hvis programmet ikke henter meddelelser fra AWS IoT under test, skal du ikke bekymre dig! Dette kan være min skyld, da Alexa Drone Control File muligvis ikke passer til din ting. Så for at løse det skal du gå tilbage til AWS IoT og trykke på Lær i venstre panel. Følg instruktionerne, og du skal muligvis genstarte. Det er jeg ked af. Når din IoT begynder at arbejde med programmet på RasPi, kan du integrere dronekit -koden fra Alexa Drone Control -filen, jeg gav. Brug derefter det Shell Script, jeg gav med dine certifikater og Rest API -slutpunkt fra IoT.

# stop script på fejlsæt -e # Kontroller om der findes root CA -fil, download hvis ikke hvis [! -f./root-CA.crt]; derefter printf "\ nDownload AWS IoT Root CA-certifikat fra AWS … / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # installer AWS Device SDK til Python, hvis det ikke allerede er installeret hvis [! -d./aws-iot-device-sdk-python]; derefter printf "\ nInstallering af AWS SDK … / n" git-klon https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py installer popd fi

# kør pub/sub -prøve -app ved hjælp af certifikater downloadet i pakken

printf "\ nKører pub/sub -prøveprogram … / 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 virker ikke for jer alle, da navnene er forskellige. I stedet for de nøgler, jeg brugte, erstattes med dine nøglenavne, når du overfører filen. Sørg for at afslutte dk, før du overfører filen! Det burde være alt hvad du skal gøre for nu.

3. Opbygning af din Alexa Skill

Dette trin virker meget sværere, end det egentlig er. Først skal vi logge ind på Alexa Developer -konsollen. Derefter skal du bare trykke på create skill. Når den beder om at vælge en model til dine evner, skal du bare trykke på brugerdefineret. Når den beder om at vælge en metode, skal du trykke på provision din egen. Du kan navngive det, hvad du vil. Der kræves ingen skabelon, så vælg start forfra. Dernæst, efter at du har oprettet din færdighed, skal du ankomme til Skill builder -skærmen med en tjekliste til højre. Herfra kan vi begynde at opbygge vores evner. Først på tjeklisten er påkaldelsesnavnet. Dette er, hvad du vil fortælle Alexa at påberåbe dig. For mig satte jeg bare mit påkaldelsesnavn som drone. Nu kan vi gå til vores hensigter, ytringer og slots. Her kan du lave kommandoer til dronen, f.eks. Gå op 1 meter eller gå til højre eller ned. Min fungerer kun rigtig med en meter for nu. Du kan klikke på JSON Editor i bunden af det venstre panel. Du kan derefter indsætte følgende kode i den.

Når du har indsat koden i JSON Editor, kan du klikke på det tredje trin i tjeklisten, og den vil bygge din interaktionsmodel for dig. Med dette trin er du færdig for nu. Du kan efterlade slutpunktspladsen tom for nu!

Trin 4: Opbygning af din Lambda -funktion

Nu er dette trin et trin, som du bliver nødt til at finde ud af selv. Jeg vil fortælle dig, hvordan du slutter det til Alexa Skill, men du skal selv kode det. Så gå først til AWS -administrationskonsol. Gå derefter til Lambda. Du kan derefter oprette en funktion, der navngiver den, hvad du vil. Sørg for at oprette det fra bunden og lav runtime, uanset hvilket programmeringssprog du ønsker. Jeg brugte Node.js. For at tilføje Alexa Skill skal du tilføje en trigger og vælge Alexa Skills Kit (ASK). Kopiér din Lambda ARN og gå tilbage til Alexa Skill. Gå nu til slutpunktet. Du kan indsætte din ARN, gemme og bygge en ny model. Tag derefter Alexa Skill ID, og indsæt det i trigger -sektionen, hvor det beder dig om Lambda. Rul derefter ned på Lambda og find de grundlæggende indstillinger og lav timeout til 10 sekunder. Nu er det op til dig at finde ud af koden. For tip kan du nedenstående websteder.

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

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

og du kan bruge den fil, jeg vedhæftede, men den er ufuldstændig og fungerer ikke.

/ *** Styr din APM / Pixhawk quadcopter med din stemme ved hjælp af Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // denne enhed er virkelig controlleren var mqtt_config = {"keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, // + "-Lambda-" + (ny Date (). getTime ()), "region": "us-east-1", "debug": true}; var ctx = null; var klient = null; // Rut den indkommende anmodning baseret på type (LaunchRequest, IntentRequest osv.) Anmodningens JSON -brødtekst findes i hændelsesparameteren. exports.handler = funktion (hændelse, kontekst) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = kontekst; if (event.session.application.applicationId! == app_id) {ctx.fail ("Ugyldigt program -id"); } klient = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Connected to AWS IoT"); // callback ();});

hvis (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } ellers if (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } ellers if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx.succeed (); }} catch (e) {console.log ("UNDTAGELSE i handler:" + e); ctx.fail ("Undtagelse:" + e); }}; /*** Opkaldt, når sessionen starter. */ function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Opkaldes, når brugeren starter færdigheden uden at angive, hvad de vil have. */ function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Send til din færdigheds lancering. getWelcomeResponse (tilbagekald); } /*** Opkaldes, når brugeren angiver en hensigt med denne færdighed. */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 tilbagekald = null; // Send til din færdigheds intentionhandlers hvis ("GoIntent" === intentionName) {doGoIntent (intention, session); } ellers hvis ("CommandIntent" === intentionName) {doCommandIntent (intention, session); } ellers hvis ("TurnIntent" === intentionName) {doTurnIntent (intention, session); } ellers hvis ("HelpIntent" === intentionName) {getWelcomeResponse (); } else {throw "Ugyldig hensigt"; }} /*** Opkaldes, når brugeren afslutter sessionen. * Opkaldes ikke, når færdigheden vender tilbage shouldEndSession = true. */ function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Tilføj oprydningslogik her} // --------------- Funktioner, der styrer færdighedens adfærd -------------------- --- funktion getWelcomeResponse () {// Hvis vi ville initialisere sessionen for at have nogle attributter, kunne vi tilføje dem her. var sessionAttributes = {}; var cardTitle = "Velkommen"; var speechOutput = "Velkommen til DRONE CONTROL."; // TODO: er drone online eller offline? Hvis det er online, er det ARMED? var repromptText = "Drone klar til kommando."; var shouldEndSession = falsk; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } /*** håndterer GO -hensigt. */ function doGoIntent (intention, session, callback) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = falsk; var speechOutput = ""; var direction = intention.slots. Direction.value; var distance = intention.slots. Distance.value; var unit = intention.slots. Unit.value; var validDirections = ["frem", "frem", "baglæns", "tilbage", "højre", "venstre", "op", "ned", "lige", "fremad", "lige frem"]; var validUnits = ["fod", "fod", "meter", "meter", "gård", "meter"]; repromptText = "Fortæl mig, hvor langt jeg skal gå og i hvilken retning."; var fail = false; // valider input, hvis (! (parseInt (distance)> = 1)) {speechOutput = "Jeg kunne ikke forstå den afstand, du vil have mig til at rejse."; fejl = sandt; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Jeg kunne ikke forstå den retning, du vil have mig til at rejse."; fejl = sandt; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } hvis (validUnits.indexOf (enhed) == -1) {speechOutput = "Jeg kunne ikke forstå den enhed, du vil have mig til at rejse."; fejl = sandt; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } hvis (! fail) {var cardTitle = "Drone kører" + retning + "" + distance + "" + enhed; speechOutput = "Går" + retning + "" + distance + "" + enhed; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funktion doCommandIntent (hensigt, session, tilbagekald) {

// var cardTitle = "Drone KOMMANDO …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = falsk; var speechOutput = ""; repromptText = "Fortæl mig, hvad kommandoen til dronen er."; var task = intention.slots. Task.value; var validTasks = ["launch", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "abort"]; hvis (validTasks.indexOf (opgave) == -1) {speechOutput = "Jeg kunne ikke forstå kommandoen."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Udfører Drone -kommando" + opgave; speechOutput = "Udfører kommando" + opgave; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funktion doTurnIntent (hensigt, session, tilbagekald) {

// var cardTitle = "Drone Turn …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = falsk; var speechOutput = ""; repromptText = "Fortæl mig, hvordan du vil vende dronen."; var direction = intention.slots. Direction.value; var validDirections = ["højre", "venstre", "omkring"]; hvis (validDirections.indexOf (retning) == -1) {speechOutput = "Jeg kunne ikke forstå svingets retning."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } ellers {var cardTitle = "Dronen drejer" + retning; speechOutput = "Drejning" + retning; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funktion 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, med succes."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("fejl", (funktion (fejl, tildelt) {console.log ("MQTT KUNDEFEJL !!" + fejl);})); }

// --------------- Hjælpere, der 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}} funktion buildResponse (sessionAttributes, speechletResponse) {return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse}}

Anbefalede: