Inhaltsverzeichnis:

Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS - Gunook
Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS - Gunook

Video: Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS - Gunook

Video: Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS - Gunook
Video: DIY Raspberry Pi Amazon Alexa (Echo) ✔ Voice Activation & Control Project 2024, Juli
Anonim
Image
Image
Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS
Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS
Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS
Alexa sprachgesteuerte Raspberry Pi-Drohne mit IoT und AWS

Hi! Mein Name ist Armaan. Ich bin ein 13-jähriger Junge aus Massachusetts. Dieses Tutorial zeigt, wie Sie dem Titel entnehmen können, wie man eine Raspberry Pi Drohne baut. Dieser Prototyp zeigt, wie sich Drohnen entwickeln und welche Rolle sie in Zukunft spielen könnten. Ich kann mir definitiv vorstellen, in 10 Jahren aufzuwachen und eine Drohne zu bitten, mir Frühstück zu besorgen. Die Drohne verwendet Amazon Alexa, Amazon Web Services, IoT (Internet of Things) und vor allem einen Raspberry Pi. Es soll Drohnen demonstrieren und informieren und wie sie sich täglich verbessern. Hoffentlich sind Sie erfolgreich und lernen dabei Drohnen kennen. Viel Glück und danke fürs Lesen. -Armaan

Lieferungen

Um den Prototyp zu bauen, gibt es verschiedene Hardware- und Softwareanforderungen. Ich habe ein Online-Tutorial von The Drone Dojo verwendet, um die Drohne zu bauen und die aufgeführten Technologien integriert. Für die Drohne finden Sie die Teileliste gleich hier:

Drohnen-Teileliste

Software Anforderungen:

  • Amazon Webservices
  • Ein Laptop
  • Missionsplaner-Software
  • Balena Etcher
  • MicroSD-Karte mit Raspbian-Datei finden Sie hier
  • Amazon Alexa, physisch oder virtuell

Schritt 1: Teile sammeln und verstehen

Teile sammeln und verstehen
Teile sammeln und verstehen

Jedes in der Lieferliste erwähnte Teil ist notwendig, ebenso wie ein klares Verständnis jedes Teils. Sie können die Teile online finden und nach der Zusammenstellung weiterlesen. Eine Playlist von The Drone Dojo zum vollständigen Verständnis der Teile finden Sie hier. Eine 4-minütige Erklärung auf meinem Youtube-Kanal finden Sie hier. Wenn es um Drohnen geht, sind die einzigen Teile, entgegen der Meinung der meisten Leute, nicht nur Motoren und Propeller. Im Folgenden sind die grundlegenden Zwecke jedes Teils aufgeführt.

Der Raspberry Pi mit dem Emlid Navio2

Dieser Teil ist so ziemlich ein zentraler Prozessor und der Hauptpunkt der Drohne. Der Raspberry Pi verhält sich wie die CPU eines Computers, der Befehle an den Navio2 sendet, um sie über PWM (Pulsweitenmodulationssignale) an andere Teile der Drohne auszuführen

2. Die ESCs (elektronische Geschwindigkeitsregler)

Diese gelben Teile befinden sich unter dem Rahmen. Sie sind 4 an den Navio angeschlossen, einer für jeden Motor. Beim Empfang von PWM-Signalen drehen sie die Motoren und beginnen den Flug.

3. Motoren

Motoren brauchen nicht allzu viel Erklärung, weil Sie sie wahrscheinlich kennen. Sie drehen und drehen die Propeller, um Schub zu erzeugen.

4. Propeller

Propeller erzeugen Schub, damit die Drohne fliegen kann. Sie drehen sich in die gleiche Richtung wie die Motoren, um das Fahrzeug anzuheben.

5. Das Batterie- und Stromversorgungsmodul

Der LiPo-Akku versorgt die gesamte Drohne durch den Rahmen mit dem Power-Modul. Es gibt etwa 15-20 Minuten Flugzeit und dient als Stromquelle.

6. Das GPS

Das GPS kommuniziert mit Satelliten, um die Position der Drohne zu bestimmen. Er bestimmt Höhe, Breite und Länge. Es kann für Geofencing, Wegpunkte und auch für das Bewegen zu bestimmten Positionen oder Richtungen verwendet werden.

7. Das Telemetriemodul

Das Telemetriemodul verbindet unsere Drohne mit einer zu überwachenden Bodenkontrollstation, in unserem Fall Mission Planner.

8. Der RC-Controller und das Modul zusammen mit dem PPM-Encoder

Der RC-Controller verwendet Funk, um Signale und Befehle an das RC-Modul zu übertragen, um die Drohne manuell zu steuern. Der PPM-Encoder übersetzt diese Signale für die Verarbeitung und Ausführung durch das Navio + RPI.

9. Der Rahmen

Dieser rot-weiße Rahmen dient als Basis oder Plattform für die anderen zu platzierenden Teile. Der Rahmen ist aerodynamisch und leicht, daher perfekt für unseren Drohnenbau.

Jetzt, da wir jedes Teil kennen, können wir endlich die Drohne bauen! Auf zum nächsten Schritt!

Schritt 2: Zusammenbau der Drohne

Zusammenbau der Drohne
Zusammenbau der Drohne

Dieser Schritt ist in Bezug auf die körperliche Anstrengung wahrscheinlich der schwierigste. Ich empfehle, sich eine andere Person zur Hilfe zu holen oder zu versuchen, die helfende Hand in der Stückliste zu verwenden. Der Prozess ist zu lang, um ihn hier zu demonstrieren, daher werde ich einen weiteren Link bereitstellen, den ich von The Drone Dojo verwendet habe.

Bau einer Raspberry Pi-Drohne

Da ich nicht zu sehr ins Detail gehe, werde ich nur die Grundlagen jedes Schritts hervorheben.

1. Organisieren Sie Ihre Vorräte - Sammeln Sie unsere Materialien und stellen Sie sicher, dass sie leicht zugänglich sind

2. Planen Sie Ihren Build - Organisieren Sie Ihre Teile auf dem Rahmen, um eine Blaupause von dem zu erstellen, was Sie bauen werden

3. Lötarbeiten – Dies ist die Arbeit, die alleine etwas schwer zu erledigen ist. Sie müssen die goldenen Kugelstecker, die mit den Motoren geliefert werden, an die Regler anlöten. Als nächstes müssen Sie den unteren Teil des Rahmens nehmen und die ESCs an den unteren Rahmen oder die Stromverteilungsplatine anlöten. Das Batteriemodul wird auch auf das Power Distribution Board gelötet

4. Aufstellen des Rahmens - Anschließend müssen Sie den oberen Teil des Rahmens zusammen mit den Armen einschrauben. Sie können dann den Raspberry Pi nach Belieben oben anbringen (ich habe Klebeband verwendet). Dann können Sie die ESCs mit Kabelbindern an den Armen befestigen. Jetzt sind wir fast fertig.

5. Binden des RC-Controllers an den Empfänger - Versuchen Sie, die Anweisungen in der obigen Wiedergabeliste zu befolgen, um den RC-Controller mit einem ESC zu binden.

6. Fertigstellen der Teile am Rahmen - Klebeband oder -band des Telemetriemoduls am Rahmen. Kleben Sie den PPM-Encoder auch an einen Arm. Jetzt können Sie die ESCs und den PPM-Encoder mit dem Navio verbinden.

7. GPS-Halterung + Batterie - Montieren Sie die GPS-Halterung mit den verschiedenen Schrauben und Teilen. Befestigen Sie das GPS mit Kabelbindern am Rahmen. Ich habe die GPS-Halterung wegen ihrer Zerbrechlichkeit nicht unbedingt verwendet, aber es liegt an Ihnen. Als nächstes können Sie den Akku zwischen die Power Dist. Planke. Ich habe das Leistungsmodul auch an den Rahmen geschnallt und geklebt. Jetzt ist Ihre Hardware so gut wie eingerichtet. Nun zu dem Teil, auf den wir gewartet haben!

8. Einbau der Propeller!!! - Sie können die Propeller anhand der in der Playlist angegebenen Tabelle festziehen. Dann können Sie die ESCs an die Motoren anschließen und wir sind endlich fertig mit dem Bau der Drohne.

Software kommt als nächstes, also weiter!

Schritt 3: Raspberry Pi und GCS konfigurieren (Mission Planner)

Raspberry Pi und GCS konfigurieren (Mission Planner)
Raspberry Pi und GCS konfigurieren (Mission Planner)

Auch hier finden Sie in der Playlist aus dem letzten Schritt eine detailliertere Anleitung. Sie wissen jedoch wahrscheinlich, wie Sie den RasPi einrichten. Aber diesmal machen wir es kopflos. Verwenden Sie Balena Etcher, um das Betriebssystem von der Navio OS-Website auf die MicroSD-Karte zu brennen. Gehen Sie mit Notepad ++ zum wpa-Supplicant, während er an Ihren Computer angeschlossen ist. Geben Sie danach die ssid und das Passwort für den Raspberry Pi ein, um sich mit Ihrem WLAN zu verbinden. Dann müssen Sie eine Datei namens SSH hinzufügen. Dies kann über die Befehlszeile oder eine andere Methode erfolgen. Jetzt können wir SSH. Sie können die Eingabeaufforderung oder Putty verwenden. Ich habe die Eingabeaufforderung verwendet und "ssh pi@navio" eingegeben, um in meinem Fall eine Verbindung herzustellen, oder Sie können die IP-Adresse und ssh auf diese Weise finden. Verwenden Sie nach dem Anschließen dieses Video, um das Navio einzurichten und zu konfigurieren. Um die Telemetrie einzurichten, müssen Sie zuerst eine Bearbeitung auf dem Raspberry Pi vornehmen. Befolgen Sie dies, um die Bearbeitung vorzunehmen und versuchen Sie, eine Verbindung zum Mission Planner herzustellen. Wenn die Telemetrie nicht funktioniert, können Sie die Bearbeitung rückgängig machen und eine Verbindung über eine UDB-Verbindung herstellen, indem Sie Ihre GCS-IP (Ground Control Station wie Laptop) eingeben. Sobald Sie mit dem Mission Planner verbunden sind, können Sie mit dem Einrichtungsassistenten alle Teile der Drohne kalibrieren. Wenn Sie Hilfe benötigen, schlagen Sie erneut in der Playlist nach. Normalerweise tritt beim Einrichten fast immer ein Fehler auf. Die Fehlerbehebung ist einer der größten Teile dieses Projekts. Ich kann dir da nicht wirklich helfen, da mir deine Fehler nicht bekannt sind, aber die meisten Fehler können mit Hilfe des Internets behoben werden. Nachdem alles fertig ist, ist die Drohne flugbereit! Sie können Ihren RC-Controller und die Flugmodi im Mission Planner einrichten. Versuchen Sie, den linken Stick fünf Sekunden lang ganz unten rechts zu halten, um die Drohne scharfzuschalten. Ich empfehle nicht zu fliegen, ohne sich ein Tutorial anzusehen, da die Drohne sehr zerbrechlich und leicht zu zerbrechen ist. Für mich, als ich das erste Mal flog, habe ich die GPS-Halterung und einige Propeller gebrochen. Wenn Sie keine Sprachsteuerung benötigen, können Sie hier aufhören. Um mehr über AWS und die Programmierung der Drohne zu erfahren, fahren Sie fort!

Schritt 4: Programmierung der Drohne zum Fliegen mit Python

Programmierung der Drohne zum Fliegen mit Python
Programmierung der Drohne zum Fliegen mit Python

Bevor wir uns mit AWS befassen, sollten wir zunächst verstehen, wie die Drohne zum Fliegen programmiert wird. Nach der Ersteinrichtung sollte die Integration der Sprachsteuerung nicht allzu schwierig sein. Das erste, was wir versuchen können, ein Gefühl dafür zu bekommen, ist ein einfaches Start- und Landeprogramm. Nach dem Einrichten des Raspberry Pi können wir wieder per SSH darauf zugreifen. Sie können sich die Playlist noch einmal ansehen oder meiner Anleitung folgen.

1. Laden wir zunächst den ArduPilot-Quellcode in ein Verzeichnis auf dem Raspberry Pi herunter

mkdir src

Holen Sie sich dann die Dateien von GitHub mit git clone

git clone -b Copter-3.6.11

Navigieren wir nun zu /src/ardupilot

cd src

CD-Ardupilot

Lassen Sie uns nun die Quelldateien initialisieren

git submodul update --init --recursive

2. Als nächstes müssen wir die Firmware auf dem Raspberry Pi kompilieren

Stellen Sie sicher, dass Sie mit cd zu /src/ardupilot/ navigieren, bevor Sie die nächsten Schritte ausführen

Dann um speziell auf das Navio zu konfigurieren

./waf configure --board=navio2

Dann kannst du mit kompilieren

./waf --targets bin/arducopter

3. Wir können nun den Quellcode auf dem Navio installieren

Lassen Sie uns zuerst zum richtigen Verzeichnis navigieren.

cd/etc/systemd/system

Bearbeiten Sie dann die Datei

sudo vi arducopter.service

Wo ExecStart steht, fügen Sie Folgendes statt dessen ein, was bereits vorhanden ist

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

Um nun den ardupilot-Quellcode in die Tat umzusetzen, können wir verwenden

sudo systemctl daemon-reload

Dann können wir wieder mit

sudo systemctl arducopter neu starten

Mit dem letzten Schritt haben wir endlich die Einrichtung von ArduPilot auf unserer Drohne abgeschlossen

4. DroneKit installieren

DroneKit ist die Software, mit der wir die Drohne zum Fliegen programmieren. Um einen Teil des Codes zu verstehen, finden Sie die Dokumentation hier. Zuerst müssen wir das Paket auf unserer Drohne installieren, bevor wir ein Skript schreiben.

Wir können das Python-Paket mit installieren

pip installiere Dronekit==2.9.1

Dies kann die neueste Version sein oder nicht, aber es ist die, die ich verwendet habe, damit ich bei der Fehlerbehebung helfen kann.

Um zu überprüfen, ob es installiert ist, können wir Folgendes tun:

pip einfrieren | grep Drohnenkit

Jetzt sind wir endlich bereit, unser erstes Python-Skript zu erstellen

5. takeoff_and_land.py

WARNUNG! Ich schlage vor, ein grundlegendes Verständnis von Python zu entwickeln, damit Sie den Code lernen und verstehen können. Wenn Sie das Programm selbst schreiben möchten, folgen Sie diesem Video.

##Erstellen Sie zuerst kein Verzeichnis, um diesen Code zu speichern

cd dk ##Wenn du es selbst machen willst, dann benutze vi takeoff_and_land.py ##um ein Programm zu erstellen

Andernfalls können Sie einen Blick darauf werfen oder die angehängte Datei verwenden und ein Dateiübertragungsprotokoll verwenden. Dieses Programm können wir anschließend ausprobieren. Zuerst um klarzustellen, dass es sich um eine Python-Datei handelt, die wir verwenden müssen

chmod +x takeoff_and_land.py

Versuchen Sie dann, den folgenden Code zum Ausführen zu verwenden

python takeoff_and_land.py --connect 127.0.0.1:14550

Beim ersten Mal hat es bei mir auch nicht geklappt. Wenn es ein Link-Timeout gibt, machen Sie sich keine Sorgen, Sie können etwas tun. Öffnen Sie eine weitere Eingabeaufforderung und ssh. Sie können versuchen, etwas namens mavproxy zu installieren und auszuführen. Danach können Sie beide gleichzeitig ausführen. Dies sollte helfen, die Drohne zu verbinden. Sobald das erledigt ist, habe ich eine Herausforderung für Sie. Versuchen Sie herauszufinden, was das andere Programm (set_velocity_body.py) tut und wie es funktioniert. Wenn ja, gute Arbeit.

6. Weiter!

Dieses Wissen können wir nun nutzen, um unsere Drohne sprachgesteuert zu machen. Die Alexa-Drohnensteuerung verwendet viele dieser Funktionen und mehr. Viel Glück und weiter!

Schritt 5: Verwenden von Amazon Alexa und Amazon Web Services zur Integration der Sprachsteuerung

Verwenden von Amazon Alexa und Amazon Web Services zur Integration der Sprachsteuerung
Verwenden von Amazon Alexa und Amazon Web Services zur Integration der Sprachsteuerung
Verwenden von Amazon Alexa und Amazon Web Services zur Integration der Sprachsteuerung
Verwenden von Amazon Alexa und Amazon Web Services zur Integration der Sprachsteuerung

Dieser Schritt ist einer der weniger dokumentierten. Dies bedeutet, dass es am schwierigsten ist, Fehler zu beheben. Ich brauchte ungefähr einen Monat, um es zum Laufen zu bringen, vielleicht mehr. Das Wichtigste hier ist Geduld. Diese Funktion kann, wenn sie im wirklichen Leben implementiert wird, lebensverändernd sein. Sie können Alexa einfach sagen, dass sie Ihre Einkäufe für Sie holen soll, anstatt selbst zu gehen. Stell dir das vor! Also ohne weitere Umschweife lassen Sie uns darauf eingehen!

1. Registrieren des Raspberry Pi als Ding in AWS IoT

Um IoT (Internet der Dinge) zu nutzen, brauchen wir etwas. Wir müssen uns also zuerst bei der AWS-Konsole anmelden, um AWS IoT zu verwenden. Gehen Sie dann zu IoT Core. Dort sollten Sie auf Verwalten klicken und dann ein Ding erstellen. Nach dem Hinzufügen eines Namens benötigen wir zum Verbinden ein Zertifikat. Ich würde empfehlen, auf die One-Click-Zertifizierung zu klicken. Nachdem Sie den Zertifikatsbildschirm angezeigt haben, stellen Sie sicher, dass Sie jeden einzelnen Schlüssel einschließlich der Stammzertifizierungsstelle herunterladen. Dann können Sie gehen und die Erstellung des Dings beenden. Als nächstes müssen wir eine Richtlinie erstellen. Gehen Sie zurück zum IoT-Kern. Klicken Sie dann auf Sicher und dann auf Richtlinien. Klicken Sie dann auf Richtlinie erstellen. Sie können dann einen Namen erstellen und Ressourcen hinzufügen. Geben Sie unter Aktion iot* und unter Ressource ein * ein und klicken Sie auf Wirkung zulassen. Dann geh zurück zu deinem Ding und gehe zu deinem Zertifikat. Klicken Sie hier auf Richtlinien. Sie können dann Ihre Police für das Ding anhängen und alles ist fertig!

2. Einrichten von Code auf Raspberry Pi und Interaktion mit IoT

Für diesen Teil benötigen Sie einen SFTP-Client (ich habe WinSCP verwendet) für die Dateiübertragung. Wenn wir uns mit unserem Raspberry Pi verbinden, müssen wir die Zertifikatsschlüssel zur Hand haben. Sie müssen die Schlüsseldateien auf den Raspberry Pi übertragen. Sie sollten auch das AWSIoTPythonSDK auf dem Raspberry Pi pip installieren. Gehen Sie dann in das dk-Verzeichnis auf dem Raspberry Pi. Sie verwenden die Alexa Drone Control-Datei, die ich für die Kommunikation mit IoT angegeben habe. Um diese Datei zu verwenden, habe ich ein Shell-Skript zum Starten verwendet. Ich zeige den Code unten, da ich die Datei aus irgendeinem Grund nicht hochladen kann. Wenn das Programm während des Tests keine Nachrichten von AWS IoT empfängt, machen Sie sich keine Sorgen! Dies könnte meine Schuld sein, da die Alexa-Drohnen-Steuerungsdatei möglicherweise nicht zu Ihrem Ding passt. Um das Problem zu beheben, gehen Sie zurück zu AWS IoT und klicken Sie im linken Bereich auf Lernen. Folgen Sie den Anweisungen und Sie müssen möglicherweise neu starten. Das tut mir leid. Sobald Ihr IoT mit dem Programm auf dem RasPi zu arbeiten beginnt, können Sie den Drohnenkit-Code aus der Alexa Drone Control-Datei, die ich gegeben habe, integrieren. Verwenden Sie danach das Shell-Skript, das ich mit Ihren Zertifikaten und dem Rest API Endpoint von IoT gegeben habe.

# stop script on errorset -e # Überprüfen Sie, ob die Root-CA-Datei vorhanden ist, laden Sie sie herunter, wenn nicht, wenn [! -f./root-CA.crt]; dann printf "\nHerunterladen des AWS IoT Root CA-Zertifikats von AWS…\n" curl https://www.amazontrust.com/repository/AmazonRoot…> > root-CA.crt fi # AWS Device SDK für Python installieren, falls nicht bereits installiert wenn [! -d./aws-iot-device-sdk-python]; dann 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

# Ausführen der Pub/Sub-Beispiel-App mit den im Paket heruntergeladenen Zertifikaten

printf "\nPub/Sub-Beispielanwendung wird ausgeführt…\n" python dk/AlexaDroneControl.py --connect 127.0.0.1:14550 -e "Ihr IoT-ARN" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

Dies wird nicht für Sie alle funktionieren, da die Namen unterschiedlich sind. Anstelle der Schlüssel, die ich verwendet habe, ersetzen Sie sie durch Ihre Schlüsselnamen, wenn Sie die Datei übertragen. Stellen Sie sicher, dass Sie dk beenden, bevor Sie die Datei übertragen! Das sollte alles sein, was Sie jetzt tun müssen.

3. Aufbau deines Alexa-Skills

Dieser Schritt scheint viel schwieriger zu sein, als er wirklich ist. Zuerst müssen wir uns bei der Alexa Developer Console anmelden. Klicken Sie dann einfach auf Fertigkeit erstellen. Wenn Sie aufgefordert werden, ein Modell für Ihre Fertigkeit auszuwählen, klicken Sie einfach auf „Benutzerdefiniert“. Wenn Sie aufgefordert werden, eine Methode auszuwählen, klicken Sie auf Eigene bereitstellen. Sie können es benennen, wie Sie wollen. Es ist keine Vorlage erforderlich, also wählen Sie von vorne beginnen. Als Nächstes, nachdem Sie Ihren Skill erstellt haben, sollten Sie auf dem Bildschirm des Skill-Builders mit einer Checkliste auf der rechten Seite erscheinen. Von hier aus können wir mit dem Aufbau unserer Fähigkeiten beginnen. An erster Stelle auf der Checkliste steht der Aufrufname. Dies ist, was Sie Alexa sagen werden, um Ihren Skill aufzurufen. Für mich habe ich nur meinen Aufrufnamen als Drohne angegeben. Jetzt können wir zu unseren Absichten, Äußerungen und Slots gehen. Hier können Sie Befehle für die Drohne machen, wie zum Beispiel 1 Meter nach oben gehen oder nach rechts oder unten gehen. Meins funktioniert im Moment nur mit einem Meter. Sie können unten im linken Bereich auf den JSON-Editor klicken. Sie können dann den folgenden Code darin einfügen.

{ "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": "Task" }], "samples": ["Command Drone to {Task}"] }, { "name": "TurnIntent", "slots": [{ "name": "Direction", "type": " Direction" }, { "name": "Rotation", "type": "AMAZON. NUMBER" }], "samples": ["Turn {Direction} {Rotation} degree"] }], "types": [{ "name": "Richtung", "Werte": [{ "Name": { "Wert": "Gerade", "Synonyme": ["Forw ards", "Vorwärts"] } }, { "Name": { "Wert": "Zurück", "Synonyme": ["Rückwärts", "Rückwärts"] } }, { "Name": { "Wert": "Right" } }, { "name": { "value": "Left" } }, { "name": { "value": "Down" } }, { "name": { "value": "Up " } }] }, { "name": "Einheit", "Werte": [{ "Name": { "Wert": "Meter", "Synonyme": ["Meter"] } }, { "Name": { "value": "Yards", "synonyms": ["Yard"] } }, { "name": { "value": "Feet", "synonyms": ["Foot"] } }] }, { "name": "Task", "values": [{ "name": { "value": "Land" } }, { "name": { "value": "Hold" } }, { "name": { "value": "Stay" } }, { "name": { "value": "RTL", "synonyms": ["Return to Launch"] }] }] } } }

Nachdem Sie den Code in den JSON-Editor eingefügt haben, können Sie auf den dritten Schritt der Checkliste klicken und Ihr Interaktionsmodell wird für Sie erstellt. Mit diesem Schritt sind Sie vorerst fertig. Sie können den Endpunkt-Slot vorerst leer lassen!

Schritt 4: Aufbau Ihrer Lambda-Funktion

Nun, diesen Schritt müssen Sie selbst herausfinden. Ich werde Ihnen sagen, wie Sie es mit dem Alexa Skill verbinden, aber Sie müssen es selbst codieren. Gehen Sie also zuerst zur AWS-Verwaltungskonsole. Dann gehen Sie zu Lambda. Sie können dann eine Funktion erstellen, die sie beliebig benennt. Stellen Sie sicher, dass Sie es von Grund auf neu erstellen und die Laufzeit in jeder gewünschten Programmiersprache gestalten. Ich habe Node.js verwendet. Um den Alexa Skill hinzuzufügen, fügen Sie einen Trigger hinzu und wählen Sie Alexa Skills Kit (ASK). Kopieren Sie Ihren Lambda ARN und gehen Sie zurück zum Alexa Skill. Gehen Sie nun zum Endpunkt. Sie können Ihren ARN einfügen, speichern und ein neues Modell erstellen. Nehmen Sie dann die Alexa-Skill-ID und fügen Sie sie in den Triggerabschnitt ein, in dem Sie auf dem Lambda gefragt werden. Scrollen Sie als nächstes auf dem Lambda nach unten und finden Sie die Grundeinstellungen und stellen Sie den Timeout auf 10 Sekunden ein. Jetzt liegt es an Ihnen, den Code herauszufinden. Hinweise finden Sie auf den folgenden Websites.

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

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

und Sie können die Datei verwenden, die ich angehängt habe, aber sie ist unvollständig und funktioniert nicht.

/** * Steuern Sie Ihren APM / Pixhawk Quadcopter mit Ihrer Stimme, mit Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require('aws-iot-device-sdk'); var config = require("./config"); var Gerätename = "EchoDroneControl"; // dieses Gerät ist wirklich der Controller var mqtt_config = { "keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, //+ "-Lambda-" + (neues Date().getTime()), "region":"us-east-1", "debug":true }; var ctx = null; var-Client = null; // Die eingehende Anfrage basierend auf dem Typ weiterleiten (LaunchRequest, IntentRequest usw.) Der JSON-Body der Anfrage wird im Ereignisparameter bereitgestellt. exports.handler = Funktion (Ereignis, Kontext) { try { console.log("event.session.application.applicationId=" + event.session.application.applicationId); ctx = Kontext; if (event.session.application.applicationId !== app_id) { ctx.fail("Ungültige Anwendungs-ID"); } client = awsIot.device(mqtt_config); client.on("connect", function(){ console.log("Connected to AWS IoT"); // callback(); });

if (event.session.new) {

onSessionStarted({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") { onLaunch(event.request, event.session); } 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("AUSNAHME im Handler: " + e); ctx.fail("Ausnahme: " + e); } }; /** * Wird aufgerufen, wenn die Sitzung beginnt. */ Funktion onSessionStarted(sessionStartedRequest, session) { console.log("onSessionStarted requestId=" + sessionStartedRequest.requestId +", sessionId=" + session.sessionId); }

/**

* Wird aufgerufen, wenn der Benutzer den Skill startet, ohne anzugeben, was er möchte. */ Funktion onLaunch(launchRequest, Sitzung, Rückruf) { console.log("onLaunch requestId=" + launchRequest.requestId +", sessionId=" + session.sessionId); // An den Start deines Skills senden. getWelcomeResponse(Rückruf); } /** * Wird aufgerufen, wenn der Benutzer eine Absicht für diesen Skill angibt. */ Funktion onIntent(intentRequest, session) { //, callback) { console.log("onIntent requestId=" + intentionRequest.requestId +", sessionId=" + session.sessionId); var Intent = IntentRequest. Intent, IntentName = IntentRequest. Intent. Name; console.log("REQUEST to string =" + JSON.stringify(intentRequest)); var-Rückruf = null; // An die Intent-Handler Ihres Skills senden if ("GoIntent" === intentionName) { doGoIntent(intent, session); } Else if ("CommandIntent" === IntentName) { doCommandIntent (Intent, Sitzung); } Else if ("TurnIntent" === IntentName) { doTurnIntent (Intent, Sitzung); } Else if ("HelpIntent" === IntentName) { getWelcomeResponse(); } else { throw "Ungültige Absicht"; } } /** * Wird aufgerufen, wenn der Benutzer die Sitzung beendet. * Wird nicht aufgerufen, wenn der Skill shouldEndSession=true zurückgibt. */ Funktion onSessionEnded(sessionEndedRequest, session) { console.log("onSessionEnded requestId=" + sessionEndedRequest.requestId +", sessionId=" + session.sessionId); // Hier Aufräumlogik hinzufügen } // --------------- Funktionen, die das Verhalten des Skills steuern -------------------- --- function getWelcomeResponse() { // Wenn wir die Sitzung mit einigen Attributen initialisieren wollten, könnten wir diese hier hinzufügen. var Sitzungsattribute = {}; var cardTitle = "Willkommen"; var languageOutput = "Willkommen bei der DROHNENSTEUERUNG."; // TODO: ist die Drohne online oder offline? Wenn online, ist es BEWAFFNET? var repromptText = "Drohne bereit für Befehl."; var sollteEndSession = false; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } /** * behandelt den GO-Intent. */ Funktion doGoIntent(Intent, Sitzung, Rückruf) { // var cardTitle = "Drone GO…"; var repromptText = ""; var Sitzungsattribute = {}; var sollteEndSession = false; var Sprachausgabe = ""; var Richtung = intention.slots. Direction.value; var Abstand = Absicht.slots. Distance.value; var-Einheit = intention.slots. Unit.value; var validDirections = ["vorwärts", "vorwärts", "rückwärts", "zurück", "rechts", "links", "oben", "unten", "gerade", "vor", "geradeaus"]; var validUnits = ["Fuß", "Fuß", "Meter", "Meter", "Yard", "Yards"]; repromptText = "Sagen Sie mir, wie weit ich gehen soll und in welche Richtung."; var fehlgeschlagen = falsch; // Eingaben validieren if (!(parseInt(distance) >= 1)) { languageOutput = "Ich konnte die Entfernung nicht verstehen, die ich zurücklegen soll. "; scheitern = wahr; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf(direction) == -1) { languageOutput = "Ich konnte die Richtung, in die ich reisen soll, nicht verstehen."; scheitern = wahr; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf(unit) == -1) { languageOutput = "Ich konnte die Einheit, die ich reisen soll, nicht verstehen."; scheitern = wahr; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, languageOutput, repromptText, shouldEndSession))); } if (!fail) { var cardTitle = "Drohne geht" + Richtung + " " + Entfernung + " " + Einheit; languageOutput = "Gehen" + Richtung + " " + Entfernung + " " + Einheit; mqttPublish(intent, sessionAttributes, cardTitle, languageOutput, repromptText, shouldEndSession); } }

Funktion doCommandIntent(Absicht, Sitzung, Rückruf) {

// var cardTitle = "Drone COMMAND…"; var repromptText = null; var Sitzungsattribute = {}; var sollteEndSession = false; var Sprachausgabe = ""; repromptText = "Sagen Sie mir, was der Befehl für die Drohne ist. "; var Task = Intent.slots. Task.value; var validTasks = ["launch", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "abort"]; if (validTasks.indexOf(task) == -1) { languageOutput = "Ich konnte den Befehl nicht verstehen."; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else {var cardTitle = "Drohne-Befehl ausführen" + Aufgabe; SpeechOutput = "Befehl ausführen" + Aufgabe; mqttPublish(intent, sessionAttributes, cardTitle, languageOutput, repromptText, shouldEndSession); } }

Funktion doTurnIntent(Absicht, Sitzung, Rückruf) {

// var cardTitle = "Drone Turn…"; var repromptText = null; var Sitzungsattribute = {}; var sollteEndSession = false; var Sprachausgabe = ""; repromptText = "Sagen Sie mir, wie Sie die Drohne drehen möchten. "; var Richtung = intention.slots. Direction.value; var validDirections = ["rechts", "links", "um"]; if (validDirections.indexOf(direction) == -1) { languageOutput = "Ich konnte die Richtung der Abbiegung nicht verstehen."; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); aufrechtzuerhalten. Else { var cardTitle = "Drone Turning" + Richtung; languageOutput = "Drehen" + Richtung; mqttPublish(intent, sessionAttributes, cardTitle, languageOutput, repromptText, shouldEndSession); } }

Funktion mqttPublish(intent, sessionAttributes, cardTitle, languageOutput, 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.on("close", (function () { console.log("MQTT CLIENT CLOSE - glaubt, dass es fertig ist, erfolgreich. "); ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, SpeechOutput, repromptText, shouldEndSession)));})); client.on("Fehler", (Funktion (err, gewährt) { console.log("MQTT CLIENT ERROR!! " + err); })); }

// -------------- Helfer, die alle Antworten erstellen ----------------------

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

Empfohlen: