Innehållsförteckning:

Alexa röststyrd Raspberry Pi Drone med IoT och AWS: 6 steg (med bilder)
Alexa röststyrd Raspberry Pi Drone med IoT och AWS: 6 steg (med bilder)

Video: Alexa röststyrd Raspberry Pi Drone med IoT och AWS: 6 steg (med bilder)

Video: Alexa röststyrd Raspberry Pi Drone med IoT och AWS: 6 steg (med bilder)
Video: 4 умопомрачительных проекта Mosfet, которые могут создать даже новички! 2024, Juli
Anonim
Image
Image
Alexa Voice Controlled Raspberry Pi Drone Med IoT och AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT och AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT och AWS
Alexa Voice Controlled Raspberry Pi Drone Med IoT och AWS

Hej! Jag heter Armaan. Jag är en 13-årig pojke från Massachusetts. Denna handledning visar, som du kan utgå från titeln, hur man bygger en Raspberry Pi Drone. Denna prototyp visar hur drönare utvecklas och även hur stor roll de kan spela i framtiden. Jag kan definitivt se mig själv vakna om 10 år och be en drönare att få frukost åt mig. Drönaren använder Amazon Alexa, Amazon Web Services, IoT (Things of Things), och viktigast av allt en Raspberry Pi för att köra. Det är tänkt att demonstrera och informera om drönare och hur de förbättras varje dag. Förhoppningsvis är du framgångsrik och lär dig om drönare i processen. Lycka till och tack för att du läste. -Armaan

Tillbehör

För att bygga prototypen finns det olika hårdvaru- och programvarubehov. Jag använde en online -handledning av The Drone Dojo för att bygga drönaren och integrerade den listade tekniken. För drönaren hittar du dellistan här:

Drone delar lista

Programvarukrav:

  • Amazon Web Services
  • En bärbar dator
  • Mission Planer Software
  • Balena Etcher
  • MicroSD -kort med Raspbian -fil finns här
  • Amazon Alexa, fysiskt eller virtuellt

Steg 1: Samla och förstå delar

Samla och förstå delar
Samla och förstå delar

Varje del som nämns i utbudslistan är nödvändig, och det är en tydlig förståelse av varje del. Du kan hitta delarna online och när du har samlat in, fortsätt läsa. En spellista av The Drone Dojo för en fullständig förståelse av delarna hittar du här. En 4-minuters förklaring på min youtube-kanal hittar du här. När det gäller drönare är de enda delarna, trots vad de flesta tror, inte bara motorer och propellrar. Nedan följer de grundläggande syftena med varje del.

Raspberry Pi med Emlid Navio2

Denna del är i stort sett en central processor och huvudpunkten för drönaren. Raspberry Pi fungerar som CPU: n på en dator som skickar kommandon till Navio2 för att utföra via PWM (Pulse Width Modulation Signals) till andra delar av drönaren

2. ESC: erna (elektroniska hastighetsregulatorer)

Dessa gula delar finns under ramen. De är 4 anslutna till Navio, en för varje motor. När de får PWM -signaler roterar de motorerna och börjar flyga.

3. Motorer

Motorer behöver inte för mycket förklaring eftersom du förmodligen är bekant med dem. De roterar och snurrar propellerna för att skapa dragkraft.

4. Propellrar

Propellrar skapar dragkraft för drönaren att flyga. De snurrar i samma riktning som motorerna för att lyfta fordonet.

5. Batteri- och strömmodul

LiPo -batteriet driver hela drönaren genom ramen med hjälp av strömmodulen. Det ger cirka 15-20 minuters flygtid och fungerar som en strömkälla.

6. GPS: en

GPS: n kommunicerar med satelliter för att bestämma drönarens position. Den bestämmer höjd, latitud och longitud. Den kan användas för Geofencing, waypoints och även flytta till vissa positioner eller riktningar.

7. Telemetri -modulen

Telemetri -modulen ansluter vår drönare till en markkontrollstation, i vårt fall Mission Planner, som ska övervakas.

8. RC -styrenheten och modulen tillsammans med PPM -kodare

RC -styrenheten använder radio för att överföra signaler och kommandon till RC -modulen för att styra drönaren manuellt. PPM -kodaren översätter dessa signaler för Navio + RPI att bearbeta och köra.

9. Ramen

Denna röda och vita ram fungerar som en bas eller plattform för de andra delarna som ska placeras. Ramen är aerodynamisk och lätt, därför perfekt för vår drönare.

Nu med kunskap om varje del kan vi äntligen bygga drönaren! Till nästa steg!

Steg 2: Montering av drönaren

Montering av drönaren
Montering av drönaren

Detta steg är förmodligen det svåraste när det gäller fysisk ansträngning. Jag rekommenderar att du har en annan person som hjälp eller försöker använda den hjälpande handen i listan med delar. Processen är för lång för att demonstrera här, så jag kommer att tillhandahålla en annan länk som jag använde av The Drone Dojo.

Bygga en Raspberry Pi Drone

Återigen, eftersom jag inte kommer att gå in på för mycket detaljer, kommer jag bara att markera grunderna i varje steg.

1. Organisera dina tillbehör - Samla ihop vårt material och se till att det är lättillgängligt

2. Planera din byggnad - Organisera dina delar på ramen för att göra en ritning av vad du ska bygga

3. Lödningsarbete - Detta är det arbete som är lite svårt att göra ensam. Du måste löda de gyllene kulanslutningarna som följer med motorerna till ESC: erna. Därefter måste du ta den nedre delen av ramen och löda ESC: erna till den nedre ramen eller Power Distribution Board. Batterimodulen löds också på strömfördelningskortet

4. Installera ramen - Du måste sedan skruva fast den övre delen av ramen tillsammans med armarna. Du kan sedan fästa Raspberry Pi ovanpå hur du vill. (Jag använde tejp). Sedan kan du fästa ESC: erna på armarna med dragkedjor. Nu är vi nästan klara.

5. Binda RC -styrenheten till mottagaren - Försök att följa instruktionerna i spellistan ovan för att binda RC -kontrollen med hjälp av en ESC.

6. Avsluta delar på ramen - Gaffeltejp eller rem på telemetri -modulen på ramen. Dufttejp PPM -kodaren till en arm också. Nu kan du koppla ESC: erna och PPM -kodaren till Navio.

7. GPS -fäste + batteri - Montera GPS -fästet med de olika skruvarna och bitarna. Fäst GPS-enheten på ramen med hjälp av dragkedjor. Jag använde inte nödvändigtvis GPS -fästet på grund av dess bräcklighet, men det är upp till dig. Därefter kan du sätta in batteriet mellan Power Dist. Styrelse. Jag spände fast och tejpade fast kraftmodulen på ramen också. Nu är din hårdvara i stort sett konfigurerad. Nu till den del vi väntar på!

8. Installera propellrarna !!! - Du kan dra åt propellerna med hjälp av diagrammet som nämns i spellistan. Sedan kan du ansluta ESC: erna till motorerna och vi har äntligen byggt drönaren.

Programvaran är nästa, så vidare!

Steg 3: Konfigurera Raspberry Pi och GCS (Mission Planner)

Konfigurera Raspberry Pi och GCS (Mission Planner)
Konfigurera Raspberry Pi och GCS (Mission Planner)

Återigen kan du hitta mer detaljerade instruktioner i spellistan från det sista steget. Men du förmodligen vet hur du konfigurerar RasPi. Men den här gången gör vi det utan huvud. Använd Balena Etcher för att bränna operativsystemet från Navio OS -webbplatsen till MicroSD -kortet. Medan den är ansluten till din dator, gå in på wpa -supplikanten med anteckningsblock ++. Efter det, ange ssid och lösenord för Raspberry Pi för att ansluta till din WiFi. Då måste du lägga till en fil som heter SSH. Detta kan vara via kommandoraden eller någon annan metod. Nu kan vi SSH. Du kan använda kommandotolken eller Putty. Jag använde kommandotolken och skrev "ssh pi@navio" för att ansluta i mitt fall, eller så kan du hitta IP -adressen och ssh på det sättet. När du ansluter, använd den här videon för att konfigurera och konfigurera Navio. För att konfigurera telemetri måste du först redigera Raspberry Pi. Följ detta för att redigera och försöka ansluta till Mission Planner. Om telemetri inte fungerar kan du ångra redigeringen och ansluta med en UDB -anslutning genom att ange din GCS (Ground Control Station, t.ex. bärbar dator) IP. När du väl är ansluten till Mission Planner kan du använda installationsguiden för att kalibrera alla delar av drönaren. Om du behöver hjälp hänvisar du till spellistan igen. Vanligtvis, när du ställer in, är det nästan alltid ett fel. Felsökning är en av de största delarna av detta projekt. Jag kan inte riktigt hjälpa dig där eftersom jag inte är medveten om dina fel, men de flesta fel kan åtgärdas med hjälp från internet. När allt är klart är drönaren redo att flyga! Du kan konfigurera din RC -kontroller och flyglägen på Mission Planner. Försök att hålla den vänstra pinnen längst ned till höger i fem sekunder för att beväpna drönaren. Jag rekommenderar inte att flyga utan att titta på en handledning eftersom drönaren är mycket ömtålig och lätt att bryta. För mig, första gången jag flög det, bröt jag GPS -fästet och några propellrar. Om du inte behöver röststyrning kan du stanna här. För att lära dig om AWS och programmera drönaren fortsätt!

Steg 4: Programmering av drönaren för att flyga med Python

Programmering av drönaren för att flyga med Python
Programmering av drönaren för att flyga med Python

Innan vi går in på AWS bör vi först förstå hur man programmerar drönaren för att flyga. Efter den första installationen borde integrering av röststyrning inte vara för svårt. Det första vi kan försöka få en känsla av är att göra ett enkelt start- och landprogram. Efter att ha installerat Raspberry Pi kan vi SSH in i den igen. Du kan titta på spellistan igen eller följa min instruktion.

1. Låt oss först ladda ner ArduPilot -källkoden i en katalog på Raspberry Pi

mkdir src

Hämta sedan filerna från GitHub med git -klon

git klon -b Copter -3.6.11

Låt oss nu navigera till /src /ardupilot

cd src

cd ardupilot

Låt oss nu initiera källfilerna

git -submoduluppdatering --init --recursive

2. Därefter måste vi kompilera firmware på Raspberry Pi

Se till att navigera till/src/ardupilot/med cd innan du gör nästa steg

Sedan för att konfigurera specifikt till Navio med

./waf configure --board = navio2

Sedan kan du kompilera med

./waf -målfack/arducopter

3. Vi kan nu installera källkoden till Navio

Låt oss först navigera till rätt katalog.

cd/etc/systemd/system

Redigera sedan filen

sudo vi arducopter.service

Där det står ExecStart sätter du in följande istället för det som redan finns

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

Nu kan vi använda för att sätta in källkoden för ardupilot

sudo systemctl daemon-reload

Då kan vi starta om med

sudo systemctl startar om arducopter

Med det sista steget har vi äntligen avslutat installationen av ArduPilot på vår drönare

4. Installera DroneKit

DroneKit är den programvara som vi kommer att använda för att programmera drönaren att flyga. För att förstå en del av koden kan du hitta dokumentationen här. Först måste vi installera paketet på vår drönare innan vi skriver ett manus.

Vi kan installera python -paketet med

pip installera dronekit == 2.9.1

Det här är kanske den nyaste versionen, men det är den jag använde så att jag kan hjälpa till med felsökning.

För att kontrollera om det är installerat kan vi göra en

pipfrysning | grep dronekit

Nu är vi äntligen redo att göra vårt första python -skript

5. start_and_land.py

VARNING! Jag föreslår att du etablerar en grundläggande förståelse för python, så att du kan lära dig och förstå koden. Om du vill skriva programmet själv följer du den här videon.

## Låt oss först skapa en katalog för att lagra denna kod

cd dk ## Om du vill göra det själv kan du använda vi takeoff_and_land.py ## för att skapa ett program

Annars kan du ta en titt eller använda den bifogade filen och använda ett filöverföringsprotokoll. Vi kan testa detta program efteråt. Först för att klargöra att det är en python -fil vi måste använda

chmod +x start_and_land.py

För att försöka använda följande kod för att köra

python takeoff_and_land.py --connect 127.0.0.1:14550

Första gången fungerade det inte heller för mig. Om det finns en timeout för länkar, oroa dig inte, det finns något du kan göra. Öppna en annan prompt och ssh. Du kan försöka installera något som heter mavproxy och prova att köra det. Efter det kan du köra båda samtidigt. Detta bör hjälpa till att ansluta drönaren. När det är klart har jag en utmaning för dig. Försök att ta reda på vad det andra programmet (set_velocity_body.py) gör och hur du får det att fungera. Om du gör det, bra jobbat.

6. Framåt!

Vi kan nu använda denna kunskap för att göra vår drönare röststyrd. Alexa drone control använder många av dessa funktioner och mer. Lycka till och framåt!

Steg 5: Använda Amazon Alexa och Amazon Web Services för att integrera röststyrning

Använda Amazon Alexa och Amazon Web Services för att integrera röststyrning
Använda Amazon Alexa och Amazon Web Services för att integrera röststyrning
Använda Amazon Alexa och Amazon Web Services för att integrera röststyrning
Använda Amazon Alexa och Amazon Web Services för att integrera röststyrning

Detta steg är ett av de mindre dokumenterade. Det betyder att det blir det svåraste att felsöka. Bara att få det att fungera tog mig ungefär en månad, kanske mer. Det viktigaste här är att ha tålamod. Denna funktion, om den implementeras i verkliga livet, kan förändra livet. Du kan bara säga att Alexa ska skaffa dina matvaror åt dig istället för att gå själv. Tänk dig att! Så utan vidare ska vi gå in på det!

1. Registrera Raspberry Pi som en sak på AWS IoT

För att kunna använda IoT (Internet of Things) behöver vi en sak. Så vi måste logga in på AWS -konsolen för att använda AWS IoT först. Gå sedan till IoT Core. Väl där ska du klicka på Hantera och sedan skapa en sak. Efter att ha lagt till ett namn, för att ansluta, behöver vi ett certifikat. Jag rekommenderar att du klickar på ett-klick-certifieringen. Efter att ha sett certifikatskärmen, se till att ladda ner varje nyckel inklusive rot -CA. Sedan kan du gå och avsluta skapandet av saken. Därefter måste vi skapa en policy. Gå tillbaka till IoT Core. Klicka sedan på säker och klicka på policyer. Tryck sedan på skapa policy. Du kan sedan skapa ett namn och lägga till resurser. Under åtgärd, skriv iot * och skriv * under resurs och tryck tillåt för effekt. Gå sedan tillbaka till din sak och gå till ditt certifikat. Väl här klickar du på policyn. Du kan sedan bifoga din policy för saken och det är klart!

2. Konfigurera kod på Raspberry Pi och interagera med IoT

För den här delen behöver du en SFTP -klient (jag använde WinSCP) för filöverföring. När vi ansluter till vår Raspberry Pi måste vi ha certifikatnycklarna till hands. Du måste överföra nyckelfilerna till Raspberry Pi. Du bör också pipinstallera AWSIoTPythonSDK på Raspberry Pi. Gå sedan in i dk -katalogen på Raspberry Pi. Du använder Alexa Drone Control -filen jag gav för att kommunicera med IoT. För att använda den här filen använde jag ett Shell Script för att starta. Jag kommer att visa koden nedan eftersom jag av någon anledning inte kan ladda upp filen. Oroa dig inte om programmet inte hämtar meddelanden från AWS IoT under testet! Detta kan vara mitt fel eftersom Alexa Drone Control File kanske inte passar din sak. Så, för att fixa det, gå tillbaka till AWS IoT och tryck på lär på den vänstra panelen. Följ instruktionerna och du kan behöva starta om. Förlåt för det. När din IoT börjar arbeta med programmet på RasPi kan du integrera dronekit -koden från Alexa Drone Control -filen jag gav. Använd sedan det Shell Script som jag gav med dina certifikat och Rest API Endpoint från IoT.

# stoppskript på feluppsättning -e # Kontrollera om det finns root -CA -fil, ladda ner om inte om [! -f./root-CA.crt]; skriv sedan ut "\ nHämta AWS IoT Root CA-certifikat från AWS … / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # installera AWS Device SDK för Python om det inte redan är installerat om [! -d./aws-iot-device-sdk-python]; skriv sedan ut "\ nInstallera AWS SDK … / n" git-klon https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py installera popd fi

# kör pub/sub -exempelapp med certifikat som laddats ner i paketet

printf "\ nRunning pub/sub sample application … / 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

Detta fungerar inte för er alla eftersom namnen är olika. Istället för att nycklarna som jag använde ersätter dina nyckelnamn när du överför filen. Se till att lämna dk innan du överför filen! Det borde vara allt du behöver göra för tillfället.

3. Bygga din Alexa Skill

Detta steg verkar mycket svårare än det verkligen är. Först måste vi logga in på Alexa Developer -konsolen. Sedan är det bara att slå skapa skicklighet. När den ber att välja en modell för din skicklighet, tryck bara på anpassad. När den ber om att välja en metod, tryck på provision din egen. Du kan namnge det vad du vill. Ingen mall krävs, så välj börja från början. Efter att du har skapat din skicklighet bör du komma fram till Skill builder -skärmen med en checklista till höger. Härifrån kan vi börja bygga vår skicklighet. Först på checklistan är anropsnamnet. Detta är vad du kommer att berätta för Alexa att åberopa din skicklighet. För mig lägger jag bara mitt anropsnamn som drönare. Nu kan vi gå till våra avsikter, uttalanden och slots. Här kan du göra kommandon för drönaren som att gå upp 1 meter eller gå åt höger eller ner. Min fungerar verkligen bara med en meter för tillfället. Du kan klicka på JSON Editor längst ned på den vänstra panelen. Du kan sedan klistra in följande kod i den.

När du har klistrat in koden i JSON Editor kan du klicka på det tredje steget i checklistan och den kommer att bygga din interaktionsmodell åt dig. Med det här steget är du klar för nu. Du kan lämna slutpunktsfältet tomt för tillfället!

Steg 4: Bygg din Lambda -funktion

Nu är detta steg ett steg som du måste ta reda på själv. Jag kommer att berätta hur du ansluter den till Alexa Skill, men du måste koda den själv. Så, gå först till AWS -hanteringskonsolen. Gå sedan till Lambda. Du kan sedan skapa en funktion som namnger den vad du vill. Se till att författa det från grunden och gör körtiden vilket programmeringsspråk du vill. Jag använde Node.js. För att lägga till Alexa Skill, lägg till en trigger och välj Alexa Skills Kit (ASK). Kopiera din Lambda ARN och gå tillbaka till Alexa Skill. Gå nu till slutpunkten. Du kan klistra in din ARN, spara och bygga en ny modell. Ta sedan Alexa Skill ID och klistra in det i triggersektionen där det frågar dig på Lambda. Bläddra sedan ner på Lambda och hitta de grundläggande inställningarna och gör timeout -tiden till 10 sekunder. Nu är det upp till dig att ta reda på koden. För tips kan du webbplatserna nedan.

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

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

och du kan använda filen jag bifogade, men den är ofullständig och fungerar inte.

/ *** Styr din APM / Pixhawk quadcopter med din röst med Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // den här enheten är verkligen controller 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; // Dra den inkommande begäran baserat på typ (LaunchRequest, IntentRequest, etc.) JSON -kroppen för begäran finns i händelseparametern. exports.handler = funktion (händelse, sammanhang) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = sammanhang; if (event.session.application.applicationId! == app_id) {ctx.fail ("Ogiltigt program -ID"); } klient = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Connected to AWS IoT"); // callback ();});

if (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } annars if (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } annars if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx.succeed (); }} catch (e) {console.log ("UNDANTAG i hanteraren:" + e); ctx.fail ("Undantag:" + e); }}; /*** Ringde när sessionen startar. */ function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Kallas när användaren startar färdigheten utan att ange vad de vill ha. */ function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Skicka till din färdighets lansering. getWelcomeResponse (återuppringning); } /*** Kallas när användaren anger en avsikt för den här färdigheten. */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 återuppringning = null; // Skicka till din färdighets avsiktshanterare om ("GoIntent" === intentionName) {doGoIntent (intention, session); } annars if ("CommandIntent" === intentionName) {doCommandIntent (intention, session); } annars if ("TurnIntent" === intentionName) {doTurnIntent (intention, session); } annars if ("HelpIntent" === intentionName) {getWelcomeResponse (); } else {throw "Ogiltig avsikt"; }} /*** Ringde när användaren avslutar sessionen. * Anropas inte när skickligheten returnerar shouldEndSession = true. */ function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Lägg till rensningslogik här} // --------------- Funktioner som styr skicklighetens beteende -------------------- --- funktion getWelcomeResponse () {// Om vi ville initiera sessionen för att ha några attribut kan vi lägga till dem här. var sessionAttributes = {}; var cardTitle = "Välkommen"; var speechOutput = "Välkommen till DRONE CONTROL."; // TODO: är drönare online eller offline? Om det är online, är det ARMED? var repromptText = "Drone redo för kommando."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } /*** hanterar GO -avsikter. */ function doGoIntent (intention, session, callback) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; var direction = intention.slots. Direction.value; var distans = intention.slots. Distance.value; var unit = intention.slots. Unit.value; var validDirections = ["framåt", "framåt", "bakåt", "bakåt", "höger", "vänster", "upp", "ner", "rakt", "framåt", "rakt fram"]; var validUnits = ["fot", "fot", "meter", "meter", "gård", "varv"]; repromptText = "Berätta hur långt jag ska gå och åt vilket håll."; var fail = false; // validera inmatningar om (! (parseInt (distans)> = 1)) {speechOutput = "Jag kunde inte förstå avståndet du vill att jag ska resa."; misslyckas = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Jag kunde inte förstå vilken riktning du vill att jag ska färdas."; misslyckas = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (enhet) == -1) {speechOutput = "Jag kunde inte förstå enheten du vill att jag ska resa."; misslyckas = sant; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } om (! misslyckas) {var cardTitle = "Drone going" + direction + "" + distance + "" + unit; speechOutput = "Går" + riktning + "" + avstånd + "" + enhet; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funktion doCommandIntent (avsikt, session, återuppringning) {

// var cardTitle = "Drone COMMAND …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Berätta vad som är kommandot för drönaren."; var task = intention.slots. Task.value; var validTasks = ["start", "land", "r. t. l.", "håll", "stanna", "stoppa", "återgå till lansering", "avbryta"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Jag kunde inte förstå kommandot."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Utför Drone -kommando" + uppgift; speechOutput = "Utför kommando" + uppgift; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funktion doTurnIntent (avsikt, session, återuppringning) {

// var cardTitle = "Drone Turn …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Berätta hur du vill vända drönaren."; var direction = intention.slots. Direction.value; var validDirections = ["höger", "vänster", "runt"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Jag kunde inte förstå svängens riktning."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } annars {var cardTitle = "Drone vrider" + riktning; speechOutput = "Turning" + riktning; 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 - tycker att det är klart, framgångsrikt."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("fel", (funktion (err, beviljad) {console.log ("MQTT CLIENT ERROR !!" + err);})); }

// --------------- Hjälpare som bygger alla svar -----------------------

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

Rekommenderad: