Inhoudsopgave:

Alexa spraakgestuurde Raspberry Pi-drone met IoT en AWS - Ajarnpa
Alexa spraakgestuurde Raspberry Pi-drone met IoT en AWS - Ajarnpa

Video: Alexa spraakgestuurde Raspberry Pi-drone met IoT en AWS - Ajarnpa

Video: Alexa spraakgestuurde Raspberry Pi-drone met IoT en AWS - Ajarnpa
Video: Uitpakparty: Amazon Echo Dot, speaker met spraakassistent 2024, Juli-
Anonim
Image
Image
Alexa Spraakgestuurde Raspberry Pi-drone met IoT en AWS
Alexa Spraakgestuurde Raspberry Pi-drone met IoT en AWS
Alexa Spraakgestuurde Raspberry Pi-drone met IoT en AWS
Alexa Spraakgestuurde Raspberry Pi-drone met IoT en AWS

Hoi! Mijn naam is Armaan. Ik ben een 13-jarige jongen uit Massachusetts. Deze tutorial laat zien, zoals je uit de titel kunt afleiden, hoe je een Raspberry Pi Drone bouwt. Dit prototype laat zien hoe drones evolueren en ook hoe groot een rol ze in de toekomst kunnen spelen. Ik zie mezelf zeker over 10 jaar wakker worden en een drone vragen om ontbijt voor me te halen. De drone gebruikt Amazon Alexa, Amazon Web Services, IoT (Internet of Things) en vooral een Raspberry Pi om te draaien. Het is bedoeld om te demonstreren en te informeren over drones en hoe ze elke dag verbeteren. Hopelijk heb je succes en leer je over drones in het proces. Veel succes en bedankt voor het lezen. -Armaan

Benodigdheden

Om het prototype te bouwen zijn er verschillende hardware- en softwarebehoeften. Ik heb een online tutorial van The Drone Dojo gebruikt om de drone te bouwen en de genoemde technologieën te integreren. Voor de drone kun je de onderdelenlijst hier vinden:

Lijst met drone-onderdelen

Softwarevereisten:

  • Amazon-webservices
  • Een laptop
  • Mission Planer-software
  • Balena Etcher
  • MicroSD-kaart met Raspbian-bestand hier gevonden
  • Amazon Alexa, fysiek of virtueel

Stap 1: Onderdelen verzamelen en begrijpen

Onderdelen verzamelen en begrijpen
Onderdelen verzamelen en begrijpen

Elk onderdeel dat in de leveringslijst wordt vermeld, is noodzakelijk, evenals een duidelijk begrip van elk onderdeel. U kunt de onderdelen online vinden en eenmaal verzameld, kunt u verder lezen. Een afspeellijst van The Drone Dojo voor een volledig begrip van de onderdelen is hier te vinden. Een uitleg van 4 minuten op mijn youtube kanaal vind je hier. Als het op drones aankomt, zijn de enige onderdelen, ondanks wat de meeste mensen denken, niet alleen motoren en propellers. Hieronder staan de basisdoelen van elk onderdeel.

De Raspberry Pi met de Emlid Navio2

Dit onderdeel is zo'n beetje een centrale processor en het belangrijkste punt van de drone. De Raspberry Pi werkt als de CPU van een computer die commando's naar de Navio2 stuurt om via PWM (Pulse Width Modulation Signals) naar andere delen van de drone uit te voeren

2. De ESC's (elektronische snelheidsregelaars)

Deze gele delen bevinden zich onder het frame. Ze zijn 4 aangesloten op de Navio, één voor elke motor. Bij ontvangst van PWM-signalen draaien ze de motoren en beginnen ze met vliegen.

3. Motoren

Motoren hebben niet al te veel uitleg nodig omdat je ze waarschijnlijk wel kent. Ze draaien en draaien de propellers om stuwkracht te creëren.

4. Propellers

Propellers creëren stuwkracht voor de drone om te vliegen. Ze draaien in dezelfde richting als de motoren om het voertuig op te tillen.

5. De batterij- en voedingsmodule

De LiPo-batterij voedt de hele drone door het frame met behulp van de voedingsmodule. Het geeft ongeveer 15-20 minuten vliegtijd en fungeert als stroombron.

6. De GPS

De GPS communiceert met satellieten om de positie van de drone te bepalen. Het bepaalt hoogte, breedte en lengte. Het kan worden gebruikt voor geofencing, waypoints en ook voor het verplaatsen naar bepaalde posities of richtingen.

7. De telemetriemodule

De telemetriemodule verbindt onze drone met een grondcontrolestation, in ons geval Mission Planner, om te monitoren.

8. De RC-controller en -module samen met PPM-encoder

De RC-controller gebruikt radio om signalen en commando's naar de RC-module te verzenden om de drone handmatig te besturen. De PPM Encoder vertaalt deze signalen zodat de Navio + RPI deze kan verwerken en uitvoeren.

9. Het kader

Dit rood-witte frame fungeert als basis of platform voor de andere te plaatsen onderdelen. Het frame is aerodynamisch en lichtgewicht, daarom perfect voor onze drone-bouw.

Nu met kennis van elk onderdeel, kunnen we eindelijk de drone bouwen! Op naar de volgende stap!

Stap 2: Montage van de drone

De drone in elkaar zetten
De drone in elkaar zetten

Deze stap is waarschijnlijk de moeilijkste in termen van fysieke inspanning. Ik raad aan om iemand anders te laten helpen of probeer de helpende hand in de onderdelenlijst te gebruiken. Het proces is te lang om hier te demonstreren, dus ik zal een andere link geven die ik door The Drone Dojo heb gebruikt.

Een Raspberry Pi-drone bouwen

Nogmaals, omdat ik niet te veel in detail zal treden, zal ik alleen de basis van elke stap benadrukken.

1. Organiseer uw benodigdheden - Verzamel onze materialen en zorg ervoor dat ze gemakkelijk toegankelijk zijn

2. Plan je bouw - Organiseer je onderdelen op het frame om een blauwdruk te maken van wat je gaat bouwen

3. Soldeerwerk - Dit is het werk dat een beetje moeilijk is om alleen te doen. U moet de gouden kogelconnectoren die bij de motoren worden geleverd aan de ESC's solderen. Vervolgens moet u het onderste deel van het frame nemen en de ESC's aan het onderste frame of de stroomverdelingskaart solderen. De batterijmodule wordt ook op het stroomverdeelbord gesoldeerd

4. Het frame opzetten - Vervolgens moet u het bovenste deel van het frame samen met de armen vastschroeven. Je kunt de Raspberry Pi er vervolgens op elke gewenste manier op bevestigen (ik heb ducttape gebruikt). Vervolgens kunt u de ESC's aan de armen vastmaken met ritssluitingen. Nu zijn we bijna klaar.

5. De RC-controller aan de ontvanger binden - Probeer de instructies in de afspeellijst hierboven te volgen om de RC-controller te binden met behulp van een ESC.

6. Onderdelen op frame voltooien - Duct tape of riem op de telemetriemodule op het frame. Duct tape de PPM Encoder ook op een arm. Nu kunt u de ESC's en PPM Encoder aansluiten op de Navio.

7. GPS Mount + Batterij - Monteer de GPS Mount met de verschillende schroeven en onderdelen. Bevestig de GPS met behulp van kabelbinders aan het frame. Ik heb de GPS-houder niet per se gebruikt vanwege de kwetsbaarheid, maar het is aan jou. Vervolgens kunt u de batterij tussen de Power Dist. Bord. Ik heb de voedingsmodule ook vastgebonden en met tape aan het frame vastgemaakt. Nu is je hardware zo goed als ingesteld. Nu voor het deel waar we op hebben gewacht!

8. De propellers installeren!!! - U kunt de propellers aandraaien met behulp van de tabel die in de afspeellijst wordt vermeld. Dan kun je de ESC's op de motoren aansluiten en zijn we eindelijk klaar met het bouwen van de drone.

Software is de volgende, dus verder!

Stap 3: Raspberry Pi en GCS configureren (Mission Planner)

Raspberry Pi en GCS configureren (Mission Planner)
Raspberry Pi en GCS configureren (Mission Planner)

Nogmaals, je kunt meer gedetailleerde instructies vinden in de afspeellijst van de laatste stap. U weet echter waarschijnlijk hoe u de RasPi moet instellen. Maar deze keer doen we het zonder hoofd. Gebruik Balena Etcher om het besturingssysteem van de Navio OS-website op de MicroSD-kaart te branden. Terwijl het is aangesloten op uw computer, gaat u naar de wpa supplicant met behulp van notepad ++. Voer daarna de ssid en het wachtwoord in voor de Raspberry Pi om verbinding te maken met uw wifi. Dan moet u een bestand met de naam SSH toevoegen. Dit kan via de opdrachtregel of een andere methode. Nu kunnen we SSH. U kunt de opdrachtprompt of Putty gebruiken. Ik gebruikte de opdrachtprompt en typte "ssh pi@navio" om in mijn geval verbinding te maken, of je kunt het IP-adres en ssh op die manier vinden. Gebruik na het aansluiten deze video om de Navio in te stellen en te configureren. Om de telemetrie in te stellen moet je eerst een bewerking op de Raspberry Pi maken. Volg dit om de bewerking uit te voeren en probeer verbinding te maken met Mission Planner. Als telemetrie niet werkt, kunt u de bewerking ongedaan maken en verbinding maken via een UDB-verbinding door uw GCS (Ground Control Station zoals laptop) IP in te voeren. Eenmaal verbonden met Mission Planner, kun je de installatiewizard gebruiken om alle onderdelen van de drone te kalibreren. Raadpleeg de afspeellijst opnieuw als u hulp nodig heeft. Meestal is er bij het instellen bijna altijd een fout. Het oplossen van problemen is een van de grootste onderdelen van dit project. Ik kan je daar niet echt helpen omdat ik niet op de hoogte ben van je fouten, maar de meeste fouten kunnen worden opgelost met hulp van internet. Nadat alles klaar is, is de drone klaar om te vliegen! Je kunt je RC-controller en vliegmodi instellen op Mission Planner. Probeer de linker joystick vijf seconden helemaal rechtsonder vast te houden om de drone te bewapenen. Ik raad niet aan om te vliegen zonder een tutorial te bekijken, omdat de drone erg kwetsbaar en gemakkelijk te breken is. Voor mij, de eerste keer dat ik ermee vloog, brak ik de GPS-houder en enkele propellers. Als u geen spraakbesturing nodig heeft, kunt u hier stoppen. Ga verder om meer te weten te komen over AWS en het programmeren van de drone!

Stap 4: De drone programmeren om met Python te vliegen

De drone programmeren om met Python te vliegen
De drone programmeren om met Python te vliegen

Voordat we naar AWS gaan, moeten we eerst begrijpen hoe we de drone moeten programmeren om te vliegen. Na de eerste installatie zou het integreren van spraakbesturing niet al te moeilijk moeten zijn. Het eerste dat we kunnen proberen om er een idee van te krijgen, is door een eenvoudig start- en landprogramma te maken. Na het instellen van de Raspberry Pi kunnen we er weer SSH in plaatsen. Je kunt de playlist opnieuw bekijken of mijn instructie volgen.

1. Laten we eerst de ArduPilot-broncode downloaden in een map op de Raspberry Pi

mkdir src

Haal vervolgens de bestanden van GitHub met behulp van git clone

git clone -b Copter-3.6.11

Laten we nu naar /src/ardupilot. gaan

cd src

cd ardupilot

Laten we nu de bronbestanden initialiseren

git submodule update --init --recursive

2. Vervolgens moeten we de firmware compileren op de Raspberry Pi

Zorg ervoor dat u met cd naar /src/ardupilot/ navigeert voordat u de volgende stappen uitvoert

Om vervolgens specifiek voor de Navio te configureren met behulp van

./waf configureren --board=navio2

Dan kun je compileren met

./waf --targets bin/arducopter

3. We kunnen nu de broncode installeren op de Navio

Laten we eerst naar de juiste map navigeren.

cd/etc/systemd/system

Bewerk vervolgens het bestand

sudo vi arducopter.service

Waar ExecStart staat, voeg het volgende in in plaats van wat er al is

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

Nu, om de ardupilot-broncode in actie te brengen, kunnen we gebruiken

sudo systemctl daemon-reload

Dan kunnen we opnieuw beginnen met

sudo systemctl herstart arducopter

Met de laatste stap zijn we eindelijk klaar met het instellen van ArduPilot op onze drone

4. DroneKit installeren

DroneKit is de software die we gaan gebruiken om de drone te programmeren om te vliegen. Om een deel van de code te begrijpen, kunt u de documentatie hier vinden. Eerst moeten we het pakket op onze drone installeren voordat we een script schrijven.

We kunnen het python-pakket installeren met:

pip install dronekit==2.9.1

Dit kan wel of niet de nieuwste versie zijn, maar het is degene die ik heb gebruikt, dus ik kan helpen bij het oplossen van problemen.

Om te controleren of het is geïnstalleerd, kunnen we een

pip bevriezen | grep dronekit

Nu zijn we eindelijk klaar om ons eerste pythonscript te maken

5. takeoff_and_land.py

WAARSCHUWING! Ik stel voor om een basiskennis van python op te bouwen, zodat je de code kunt leren en begrijpen. Als je het programma zelf wilt schrijven, volg dan deze video.

##Laten we eerst geen map maken om deze code op te slaan

cd dk ##Als je het zelf wilt doen, gebruik dan vi takeoff_and_land.py ##om een programma te maken

Anders kunt u een kijkje nemen of het bijgevoegde bestand gebruiken en een protocol voor bestandsoverdracht gebruiken. We kunnen dit programma daarna uitproberen. Eerst om te verduidelijken dat het een python-bestand is dat we moeten gebruiken

chmod +x takeoff_and_land.py

Gebruik vervolgens de volgende code om uit te voeren:

python takeoff_and_land.py --connect 127.0.0.1: 14550

Bij mij lukte het de eerste keer ook niet. Als er een linktime-out is, hoeft u zich geen zorgen te maken, er is iets dat u kunt doen. Open een andere prompt en ssh. U kunt proberen iets genaamd mavproxy te installeren en het uit te voeren. Daarna kunt u beide tegelijkertijd uitvoeren. Dit zou moeten helpen om de drone te verbinden. Zodra dat gedaan is, heb ik een uitdaging voor je. Probeer erachter te komen wat het andere programma (set_velocity_body.py) doet en hoe het te laten werken. Als je dat doet, goed gedaan.

6. Voorwaarts!

Deze kennis kunnen we nu gebruiken om onze drone spraakgestuurd te maken. Alexa drone-besturing gebruikt veel van deze functies en meer. Veel succes en verder!

Stap 5: Amazon Alexa en Amazon Web Services gebruiken om spraakbesturing te integreren

Amazon Alexa en Amazon Web Services gebruiken om spraakbediening te integreren
Amazon Alexa en Amazon Web Services gebruiken om spraakbediening te integreren
Amazon Alexa en Amazon Web Services gebruiken om spraakbediening te integreren
Amazon Alexa en Amazon Web Services gebruiken om spraakbediening te integreren

Deze stap is een van de minder gedocumenteerde. Dit betekent dat het het moeilijkst zal zijn om problemen op te lossen. Het kostte me ongeveer een maand, misschien meer, om het aan het werk te krijgen. Het belangrijkste hier is geduld hebben. Deze functie kan, indien geïmplementeerd in het echte leven, levens veranderen. Je kunt Alexa gewoon vertellen om je boodschappen voor je te halen in plaats van zelf te gaan. Stel je voor dat! Dus zonder verder oponthoud, laten we er op ingaan!

1. De Raspberry Pi als een ding registreren op AWS IoT

Om IoT (Internet of Things) te gebruiken, hebben we iets nodig. We moeten dus eerst inloggen op de AWS-console om AWS IoT te gebruiken. Ga dan naar IoT Core. Eenmaal daar moet u op Beheren klikken en vervolgens iets maken. Na het toevoegen van een naam hebben we voor het verbinden een certificaat nodig. Ik zou aanraden om op de certificering met één klik te klikken. Nadat u het certificaatscherm hebt gezien, moet u ervoor zorgen dat u elke sleutel downloadt, inclusief de root-CA. Dan kun je de creatie van het ding afmaken. Vervolgens moeten we een beleid maken. Ga terug naar de IoT Core. Klik vervolgens op veilig en klik op beleid. Klik vervolgens op beleid maken. U kunt vervolgens een naam maken en bronnen toevoegen. Typ onder action iot* en typ * onder resource en druk op allow for effect. Ga dan terug naar je ding en ga naar je certificaat. Klik hier op beleid. U kunt dan uw polis voor het ding bijvoegen en het is helemaal klaar!

2. Code instellen op Raspberry Pi en interactie met IoT

Voor dit deel heb je een SFTP-client nodig (ik gebruikte WinSCP) voor bestandsoverdracht. Bij het verbinden met onze Raspberry Pi moeten we de certificaatsleutels bij de hand hebben. U moet de sleutelbestanden naar de Raspberry Pi overbrengen. Je moet ook pip de AWSIoTPythonSDK op de Raspberry Pi installeren. Ga dan naar de dk-map op de Raspberry Pi. Je gebruikt het Alexa Drone Control-bestand dat ik heb gegeven om met IoT te communiceren. Om dit bestand te gebruiken heb ik een Shell Script gebruikt om op te starten. Ik zal de onderstaande code laten zien omdat ik het bestand om de een of andere reden niet kan uploaden. Als het programma tijdens het testen geen berichten van AWS IoT oppikt, hoeft u zich geen zorgen te maken! Dit kan mijn fout zijn, omdat het Alexa Drone Control File mogelijk niet bij je ding past. Dus, om het te repareren, ga terug naar AWS IoT en klik op leren in het linkerdeelvenster. Volg de instructies en u moet mogelijk opnieuw opstarten. Sorry daarvoor. Zodra je IoT begint te werken met het programma op de RasPi, kun je de dronekit-code integreren uit het Alexa Drone Control-bestand dat ik heb gegeven. Gebruik daarna het Shell-script dat ik bij je certificaten heb gegeven en Rest API Endpoint van IoT.

# stop script op errorset -e # Controleer of root CA-bestand bestaat, download zo niet als [! -f./root-CA.crt]; druk vervolgens af "\nDownload AWS IoT Root CA-certificaat van AWS…\n" curl https://www.amazontrust.com/repository/AmazonRoot…> > root-CA.crt fi # installeer AWS Device SDK voor Python indien nog niet geïnstalleerd indien [! -d./aws-iot-apparaat-sdk-python]; dan printf "\nInstalling AWS SDK…\n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# voer een pub/sub-voorbeeldapp uit met certificaten die in het pakket zijn gedownload

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

Dit zal niet voor jullie allemaal werken, omdat de namen anders zijn. Vervang de sleutels die ik heb gebruikt door uw sleutelnamen wanneer u het bestand overbrengt. Zorg ervoor dat u dk afsluit voordat u het bestand overzet! Dat zou alles moeten zijn wat je nu hoeft te doen.

3. Je Alexa-vaardigheid opbouwen

Deze stap lijkt een stuk moeilijker dan het in werkelijkheid is. Eerst moeten we inloggen op de Alexa Developer-console. Klik vervolgens op vaardigheid maken. Wanneer het vraagt om een model voor je vaardigheid te kiezen, klik je gewoon op aangepast. Als er wordt gevraagd om een methode te kiezen, klik je op 'Provision your own'. Je kunt het noemen wat je wilt. Er is geen sjabloon vereist, dus kies om helemaal opnieuw te beginnen. Vervolgens zou je, nadat je je vaardigheid hebt gemaakt, op het scherm Skillbuilder moeten komen met een checklist aan de rechterkant. Vanaf hier kunnen we beginnen met het opbouwen van onze vaardigheden. Als eerste op de checklist staat de naam van de aanroep. Dit is wat je Alexa zult vertellen om je vaardigheid op te roepen. Voor mij heb ik mijn aanroepnaam gewoon als drone gezet. Nu kunnen we naar onze intenties, uitingen en slots gaan. Hier kun je commando's voor de drone maken, zoals 1 meter omhoog gaan of naar rechts of naar beneden gaan. De mijne werkt voorlopig maar met één meter. U kunt op de JSON-editor onderaan het linkerdeelvenster klikken. U kunt dan de volgende code erin plakken.

{ "interactionModel": { "languageModel": { "invocationName": "drone", "intents": [{ "name": "AMAZON. FallbackIntent", "samples": }, { "name": "AMAZON. CancelIntent", "samples": }, { "name": "AMAZON. HelpIntent", "samples": }, { "name": "AMAZON. StopIntent", "samples": }, { "name": "AMAZON. NavigateHomeIntent", "samples": }, { "name": "GoIntent", "slots": [{ "name": "Direction", "type": "Direction" }, { "name": "Distance", "type": "AMAZON. NUMBER" }, { "name": "Unit", "type": "Unit" }], "samples": ["Go {Direction} {Distance} {Unit}", "Go {Distance} {Unit} {Direction}"] }, { "name": "CommandIntent", "slots": [{ "name": "Task", "type": "Taak" }], "samples": ["Command drone to {Task}"] }, { "name": "TurnIntent", "slots": [{ "name": "Direction", "type": " Richting" }, { "naam": "Rotatie", "type": "AMAZON. NUMBER" }], "samples": ["Draai {Richting} {Rotatie} graden"] }], "types": [{ "name": "Richting", "values": [{ "name": { "value": "Recht", "synoniemen": ["Forw ards", "Forward"] } }, { "name": { "value": "Back", "synoniemen": ["Backwards", "Backward"] } }, { "name": { "value": "Rechts" } }, { "naam": { "waarde": "Links" } }, { "naam": { "waarde": "Omlaag" } }, { "naam": { "waarde": "Omhoog " } }] }, { "naam": "Eenheid", "waarden": [{ "naam": { "waarde": "Meters", "synoniemen": ["Meter"] } }, { "naam": { "value": "Yards", "synoniemen": ["Yard"] } }, { "name": { "value": "Feet", "synoniemen": ["Foot"] } }] }, { "name": "Taak", "values": [{ "name": { "value": "Grond" } }, { "name": { "value": "Hold" } }, { "name": { "value": "Blijf" } }, { "name": { "value": "RTL", "synoniemen": ["Terug naar start"] } }] }] } } }

Nadat u de code in de JSON-editor hebt geplakt, kunt u op de derde stap van de checklist klikken en uw interactiemodel voor u bouwen. Met deze stap ben je voor nu klaar. U kunt het eindpuntslot voorlopig leeg laten!

Stap 4: Uw Lambda-functie bouwen

Nu, deze stap is er een die je zelf moet uitzoeken. Ik zal je vertellen hoe je het aansluit op de Alexa Skill, maar je zult het zelf moeten coderen. Ga dus eerst naar de AWS-beheerconsole. Ga dan naar Lambda. U kunt dan een functie maken met de naam die u maar wilt. Zorg ervoor dat u het helemaal opnieuw schrijft en maak de runtime in elke gewenste programmeertaal. Ik heb Node.js gebruikt. Om de Alexa Skill toe te voegen, voeg je een trigger toe en selecteer je Alexa Skills Kit (ASK). Kopieer je Lambda ARN en ga terug naar de Alexa Skill. Ga nu naar het eindpunt. U kunt uw ARN plakken, opslaan en een nieuw model bouwen. Neem vervolgens de Alexa Skill ID en plak deze in het triggergedeelte waar het je op de Lambda vraagt. Scroll vervolgens naar beneden op de Lambda en zoek de basisinstellingen en maak de time-out 10 seconden. Nu is het aan jou om de code te achterhalen. Voor hints kunt u onderstaande websites raadplegen.

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

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

en je kunt het bestand gebruiken dat ik heb bijgevoegd, maar het is onvolledig en zal niet werken.

/** * Bedien je APM / Pixhawk quadcopter met je stem, met behulp van Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = vereisen('aws-iot-device-sdk'); var config = vereisen(./config"); var deviceName = "EchoDroneControl"; // dit apparaat is echt de 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 cliënt = null; // Routeer de binnenkomende aanvraag op basis van type (LaunchRequest, IntentRequest, etc.) De JSON-body van de aanvraag wordt opgegeven in de eventparameter. exports.handler = functie (gebeurtenis, context) { probeer { console.log("event.session.application.applicationId=" + event.session.application.applicationId); ctx = context; if (event.session.application.applicationId !== app_id) { ctx.fail("Ongeldige applicatie-ID"); } client = awsIot.device (mqtt_config); client.on("connect", function(){ console.log("Verbonden met AWS IoT"); // callback(); });

if (gebeurtenis.sessie.nieuw) {

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("UITZONDERING in handler: " + e); ctx.fail("Uitzondering: " + e); } }; /** * Wordt gebeld wanneer de sessie begint. */ function onSessionStarted(sessionStartedRequest, session) { console.log("onSessionStarted requestId=" + sessionStartedRequest.requestId + ", sessionId=" + session.sessionId); }

/**

* Wordt aangeroepen wanneer de gebruiker de vaardigheid start zonder op te geven wat ze willen. */ function onLaunch(launchRequest, session, callback) { console.log("onLaunch requestId=" + launchRequest.requestId +", sessionId=" + session.sessionId); // Verzending naar de lancering van je vaardigheid. getWelcomeResponse (terugbellen); } /** * Wordt aangeroepen wanneer de gebruiker een intentie opgeeft voor deze vaardigheid. */ function onIntent(intentRequest, session) { //, callback) { console.log("onIntent requestId=" + intentRequest.requestId +", sessionId=" + session.sessionId); var intent = intentRequest.intent, intentName = intentRequest.intent.name; console.log("VERZOEK naar string =" + JSON.stringify(intentRequest)); var terugbellen = null; // Verzending naar de intent-handlers van uw vaardigheid if ("GoIntent" === intentName) { doGoIntent (intent, session); } else if ("CommandIntent" === intentName) { doCommandIntent(intent, session); } else if ("TurnIntent" === intentName) { doTurnIntent(intent, session); } else if ("HelpIntent" === intentName) { getWelcomeResponse(); } else { throw "Ongeldige bedoeling"; } } /** * Wordt gebeld wanneer de gebruiker de sessie beëindigt. * Wordt niet aangeroepen wanneer de vaardigheid ShouldEndSession=true retourneert. */ function onSessionEnded(sessionEndedRequest, session) { console.log("onSessionEnded requestId=" + sessionEndedRequest.requestId +", sessionId=" + session.sessionId); // Voeg hier opruimlogica toe } // --------------- Functies die het gedrag van de vaardigheid bepalen -------------------- --- function getWelcomeResponse() { // Als we de sessie wilden initialiseren om enkele attributen te hebben, zouden we die hier kunnen toevoegen. var sessionAttributes = {}; var cardTitle = "Welkom"; var speechOutput = "Welkom bij de DRONE CONTROL. "; // TODO: is drone online of offline? Indien online, is het ARMED? var repromptText = "Drone klaar voor commando."; var ShouldEndSession = false; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } /** * verwerkt GO-intentie. */ function doGoIntent(intent, session, callback) { // var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var ShouldEndSession = false; var speechOutput = ""; var richting = intentie.slots. Direction.value; var afstand = intentie.slots. Afstand.waarde; var unit = intentie.slots. Eenheid.waarde; var validDirections = ["vooruit", "vooruit", "achteruit", "achteruit", "rechts", "links", "omhoog", "omlaag", "rechtdoor", "vooruit", "rechtdoor"]; var validUnits = ["foot", "feet", "meter", "meters", "yard", "yards"]; repromptText = "Vertel me hoe ver ik moet gaan en in welke richting."; var mislukt = onwaar; // valideer invoer if (!(parseInt(distance) >= 1)) { speechOutput = "Ik kon de afstand die je wilt dat ik afleg niet begrijpen."; mislukken = waar; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf(direction) == -1) { speechOutput = "Ik begreep niet in welke richting ik moet reizen."; mislukken = waar; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf(unit) == -1) { speechOutput = "Ik kon de eenheid die je me wilt laten reizen niet begrijpen."; mislukken = waar; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (!fail) { var cardTitle = "Drone gaat" + richting + " " + afstand + " " + eenheid; speechOutput = "Gaan" + richting + " " + afstand + " " + eenheid; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

functie doCommandIntent(intent, session, callback) {

// var cardTitle = "Drone COMMANDO …"; var repromptText = null; var sessionAttributes = {}; var ShouldEndSession = false; var speechOutput = ""; repromptText = "Vertel me wat het commando is voor de drone. "; var taak = intentie.slots. Task.value; var validTasks = ["start", "land", "r.t.l.", "hold", "stay", "stop", "return to launch", "abort"]; if (validTasks.indexOf(task) == -1) { speechOutput = "Ik kon de opdracht niet begrijpen. "; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else { var cardTitle = "Drone-opdracht uitvoeren" + taak; speechOutput = "Opdracht uitvoeren" + taak; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

functie doTurnIntent(intent, session, callback) {

// var cardTitle = "Drone Turn …"; var repromptText = null; var sessionAttributes = {}; var ShouldEndSession = false; var speechOutput = ""; repromptText = "Vertel me hoe je de drone wilt draaien. "; var richting = intentie.slots. Direction.value; var validDirections = ["rechts", "links", "rond"]; if (validDirections.indexOf(direction) == -1) { speechOutput = "Ik kon de richting van de afslag niet begrijpen. "; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else { var cardTitle = "Drone draait" + richting; speechOutput = "Draaien" + richting; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

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

{ var strIntent = JSON.stringify(intentie); console.log("mqttPublish: INTENT text = " + strIntent); // client.publish ("ikw1zr46p50f81z/drone/echo", strIntent, false); client.publish(config.topic, strIntent, false); klant.end(); client.on("close", (function () { console.log("MQTT CLIENT CLOSE - denkt dat het klaar is, succesvol. "); ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); })); client.on ("fout", (functie (fout, toegestaan) { console.log ("MQTT CLIENT FOUT!! " + fout); })); }

// --------------- Helpers die alle reacties bouwen -----------------------

functie buildSpeechletResponse (titel, output, repromptText, shouldEndSession) { return { outputSpeech: { type: "PlainText", tekst: output }, kaart: { type: "Eenvoudig", titel: titel, inhoud: output }, prompt: { outputSpeech: { type: "PlainText", tekst: repromptText } }, ShouldEndSession: ShouldEndSession } } function buildResponse (sessionAttributes, speechletResponse) { return { version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse } }

Aanbevolen: