Table des matières:

Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : 6 étapes (avec photos)
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : 6 étapes (avec photos)

Vidéo: Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : 6 étapes (avec photos)

Vidéo: Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS : 6 étapes (avec photos)
Vidéo: IoT MqttClients - MQTT client Programming with Python 2024, Juillet
Anonim
Image
Image
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS
Drone Raspberry Pi à commande vocale Alexa avec IoT et AWS

Salut! Je m'appelle Armaan. Je suis un garçon de 13 ans du Massachusetts. Ce tutoriel montre, comme vous pouvez le déduire du titre, comment construire un drone Raspberry Pi. Ce prototype montre comment les drones évoluent et aussi quel rôle ils pourraient jouer à l'avenir. Je me vois certainement me réveiller dans 10 ans et demander à un drone de prendre le petit-déjeuner pour moi. Le drone utilise Amazon Alexa, Amazon Web Services, IoT (Internet des objets) et surtout un Raspberry Pi pour fonctionner. Il est destiné à démontrer et à informer sur les drones et comment ils s'améliorent chaque jour. J'espère que vous avez réussi et que vous en apprenez davantage sur les drones dans le processus. Bonne chance et merci pour la lecture. -Armaan

Fournitures

Pour construire le prototype, il existe divers besoins matériels et logiciels. J'ai utilisé un tutoriel en ligne de The Drone Dojo pour construire le drone et intégré les technologies répertoriées. Pour le drone, vous pouvez trouver la liste des pièces ici:

Liste des pièces de drone

Logiciels requis:

  • Services Web Amazon
  • Un ordinateur portable
  • Logiciel de rabotage de mission
  • Graveur Balena
  • Carte MicroSD avec fichier Raspbian trouvée ici
  • Amazon Alexa, physique ou virtuel

Étape 1: Rassembler et comprendre les pièces

Rassembler et comprendre les pièces
Rassembler et comprendre les pièces

Chaque pièce mentionnée dans la liste de fournitures est nécessaire, de même qu'une compréhension claire de chaque pièce. Vous pouvez trouver les pièces en ligne et une fois rassemblées, continuez à lire. Une playlist de The Drone Dojo pour une compréhension complète des parties peut être trouvée ici. Une explication de 4 minutes sur ma chaîne youtube se trouve ici. En ce qui concerne les drones, les seules pièces, contrairement à ce que la plupart des gens pensent, ne sont pas seulement les moteurs et les hélices. Vous trouverez ci-dessous les objectifs de base de chaque partie.

Le Raspberry Pi avec l'Emlid Navio2

Cette partie est à peu près un processeur central et le point principal du drone. Le Raspberry Pi agit comme le processeur d'un ordinateur qui envoie des commandes au Navio2 à exécuter via PWM (signaux de modulation de largeur d'impulsion) à d'autres parties du drone

2. Les ESC (contrôleurs de vitesse électroniques)

Ces parties jaunes se trouvent sous le cadre. Ils sont 4 branchés sur le Navio, un pour chaque moteur. À la réception des signaux PWM, ils font tourner les moteurs et commencent le vol.

3. Moteurs

Les moteurs n'ont pas besoin de trop d'explications car vous les connaissez probablement. Ils tournent et font tourner les hélices pour créer une poussée.

4. Hélices

Les hélices créent une poussée pour que le drone vole. Ils tournent dans le même sens que les moteurs pour soulever le véhicule.

5. La batterie et le module d'alimentation

La batterie LiPo alimente l'ensemble du drone à travers le cadre à l'aide du module d'alimentation. Il donne environ 15-20 minutes de temps de vol et agit comme une source d'alimentation.

6. Le GPS

Le GPS communique avec les satellites pour déterminer la position du drone. Il détermine l'altitude, la latitude et la longitude. Il peut être utilisé pour le géorepérage, les points de cheminement et également pour se déplacer vers certaines positions ou directions.

7. Le module de télémétrie

Le module de télémétrie connecte notre drone à une station de contrôle au sol, dans notre cas Mission Planner, à surveiller.

8. Le contrôleur et le module RC avec l'encodeur PPM

Le contrôleur RC utilise la radio pour transmettre des signaux et des commandes au module RC pour piloter le drone manuellement. L'encodeur PPM traduit ces signaux pour que Navio + RPI les traite et les exécute.

9. Le cadre

Ce cadre rouge et blanc sert de base ou de plate-forme pour les autres pièces à placer. Le cadre est aérodynamique et léger, donc parfait pour notre construction de drone.

Maintenant, avec la connaissance de chaque pièce, nous pouvons enfin construire le drone ! En avant à l'étape suivante !

Étape 2: Assemblage du drone

Assemblage du drone
Assemblage du drone

Cette étape est probablement la plus difficile en termes d'effort physique. Je recommande de demander de l'aide à une autre personne ou d'essayer d'utiliser le coup de main dans la liste des pièces. Le processus est trop long à démontrer ici, je vais donc fournir un autre lien que j'ai utilisé par The Drone Dojo.

Construire un drone Raspberry Pi

Encore une fois, comme je n'entrerai pas dans trop de détails, je vais juste souligner les bases de chaque étape.

1. Organisez vos fournitures - Rassemblez nos matériaux et assurez-vous qu'ils sont facilement accessibles

2. Planifiez votre construction - Organisez vos pièces sur le cadre pour faire un plan de ce que vous allez construire

3. Travail de soudure - C'est le travail qui est un peu difficile à faire seul. Vous devez souder les connecteurs dorés fournis avec les moteurs aux ESC. Ensuite, vous devez prendre la partie inférieure du cadre et souder les ESC au cadre inférieur ou à la carte de distribution électrique. Le module de batterie sera également soudé sur la carte de distribution électrique

4. Installation du cadre - Vous devez ensuite visser la partie supérieure du cadre avec les bras. Vous pouvez ensuite attacher le Raspberry Pi sur le dessus comme vous le souhaitez (j'ai utilisé du ruban adhésif). Ensuite, vous pouvez fixer les ESC aux bras avec des attaches zippées. Maintenant, nous avons presque terminé.

5. Liaison de la télécommande RC au récepteur - Essayez de suivre les instructions de la liste de lecture ci-dessus pour lier la télécommande RC à l'aide d'un ESC.

6. Finalisation des pièces sur le cadre - Ruban adhésif ou sangle sur le module de télémétrie sur le cadre. Ruban adhésif pour l'encodeur PPM sur un bras également. Vous pouvez maintenant câbler l'ESC et l'encodeur PPM au Navio.

7. Support GPS + Batterie - Assemblez le support GPS avec les différentes vis et pièces. À l'aide de fermetures éclair, attachez le GPS au cadre. Je n'ai pas forcément utilisé le support GPS en raison de sa fragilité, mais c'est à vous de décider. Ensuite, vous pouvez insérer la batterie entre le Power Dist. Planche. J'ai également attaché et scotché le module d'alimentation au cadre. Maintenant, votre matériel est à peu près configuré. Maintenant pour la partie que nous attendons !

8. Installation des hélices !!! - Vous pouvez serrer les hélices à l'aide du tableau mentionné dans la playlist. Ensuite, vous pouvez brancher les ESC sur les moteurs et nous avons enfin fini de construire le drone.

Le logiciel est le prochain, donc en avant !

Étape 3: Configuration de Raspberry Pi et GCS (Mission Planner)

Configuration de Raspberry Pi et GCS (Mission Planner)
Configuration de Raspberry Pi et GCS (Mission Planner)

Encore une fois, vous pouvez trouver des instructions plus détaillées dans la liste de lecture de la dernière étape. Cependant, vous savez probablement comment configurer le RasPi. Mais cette fois, nous le faisons sans tête. Utilisez Balena Etcher pour graver le système d'exploitation du site Web Navio OS sur la carte MicroSD. Pendant qu'il est connecté à votre ordinateur, accédez au demandeur wpa à l'aide du bloc-notes ++. Après cela, entrez le ssid et le mot de passe pour que le Raspberry Pi se connecte à votre WiFi. Ensuite, vous devez ajouter un fichier appelé SSH. Cela peut être via la ligne de commande ou une autre méthode. Maintenant, nous pouvons SSH. Vous pouvez utiliser l'invite de commande ou Putty. J'ai utilisé l'invite de commande et tapé "ssh pi@navio" pour me connecter dans mon cas, ou vous pouvez trouver l'adresse IP et ssh de cette façon. Lors de la connexion, utilisez cette vidéo pour installer et configurer le Navio. Pour configurer la télémétrie, vous devez d'abord effectuer une modification sur le Raspberry Pi. Suivez ceci pour effectuer la modification et essayez de vous connecter à Mission Planner. Si la télémétrie ne fonctionne pas, vous pouvez annuler la modification et vous connecter à l'aide d'une connexion UDB en entrant votre IP GCS (station de contrôle au sol telle qu'un ordinateur portable). Une fois connecté à Mission Planner, vous pouvez utiliser l'assistant de configuration pour calibrer toutes les parties du drone. Si vous avez besoin d'aide, reportez-vous à nouveau à la liste de lecture. Habituellement, chaque fois que vous configurez, il y a presque toujours une erreur. Le dépannage est l'une des parties les plus importantes de ce projet. Je ne peux pas vraiment vous aider car je ne suis pas au courant de vos erreurs, mais la plupart des erreurs peuvent être corrigées à l'aide d'Internet. Une fois que tout est prêt, le drone est prêt à voler ! Vous pouvez configurer votre contrôleur RC et vos modes de vol sur Mission Planner. Essayez de maintenir le joystick gauche tout en bas à droite pendant cinq secondes pour armer le drone. Je ne recommande pas de voler sans regarder un tutoriel car le drone est très fragile et facile à casser. Pour ma part, la première fois que je l'ai piloté, j'ai cassé le support GPS et quelques hélices. Si vous n'avez pas besoin de commande vocale, vous pouvez vous arrêter ici. Pour en savoir plus sur AWS et programmer le drone continuez !

Étape 4: programmer le drone pour voler avec Python

Programmer le drone pour voler avec Python
Programmer le drone pour voler avec Python

Avant d'entrer dans AWS, nous devons d'abord comprendre comment programmer le drone pour voler. Après la configuration initiale, l'intégration de la commande vocale ne devrait pas être trop difficile. La première chose que nous pouvons essayer d'avoir une idée est de faire un simple programme de décollage et d'atterrissage. Après avoir configuré le Raspberry Pi, nous pouvons à nouveau y accéder en SSH. Vous pouvez regarder à nouveau la liste de lecture ou suivre mes instructions.

1. Commençons par télécharger le code source ArduPilot dans un répertoire sur le Raspberry Pi

mkdir src

Ensuite, récupérez les fichiers de GitHub en utilisant git clone

git clone -b Copter-3.6.11

Maintenant, naviguons vers /src/ardupilot

cd src

cd ardupilot

Maintenant, initialisons les fichiers sources

mise à jour du sous-module git --init --recursive

2. Ensuite, nous devons compiler le firmware sur le Raspberry Pi

Assurez-vous de naviguer vers /src/ardupilot/ avec cd avant de passer aux étapes suivantes

Ensuite pour cofigurer spécifiquement au Navio en utilisant

./waf configure --board=navio2

Ensuite, vous pouvez compiler avec

./waf --targets bin/arducopter

3. Nous pouvons maintenant installer le code source sur le Navio

Tout d'abord, naviguons vers le bon répertoire.

cd/etc/systemd/system

Puis modifiez le fichier

sudo vi arducopter.service

Là où il est écrit ExecStart, insérez ce qui suit au lieu de ce qui est déjà là

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

Maintenant, pour mettre le code source ardupilot en action, nous pouvons utiliser

sudo systemctl démon-recharger

Ensuite, nous pouvons redémarrer avec

sudo systemctl redémarrer arducopter

Avec la dernière étape, nous avons enfin fini de configurer ArduPilot sur notre drone

4. Installation de DroneKit

DroneKit est le logiciel que nous utiliserons pour programmer le drone pour qu'il vole. Pour comprendre une partie du code, vous pouvez trouver la documentation ici. Nous devons d'abord installer le package sur notre drone avant d'écrire un script.

Nous pouvons installer le package python avec

pip installer dronekit==2.9.1

Il peut s'agir de la version la plus récente ou non, mais c'est celle que j'ai utilisée pour que je puisse aider au dépannage.

Pour vérifier si installé, nous pouvons faire un

gel de pépins | kit de drone grep

Maintenant, nous sommes enfin prêts à créer notre premier script python

5. takeoff_and_land.py

ATTENTION! Je suggère d'établir une compréhension de base de python, afin que vous puissiez apprendre et comprendre le code. Si vous voulez écrire le programme vous-même, suivez cette vidéo.

## Commençons par créer un répertoire pour stocker ce code

cd dk ##Si vous voulez le faire vous-même, utilisez vi takeoff_and_land.py ##pour créer un programme

Sinon, vous pouvez jeter un œil ou utiliser le fichier joint et utiliser un protocole de transfert de fichiers. Nous pouvons essayer ce programme par la suite. D'abord pour préciser qu'il s'agit d'un fichier python que nous devons utiliser

chmod +x takeoff_and_land.py

Ensuite, pour essayer d'utiliser le code suivant pour exécuter

python takeoff_and_land.py --connect 127.0.0.1:14550

La première fois, ça n'a pas marché pour moi non plus. S'il y a un délai d'expiration du lien, ne vous inquiétez pas, vous pouvez faire quelque chose. Ouvrez une autre invite et ssh. Vous pouvez essayer d'installer quelque chose appelé mavproxy et essayer de l'exécuter. Après cela, vous pouvez exécuter les deux simultanément. Cela devrait aider à connecter le drone. Une fois cela fait, j'ai un défi pour vous. Essayez de comprendre ce que fait l'autre programme (set_velocity_body.py) et comment le faire fonctionner. Si vous le faites, bon travail.

6. En avant !

Nous pouvons maintenant utiliser ces connaissances pour rendre notre drone à commande vocale. Le contrôle de drone Alexa utilise beaucoup de ces fonctionnalités et plus encore. Bonne chance et en avant !

Étape 5: Utilisation d'Amazon Alexa et d'Amazon Web Services pour intégrer le contrôle vocal

Utilisation d'Amazon Alexa et d'Amazon Web Services pour intégrer le contrôle vocal
Utilisation d'Amazon Alexa et d'Amazon Web Services pour intégrer le contrôle vocal
Utilisation d'Amazon Alexa et d'Amazon Web Services pour intégrer le contrôle vocal
Utilisation d'Amazon Alexa et d'Amazon Web Services pour intégrer le contrôle vocal

Cette étape est l'une des moins documentées. Cela signifie que ce sera le plus difficile à dépanner. Le faire fonctionner m'a pris environ un mois, peut-être plus. La chose la plus importante ici est d'être patient. Cette fonctionnalité, si elle est mise en œuvre dans la vraie vie, peut changer la vie. Vous pouvez simplement dire à Alexa de faire vos courses pour vous au lieu d'y aller vous-même. Imagine ça! Alors sans plus tarder, allons-y !

1. Enregistrement du Raspberry Pi en tant que chose sur AWS IoT

Pour utiliser l'IoT (Internet des objets), eh bien, nous avons besoin d'une chose. Nous devons donc nous connecter à la console AWS pour utiliser AWS IoT en premier. Ensuite, accédez à IoT Core. Une fois là-bas, vous devez cliquer sur Gérer, puis créer un élément. Après avoir ajouté un nom, pour la connexion, nous avons besoin d'un certificat. Je recommanderais de cliquer sur la certification en un clic. Ensuite, après avoir vu l'écran du certificat, assurez-vous de télécharger chaque clé, y compris l'autorité de certification racine. Ensuite, vous pouvez aller terminer la création de la chose. Ensuite, nous devons créer une politique. Retournez à l'IoT Core. Cliquez ensuite sur sécurisé et cliquez sur politiques. Ensuite, appuyez sur créer une politique. Vous pouvez ensuite créer un nom et ajouter des ressources. Sous action, tapez iot* et tapez * sous ressource et appuyez sur autoriser l'effet. Ensuite, retournez à votre truc et allez à votre certificat. Une fois ici, cliquez sur les politiques. Vous pouvez alors joindre votre police pour la chose et c'est tout réglé !

2. Configuration du code sur Raspberry Pi et interaction avec l'IoT

Pour cette partie, vous aurez besoin d'un client SFTP (j'ai utilisé WinSCP) pour le transfert de fichiers. Lors de la connexion à notre Raspberry Pi, nous aurons besoin d'avoir les clés de certificat en main. Vous devez transférer les fichiers clés vers le Raspberry Pi. Vous devez également pip installer le AWSIoTPythonSDK sur le Raspberry Pi. Ensuite, allez dans le répertoire dk sur le Raspberry Pi. Vous utilisez le fichier Alexa Drone Control que j'ai donné pour communiquer avec l'IoT. Pour utiliser ce fichier, j'ai utilisé un script Shell pour le démarrage. Je vais montrer le code ci-dessous car je ne peux pas télécharger le fichier pour une raison quelconque. Si le programme ne récupère pas les messages d'AWS IoT lors des tests, ne vous inquiétez pas ! Cela pourrait être de ma faute car le fichier de contrôle Alexa Drone peut ne pas convenir à votre chose. Donc, pour y remédier, revenez à AWS IoT et appuyez sur Apprendre dans le panneau de gauche. Suivez les instructions et vous devrez peut-être redémarrer. Désolé pour ça. Une fois que votre IoT commence à fonctionner avec le programme sur le RasPi, vous pouvez intégrer le code du dronekit à partir du fichier Alexa Drone Control que j'ai donné. Après cela, utilisez le script Shell que j'ai donné avec vos certificats et le point de terminaison de l'API Rest de l'IoT.

# stop script on errorset -e # Vérifiez si le fichier CA racine existe, téléchargez sinon si [! -f./root-CA.crt]; puis printf "\nTéléchargement du certificat AWS IoT Root CA depuis AWS…\n" curl https://www.amazontrust.com/repository/AmazonRoot…> > root-CA.crt fi # installer AWS Device SDK pour Python s'il n'est pas déjà installé si [! -d./aws-iot-device-sdk-python]; puis 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

# exécuter l'exemple d'application pub/sub à l'aide des certificats téléchargés dans le package

printf "\nExécution d'un exemple d'application pub/sub…\n" python dk/AlexaDroneControl.py --connect 127.0.0.1:14550 -e "Votre ARN IoT" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

Cela ne fonctionnera pas pour vous tous car les noms sont différents. Au lieu des clés que j'ai utilisées, remplacez-les par vos noms de clés lorsque vous transférez le fichier. Assurez-vous de quitter dk avant de transférer le fichier ! Cela devrait être tout ce que vous avez à faire pour le moment.

3. Construire votre compétence Alexa

Cette étape semble beaucoup plus difficile qu'elle ne l'est en réalité. Tout d'abord, nous devons nous connecter à la console Alexa Developer. Ensuite, appuyez simplement sur créer une compétence. Lorsqu'il vous demande de choisir un modèle pour votre compétence, appuyez simplement sur personnalisé. Lorsqu'il vous demande de choisir une méthode, appuyez sur la vôtre. Vous pouvez le nommer comme vous voulez. Aucun modèle n'est requis, alors choisissez de partir de zéro. Ensuite, après avoir créé votre compétence, vous devriez arriver sur l'écran du générateur de compétences avec une liste de contrôle sur la droite. À partir de là, nous pouvons commencer à développer nos compétences. Le nom d'appel figure en premier sur la liste de contrôle. C'est ce que vous direz à Alexa d'invoquer votre compétence. Pour moi, j'ai juste mis mon nom d'invocation comme drone. Nous pouvons maintenant passer à nos intentions, nos énoncés et nos créneaux. Ici, vous pouvez effectuer des commandes pour le drone telles que monter de 1 mètre ou aller à droite ou en bas. Le mien ne fonctionne vraiment qu'avec un mètre pour l'instant. Vous pouvez cliquer sur l'éditeur JSON en bas du panneau de gauche. Vous pouvez ensuite y coller le code suivant.

{ "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" }, { "nom": "Distance", "type": "AMAZON. NUMBER" }, { "nom": "Unité", "type": "Unité" }], "échantillons": ["Aller {Direction} {Distance} {Unité}", "Aller {Distance} {Unité} {Direction}"] }, { "name": "CommandIntent", "slots": [{ "name": "Task", "type": "Task" }], "samples": ["Commander le drone à {Task}"] }, { "name": "TurnIntent", "slots": [{ "name": "Direction", "type": " Direction" }, { "name": "Rotation", "type": "AMAZON. NUMBER" }], "samples": ["Tourner {Direction} {Rotation} degrés"] }], "types": [{ "name": "Direction", "values": [{ "name": { "value": "Straight", "synonyms": ["Forw ards", "Forward"] } }, { "name": { "value": "Back", "synonyms": ["Backwards", "Backward"] } }, { "name": { "value": "Droite" } }, { "nom": { "valeur": "Gauche" } }, { "nom": { "valeur": "Bas" } }, { "nom": { "valeur": "Haut " } }] }, { "nom": "Unité", "valeurs": [{ "nom": { "valeur": "Mètres", "synonymes": ["Mètre"] } }, { "nom": { "value": "Yards", "synonyms": ["Yard"] } }, { "name": { "value": "Pieds", "synonyms": ["Foot"] } }] }, { "name": "Task", "values": [{ "name": { "value": "Land" } }, { "name": { "value": "Hold" } }, { "name": { "value": "Stay" } }, { "name": { "value": "RTL", "synonyms": ["Return to Launch"] } }] }] } } }

Après avoir collé le code dans l'éditeur JSON, vous pouvez cliquer sur la troisième étape de la liste de contrôle et il construira votre modèle d'interaction pour vous. Avec cette étape, vous aurez terminé pour le moment. Vous pouvez laisser l'emplacement de point de terminaison vide pour l'instant !

Étape 4: Construire votre fonction Lambda

Maintenant, cette étape est celle que vous allez devoir découvrir par vous-même. Je vais vous expliquer comment le connecter à la Skill Alexa, mais vous devrez le coder vous-même. Alors, allez d'abord à la console de gestion AWS. Ensuite, allez à Lambda. Vous pouvez ensuite créer une fonction en la nommant comme vous le souhaitez. Assurez-vous de le créer à partir de zéro et de créer le runtime dans le langage de programmation de votre choix. J'ai utilisé Node.js. Pour ajouter la compétence Alexa, ajoutez un déclencheur et sélectionnez Alexa Skills Kit (ASK). Copiez votre ARN Lambda et revenez à la compétence Alexa. Maintenant, allez au point de terminaison. Vous pouvez coller votre ARN, enregistrer et créer un nouveau modèle. Ensuite, prenez l'identifiant de compétence Alexa et collez-le dans la section déclencheur où il vous demande sur le Lambda. Ensuite, faites défiler vers le bas sur le Lambda et trouvez les paramètres de base et faites le délai d'attente de 10 secondes. Maintenant, c'est à vous de comprendre le code. Pour des conseils, vous pouvez les sites Web ci-dessous.

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

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

et vous pouvez utiliser le fichier que j'ai joint, mais il est incomplet et ne fonctionnera pas.

/** * Contrôlez votre quadcopter APM / Pixhawk avec votre voix, en utilisant Amazon Alexa, Lambda, 2lemetry MQTT.*/ var awsIot = require('aws-iot-device-sdk'); var config = require("./config"); var nom_appareil = "EchoDroneControl"; // ce périphérique est vraiment le contrôleur 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 = null; // Router la requête entrante en fonction du type (LaunchRequest, IntentRequest, etc.) Le corps JSON de la requête est fourni dans le paramètre d'événement. exports.handler = function (événement, contexte) { try { console.log("event.session.application.applicationId=" + event.session.application.applicationId); ctx = contexte; if (event.session.application.applicationId !== app_id) { ctx.fail("Invalid Application ID"); } client = awsIot.device(mqtt_config); client.on("connect", function(){ console.log("Connected to AWS IoT"); // callback(); });

si (événement.session.nouveau) {

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 dans le gestionnaire: " + e); ctx.fail("Exception: " + e); } }; /** * Appelé au démarrage de la session. */ function onSessionStarted(sessionStartedRequest, session) { console.log("onSessionStarted requestId=" + sessionStartedRequest.requestId + ", sessionId=" + session.sessionId); }

/**

* Appelé lorsque l'utilisateur lance la skill sans spécifier ce qu'il veut. */ function onLaunch(launchRequest, session, callback) { console.log("onLaunch requestId=" + launchRequest.requestId + ", sessionId=" + session.sessionId); // Envoi au lancement de votre skill. getWelcomeResponse (rappel); } /** * Appelé lorsque l'utilisateur spécifie une intention pour cette compétence. */ function onIntent(intentRequest, session) { //, callback) { console.log("onIntent requestId=" + intentRequest.requestId + ", sessionId=" + session.sessionId); var intention = intentRequest.intent, intentName = intentRequest.intent.name; console.log("REQUEST to string =" + JSON.stringify(intentRequest)); var rappel = null; // Envoi aux gestionnaires d'intention de votre compétence if ("GoIntent" === intentName) { doGoIntent(intent, session); } else if ("CommandIntent" === intentName) { doCommandIntent(intent, session); } else if ("TurnIntent" === intentName) { doTurnIntent(intent, session); } else if ("HelpIntent" === intentName) { getWelcomeResponse(); } else { throw "Intention invalide"; } } /** * Appelé lorsque l'utilisateur termine la session. * N'est pas appelé lorsque la compétence renvoie shouldEndSession=true. */ function onSessionEnded(sessionEndedRequest, session) { console.log("onSessionEnded requestId=" + sessionEndedRequest.requestId + ", sessionId=" + session.sessionId); // Ajoutez la logique de nettoyage ici } // --------------- Fonctions qui contrôlent le comportement de la compétence -------------------- --- function getWelcomeResponse() { // Si nous voulions initialiser la session pour avoir des attributs, nous pourrions les ajouter ici. var sessionAttributes = {}; var cardTitle = "Bienvenue"; var speechOutput = "Bienvenue dans le DRONE CONTROL. "; // A FAIRE: le drone est-il en ligne ou hors ligne ? Si en ligne, est-ce ARMÉ ? var repromptText = "Drone prêt pour la commande."; var shouldEndSession = false; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } /** * gère l'intention GO. */ function doGoIntent(intent, session, callback) { // var cardTitle = "Drone GO…"; var texterpromp = ""; 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 = ["en avant", "en avant", "en arrière", "en arrière", "à droite", "à gauche", "en haut", "en bas", "tout droit", "en avant", "tout droit devant"]; var validUnits = ["foot", "feet", "meter", "meters", "yard", "yards"]; rempptText = "Dites-moi jusqu'où aller et dans quelle direction. "; var échec = faux; // valider les entrées if (!(parseInt(distance) >= 1)) { speechOutput = "Je n'ai pas compris la distance que vous voulez que je parcoure. "; échec = vrai; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf(direction) == -1) { speechOutput = "Je n'ai pas compris la direction dans laquelle vous voulez que je voyage. "; échec = vrai; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf(unit) == -1) { speechOutput = "Je n'ai pas compris l'unité que vous voulez que je voyage. "; échec = vrai; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } if (!fail) { var cardTitle = "Drone allant " + direction + " " + distance + " " + unité; SpeechOutput = "Aller " + direction + " " + distance + " " + unité; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

function doCommandIntent(intent, session, callback) {

// var cardTitle = "Drone COMMANDE…"; var Texte de rappel = null; var sessionAttributes = {}; var shouldEndSession = false; var SpeechOutput = ""; remptText = "Dites-moi quelle est la commande pour le drone. "; 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) { speechOutput = "Je n'ai pas compris la commande. "; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else { var cardTitle = "Exécution de la commande Drone " + tâche; speechOutput = "Exécution de la commande " + tâche; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

function doTurnIntent(intent, session, callback) {

// var cardTitle = "Drone Turn…"; var Texte de rappel = null; var sessionAttributes = {}; var shouldEndSession = false; var SpeechOutput = ""; remptText = "Dites-moi comment vous voulez faire tourner le drone. "; var direction = intent.slots. Direction.value; var validDirections = ["right", "left", "around"]; if (validDirections.indexOf(direction) == -1) { speechOutput = "Je ne pouvais pas comprendre la direction du virage. "; ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, repromptText, shouldEndSession))); } else { var cardTitle = "Drone tournant " + direction; SpeechOutput = "Tourner" + direction; mqttPublish(intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); } }

fonction 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.on("close", (function () { console.log("MQTT CLIENT CLOSE - pense que c'est fait, avec succès. "); ctx.succeed(buildResponse(sessionAttributes, buildSpeechletResponse(cardTitle, speechOutput, remptText, shouldEndSession))); })); client.on("erreur", (fonction (err, accordé) { console.log("MQTT CLIENT ERROR!! " + err); })); }

// --------------- Aides qui construisent toutes les réponses -----------------------

function buildSpeechletResponse(title, output, repromptText, shouldEndSession) { return { outputSpeech: { type: "PlainText", text: output }, card: { type: "Simple", title: title, content: output }, rempt: { outputSpeech: { type: "PlainText", texte: repromptText } }, shouldEndSession: shouldEndSession } } fonction buildResponse(sessionAttributes, speechletResponse) { return { version: "1.0", sessionAttributes: sessionAttributes, réponse: speechletResponse } }

Conseillé: