Cuprins:

Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS: 6 pași (cu imagini)
Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS: 6 pași (cu imagini)

Video: Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS: 6 pași (cu imagini)

Video: Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS: 6 pași (cu imagini)
Video: Ce este Micro:bit? 2024, Iulie
Anonim
Image
Image
Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS
Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS
Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS
Dronă Raspberry Pi controlată vocală Alexa cu IoT și AWS

Salut! Numele meu este Armaan. Sunt un băiat de 13 ani din Massachusetts. Acest tutorial arată, după cum puteți deduce din titlu, cum să construiți o dronă Raspberry Pi. Acest prototip demonstrează evoluția dronelor și, de asemenea, cât de important ar putea juca în viitor. Cu siguranță mă văd trezindu-mă peste 10 ani și cerând unei drone să ia micul dejun pentru mine. Drona folosește Amazon Alexa, Amazon Web Services, IoT (Internet of Things) și, cel mai important, un Raspberry Pi pentru a rula. Este menit să demonstreze și să informeze despre dronele și modul în care acestea se îmbunătățesc în fiecare zi. Sperăm că veți avea succes și veți afla despre drone în acest proces. Mult noroc și mulțumesc pentru lectură. -Armaan

Provizii

Pentru a construi prototipul există diverse necesități hardware și software. Am folosit un tutorial online de la Drone Dojo pentru a construi drona și am integrat tehnologiile enumerate. Pentru dronă puteți găsi lista pieselor chiar aici:

Lista pieselor dronelor

Cerințe software:

  • Servicii Web Amazon
  • Un laptop
  • Software pentru planificarea misiunii
  • Balena Etcher
  • Card MicroSD cu fișier Raspbian găsit aici
  • Amazon Alexa, fizic sau virtual

Pasul 1: Adunarea și înțelegerea părților

Adunarea și înțelegerea părților
Adunarea și înțelegerea părților

Fiecare parte menționată în lista de aprovizionare este necesară, la fel și o înțelegere clară a fiecărei părți. Puteți găsi piesele online și odată strânse, continuați să citiți. O listă de redare de la The Drone Dojo pentru o înțelegere completă a părților poate fi găsită aici. O explicație de 4 minute pe canalul meu YouTube poate fi găsită aici. Când vine vorba de drone, singurele piese, în ciuda a ceea ce cred majoritatea oamenilor, nu sunt doar motoare și elice. Mai jos sunt scopurile de bază ale fiecărei părți.

Raspberry Pi cu Emlid Navio2

Această parte este destul de mult un procesor central și punctul principal al dronei. Raspberry Pi acționează ca CPU-ul unui computer care trimite comenzi către Navio2 pentru a executa prin PWM (Pulse Width Modulation Signals) către alte părți ale dronei

2. ESC (Controlere electronice de viteză)

Aceste părți galbene se găsesc sub cadru. Sunt 4 conectate la Navio, câte unul pentru fiecare motor. La primirea semnalelor PWM, acestea rotesc motoarele și încep zborul.

3. Motoare

Motoarele nu au nevoie de prea multe explicații, deoarece probabil că le cunoașteți. Ei rotesc și rotesc elicele pentru a crea împingere.

4. Elice

Elicele creează forță pentru ca drona să zboare. Se rotesc în aceeași direcție ca motoarele pentru a ridica vehiculul.

5. Bateria și modulul de alimentare

Bateria LiPo alimentează întreaga dronă prin cadru utilizând modulul de alimentare. Oferă aproximativ 15-20 de minute de zbor și acționează ca o sursă de energie.

6. GPS-ul

GPS-ul comunică cu sateliții pentru a determina poziția dronei. Determină altitudinea, latitudinea și longitudinea. Poate fi folosit pentru Geofencing, puncte de parcurs și, de asemenea, pentru a muta în anumite poziții sau direcții.

7. Modulul de telemetrie

Modulul de telemetrie conectează drona noastră la o stație de control la sol, în cazul nostru Mission Planner, pentru a fi monitorizată.

8. Controlerul RC și modulul împreună cu codificatorul PPM

Controlerul RC utilizează radio pentru a transmite semnale și comenzi către modulul RC pentru a pilota manual drona. Codificatorul PPM traduce aceste semnale pentru ca Navio + RPI să poată fi procesate și executate.

9. Cadrul

Acest cadru roșu și alb acționează ca bază sau platformă pentru celelalte părți care urmează să fie plasate. Cadrul este aerodinamic și ușor, prin urmare perfect pentru construcția noastră de drone.

Acum, având cunoștințe despre fiecare parte, putem construi în cele din urmă drona! În continuare la următorul pas!

Pasul 2: Asamblarea dronei

Asamblarea Dronei
Asamblarea Dronei

Acest pas este probabil cel mai dificil din punct de vedere al efortului fizic. Vă recomand să aveți o altă persoană pentru ajutor sau să încercați să folosiți mâna de ajutor în lista pieselor. Procesul este prea lung pentru a fi demonstrat aici, așa că voi oferi un alt link pe care l-am folosit de The Drone Dojo.

Construirea unei drone Raspberry Pi

Din nou, deoarece nu voi intra în prea multe detalii, voi evidenția doar elementele de bază ale fiecărui pas.

1. Organizați consumabilele - Adunați materialele noastre și asigurați-vă că acestea sunt ușor accesibile

2. Planifică-ți construcția - Organizează-ți piesele pe cadru pentru a face un plan al ceea ce vei construi

3. Muncă de lipit - Aceasta este munca puțin greu de făcut singură. Trebuie să lipiți conectorii glonți de aur care vin împreună cu motoarele la ESC. Apoi, trebuie să luați partea inferioară a cadrului și să lipiți ESC-urile pe cadrul inferior sau pe placa de distribuție a energiei. Modulul bateriei va fi, de asemenea, lipit pe placa de distribuție a energiei

4. Configurarea cadrului - Apoi trebuie să înșurubați partea superioară a cadrului împreună cu brațele. Apoi puteți atașa Raspberry Pi deasupra oricum doriți. (Am folosit bandă adezivă). Apoi, puteți fixa ESC-ul pe brațe cu fermoare. Acum aproape am terminat.

5. Legarea controlerului RC la receptor - Încercați să urmați instrucțiunile din lista de redare de mai sus pentru a lega controlerul RC folosind un ESC.

6. Finalizarea părților pe cadru - Bandă sau curea de canal pe modulul de telemetrie pe cadru. Conduceți banda cu codul PPM și pe un braț. Acum puteți conecta codificatorul ESC și PPM la Navio.

7. Suport GPS + Baterie - Asamblați Suportul GPS cu diferite șuruburi și piese. Folosind fermoare, atașați GPS-ul la cadru. Nu am folosit neapărat suportul GPS din cauza fragilității sale, dar depinde de tine. Apoi, puteți introduce bateria între Power Dist. Bord. Am legat și am lipit și modulul de alimentare de cadru. Acum hardware-ul dvs. este destul de configurat. Acum pentru partea pe care o așteptăm!

8. Instalarea elicelor !!! - Puteți strânge elicele folosind graficul menționat în lista de redare. Apoi, puteți conecta ESC-urile la motoare și în cele din urmă am terminat de construit drona.

Software-ul urmează, așa mai departe!

Pasul 3: Configurarea Raspberry Pi și GCS (Mission Planner)

Configurarea Raspberry Pi și GCS (Mission Planner)
Configurarea Raspberry Pi și GCS (Mission Planner)

Din nou, puteți găsi instrucțiuni mai detaliate în lista de redare de la ultimul pas. Cu toate acestea, probabil știți cum să configurați RasPi. Dar de data aceasta o facem fără cap. Utilizați Balena Etcher pentru a arde sistemul de operare de pe site-ul web Navio OS pe cardul MicroSD. În timp ce este conectat la computer, accesați solicitantul wpa folosind notepad ++. După aceea, introduceți ssid și parola pentru ca Raspberry Pi să se conecteze la WiFi. Apoi trebuie să adăugați un fișier numit SSH. Acest lucru poate fi prin Linia de comandă sau o altă metodă. Acum putem SSH. Puteți utiliza promptul de comandă sau Putty. Am folosit promptul de comandă și am tastat „ssh pi @ navio” pentru a mă conecta în cazul meu, sau puteți găsi adresa IP și ssh în acest fel. La conectare, utilizați acest videoclip pentru a configura și configura Navio. Pentru a configura telemetria, trebuie mai întâi să faceți o modificare pe Raspberry Pi. Urmați acest lucru pentru a edita și încercați să vă conectați la Planificatorul de misiuni. Dacă telemetria nu funcționează, puteți anula editarea și vă puteți conecta utilizând o conexiune UDB introducând IP-ul GCS (Ground Control Station, cum ar fi laptopul). Odată conectat la Mission Planner, puteți utiliza expertul de configurare pentru a calibra toate părțile dronei. Dacă aveți nevoie de ajutor, consultați din nou lista de redare. De obicei, ori de câte ori vă configurați, există aproape întotdeauna o eroare. Depanarea este una dintre cele mai mari părți ale acestui proiect. Nu vă pot ajuta cu adevărat acolo, deoarece nu sunt conștient de erorile dvs., dar majoritatea erorilor pot fi remediate cu ajutorul internetului. După ce totul este gata, atunci drona este gata să zboare! Puteți configura controlerul RC și modurile de zbor pe Mission Planner. Încercați să țineți bastonul stâng în dreapta jos timp de cinci secunde pentru a înarma drona. Nu recomand zborul fără să te uiți la un tutorial, deoarece drona este foarte fragilă și ușor de rupt. Pentru mine, prima dată când l-am zburat, am rupt suportul GPS și câteva elice. Dacă nu aveți nevoie de control vocal, vă puteți opri aici. Pentru a afla despre AWS și programarea dronei continuați!

Pasul 4: Programarea dronei pentru a zbura cu Python

Programarea Dronei pentru a zbura cu Python
Programarea Dronei pentru a zbura cu Python

Înainte de a intra în AWS, ar trebui să înțelegem mai întâi cum să programăm drona să zboare. După configurarea inițială, integrarea controlului vocal nu ar trebui să fie prea dificilă. Primul lucru pe care îl putem înțelege este realizarea unui program simplu de decolare și aterizare. După configurarea Raspberry Pi, putem introduce SSH din nou. Puteți să vă uitați din nou la lista de redare sau să urmați instrucțiunile mele.

1. Mai întâi să descărcăm codul sursă ArduPilot într-un director de pe Raspberry Pi

mkdir src

Apoi, obțineți fișierele din GitHub folosind git clone

git clone -b Copter-3.6.11

Acum, să navigăm la / src / ardupilot

cd src

cd ardupilot

Acum, să inițializăm fișierele sursă

git submodule update --init --recursive

2. Apoi, trebuie să compilăm firmware-ul de pe Raspberry Pi

Asigurați-vă că navigați la / src / ardupilot / cu cd înainte de a face următorii pași

Apoi pentru a cofigura în mod specific Navio folosind

./waf configure --board = navio2

Apoi puteți compila cu

./waf --targets bin / arducopter

3. Acum putem instala codul sursă pe Navio

Mai întâi permiteți navigarea către directorul potrivit.

cd / etc / systemd / system

Apoi editați fișierul

sudo vi arducopter.service

Unde scrie ExecStart, introduceți următoarele în loc de ceea ce există deja

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

Acum, pentru a pune în funcțiune codul sursă ardupilot, putem folosi

sudo systemctl daemon-reload

Atunci putem reporni cu

sudo systemctl reporniți arducopterul

Cu ultimul pas, am terminat în sfârșit configurarea ArduPilot pe drona noastră

4. Instalarea DroneKit

DroneKit este software-ul pe care îl vom folosi pentru a programa drona să zboare. Pentru a înțelege o parte din cod, puteți găsi documentația aici. Mai întâi trebuie să instalăm pachetul pe drona noastră înainte de a scrie un script.

Putem instala pachetul Python cu

pip install dronekit == 2.9.1

Aceasta poate fi sau nu cea mai nouă versiune, dar este cea pe care am folosit-o, astfel încât să vă pot ajuta cu soluționarea problemelor.

Pentru a verifica dacă este instalat, putem face un

pip freeze | grep dronekit

Acum suntem în sfârșit gata să realizăm primul nostru script python

5. takeoff_and_land.py

AVERTIZARE! Vă sugerez stabilirea unei înțelegeri de bază despre python, astfel încât să puteți învăța și înțelege codul. Dacă doriți să scrieți singur programul, urmați acest videoclip.

## Mai întâi să nu creăm un director pentru a stoca acest cod

cd dk ## Dacă doriți să o faceți singur, utilizați vi takeoff_and_land.py ## pentru a crea un program

În caz contrar, puteți arunca o privire sau puteți utiliza fișierul atașat și puteți utiliza un protocol de transfer de fișiere. Putem încerca acest program ulterior. Mai întâi pentru a clarifica că este un fișier python pe care trebuie să îl folosim

chmod + x takeoff_and_land.py

Apoi, pentru a încerca, utilizați următorul cod pentru a rula

python takeoff_and_land.py --connect 127.0.0.1:14550

Nici prima dată nu a funcționat pentru mine. Dacă există o expirare a legăturii, atunci nu vă faceți griji, puteți face ceva. Deschideți un alt prompt și ssh. Puteți încerca să instalați ceva numit mavproxy și să încercați să îl rulați. După aceea, puteți rula ambele simultan. Acest lucru ar trebui să ajute la conectarea dronei. Odată ce s-a făcut, am o provocare pentru tine. Încercați să aflați ce face celălalt program (set_velocity_body.py) și cum să îl faceți să funcționeze. Dacă o faci, treabă bună.

6. Înainte!

Acum putem folosi aceste cunoștințe pentru a face drona noastră controlată vocal. Controlul dronelor Alexa folosește multe dintre aceste caracteristici și multe altele. Mult succes și mai departe!

Pasul 5: utilizarea Amazon Alexa și a serviciilor web Amazon pentru a integra controlul vocal

Utilizarea serviciilor Amazon Alexa și Amazon Web Services pentru a integra controlul vocal
Utilizarea serviciilor Amazon Alexa și Amazon Web Services pentru a integra controlul vocal
Utilizarea serviciilor Amazon Alexa și Amazon Web Services pentru a integra controlul vocal
Utilizarea serviciilor Amazon Alexa și Amazon Web Services pentru a integra controlul vocal

Acest pas este unul dintre cele mai puțin documentate. Aceasta înseamnă că va fi cel mai greu de depanat. Doar punerea în funcțiune a durat aproximativ o lună, poate mai mult. Cel mai important lucru aici este să ai răbdare. Această caracteristică, dacă este implementată în viața reală, poate schimba viața. Îi poți spune doar lui Alexa să-ți ia alimente pentru tine în loc să te duci singur. Imaginează-ți asta! Așadar, fără alte întrebări, să intrăm!

1. Înregistrarea Raspberry Pi ca lucru pe AWS IoT

Pentru a folosi IoT (Internetul obiectelor), avem nevoie de un lucru. Deci, trebuie să ne conectăm la AWS Console pentru a utiliza AWS IoT mai întâi. Apoi accesați IoT Core. Odată ajuns acolo, ar trebui să faceți clic pe Gestionare și apoi să creați un lucru. După adăugarea unui nume, pentru conectare, avem nevoie de un certificat. Aș recomanda să faceți clic pe certificarea cu un singur clic. Apoi, după ce vedeți ecranul certificatului, asigurați-vă că descărcați fiecare cheie, inclusiv CA rădăcină. Apoi, puteți merge și termina crearea lucrului. În continuare trebuie să creăm o politică. Reveniți la IoT Core. Apoi faceți clic pe securizat și faceți clic pe politici. Apoi apăsați pe creați politica. Apoi puteți crea un nume și puteți adăuga resurse. Sub acțiune, tastați iot * și tastați * sub resursă și apăsați permite efectul. Apoi reveniți la lucrurile dvs. și mergeți la certificatul dvs. Odată ajuns aici, faceți clic pe politici. Apoi, puteți atașa politica dvs. pentru acest lucru și totul este gata!

2. Configurarea codului pe Raspberry Pi și interacțiunea cu IoT

Pentru această parte, veți avea nevoie de un client SFTP (am folosit WinSCP) pentru transferul de fișiere. La conectarea la Raspberry Pi, va trebui să avem cheile de certificat la îndemână. Trebuie să transferați fișierele cheie în Raspberry Pi. De asemenea, ar trebui să instalați AWSIoTPythonSDK pe Raspberry Pi. Apoi accesați directorul dk de pe Raspberry Pi. Folosiți fișierul Alexa Drone Control pe care l-am dat pentru comunicarea cu IoT. Pentru a utiliza acest fișier, am folosit un script Shell pentru pornire. Voi arăta codul de mai jos, deoarece nu pot încărca fișierul din anumite motive. Dacă programul nu preia mesaje de la AWS IoT în timpul testării, nu vă faceți griji! Aceasta ar putea fi vina mea, deoarece este posibil ca fișierul de control al dronelor Alexa să nu se potrivească lucrului dvs. Deci, pentru a remedia problema, reveniți la AWS IoT și apăsați Learn pe panoul din stânga. Urmați instrucțiunile și poate fi necesar să reporniți. Îmi pare rău pentru asta. Odată ce IoT-ul dvs. începe să lucreze cu programul pe RasPi, puteți integra codul dronekit din fișierul Alexa Drone Control pe care l-am dat. După aceea, utilizați scriptul Shell pe care l-am dat împreună cu certificatele dvs. și Rest API API de la IoT.

# opriți scriptul pe setul de erori -e # Verificați dacă există fișierul CA rădăcină, descărcați dacă nu dacă [! -f./root-CA.crt]; apoi printf "\ nDescărcarea certificatului AWS IoT Root CA din AWS … / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # install AWS Device SDK for Python dacă nu este deja instalat dacă [! -d./aws-iot-device-sdk-python]; apoi printf "\ nInstalarea AWS SDK … / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# rulați aplicația pub / sub exemplu folosind certificate descărcate în pachet

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

Acest lucru nu va funcționa pentru toți, deoarece numele sunt diferite. În loc de cheile pe care le-am folosit, înlocuiți-le cu numele cheilor dvs. atunci când transferați fișierul. Asigurați-vă că ieșiți din dk înainte de a transfera fișierul! Asta ar trebui să fie tot ce trebuie să faceți pentru moment.

3. Construiți-vă abilitatea Alexa

Acest pas pare mult mai greu decât este cu adevărat. Mai întâi, trebuie să ne conectăm la consola pentru dezvoltatori Alexa. Apoi, atinge doar creează abilitate. Când vi se cere să alegeți un model pentru calitatea dvs., apăsați personalizat. Când vă cere să alegeți o metodă, apăsați-vă pe provizionarea dvs. Îl poți numi orice vrei. Nu este necesar niciun șablon, deci alegeți începe de la zero. Apoi, după ce ți-ai creat abilitatea, ar trebui să ajungi pe ecranul Constructor de abilități cu o listă de verificare în dreapta. De aici, putem începe să ne construim abilitățile. Primul pe lista de verificare este numele invocației. Iată ce îi vei spune lui Alexa să-ți invoce abilitățile. Pentru mine, mi-am pus numele invocației drept dronă. Acum putem merge la intențiile, enunțurile și sloturile noastre. Aici puteți face comenzi pentru dronă, cum ar fi să urcați 1 metru sau să mergeți la dreapta sau în jos. Al meu chiar funcționează cu un metru deocamdată. Puteți face clic pe Editorul JSON din partea de jos a panoului din stânga. Apoi puteți lipi următorul cod în el.

După lipirea codului în Editorul JSON, puteți face clic pe al treilea pas al listei de verificare și acesta va construi modelul dvs. de interacțiune. Cu acest pas, veți fi terminat deocamdată. Puteți lăsa spațiul pentru punct final gol pentru moment!

Pasul 4: Construiți-vă funcția Lambda

Acum, acest pas este unul pe care va trebui să-l descoperiți singur. Vă voi spune cum să îl conectați la Alexa Skill, dar va trebui să îl codificați singur. Deci, mergeți mai întâi la consola de administrare AWS. Apoi, du-te la Lambda. Apoi puteți crea o funcție numind-o oricum doriți. Asigurați-vă că ați creat-o de la zero și faceți timpul de execuție orice limbaj de programare doriți. Am folosit Node.js. Pentru a adăuga Abilitatea Alexa, adăugați un declanșator și selectați Alexa Skills Kit (ASK). Copiați Lambda ARN și reveniți la Abilitatea Alexa. Acum, mergeți la punctul final. Puteți lipi ARN-ul, salva și construi un model nou. Apoi, luați ID-ul Alexa Skill și lipiți-l în secțiunea de declanșare unde vă cere pe Lambda. Apoi, derulați în jos pe Lambda și găsiți setările de bază și efectuați expirarea timpului de 10 secunde. Acum, depinde de dvs. să aflați codul. Pentru sugestii, puteți consulta site-urile web de mai jos.

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

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

și puteți utiliza fișierul pe care l-am atașat, dar este incomplet și nu va funcționa.

/ ** * Controlați quadcopterul APM / Pixhawk cu vocea dvs., utilizând Amazon Alexa, Lambda, 2lemetry MQTT.* / var awsIot = require ('aws-iot-device-sdk'); var config = require ("./ config"); var deviceName = "EchoDroneControl"; // acest dispozitiv este într-adevăr controlerul 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 = nul; var client = nul; // Treceți cererea primită pe baza tipului (LaunchRequest, IntentRequest etc.) Corpul JSON al cererii este furnizat în parametrul eveniment. exporturi.handler = funcție (eveniment, context) {încercați {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = context; if (event.session.application.applicationId! == app_id) {ctx.fail ("ID aplicație nevalidă"); } client = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Conectat la 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.succeed (); }} catch (e) {console.log ("EXCEPTION in handler:" + e); ctx.fail ("Excepție:" + e); }}; / ** * Apelat când începe sesiunea. * / function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Apelat atunci când utilizatorul lansează abilitatea fără a specifica ce dorește. * / function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Trimite la lansarea abilităților tale. getWelcomeResponse (apel invers); } / ** * Apelat atunci când utilizatorul specifică o intenție pentru această abilitate. * / function onIntent (intentRequest, session) {//, callback) {console.log ("onIntent requestId =" + intentRequest.requestId + ", sessionId =" + session.sessionId); var intent = intentRequest.intent, intentName = intentRequest.intent.name; console.log ("REQUEST to string =" + JSON.stringify (intentRequest)); var callback = nul; // Expediați către gestionarii intenției abilităților dvs. dacă („GoIntent” === intentName) {doGoIntent (intenție, sesiune); } else if ("CommandIntent" === intentName) {doCommandIntent (intenție, sesiune); } else if ("TurnIntent" === intentName) {doTurnIntent (intenție, sesiune); } else if ("HelpIntent" === intentName) {getWelcomeResponse (); } else {aruncați „intenție nevalidă”; }} / ** * Apelat când utilizatorul termină sesiunea. * Nu este apelat când abilitatea revine shouldEndSession = true. * / function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Adăugați aici logică de curățare} // --------------- Funcții care controlează comportamentul abilității -------------------- --- funcția getWelcomeResponse () {// Dacă am dori să inițializăm sesiunea pentru a avea unele atribute, le-am putea adăuga aici. var sessionAttributes = {}; var cardTitle = "Bun venit"; var speechOutput = "Bun venit la DRONE CONTROL."; // TODO: drona este online sau offline? Dacă este online, este ARMAT? var repromptText = "Drona pregătită pentru comandă."; var shouldEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } / ** * gestionează intenția GO. * / function doGoIntent (intent, session, callback) {// var cardTitle = "Drone GO …"; var repromptText = ""; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; var direction = intent.slots. Direction.value; var distance = intent.slots. Distance.value; var unit = intent.slots. Unit.value; var validDirections = ["înainte", "înainte", "înapoi", "înapoi", "dreapta", "stânga", "sus", "jos", "drept", "înainte", "drept înainte"]; var validUnits = ["picior", "picioare", "metru", "metri", "curte", "curți"]; repromptText = "Spune-mi cât de departe trebuie să merg și în ce direcție."; var fail = false; // validați intrările dacă (! (parseInt (distanță)> = 1)) {speechOutput = "Nu am putut înțelege distanța pe care doriți să o parcurg."; fail = adevărat; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Nu am putut înțelege direcția pe care vrei să o călătoresc."; fail = adevărat; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Nu am putut înțelege unitatea pe care vrei să o călătoresc."; fail = adevărat; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Drone merge" + direcție + "" + distanță + "" + unitate; speechOutput = "Mergând" + direcție + "" + distanță + "" + unitate; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funcția doCommandIntent (intenție, sesiune, apel invers) {

// var cardTitle = "COMANDĂ pentru dronă …"; var repromptText = nul; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Spune-mi care este comanda pentru dronă."; var task = intent.slots. Task.value; var validTasks = ["lansare", "teren", "r. t. l.", "țineți", "rămâneți", "opriți", "reveniți la lansare", "întrerupeți"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Nu am putut înțelege comanda."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Executarea comenzii Drone" + sarcină; speechOutput = "Comanda de executare" + sarcină; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funcția doTurnIntent (intenție, sesiune, apel invers) {

// var cardTitle = "Drone Turn …"; var repromptText = nul; var sessionAttributes = {}; var shouldEndSession = false; var speechOutput = ""; repromptText = "Spune-mi cum vrei să transformi drona."; var direction = intent.slots. Direction.value; var validDirections = ["dreapta", "stânga", "în jurul"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Nu am putut înțelege direcția virajului."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Drona de cotitură" + direcție; speechOutput = "Întoarcere" + direcție; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

funcția mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession)

{var strIntent = JSON.stringify (intent); console.log ("mqttPublish: INTENT text =" + strIntent); // client.publish ("ikw1zr46p50f81z / drone / echo", strIntent, false); client.publish (config.topic, strIntent, false); client.end (); client.);})); client.on ("eroare", (funcție (eroare, acordată) {console.log ("EROARE CLIENT MQTT !!" + eroare);})); }

// --------------- Ajutoare care construiesc toate răspunsurile -----------------------

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

Recomandat: