Turinys:

„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS: 6 žingsniai (su nuotraukomis)
„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS: 6 žingsniai (su nuotraukomis)

Video: „Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS: 6 žingsniai (su nuotraukomis)

Video: „Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS: 6 žingsniai (su nuotraukomis)
Video: Siurblys Elektrolux i9 ir valdymas balsu su Alexa, JUNG Vilnius biure 2024, Liepa
Anonim
Image
Image
„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS
„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS
„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS
„Alexa“balsu valdomas „Raspberry Pi“dronas su IoT ir AWS

Sveiki! Mano vardas Armaanas. Aš esu 13 metų berniukas iš Masačusetso. Ši pamoka parodo, kaip galite daryti išvadą iš pavadinimo, kaip sukurti „Raspberry Pi“droną. Šis prototipas parodo, kaip bepiločiai orlaiviai vystosi, ir kokį didelį vaidmenį jie gali atlikti ateityje. Aš tikrai matau save pabudusį po 10 metų ir prašau drono, kad jis man parūpintų pusryčių. Dronas paleidžia „Amazon Alexa“, „Amazon Web Services“, „IoT“(daiktų internetas) ir, svarbiausia, „Raspberry Pi“. Jis skirtas demonstruoti ir informuoti apie dronus ir kaip jie tobulėja kiekvieną dieną. Tikimės, kad jums pasiseks ir sužinosite apie dronus. Sėkmės ir ačiū, kad skaitote. -Armanas

Prekės

Norint sukurti prototipą, reikia įvairių aparatinės ir programinės įrangos poreikių. Aš panaudojau „The Drone Dojo“internetinę pamoką, kad galėčiau sukurti droną ir integruoti išvardytas technologijas. Drono dalių sąrašą rasite čia:

Drono dalių sąrašas

Programinės įrangos reikalavimai:

  • „Amazon“žiniatinklio paslaugos
  • Nešiojamasis kompiuteris
  • Misijos planavimo programinė įranga
  • Balena Etcher
  • „MicroSD“kortelę su „Raspbian“failu rasite čia
  • „Amazon Alexa“, fizinė ar virtuali

1 žingsnis: dalių surinkimas ir supratimas

Dalių surinkimas ir supratimas
Dalių surinkimas ir supratimas

Kiekviena tiekimo sąraše paminėta dalis yra būtina, taip pat aiškus kiekvienos dalies supratimas. Galite rasti dalių internete ir surinkę tęsti skaitymą. „Drone Dojo“grojaraštį, skirtą visapusiškai suprasti dalis, rasite čia. 4 minučių paaiškinimą mano „YouTube“kanale rasite čia. Kalbant apie dronus, vienintelės dalys, nepaisant to, ką dauguma žmonių galvoja, yra ne tik varikliai ir sraigtai. Žemiau yra pagrindiniai kiekvienos dalies tikslai.

„Raspberry Pi“su „Emlid Navio2“

Ši dalis yra beveik centrinis procesorius ir pagrindinis drono taškas. „Raspberry Pi“veikia kaip kompiuterio centrinis procesorius, kuris siunčia komandas „Navio2“, kad jos būtų vykdomos per PWM (impulso pločio moduliacijos signalus) į kitas drono dalis.

2. ESC (elektroniniai greičio reguliatoriai)

Šios geltonos dalys yra po rėmu. Jie yra 4 prijungti prie „Navio“, po vieną kiekvienam varikliui. Gavę PWM signalus, jie sukasi varikliais ir pradeda skristi.

3. Varikliai

Varikliams nereikia per daug aiškinti, nes tikriausiai esate su jais susipažinę. Jie sukioja ir suka sraigtus, kad sukurtų trauką.

4. Sraigtai

Sraigtai sukuria trauką dronui skristi. Jie sukasi ta pačia kryptimi kaip ir varikliai, kad pakeltų transporto priemonę.

5. Baterijos ir maitinimo modulis

„LiPo“baterija maitina visą droną per rėmą, naudodama maitinimo modulį. Tai suteikia maždaug 15-20 minučių skrydžio laiko ir veikia kaip energijos šaltinis.

6. GPS

GPS palaiko ryšį su palydovais, kad nustatytų drono padėtį. Jis nustato aukštį, platumą ir ilgumą. Jis gali būti naudojamas geografinei tvorai, kelio taškams, taip pat judėti į tam tikras pozicijas ar kryptis.

7. Telemetrijos modulis

Telemetrijos modulis jungia mūsų droną prie antžeminio valdymo stoties, mūsų atveju - misijos planavimo priemonės, kuri turi būti stebima.

8. RC valdiklis ir modulis kartu su PPM koduotuvu

RC valdiklis naudoja radiją signalams ir komandoms perduoti į RC modulį, kad rankiniu būdu valdytų droną. PPM kodavimo priemonė išverčia šiuos signalus, kad „Navio + RPI“galėtų juos apdoroti ir vykdyti.

9. Rėmas

Šis raudonas ir baltas rėmas veikia kaip pagrindas ar platforma kitoms dalims, kurias reikia įdėti. Rėmas yra aerodinaminis ir lengvas, todėl puikiai tinka mūsų bepiločiams orlaiviams.

Dabar, žinodami kiekvieną dalį, pagaliau galime sukurti droną! Pirmyn prie kito žingsnio!

2 žingsnis: drono surinkimas

Drono surinkimas
Drono surinkimas

Šis žingsnis turbūt yra pats sunkiausias fizinių pastangų požiūriu. Aš rekomenduoju turėti kitą asmenį pagalbos arba pabandyti pasinaudoti pagalbos ranka dalių sąraše. Procesas yra per ilgas, kad jį būtų galima parodyti, todėl pateiksiu kitą nuorodą, kurią naudoju „The Drone Dojo“.

„Raspberry Pi“drono kūrimas

Vėlgi, nesileisiu per daug į detales, tik pabrėšiu kiekvieno žingsnio pagrindus.

1. Sutvarkykite savo reikmenis - surinkite mūsų medžiagas ir įsitikinkite, kad jos yra lengvai prieinamos

2. Suplanuokite savo konstrukciją - sutvarkykite savo dalis ant rėmo, kad suplanuotumėte tai, ką sukursite

3. Litavimo darbai - tai darbas, kurį šiek tiek sunku atlikti vienam. Turite lituoti auksines kulkos jungtis, pridedamas prie variklių, prie ESC. Tada turite paimti apatinę rėmo dalį ir lituoti ESC prie apatinio rėmo arba maitinimo paskirstymo plokštės. Akumuliatoriaus modulis taip pat bus prilituotas prie maitinimo paskirstymo plokštės

4. Rėmo nustatymas - Tada turite prisukti viršutinę rėmo dalį kartu su rankomis. Tada galite pritvirtinti „Raspberry Pi“ant viršaus bet kokiu būdu. (Aš naudoju lipnią juostą). Tada galite pritvirtinti ESC prie rankų užtrauktukais. Dabar mes beveik baigėme.

5. RC valdiklio susiejimas su imtuvu - Pabandykite sekti aukščiau esančio grojaraščio instrukcijas, kad susietumėte RC valdiklį naudodami ESC.

6. Galutinės rėmo dalys - telemetrijos modulio lipni juosta arba dirželis ant rėmo. Taip pat priklijuokite PPM koduotuvą prie rankos. Dabar galite prijungti ESC ir PPM kodavimo įrenginį prie „Navio“.

7. GPS laikiklis + baterija - Surinkite GPS laikiklį su įvairiais varžtais ir detalėmis. Naudodami užtrauktukus, pritvirtinkite GPS prie rėmo. Aš nebūtinai naudoju GPS laikiklį dėl jo trapumo, bet tai priklauso nuo jūsų. Tada galite įdėti bateriją tarp „Power Dist. Lenta. Pririšau ir priklijavau maitinimo modulį prie rėmo. Dabar jūsų aparatinė įranga yra beveik paruošta. Dabar apie dalį, kurios laukėme!

8. Propelerių montavimas !!! - Priveržkite sraigtus naudodami grojaraštyje nurodytą diagramą. Tada galite prijungti ESC prie variklių ir mes pagaliau baigėme kurti droną.

Toliau programinė įranga, todėl pirmyn!

3 veiksmas: Raspberry Pi ir GCS konfigūravimas (misijos planavimo priemonė)

Raspberry Pi ir GCS konfigūravimas (misijos planuotojas)
Raspberry Pi ir GCS konfigūravimas (misijos planuotojas)

Vėlgi, išsamesnių instrukcijų galite rasti grojaraštyje nuo paskutinio veiksmo. Tačiau tikriausiai žinote, kaip nustatyti „RasPi“. Bet šį kartą tai darome be galvos. Naudokite „Balena Etcher“, kad įrašytumėte OS iš „Navio OS“svetainės į „MicroSD“kortelę. Kol jis prijungtas prie kompiuterio, eikite į „wpa“prašytoją naudodami užrašų knygelę ++. Po to įveskite ssid ir slaptažodį, kad „Raspberry Pi“prisijungtų prie „WiFi“. Tada turite pridėti failą, pavadintą SSH. Tai galima padaryti naudojant komandinę eilutę arba kitą metodą. Dabar galime SSH. Galite naudoti komandų eilutę arba „Putty“. Aš naudoju komandų eilutę ir įvedžiau „ssh pi@navio“, kad prisijungčiau savo atveju, arba taip galite rasti IP adresą ir ssh. Prisijungę naudokite šį vaizdo įrašą „Navio“nustatymui ir konfigūravimui. Norėdami nustatyti telemetriją, pirmiausia turite redaguoti „Raspberry Pi“. Atlikite tai, kad redaguotumėte, ir pabandykite prisijungti prie „Mission Planner“. Jei telemetrija neveikia, galite anuliuoti redagavimą ir prisijungti naudodami UDB ryšį, įvesdami savo GCS (Ground Control Station, pavyzdžiui, nešiojamojo kompiuterio) IP. Prisijungę prie „Mission Planner“, galite naudoti sąrankos vedlį, kad sukalibruotumėte visas drono dalis. Jei jums reikia pagalbos, dar kartą peržiūrėkite grojaraštį. Paprastai, kai nustatote, beveik visada būna klaida. Trikčių šalinimas yra viena didžiausių šio projekto dalių. Aš tikrai negaliu jums padėti, nes nežinau jūsų klaidų, tačiau daugumą klaidų galima ištaisyti naudojant internetą. Kai viskas bus paruošta, tada dronas bus paruoštas skristi! RC valdiklį ir skrydžio režimus galite nustatyti naudodami „Mission Planner“. Pabandykite penkias sekundes laikyti kairę lazdą apačioje dešinėje, kad įjungtumėte droną. Nerekomenduoju skristi nežiūrėjus į vadovėlį, nes dronas yra labai trapus ir lengvai sulaužomas. Man pirmą kartą skrendant, sulaužiau GPS laikiklį ir kai kuriuos sraigtus. Jei jums nereikia valdymo balsu, galite sustoti čia. Norėdami sužinoti apie AWS ir drono programavimą, tęskite!

4 žingsnis: užprogramuokite droną skristi naudojant „Python“

Drono programavimas skristi naudojant „Python“
Drono programavimas skristi naudojant „Python“

Prieš pradėdami naudotis AWS, pirmiausia turėtume suprasti, kaip užprogramuoti droną skristi. Po pradinės sąrankos valdymo balsu integravimas neturėtų būti per sunkus. Pirmas dalykas, kurį galime pabandyti suvokti, yra paprastos kilimo ir nusileidimo programos sudarymas. Nustatę „Raspberry Pi“, vėl galime į jį įjungti SSH. Galite dar kartą pažvelgti į grojaraštį arba vykdyti mano nurodymus.

1. Pirmiausia atsisiųskime „ArduPilot“šaltinio kodą „Raspberry Pi“kataloge

mkdir src

Tada gaukite failus iš „GitHub“naudodami „git“kloną

git clone -b Copter -3.6.11

Dabar pereikime prie /src /ardupilot

cd src

cd ardupilot

Dabar inicijuokime šaltinio failus

git submodulio atnaujinimas -init -rekursyvus

2. Toliau turime surinkti „Raspberry Pi“programinę įrangą

Prieš atlikdami kitus veiksmus, būtinai eikite į/src/ardupilot/su cd

Tada konfigūruoti specialiai „Navio“naudojant

./waf configure -lenta = navio2

Tada galite sudaryti su

./waf -nukreipia į šiukšliadėžę/arducopterį

3. Dabar galime įdiegti „Navio“šaltinio kodą

Pirmiausia leiskite pereiti į tinkamą katalogą.

cd/etc/systemd/system

Tada redaguokite failą

sudo vi arducopter.paslauga

Ten, kur sakoma „ExecStart“, vietoj to, kas jau yra, įterpkite šį

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

Dabar, norėdami įgyvendinti ardupilot šaltinio kodą, galime naudoti

sudo systemctl demonas iš naujo

Tada galime pradėti iš naujo

sudo systemctl iš naujo paleiskite arducopterį

Paskutiniame etape mes pagaliau baigėme „ArduPilot“nustatymą mūsų drone

4. „DroneKit“diegimas

„DroneKit“yra programinė įranga, kurią naudosime užprogramuodami droną skristi. Norėdami suprasti kai kuriuos kodus, dokumentus rasite čia. Prieš rašydami scenarijų, pirmiausia turime įdiegti paketą savo drone.

Python paketą galime įdiegti su

pip install dronekit == 2.9.1

Tai gali būti naujausia versija, bet ne ta, kurią naudojau, kad galėčiau padėti išspręsti triktis.

Norėdami patikrinti, ar įdiegta, galime atlikti a

pip užšaldyti | grep dronekit

Dabar pagaliau esame pasiruošę sukurti savo pirmąjį „python“scenarijų

5. kilimas_ir_land.py

ĮSPĖJIMAS! Siūlau sukurti pagrindinį „python“supratimą, kad galėtumėte išmokti ir suprasti kodą. Jei norite patys parašyti programą, sekite šį vaizdo įrašą.

## Pirmiausia nesukurkime katalogo, kuriame būtų saugomas šis kodas

cd dk ## Jei norite tai padaryti patys, naudokite vi takeoff_and_land.py ##, kad sukurtumėte programą

Priešingu atveju galite pažvelgti arba naudoti pridėtą failą ir naudoti failų perdavimo protokolą. Vėliau galime išbandyti šią programą. Pirmiausia reikia paaiškinti, kad tai yra „python“failas, kurį turime naudoti

chmod +x kilimas_ir_land.py

Tada paleiskite naudodami šį kodą

python takeoff_and_land.py -Connect 127.0.0.1:14550

Pirmą kartą man taip pat nepavyko. Jei yra nuorodos skirtasis laikas, nesijaudinkite, kad galite ką nors padaryti. Atidarykite kitą raginimą ir ssh. Galite pabandyti įdiegti „mavproxy“ir paleisti. Po to galite paleisti abu vienu metu. Tai turėtų padėti prijungti droną. Kai tai bus padaryta, turiu jums iššūkį. Pabandykite išsiaiškinti, ką daro kita programa (set_velocity_body.py) ir kaip priversti ją veikti. Jei darai, geras darbas.

6. Pirmyn!

Dabar mes galime panaudoti šias žinias, kad mūsų dronas būtų valdomas balsu. „Alexa“bepiločių orlaivių valdymas naudoja daug šių funkcijų ir dar daugiau. Sėkmės ir pirmyn!

5 veiksmas: „Amazon Alexa“ir „Amazon Web Services“naudojimas balso valdymui integruoti

„Amazon Alexa“ir „Amazon Web Services“naudojimas balso valdymui integruoti
„Amazon Alexa“ir „Amazon Web Services“naudojimas balso valdymui integruoti
„Amazon Alexa“ir „Amazon Web Services“naudojimas balso valdymui integruoti
„Amazon Alexa“ir „Amazon Web Services“naudojimas balso valdymui integruoti

Šis žingsnis yra vienas iš mažiau dokumentuotų. Tai reiškia, kad ją pašalinti bus sunkiausia. Tik pradėjus dirbti man prireikė maždaug mėnesio, o gal ir daugiau. Svarbiausia čia būti kantriam. Ši funkcija, jei ji įgyvendinama realiame gyvenime, gali pakeisti gyvenimą. Galite tiesiog pasakyti „Alexa“, kad ji pirktų jums maisto produktus, o ne eitų pati. Įsivaizduok tai! Taigi, nesivaržydami, įsitraukime į tai!

1. Raspberry Pi registravimas kaip dalykas AWS IoT

Norint naudotis daiktų internetu (daiktų internetu), mums reikia kažko. Taigi, norėdami pirmiausia naudoti „AWS IoT“, turime prisijungti prie „AWS Console“. Tada eikite į „IoT Core“. Kai būsite ten, turėtumėte spustelėti Tvarkyti ir tada sukurti daiktą. Pridėjus pavadinimą, norint prisijungti, mums reikia sertifikato. Rekomenduočiau spustelėti vieno paspaudimo sertifikatą. Tada, pamatę sertifikato ekraną, būtinai atsisiųskite kiekvieną raktą, įskaitant pagrindinę CA. Tada galite eiti ir užbaigti daikto kūrimą. Toliau turime sukurti politiką. Grįžkite į „IoT Core“. Tada spustelėkite saugų ir spustelėkite politiką. Tada spustelėkite „Sukurti politiką“. Tada galite sukurti pavadinimą ir pridėti išteklių. Atlikdami veiksmą, įveskite iot * ir * pagal išteklių ir paspauskite leisti efektą. Tada grįžkite prie savo daikto ir eikite į savo pažymėjimą. Kai būsite čia, spustelėkite politiką. Tada galite pridėti savo politiką ir viskas yra paruošta!

2. „Raspberry Pi“kodo nustatymas ir sąveika su „IoT“

Šiai daliai failų perkėlimui jums reikės SFTP kliento (aš naudojau „WinSCP“). Prisijungę prie „Raspberry Pi“, turėsime turėti sertifikato raktus. Pagrindinius failus turite perkelti į „Raspberry Pi“. Taip pat turėtumėte įdiegti „AWSIoTPythonSDK“į „Raspberry Pi“. Tada eikite į „Raspberry Pi“katalogą „dk“. Jūs naudojate „Alexa Drone Control“failą, kurį daviau bendravimui su „IoT“. Norėdami naudoti šį failą, pradėjau naudoti „Shell“scenarijų. Toliau parodysiu kodą, nes dėl kokių nors priežasčių negaliu įkelti failo. Jei bandydama programa nepriima pranešimų iš AWS IoT, nesijaudinkite! Tai gali būti mano kaltė, nes „Alexa“drono valdymo failas gali neatitikti jūsų. Taigi, norėdami tai išspręsti, grįžkite į „AWS IoT“ir kairiajame skydelyje spustelėkite „Mokytis“. Vykdykite instrukcijas ir gali tekti paleisti iš naujo. Atsiprašau dėl to. Kai jūsų „IoT“pradės dirbti su „RasPi“programa, galite integruoti „dronekit“kodą iš mano duoto „Alexa Drone Control“failo. Po to naudokite „Shell“scenarijų, kurį daviau su savo sertifikatais ir „Rest API Endpoint“iš „IoT“.

# stop scenarijus klaidų rinkinyje -e # Patikrinkite, ar egzistuoja šakninis CA failas, atsisiųskite, jei ne, jei [! -f./root-CA.crt]; tada printf "\ nAWS IoT Root CA sertifikato atsisiuntimas iš AWS … / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # įdiegti „AWS Device SDK for Python“, jei dar neįdiegta jei [! -d./aws-iot-device-sdk-python]; tada printf "\ nAWS SDK diegimas … / n" git klonas https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py įdiegti popd fi

# paleiskite pub/sub mėginio programą naudodami pakete atsisiųstus sertifikatus

printf "\ nVykdoma pub/sub pavyzdinė programa… / 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“

Tai neveiks jums visiems, nes vardai yra skirtingi. Perkeldami failą, vietoj naudojamų raktų pakeiskite raktų pavadinimais. Prieš perkeldami failą būtinai išeikite iš dk! Tai turėtų būti viskas, ką turite padaryti dabar.

3. „Alexa Skill“kūrimas

Šis žingsnis atrodo daug sunkesnis, nei yra iš tikrųjų. Pirmiausia turime prisijungti prie „Alexa Developer“pulto. Tada tiesiog paspauskite sukurti įgūdžius. Kai jis prašo pasirinkti savo įgūdžių modelį, tiesiog paspauskite pasirinktinį. Kai jis prašo pasirinkti metodą, paspauskite nuostatą savo. Galite jį pavadinti, kaip norite. Šablono nereikia, todėl pasirinkite pradėti nuo nulio. Tada, sukūrę savo įgūdžius, turėtumėte patekti į įgūdžių kūrėjo ekraną su kontroliniu sąrašu dešinėje. Nuo čia mes galime pradėti tobulinti savo įgūdžius. Pirmasis kontroliniame sąraše yra pašaukimo pavadinimas. Štai ką jūs liepsite Alexai remtis jūsų įgūdžiais. Aš tiesiog įvedžiau savo šaukimo vardą kaip droną. Dabar galime pereiti prie savo ketinimų, posakių ir laiko tarpsnių. Čia galite atlikti bepiločio orlaivio komandas, pvz., Pakilti 1 metrą aukštyn arba eiti dešinėn arba žemyn. Manasis iš tikrųjų veikia tik su vienu metru. Galite spustelėti JSON redaktorių kairiojo skydelio apačioje. Tada į jį galite įklijuoti šį kodą.

Įklijavę kodą į JSON redaktorių, galite spustelėti trečiąjį kontrolinio sąrašo veiksmą ir jis sukurs jūsų sąveikos modelį. Šiuo žingsniu jūs būsite baigtas. Galutinio taško angą kol kas galite palikti tuščią!

4 žingsnis: sukurkite „Lambda“funkciją

Dabar šis žingsnis yra tas, kurį turėsite išsiaiškinti patys. Aš jums pasakysiu, kaip jį prijungti prie „Alexa Skill“, tačiau turėsite jį koduoti patys. Taigi, pirmiausia eikite į AWS valdymo pultą. Tada eikite į „Lambda“. Tada galite sukurti funkciją, pavadindami ją kuo tik norite. Būtinai parašykite jį nuo nulio ir vykdykite bet kokią norimą programavimo kalbą. Naudojau Node.js. Norėdami pridėti „Alexa Skill“, pridėkite aktyviklį ir pasirinkite „Alexa Skills Kit“(ASK). Nukopijuokite „Lambda ARN“ir grįžkite prie „Alexa Skill“. Dabar eikite į galutinį tašką. Galite įklijuoti savo ARN, išsaugoti ir sukurti naują modelį. Tada paimkite „Alexa Skill“ID ir įklijuokite jį į trigerio skiltį, kurioje jūsų prašoma „Lambda“. Tada slinkite žemyn „Lambda“ir suraskite pagrindinius nustatymus ir nustatykite skirtąjį laiką 10 sekundžių. Dabar jūs turite išsiaiškinti kodą. Norėdami gauti patarimų, galite apsilankyti žemiau esančiose svetainėse.

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

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

ir jūs galite naudoti mano pridėtą failą, tačiau jis yra neišsamus ir neveiks.

/ *** Valdykite savo APM / Pixhawk kvadrakopterį balsu naudodami „Amazon Alexa“, „Lambda“, 2 metrikos MQTT.*/ var awsIot = reikalauti ('aws-iot-device-sdk'); var config = reikalauti ("./ config"); var deviceName = "EchoDroneControl"; // šis įrenginys tikrai yra valdiklis var mqtt_config = {"keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, // + "-Lambda-" + (nauja data (). getTime ()), "region": "us-east-1", "debug": true}; var ctx = null; var klientas = null; // Maršrutuokite gaunamą užklausą pagal tipą (LaunchRequest, IntentRequest ir kt.) JSON užklausos turinys pateikiamas įvykio parametre. export.handler = funkcija (įvykis, kontekstas) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = kontekstas; if (event.session.application.applicationId! == app_id) {ctx.fail („Netinkamas programos ID“); } klientas = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Prisijungta prie AWS IoT"); // callback ();});

if (event.session.new) {

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.sėkmė (); }} catch (e) {console.log ("EXCEPTION in handler:" + e); ctx.fail ("Išimtis:" + e); }}; /*** Skambinama prasidėjus sesijai. */ function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Skambinama, kai vartotojas įgyja įgūdžių nenurodydamas, ko nori. */ function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Išsiuntimas į jūsų įgūdžių paleidimą. getWelcomeResponse (atgalinis skambutis); } /*** Skambinama, kai vartotojas nurodo šio įgūdžio tikslą. */function onIntent (intentRequest, session) {//, callback) {console.log ("onIntent requestId =" + aimRequest.requestId + ", sessionId =" + session.sessionId); var intencija = ketinimų prašymas.intentas, ketinimų pavadinimas = ketinimų užklausa.intentų_pavadinimas; console.log ("REQUEST to string =" + JSON.stringify (aimRequest)); var callback = null; // Nusiųskite savo įgūdžių ketinimų tvarkytojams, jei ("GoIntent" === ketinimų pavadinimas) {doGoIntent (ketinimas, sesija); } else if ("CommandIntent" === aimName) {doCommandIntent (ketinimas, seansas); } else if ("TurnIntent" === aimName) {doTurnIntent (ketinimas, seansas); } else if ("HelpIntent" === aimName) {getWelcomeResponse (); } else {thro "Netinkamas ketinimas"; }} /*** Skambinama, kai vartotojas baigia seansą. * Nešaukiamas, kai įgūdis grįžta shouldEndSession = true. */ function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Čia pridėkite valymo logiką} // --------------- Funkcijos, valdančios įgūdžių elgesį -------------------- --- function getWelcomeResponse () {// Jei norėtume inicijuoti seansą, kad būtų keletas atributų, galėtume juos pridėti čia. var sessionAttributes = {}; var cardTitle = "Sveiki atvykę"; var speechOutput = "Sveiki atvykę į DRONE CONTROL". // TODO: ar dronas yra prisijungęs ar neprisijungęs? Jei prisijungęs, ar jis yra ginkluotas? var repromptText = "Dronas paruoštas komandai."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } /*** tvarko GO ketinimą. */ function doGoIntent (ketinimas, seansas, atgalinis skambutis) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; var kryptis = ketinimas.slots. Direction.value; var atstumas = ketinimas.slots. Distance.value; var vienetas = ketinimų.slots. Unit.value; var validDirections = ["pirmyn", "pirmyn", "atgal", "atgal", "dešinėn", "kairėn", "aukštyn", "žemyn", "tiesiai", "pirmyn", "tiesiai pirmyn"]; var validUnits = ["pėda", "pėdos", "metras", "metrai", "kiemas", "jardai"]; repromptText = "Pasakyk man, kiek toli eiti ir kokia kryptimi."; var fail = false; // patvirtinti įvestis, jei (! (parseInt (distance)> = 1)) {speechOutput = "Aš negalėjau suprasti atstumo, kurį norite, kad aš nueisiu."; nesėkmė = tiesa; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Aš negalėjau suprasti krypties, kuria norite man keliauti."; nesėkmė = tiesa; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Aš negalėjau suprasti vieneto, kuriuo norite, kad aš keliautų."; nesėkmė = tiesa; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } jei (! nepavyksta) {var cardTitle = "Dronas važiuoja" + kryptis + "" + atstumas + "" + vienetas; speechOutput = "Eina" + kryptis + "" + atstumas + "" + vienetas; mqttPublish (ketinimas, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doCommandIntent (ketinimas, seansas, atgalinis skambutis) {

// var cardTitle = "Drone COMMAND …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Pasakyk man, kokia yra drono komanda."; var užduotis = ketinimas.slots. Task.value; var validTasks = ["paleisti", "nusileisti", "r. t. l.", "sulaikyti", "likti", "sustabdyti", "grįžti į paleidimą", "nutraukti"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Aš negalėjau suprasti komandos."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Vykdoma drono komanda" + užduotis; speechOutput = "Vykdoma komanda" + užduotis; mqttPublish (ketinimas, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

function doTurnIntent (ketinimas, seansas, atgalinis skambutis) {

// var cardTitle = "Drono posūkis …"; var repromptText = null; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Pasakyk man, kaip nori pasukti droną."; var kryptis = ketinimas.slots. Direction.value; var validDirections = ["dešinė", "kairė", "aplink"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Aš negalėjau suprasti posūkio krypties."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Drono posūkis" + kryptis; speechOutput = "Pasukimas" + kryptis; mqttPublish (ketinimas, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funkcija mqttPublish (ketinimas, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession)

{var strIntent = JSON.stringify (ketinimas); 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 - mano, kad tai padaryta sėkmingai."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("klaida", (funkcija (klaida, suteikta) {console.log ("MQTT CLIENT ERROR !!" + err);})); }

// --------------- Pagalbininkai, kuriantys visus atsakymus -----------------------

function buildSpeechletResponse (title, output, repromptText, shouldEndSession) {return {outputSpeech: {type: "PlainText", text: output}, kortelė: {type: "Simple", title: title, content: output}, reprompt: {outputSpeech: {type: "PlainText";

Rekomenduojamas: