INHOUDSOPGAWE:

Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS: 6 stappe (met foto's)
Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS: 6 stappe (met foto's)

Video: Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS: 6 stappe (met foto's)

Video: Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS: 6 stappe (met foto's)
Video: CS50 2013 - Week 10, continued 2024, Julie
Anonim
Image
Image
Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS
Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS
Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS
Alexa Voice Controlled Raspberry Pi Drone Met IoT en AWS

Hi! My naam is Armaan. Ek is 'n 13-jarige seun uit Massachusetts. Hierdie tutoriaal toon, soos u uit die titel kan aflei, hoe u 'n Raspberry Pi Drone kan bou. Hierdie prototipe demonstreer hoe drones ontwikkel en ook hoe 'n groot rol hulle in die toekoms kan speel. Ek kan beslis sien dat ek oor 10 jaar wakker word en 'n hommeltuig vra om ontbyt vir my te kry. Die hommeltuig gebruik Amazon Alexa, Amazon Web Services, IoT (Internet of Things), en veral 'n Raspberry Pi om te bestuur. Dit is bedoel om daagliks te demonstreer en in te lig oor drones en hoe dit verbeter. Hopelik is u suksesvol en leer u in die proses meer oor drones. Sterkte en dankie dat jy gelees het. -Armaans

Voorrade

Daar is verskillende hardeware- en sagtewarebehoeftes om die prototipe te bou. Ek het 'n aanlyn -tutoriaal van The Drone Dojo gebruik om die drone te bou en die genoemde tegnologieë te integreer. Vir die drone vind u die onderdele -lys hier:

Drone onderdele lys

Sagtewarevereistes:

  • Amazon Web Services
  • N skootrekenaar
  • Mission Planer sagteware
  • Balena Etcher
  • MicroSD -kaart met Raspbian -lêer word hier gevind
  • Amazon Alexa, fisies of virtueel

Stap 1: Versamel en verstaan dele

Versamel en verstaan onderdele
Versamel en verstaan onderdele

Elke deel wat in die aanbodlys genoem word, is nodig, en 'n duidelike begrip van elke deel. U kan die onderdele aanlyn vind, en sodra u dit versamel het, kan u verder lees. 'N Snitlys van The Drone Dojo vir 'n volledige begrip van die dele kan hier gevind word. U kan 'n verduideliking van 4 minute op my YouTube-kanaal hier vind. Wat drones betref, is die enigste dele, ten spyte van wat die meeste mense dink, nie net motors en propellers nie. Hieronder is die basiese doeleindes van elke deel.

Die Framboos Pi met die Emlid Navio2

Hierdie deel is amper 'n sentrale verwerker en die belangrikste punt van die hommeltuig. Die Raspberry Pi tree op soos die SVE van 'n rekenaar wat opdragte na die Navio2 stuur om via PWM (Pulse Width Modulation Signals) na ander dele van die drone uit te voer

2. Die ESC's (Electronic Speed Controllers)

Hierdie geel dele word onder die raam aangetref. Hulle is 4 ingeskakel by die Navio, een vir elke motor. As hulle PWM -seine ontvang, draai hulle die motors en begin vlug.

3. Motors

Motors het nie te veel verduideliking nodig nie, want u is waarskynlik bekend daarmee. Hulle draai en draai die skroewe om stootkrag te skep.

4. Propellers

Propellers sorg vir die drone om te vlieg. Hulle draai in dieselfde rigting as die motors om die voertuig op te lig.

5. Die battery- en kragmodule

Die LiPo -battery dryf die hele hommeltuig deur die raam met behulp van die kragmodule. Dit gee ongeveer 15-20 minute vlugtyd en dien as 'n kragbron.

6. Die GPS

Die GPS kommunikeer met satelliete om die drone se posisie te bepaal. Dit bepaal hoogte, breedte en lengte. Dit kan gebruik word vir geofencing, waypoints en ook om na sekere posisies of rigtings te beweeg.

7. Die telemetriemodule

Die telemetriemodule verbind ons hommeltuig met 'n grondbeheerstasie, in ons geval Mission Planner, wat gemonitor moet word.

8. Die RC -beheerder en module saam met PPM Encoder

Die RC -beheerder gebruik radio om seine en opdragte na die RC -module oor te dra om die hommeltuig met die hand te bestuur. Die PPM Encoder vertaal hierdie seine sodat die Navio + RPI kan verwerk en uitvoer.

9. Die raam

Hierdie rooi en wit raam dien as 'n basis of platform vir die ander dele wat geplaas moet word. Die raam is aërodinamies en lig, daarom perfek vir ons drone -konstruksie.

Met kennis van elke deel, kan ons uiteindelik die drone bou! Na die volgende stap!

Stap 2: Monteer die drone

Die montering van die drone
Die montering van die drone

Hierdie stap is waarskynlik die moeilikste in terme van fisiese inspanning. Ek beveel aan dat u 'n ander persoon om hulp vra, of probeer om die helpende hand in die onderdele -lys te gebruik. Die proses is te lank om hier te demonstreer, so ek sal nog 'n skakel verskaf wat ek deur The Drone Dojo gebruik het.

Bou 'n Raspberry Pi Drone

Weereens, aangesien ek nie te veel in detail sal ingaan nie, sal ek net die basiese beginsels van elke stap beklemtoon.

1. Organiseer u voorraad - Versamel ons materiaal en maak seker dat dit maklik toeganklik is

2. Beplan u bou - Organiseer u onderdele op die raam om 'n bloudruk te maak van wat u gaan bou

3. Soldeerwerk - Dit is 'n bietjie moeilik om alleen te doen. U moet die goue koeëlverbindings wat by die motors kom, aan die ESC's soldeer. Vervolgens moet u die onderste deel van die raam neem en die ESC's aan die onderste raam of kragverdelingsbord soldeer. Die batterymodule word ook aan die kragverspreidingsbord gesoldeer

4. Die raam opstel - U moet die boonste gedeelte van die raam saam met die arms vasskroef. U kan die Raspberry Pi dan bo -op heg soos u wil (ek het kleefband gebruik). Dan kan u die ESC's met ritsbande aan die arms vasmaak. Nou is ons amper klaar.

5. Bind die RC -beheerder aan die ontvanger - Probeer die instruksies in die speellys hierbo volg om die RC -beheerder met 'n ESC te bind.

6. Afwerking van dele op raam - Buisband of band aan die telemetriemodule op die raam. Plak die PPM -enkodeerder ook aan 'n arm vas. Nou kan u die ESC's en PPM Encoder na die Navio stuur.

7. GPS -houer + battery - Monteer die GPS -houer met die verskillende skroewe en stukke. Bevestig die GPS aan die raam deur middel van ritsbande. Ek het nie noodwendig die GPS Mount gebruik nie, want dit is broos, maar dit is aan u. Vervolgens kan u die battery tussen die Power Dist plaas. Raad. Ek het die kragmodule ook aan die raam vasgemaak en vasgeplak. Nou is u hardeware redelik opgestel. Nou vir die deel waarop ons gewag het!

8. Die installering van die propellers !!! - U kan die skroewe vasdraai met behulp van die grafiek wat in die snitlys genoem word. Dan kan u die ESC's by die motors aansluit en ons is uiteindelik klaar met die bou van die drone.

Sagteware is volgende, so aan!

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

Konfigurasie van Raspberry Pi en GCS (missiebeplanner)
Konfigurasie van Raspberry Pi en GCS (missiebeplanner)

U kan weer die gedetailleerde instruksies in die snitlys vind vanaf die laaste stap. U weet egter waarskynlik hoe u die RasPi moet instel. Maar hierdie keer doen ons dit koploos. Gebruik Balena Etcher om die bedryfstelsel van die Navio OS -webwerf op die MicroSD -kaart te verbrand. Terwyl dit by u rekenaar aangesluit is, gaan na die wpa -versoeker met notepad ++. Voer daarna die ssid en wagwoord in vir die Raspberry Pi om aan te sluit op u WiFi. Dan moet u 'n lêer met die naam SSH byvoeg. Dit kan via die opdragreël of 'n ander metode wees. Nou kan ons SSH. U kan die opdragprompt of Putty gebruik. Ek gebruik die opdragprompt en tik "ssh pi@navio" om in my geval aan te sluit, of u kan die IP -adres en ssh op die manier vind. Gebruik hierdie video tydens die verbinding om die Navio op te stel en te konfigureer. Om die telemetrie op te stel, moet u eers die Raspberry Pi wysig. Volg hierdie om die wysiging te maak en probeer om aan te sluit by Mission Planner. As telemetrie nie werk nie, kan u die wysiging ongedaan maak en met 'n UDB -verbinding verbind deur u GCS (Ground Control Station soos skootrekenaar) IP in te voer. Sodra u aan Mission Planner gekoppel is, kan u die instellingsassistent gebruik om alle dele van die drone te kalibreer. Raadpleeg weer die snitlys as u hulp nodig het. Gewoonlik is daar altyd 'n fout wanneer u instel. Probleemoplossing is een van die grootste dele van hierdie projek. Ek kan u nie regtig daar help nie, want ek is nie bewus van u foute nie, maar die meeste foute kan met behulp van die internet opgelos word. Nadat alles gereed is, is die hommeltuig gereed om te vlieg! U kan u RC -beheerder en vlugmodusse instel op Mission Planner. Probeer om die linker stok vyf sekondes heel regs onder te hou om die hommeltuig te bewapen. Ek beveel nie aan om te vlieg sonder om na 'n tutoriaal te kyk nie, want die hommeltuig is baie broos en maklik om te breek. Die eerste keer dat ek dit vlieg, breek ek die GPS -houer en 'n paar propellers. As u nie stembeheer benodig nie, kan u hier stop. Om meer te wete te kom oor AWS en die programmering van die drone, gaan voort!

Stap 4: Programmering van die drone om met Python te vlieg

Die programmering van die drone om met Python te vlieg
Die programmering van die drone om met Python te vlieg

Voordat ons by AWS ingaan, moet ons eers verstaan hoe om die drone te vlieg. Na die aanvanklike opstelling behoort die integrering van stembeheer nie te moeilik te wees nie. Die eerste ding wat ons kan probeer verstaan, is 'n eenvoudige opstyg- en landprogram. Nadat ons die Raspberry Pi opgestel het, kan ons weer daarin slaag. U kan weer na die snitlys kyk of my instruksies volg.

1. Laai eers die ArduPilot -bronkode af in 'n gids op die Raspberry Pi

mkdir src

Kry dan die lêers van GitHub met behulp van git -kloon

git kloon -b Copter -3.6.11

Kom ons gaan nou na /src /ardupilot

cd src

cd ardupilot

Laat ons nou die bronlêers inisialiseer

git submodule -opdatering --init --recursive

2. Vervolgens moet ons die firmware op die Raspberry Pi saamstel

Maak seker dat u na/src/ardupilot/met cd navigeer voordat u die volgende stappe doen

Dan om spesifiek vir die Navio te cofigureer met

./waf instel --bord = navio2

Dan kan u saamstel met

./waf -teikenbak/arducopter

3. Ons kan nou die bronkode in die Navio installeer

Laat ons eers na die regte gids gaan.

cd/etc/systemd/system

Wysig dan die lêer

sudo vi arducopter.service

Waar ExecStart staan, voeg die volgende in plaas van wat reeds daar is

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

Om die bronkode van die ardupilot in werking te stel, kan ons dit gebruik

sudo systemctl daemon-herlaai

Dan kan ons weer begin met

sudo systemctl herlaai arducopter

Met die laaste stap is ons uiteindelik klaar met die opstel van ArduPilot op ons drone

4. Die installering van DroneKit

DroneKit is die sagteware wat ons sal gebruik om die drone te vlieg. Om 'n paar van die kode te verstaan, kan u die dokumentasie hier vind. Eerstens moet ons die pakket op ons drone installeer voordat ons 'n script skryf.

Ons kan die python -pakket installeer met

pip installeer dronekit == 2.9.1

Dit is al dan nie die nuutste weergawe nie, maar dit is die een wat ek gebruik het, sodat ek kan help met die oplos van probleme.

Om te kyk of dit geïnstalleer is, kan ons 'n

piepvries | grep dronekit

Nou is ons uiteindelik gereed om ons eerste python -script te maak

5. opstyg_en_land.py

WAARSKUWING! Ek stel voor dat u 'n basiese begrip van python opstel, sodat u die kode kan leer en verstaan. Volg hierdie video as u die program self wil skryf.

## Laat ons eers 'n gids skep om hierdie kode te stoor

cd dk ## As u dit self wil doen, gebruik dan vi takeoff_and_land.py ## om 'n program te skep

Andersins kan u die aangehegte lêer bekyk of 'n protokol vir oordrag van lêers gebruik. Ons kan hierdie program daarna probeer. Eerstens om te verduidelik dat dit 'n python -lêer is wat ons moet gebruik

chmod +x opstyg_en_land.py

Gebruik dan die volgende kode om uit te voer

python opstyg_en_land.py -verbind 127.0.0.1:14550

Die eerste keer werk dit ook nie vir my nie. As daar 'n tydsduur vir die skakel is, moet u nie bekommerd wees nie; daar is iets wat u kan doen. Maak 'n ander aanwysing oop en ssh. U kan probeer om iets met die naam mavproxy te installeer en dit uit te voer. Daarna kan u albei gelyktydig hardloop. Dit moet help om die drone aan te sluit. Sodra dit klaar is, het ek 'n uitdaging vir u. Probeer om uit te vind wat die ander program (set_velocity_body.py) doen en hoe u dit kan laat werk. As jy dit doen, goeie werk.

6. Vorentoe!

Ons kan hierdie kennis nou gebruik om ons drone stembeheerd te maak. Alexa drone control gebruik baie van hierdie funksies en meer. Sterkte en verder!

Stap 5: Gebruik Amazon Alexa en Amazon Web Services om stembeheer te integreer

Gebruik Amazon Alexa en Amazon Web Services om stembeheer te integreer
Gebruik Amazon Alexa en Amazon Web Services om stembeheer te integreer
Gebruik Amazon Alexa en Amazon Web Services om stembeheer te integreer
Gebruik Amazon Alexa en Amazon Web Services om stembeheer te integreer

Hierdie stap is een van die minder gedokumenteerde. Dit beteken dat dit die moeilikste sal wees om probleme op te los. Dit het my ongeveer 'n maand geneem, miskien meer. Die belangrikste ding hier is om geduldig te wees. Hierdie funksie, as dit in die werklike lewe geïmplementeer word, kan lewensveranderend wees. U kan net vir Alexa sê om u kruideniersware vir u te koop in plaas daarvan om self te gaan. Stel jou dit voor! Dus, sonder meer, laat ons daarby ingaan!

1. Die Raspberry Pi as 'n ding op AWS IoT registreer

Om IoT (Internet of Things) te gebruik, het ons iets nodig. Ons moet dus by die AWS -konsole aanmeld om eers AWS IoT te gebruik. Gaan dan na IoT Core. As u daar is, moet u op Bestuur klik en dan 'n ding skep. Nadat ons 'n naam bygevoeg het, benodig ons 'n sertifikaat om aan te sluit. Ek beveel aan dat u op die een-klik-sertifisering klik. Nadat u die sertifikaatskerm gesien het, moet u elke sleutel, insluitend die wortel -CA, aflaai. Dan kan u die skepping van die ding voltooi. Vervolgens moet ons 'n beleid opstel. Gaan terug na die IoT Core. Klik dan op beveilig en klik op beleide. Druk dan op die skep van beleid. U kan dan 'n naam skep en hulpbronne byvoeg. Onder aksie, tik iot * en tik * onder hulpbron en druk op voorsiening vir effek. Gaan dan terug na u ding en gaan na u sertifikaat. Klik hier op beleid. U kan dan u polis vir die saak heg, en alles is reg!

2. Die opstel van kode op Raspberry Pi en interaksie met IoT

Vir hierdie deel benodig u 'n SFTP -kliënt (ek het WinSCP gebruik) vir die oordrag van lêers. By die verbinding met ons Raspberry Pi moet ons die sertifikatsleutels byderhand hê. U moet die sleutellêers na die Raspberry Pi oordra. U moet ook die AWSIoTPythonSDK op die Raspberry Pi installeer. Gaan dan na die dk -gids op die Raspberry Pi. U gebruik die Alexa Drone Control -lêer wat ek gegee het om met IoT te kommunikeer. Om hierdie lêer te gebruik, het ek 'n Shell Script gebruik om te begin. Ek sal die onderstaande kode wys, aangesien ek die lêer om een of ander rede nie kan oplaai nie. Moenie bekommerd wees as die program tydens die toets nie boodskappe van AWS IoT afhaal nie! Dit is moontlik my skuld, aangesien die Alexa Drone Control -lêer moontlik nie by u ding pas nie. Om dit reg te stel, gaan terug na AWS IoT en klik op leer in die linkerpaneel. Volg die instruksies en u moet moontlik weer begin. Jammer oor dit. Sodra u IoT met die program op die RasPi begin werk, kan u die dronekit -kode integreer uit die Alexa Drone Control -lêer wat ek gegee het. Gebruik daarna die Shell Script wat ek saam met u sertifikate en Rest API -eindpunt van IoT gegee het.

# stop script op foutstel -e # Kyk of root CA -lêer bestaan, laai af, indien nie [! -f./root-CA.crt]; druk dan af "\ nDownload AWS IoT Root CA-sertifikaat van AWS … / n" krul https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # installeer AWS Device SDK vir Python as dit nie reeds geïnstalleer is nie as [! -d./aws-iot-device-sdk-python]; print dan "\ nInstallering van AWS SDK … / n" git kloon https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py installeer popd fi

# voer die pub/sub -voorbeeldprogram uit met behulp van sertifikate wat in die pakket afgelaai is

printf "\ nLoop pub/submonstertoepassing … / n" python dk/AlexaDroneControl.py -verbind 127.0.0.1:14550 -e "Your IoT ARN" -r root -CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

Dit werk nie vir almal nie, aangesien die name anders is. In plaas daarvan dat die sleutels wat ek gebruik het, vervang word deur u sleutelname wanneer u die lêer oordra. Maak seker dat u dk verlaat voordat u die lêer oordra! Dit behoort vir eers al te wees wat u hoef te doen.

3. Bou jou Alexa -vaardigheid

Hierdie stap lyk baie moeiliker as wat dit werklik is. Eerstens moet ons by die Alexa Developer -konsole aanmeld. Druk dan op die skepvaardigheid. As u vra om 'n model vir u vaardigheid te kies, klik dan op die pasgemaakte. As u vra om 'n metode te kies, klik dan op u eie. U kan dit noem wat u wil. Geen sjabloon is nodig nie, dus kies om van voor af te begin. Nadat u u vaardigheid geskep het, moet u op die vaardigheidsbouwer -skerm aankom met 'n kontrolelys aan die regterkant. Van hier af kan ons ons vaardigheid begin bou. Eerste op die kontrolelys is die aanroepingsnaam. Dit is wat u vir Alexa sal sê om u vaardigheid aan te wakker. Vir my het ek my aanroepnaam net as 'n drone gestel. Nou kan ons na ons voornemens, uitsprake en slots gaan. Hier kan u opdragte vir die drone maak, soos om 1 meter op te gaan of regs of af te gaan. Myne werk vir eers net met een meter. U kan onderaan die linkerpaneel op die JSON Editor klik. U kan dan die volgende kode daarin plak.

Nadat u die kode in die JSON Editor geplak het, kan u op die derde stap van die kontrolelys klik, en dit sal u interaksiemodel vir u opstel. Met hierdie stap is u vir eers klaar. U kan die eindpuntgleuf vir eers leeg laat!

Stap 4: Bou u Lambda -funksie

Hierdie stap is nou een wat u self sal moet uitvind. Ek sal u vertel hoe u dit aan die Alexa Skill kan koppel, maar u moet dit self kodeer. Gaan dus eers na die AWS -bestuurskonsole. Gaan dan na Lambda. U kan dan 'n funksie skep wat dit noem wat u wil. Maak seker dat u dit van nuuts af skryf, en maak die tydsduur wat u ook al wil. Ek het Node.js. Om die Alexa Skill by te voeg, voeg 'n sneller by en kies Alexa Skills Kit (ASK). Kopieer u Lambda ARN en gaan terug na die Alexa Skill. Gaan nou na die eindpunt. U kan u ARN plak, 'n nuwe model stoor en 'n nuwe model bou. Neem dan die Alexa Skill ID en plak dit in die snellerafdeling waar dit u op die Lambda vra. Blaai dan af op die Lambda en vind die basiese instellings en maak die time -out 10 sekondes. Nou is dit aan u om die kode uit te vind. Vir wenke, kan u die onderstaande webwerwe gebruik.

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

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

en u kan die lêer wat ek aangeheg het, gebruik, maar dit is onvolledig en sal nie werk nie.

/ *** Beheer u APM / Pixhawk -quadcopter met u stem met Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // hierdie toestel is regtig die beheerder 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 kliënt = null; // Lei die inkomende versoek op grond van tipe (LaunchRequest, IntentRequest, ens.) Die JSON -liggaam van die versoek word in die gebeurtenisparameter verskaf. exports.handler = funksie (gebeurtenis, konteks) {probeer {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = konteks; if (event.session.application.applicationId! == app_id) {ctx.fail ("Ongeldige aansoek -ID"); } kliënt = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Connected to AWS IoT"); // terugbel ();});

as (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } anders if (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } anders if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx.succeed (); }} catch (e) {console.log ("UITSONDERING in hanteerder:" + e); ctx.fail ("Uitsondering:" + e); }}; /*** Bel wanneer die sessie begin. */ function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Gebel wanneer die gebruiker die vaardigheid bekendstel sonder om te spesifiseer wat hy wil hê. */ function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Stuur na die bekendstelling van u vaardigheid. getWelcomeResponse (terugbel); } /*** Gebel wanneer die gebruiker 'n bedoeling vir hierdie vaardigheid spesifiseer. */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 terugbel = null; // Stuur na u vaardigheidshanteerders as ("GoIntent" === intentionName) {doGoIntent (bedoeling, sessie); } anders as ("CommandIntent" === intentionName) {doCommandIntent (bedoeling, sessie); } anders as ("TurnIntent" === intentionName) {doTurnIntent (bedoeling, sessie); } anders as ("HelpIntent" === intentionName) {getWelcomeResponse (); } anders {gooi "Ongeldige bedoeling"; }} /*** Bel as die gebruiker die sessie beëindig. * Word nie geroep as die vaardigheid terugkeer shouldEndSession = true. */ function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Voeg opruimingslogika hier by} // --------------- Funksies wat die vaardigheid se gedrag beheer -------------------- --- funksie getWelcomeResponse () {// As ons die sessie wil inisialiseer met 'n paar kenmerke, kan ons dit hier byvoeg. var sessionAttributes = {}; var cardTitle = "Welkom"; var speechOutput = "Welkom by die DRONE CONTROL."; // TODO: is drone aanlyn of vanlyn? As dit aanlyn is, is dit GEWAPEN? var repromptText = "Drone gereed vir opdrag."; var shouldEndSession = vals; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } /*** hanteer GO -voorneme. */ function doGoIntent (bedoeling, sessie, terugbel) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = vals; var speechOutput = ""; var direction = intention.slots. Direction.value; var distance = intention.slots. Distance.value; var unit = intention.slots. Unit.value; var validDirections = ["vorentoe", "vorentoe", "agteruit", "agter", "regs", "links", "op", "af", "reguit", "vorentoe", "reguit vorentoe"]; var validUnits = ["voet", "voet", "meter", "meter", "werf", "meter"]; repromptText = "Vertel my hoe ver ek moet gaan en in watter rigting."; var fail = false; // bekragtig insette as (! (parseInt (afstand)> = 1)) {speechOutput = "Ek kon nie die afstand verstaan wat u wil hê ek moet aflê nie."; misluk = waar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Ek kon nie verstaan in watter rigting u wil gaan nie."; misluk = waar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (eenheid) == -1) {speechOutput = "Ek kon nie verstaan watter eenheid u wil hê ek moet reis nie."; misluk = waar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } as (! misluk) {var cardTitle = "Drone going" + direction + "" + distance + "" + unit; speechOutput = "Gaan" + rigting + "" + afstand + "" + eenheid; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funksie doCommandIntent (bedoeling, sessie, terugbel) {

// var cardTitle = "Drone OPDRAG …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = vals; var speechOutput = ""; repromptText = "Vertel my wat die opdrag vir die hommeltuig is."; var task = intention.slots. Task.value; var validTasks = ["launch", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "abort"]; if (validTasks.indexOf (taak) == -1) {speechOutput = "Ek kon die opdrag nie verstaan nie."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } anders {var cardTitle = "Drone -opdrag uitvoer" + taak; speechOutput = "Opdrag uitvoer" + taak; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funksie doTurnIntent (bedoeling, sessie, terugbel) {

// var cardTitle = "Drone draai …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = vals; var speechOutput = ""; repromptText = "Vertel my hoe u die hommeltuig wil draai."; var direction = intention.slots. Direction.value; var validDirections = ["regs", "links", "rond"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Ek kon nie die rigting van die draai verstaan nie."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } anders {var cardTitle = "Drone draai" + rigting; speechOutput = "Draai" + rigting; mqttPublish (intention, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

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

{var strIntent = JSON.stringify (bedoeling); 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 - dink dit is suksesvol gedoen."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("fout", (funksie (err, toegestaan) {console.log ("MQTT KLIENTE FOUT !!" + err);})); }

// --------------- Helpers wat al die antwoorde bou -----------------------

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}} funksie buildResponse (sessionAttributes, speechletResponse) {return {version: "1.0", sessionAttributes: sessionAttributes, response: speechletResponse}}

Aanbeveel: