Isi kandungan:

Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS: 6 Langkah (dengan Gambar)
Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS: 6 Langkah (dengan Gambar)

Video: Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS: 6 Langkah (dengan Gambar)

Video: Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS: 6 Langkah (dengan Gambar)
Video: Alexa Voice Controlled Drone - Part 1 2024, Julai
Anonim
Image
Image
Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS
Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS
Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS
Alexa Raspberry Pi Drone yang Dikendalikan Suara Dengan IoT dan AWS

Hai! Nama saya Armaan. Saya seorang budak lelaki 13 tahun dari Massachusetts. Tutorial ini menunjukkan, seperti yang anda dapat simpulkan dari tajuk, bagaimana membina Raspberry Pi Drone. Prototaip ini menunjukkan bagaimana drone berkembang dan juga seberapa besar peranan mereka mungkin dimainkan di masa depan. Saya pasti dapat melihat diri saya bangun dalam 10 tahun dan meminta drone untuk sarapan untuk saya. Drone menggunakan Amazon Alexa, Amazon Web Services, IoT (Internet of Things), dan yang paling penting adalah Raspberry Pi untuk dijalankan. Ini bertujuan untuk menunjukkan dan memberi tahu tentang drone dan bagaimana mereka bertambah baik setiap hari. Semoga anda berjaya dan belajar mengenai drone dalam prosesnya. Semoga berjaya dan terima kasih kerana membaca. -Armaan

Bekalan

Untuk membina prototaip terdapat pelbagai keperluan perkakasan dan perisian. Saya menggunakan tutorial dalam talian oleh The Drone Dojo untuk membina drone dan menyatukan teknologi yang disenaraikan. Untuk drone anda boleh mendapatkan senarai bahagian di sini:

Senarai Bahagian Drone

Keperluan Perisian:

  • Perkhidmatan Web Amazon
  • Komputer riba
  • Perisian Mission Planer
  • Balena Etcher
  • Kad MicroSD dengan Fail Raspbian terdapat di sini
  • Amazon Alexa, fizikal atau maya

Langkah 1: Mengumpulkan dan Memahami Bahagian

Mengumpulkan dan Memahami Bahagian
Mengumpulkan dan Memahami Bahagian

Setiap bahagian yang disebutkan dalam senarai bekalan adalah perlu, dan begitu juga pemahaman yang jelas tentang setiap bahagian. Anda boleh menemui bahagian dalam talian dan setelah dikumpulkan, teruskan membaca. Senarai main oleh Drone Dojo untuk memahami bahagian-bahagiannya boleh didapati di sini. Penjelasan selama 4 minit di saluran youtube saya boleh didapati di sini. Mengenai drone satu-satunya bahagian, walaupun yang difikirkan oleh kebanyakan orang, bukan hanya motor dan baling-baling. Berikut adalah tujuan asas setiap bahagian.

Raspberry Pi dengan Emlid Navio2

Bahagian ini hampir menjadi pemproses pusat dan titik utama drone. Raspberry Pi bertindak seperti CPU komputer yang menghantar arahan ke Navio2 untuk dilaksanakan melalui PWM (Isyarat Modulasi Lebar Pulse) ke bahagian lain drone

2. ESC (Pengawal Kelajuan Elektronik)

Bahagian kuning ini terdapat di bawah bingkai. Mereka 4 dipasang ke Navio, satu untuk setiap motor. Setelah menerima isyarat PWM, mereka memutar motor dan mula terbang.

3. Motor

Motor tidak memerlukan terlalu banyak penjelasan kerana anda mungkin sudah biasa dengan mereka. Mereka memutar dan memutar baling-baling untuk menghasilkan tujahan.

4. Baling-Baling

Baling-baling mencipta daya dorong agar drone terbang. Mereka berputar ke arah yang sama dengan motor untuk mengangkat kenderaan.

5. Modul Bateri dan Kuasa

Bateri LiPo menggerakkan keseluruhan drone melalui bingkai menggunakan modul kuasa. Ia memberikan masa penerbangan sekitar 15-20 minit dan bertindak sebagai sumber tenaga.

6. GPS

GPS berkomunikasi dengan satelit untuk menentukan kedudukan drone. Ini menentukan ketinggian, garis lintang, dan garis bujur. Ini dapat digunakan untuk Geofencing, titik jalan, dan juga bergerak ke posisi atau arah tertentu.

7. Modul Telemetri

Modul telemetri menghubungkan drone kita ke stesen kawalan darat, dalam kes kami Mission Planner, untuk dipantau.

8. Pengawal dan Modul RC bersama dengan PPM Encoder

Pengawal RC menggunakan radio untuk menghantar isyarat dan arahan ke Modul RC untuk mengemudi drone secara manual. PPM Encoder menerjemahkan isyarat ini agar Navio + RPI dapat diproses dan dilaksanakan.

9. Rangka

Bingkai merah dan putih ini berfungsi sebagai pangkalan atau platform untuk bahagian lain diletakkan. Rangkanya aerodinamik dan ringan, oleh itu sesuai untuk pembuatan drone kami.

Sekarang dengan pengetahuan tentang setiap bahagian, akhirnya kita dapat membina drone! Teruskan ke langkah seterusnya!

Langkah 2: Menyusun Drone

Memasang Drone
Memasang Drone

Langkah ini mungkin yang paling sukar dari segi usaha fizikal. Saya mengesyorkan meminta orang lain untuk mendapatkan bantuan atau cuba menggunakan tangan bantuan dalam senarai bahagian. Prosesnya terlalu lama untuk ditunjukkan di sini, jadi saya akan memberikan pautan lain yang saya gunakan oleh The Drone Dojo.

Membina Raspberry Pi Drone

Sekali lagi, kerana saya tidak akan membincangkan lebih terperinci, saya hanya akan mengetengahkan asas setiap langkah.

1. Susun Bekalan Anda - Kumpulkan bahan kami dan pastikan ia mudah diakses

2. Rancang Binaan Anda - Susun bahagian anda pada bingkai untuk membuat cetak biru apa yang akan anda bina

3. Soldering Work - Ini adalah kerja yang agak sukar untuk dilakukan sendiri. Anda mesti memasangkan penyambung peluru emas yang disertakan dengan motor ke ESC. Seterusnya, anda mesti mengambil bahagian bawah bingkai dan memateri ESC ke bingkai bawah atau Papan Pengagihan Kuasa. Modul Bateri juga akan disisipkan ke Papan Pengagihan Kuasa

4. Memasang Bingkai - Anda kemudian mesti memasukkan bahagian atas bingkai bersama dengan lengan. Anda kemudian boleh memasang Raspberry Pi di atas dengan cara yang anda mahukan. (Saya menggunakan pita saluran). Kemudian anda boleh melindungi ESC ke lengan dengan ikatan zip. Sekarang kita hampir selesai.

5. Mengikat Pengawal RC ke Penerima - Cuba ikuti arahan dalam senarai main di atas untuk mengikat Pengawal RC menggunakan ESC.

6. Menyelesaikan Bahagian pada Bingkai - Pita saluran atau tali pada modul telemetri ke bingkai. Saluran pita Pengekod PPM ke lengan juga. Sekarang anda boleh memasangkan ESC dan PPM Encoder ke Navio.

7. GPS Mount + Battery - Pasang GPS Mount dengan pelbagai skru dan kepingan. Dengan menggunakan ikatan zip, pasangkan GPS ke Bingkai. Saya tidak semestinya menggunakan GPS Mount kerana kerapuhannya, tetapi terpulang kepada anda. Seterusnya, anda boleh memasukkan bateri di antara Power Dist. Papan. Saya mengikat dan mengetuk modul kuasa ke bingkai juga. Kini perkakasan anda sudah siap. Sekarang untuk bahagian yang kita tunggu!

8. Memasang Baling-Baling !!! - Anda boleh mengetatkan baling-baling menggunakan carta yang disebutkan dalam senarai main. Kemudian anda boleh memasangkan ESC ke motor dan akhirnya kami selesai membina drone.

Perisian seterusnya, seterusnya!

Langkah 3: Mengkonfigurasi Raspberry Pi dan GCS (Mission Planner)

Mengkonfigurasi Raspberry Pi dan GCS (Mission Planner)
Mengkonfigurasi Raspberry Pi dan GCS (Mission Planner)

Sekali lagi, anda boleh mendapatkan arahan yang lebih terperinci dalam senarai main dari langkah terakhir. Walau bagaimanapun, anda mungkin tahu cara menyiapkan RasPi. Tetapi kali ini, kita melakukannya tanpa kepala. Gunakan Balena Etcher untuk membakar OS dari laman web Navio OS ke dalam kad MicroSD. Semasa ia terpasang ke komputer anda, masuk ke pemohon wpa menggunakan notepad ++. Selepas itu, masukkan ssid dan kata laluan untuk Raspberry Pi untuk menyambung ke WiFi anda. Kemudian anda mesti menambah fail bernama SSH. Ini boleh melalui Command Line atau kaedah lain. Sekarang kita boleh SSH. Anda boleh menggunakan command prompt atau Putty. Saya menggunakan command prompt dan menaip "ssh pi @ navio" untuk berhubung dalam kes saya, atau anda boleh mencari alamat IP dan ssh dengan cara itu. Setelah menyambung, gunakan video ini untuk menyiapkan dan mengkonfigurasi Navio. Untuk menyediakan telemetri, anda mesti membuat pengeditan terlebih dahulu pada Raspberry Pi. Ikuti ini untuk membuat pengeditan dan cuba sambungkan ke Mission Planner. Sekiranya telemetri tidak berfungsi, anda boleh mengurungkan pengeditan dan menyambung menggunakan sambungan UDB dengan memasukkan IP GCS (Ground Control Station seperti laptop) anda. Setelah disambungkan ke Mission Planner, anda boleh menggunakan wizard persediaan untuk menentukur semua bahagian drone. Sekiranya anda memerlukan bantuan, rujuk lagi senarai main. Biasanya, setiap kali anda membuat persediaan, hampir selalu ada kesalahan. Penyelesaian masalah adalah salah satu bahagian terbesar dalam projek ini. Saya tidak dapat benar-benar menolong anda di sana kerana saya tidak menyedari kesalahan anda, tetapi kebanyakan kesalahan dapat diselesaikan dengan bantuan dari internet. Setelah semuanya siap, maka drone siap terbang! Anda boleh mengatur pengawal RC dan mod penerbangan anda di Mission Planner. Cuba pegang tongkat kiri ke kanan paling bawah selama lima saat untuk mempersenjatai drone. Saya tidak mengesyorkan terbang tanpa melihat tutorial kerana drone itu sangat rapuh dan mudah pecah. Bagi saya, pada kali pertama saya menerbangkannya, saya melanggar GPS Mount dan beberapa baling-baling. Sekiranya anda tidak memerlukan kawalan suara, anda boleh berhenti di sini. Untuk mengetahui mengenai AWS dan pengaturcaraan drone terus!

Langkah 4: Memprogram Drone untuk Terbang Dengan Python

Memprogram Drone untuk Terbang Dengan Python
Memprogram Drone untuk Terbang Dengan Python

Sebelum masuk ke AWS, kita harus terlebih dahulu memahami cara memprogram drone untuk terbang. Selepas persediaan awal, menyatukan kawalan suara tidaklah terlalu sukar. Perkara pertama yang dapat kita fahami ialah membuat program landasan dan landasan yang mudah. Setelah menyiapkan Raspberry Pi, kita dapat memasukkannya semula ke dalamnya. Anda boleh melihat senarai main sekali lagi atau mengikuti arahan saya.

1. Pertama-tama mari memuat turun Kod Sumber ArduPilot dalam direktori di Raspberry Pi

mkdir src

Kemudian, dapatkan fail dari GitHub menggunakan git clone

git clone -b Copter-3.6.11

Sekarang, mari pergi ke / src / ardupilot

cd src

cd ardupilot

Sekarang, mari kita mulakan fail sumber

kemas kini git submodule --init --recursive

2. Seterusnya, kita harus menyusun firmware pada Raspberry Pi

Pastikan anda menavigasi ke / src / ardupilot / dengan cd sebelum melakukan langkah seterusnya

Kemudian untuk mengkonfigurasi khusus ke Navio menggunakan

./waf configure --board = navio2

Kemudian anda boleh menyusun dengan

./waf --targets bin / arducopter

3. Kita sekarang boleh memasang kod sumber ke Navio

Mula-mula mari menavigasi ke direktori yang betul.

cd / etc / systemd / sistem

Kemudian edit fail

sudo vi arducopter.service

Di tempat yang dinyatakan ExecStart, masukkan yang berikut dan bukannya yang sudah ada

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

Sekarang, untuk memasukkan kod sumber ardupilot ke dalam tindakan, kita dapat menggunakan

sudo systemctl daemon-tambah nilai

Kemudian kita boleh mulakan semula dengan

sudo systemctl mulakan semula arducopter

Dengan langkah terakhir, kami akhirnya selesai menyiapkan ArduPilot pada drone kami

4. Memasang DroneKit

DroneKit adalah perisian yang akan kami gunakan untuk memprogram drone untuk terbang. Untuk memahami beberapa kod, anda boleh mendapatkan dokumentasinya di sini. Mula-mula kita mesti memasang pakej pada drone kita sebelum menulis skrip.

Kita boleh memasang python package dengan

memasang pip dronekit == 2.9.1

Ini mungkin, atau mungkin bukan versi terbaru, tetapi ia adalah versi yang saya gunakan sehingga saya dapat membantu menyelesaikan masalah.

Untuk memeriksa sama ada dipasang, kita boleh melakukan

pembekuan paip | grep dronekit

Sekarang kami akhirnya bersedia untuk membuat skrip python pertama kami

5. takeoff_and_land.py

AMARAN! Saya cadangkan mewujudkan pemahaman asas mengenai python, supaya anda dapat mempelajari dan memahami kodnya. Sekiranya anda ingin menulis program itu sendiri ikuti video ini.

## Pertama jangan buat direktori untuk menyimpan kod ini

cd dk ## Sekiranya anda ingin melakukannya sendiri, gunakan vi takeoff_and_land.py ## untuk membuat program

Jika tidak, anda boleh melihat atau menggunakan fail yang dilampirkan dan menggunakan protokol pemindahan fail. Kami boleh mencuba program ini selepas itu. Pertama untuk menjelaskan bahawa ia adalah fail python yang mesti kita gunakan

chmod + x takeoff_and_land.py

Kemudian, untuk mencuba gunakan kod berikut untuk dijalankan

python takeoff_and_land.py --hubungkan 127.0.0.1.114550

Kali pertama ia tidak berfungsi untuk saya. Sekiranya terdapat masa tamat pautan, maka jangan bimbang ada sesuatu yang boleh anda lakukan. Buka prompt lain dan ssh. Anda boleh mencuba memasang sesuatu yang disebut mavproxy dan mencuba menjalankannya. Selepas itu, anda boleh menjalankan kedua-duanya secara serentak. Ini akan membantu menghubungkan drone. Setelah selesai, saya mempunyai cabaran untuk anda. Cuba fikirkan apa yang dilakukan oleh program lain (set_velocity_body.py) dan bagaimana membuatnya berfungsi. Sekiranya anda berjaya, selamat bekerja.

6. Maju!

Kita sekarang boleh menggunakan pengetahuan ini untuk menjadikan drone kita dikawal suara. Kawalan drone Alexa menggunakan banyak ciri ini dan banyak lagi. Semoga berjaya dan seterusnya!

Langkah 5: Menggunakan Amazon Alexa dan Amazon Web Services untuk Mengintegrasikan Kawalan Suara

Menggunakan Amazon Alexa dan Amazon Web Services untuk Mengintegrasikan Kawalan Suara
Menggunakan Amazon Alexa dan Amazon Web Services untuk Mengintegrasikan Kawalan Suara
Menggunakan Amazon Alexa dan Amazon Web Services untuk Mengintegrasikan Kawalan Suara
Menggunakan Amazon Alexa dan Amazon Web Services untuk Mengintegrasikan Kawalan Suara

Langkah ini adalah salah satu langkah yang kurang didokumentasikan. Ini bermaksud yang paling sukar untuk diselesaikan. Memulakannya bekerja memerlukan masa lebih kurang sebulan, mungkin lebih. Perkara yang paling penting di sini adalah bersabar. Ciri ini, jika dilaksanakan dalam kehidupan nyata, dapat mengubah hidup. Anda hanya boleh memberitahu Alexa untuk mendapatkan barang runcit untuk anda dan bukannya pergi sendiri. Bayangkan itu! Oleh itu, tanpa basa-basi, mari masuk ke dalamnya!

1. Mendaftarkan Raspberry Pi sebagai Perkara di AWS IoT

Untuk menggunakan IoT (Internet of Things), kita memerlukan sesuatu. Oleh itu, kita mesti log masuk ke AWS Console untuk menggunakan AWS IoT terlebih dahulu. Kemudian pergi ke IoT Core. Setelah sampai di sana, anda harus mengklik Urus dan kemudian buat sesuatu. Setelah menambahkan nama, untuk menyambung, kami memerlukan sijil. Saya akan mengesyorkan mengklik sijil Satu klik. Kemudian setelah melihat skrin sijil, pastikan memuat turun setiap kunci termasuk root CA. Kemudian anda boleh pergi dan menyelesaikan penciptaan perkara itu. Seterusnya kita harus membuat dasar. Kembali ke Core IoT. Kemudian klik pada dasar selamat dan klik. Kemudian tekan dasar buat. Anda kemudian boleh membuat nama dan menambahkan sumber. Dalam tindakan, ketik iot * dan taip * di bawah sumber dan tekan memungkinkan untuk berlaku. Kemudian kembali kepada perkara anda dan pergi ke sijil anda. Setelah sampai di sini, klik pada dasar. Anda kemudian boleh melampirkan polisi anda untuk perkara itu dan semuanya sudah siap!

2. Menetapkan Kod pada Raspberry Pi dan berinteraksi dengan IoT

Untuk bahagian ini, anda memerlukan Pelanggan SFTP (saya menggunakan WinSCP) untuk pemindahan fail. Setelah menyambung ke Raspberry Pi kami, kami perlu mempunyai kunci sijil di tangan. Anda mesti memindahkan fail utama ke Raspberry Pi. Anda juga harus memasang AWSIoTPythonSDK pada Raspberry Pi. Kemudian masuk ke direktori dk pada Raspberry Pi. Anda menggunakan fail Alexa Drone Control yang saya berikan untuk berkomunikasi dengan IoT. Untuk menggunakan fail ini saya menggunakan Shell Script untuk memulai. Saya akan menunjukkan kod di bawah kerana saya tidak dapat memuat naik fail kerana sebab tertentu. Sekiranya program tidak mengambil mesej dari AWS IoT semasa ujian, jangan risau! Ini mungkin salah saya kerana Alexa Drone Control File mungkin tidak sesuai dengan Perkara anda. Oleh itu, untuk memperbaikinya, kembali ke AWS IoT dan tekan belajar di panel kiri. Ikut arahan dan anda mungkin perlu memulakan semula. Maaf tentang itu. Setelah IoT anda mula berfungsi dengan program di RasPi, anda boleh mengintegrasikan kod dronekit dari fail Alexa Drone Control yang saya berikan. Selepas itu, gunakan Skrip Shell yang saya berikan dengan sijil dan Titik Akhir API Istirahat dari IoT.

# hentikan skrip pada erroret -e # Periksa untuk melihat apakah ada root root file, muat turun jika tidak jika [! -f./root-CA.crt]; kemudian printf "\ nMuat turun sijil AWS IoT Root CA dari AWS … / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # pasang AWS Device SDK untuk Python jika belum dipasang sekiranya [! -d./aws-iot-device-sdk-python]; kemudian printf "\ nMemasang AWS SDK … / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py pasang popd fi

# jalankan aplikasi sampel sub / pub menggunakan sijil yang dimuat turun dalam pakej

printf "\ nMenjalankan aplikasi sampel pub / sub … / n" python dk / AlexaDroneControl.py --connect 127.0.0.1.114550 -e "Your IoT ARN" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

Ini tidak akan berfungsi untuk anda semua kerana namanya berbeza. Daripada kunci yang saya gunakan ganti dengan nama kunci anda semasa anda memindahkan fail. Pastikan keluar dk sebelum memindahkan fail! Itulah yang harus anda buat buat masa ini.

3. Membina Kemahiran Alexa anda

Langkah ini nampaknya jauh lebih sukar daripada yang sebenarnya. Pertama, kita mesti log masuk ke konsol Pembangun Alexa. Kemudian, tekan skill create. Apabila meminta untuk memilih model untuk kemahiran anda, tekan custom. Apabila meminta untuk memilih kaedah, tekan penyediaan anda sendiri. Anda boleh menamakannya mengikut kehendak anda. Tidak perlu templat, jadi pilih mula dari awal. Seterusnya, setelah mencipta kemahiran anda, anda harus sampai di skrin Pembangun Kemahiran dengan senarai semak di sebelah kanan. Dari sini, kita boleh mula membina kemahiran kita. Pertama di senarai semak adalah nama pemanggil. Inilah yang akan anda katakan kepada Alexa untuk menggunakan kemahiran anda. Bagi saya, saya meletakkan nama panggilan saya sebagai drone. Sekarang kita boleh pergi ke maksud, ucapan, dan slot kita. Di sini, anda boleh membuat perintah untuk drone seperti naik 1 meter atau ke kanan atau ke bawah. Tambang hanya berfungsi dengan satu meter buat masa ini. Anda boleh mengklik Editor JSON di bahagian bawah panel kiri. Anda kemudian boleh menampal kod berikut ke dalamnya.

Setelah menampal kod ke JSON Editor, anda boleh mengklik pada langkah ketiga senarai semak dan ia akan membina model interaksi anda untuk anda. Dengan langkah ini, anda akan selesai buat masa ini. Anda boleh membiarkan slot titik akhir kosong buat masa ini!

Langkah 4: Membangunkan Fungsi Lambda Anda

Sekarang, langkah ini adalah langkah yang mesti anda fikirkan sendiri. Saya akan memberitahu anda cara menyambungkannya ke Alexa Skill, tetapi anda harus membuat kod sendiri. Jadi, mula-mula pergi ke konsol pengurusan AWS. Kemudian, pergi ke Lambda. Anda kemudian boleh membuat fungsi menamakannya apa sahaja yang anda mahukan. Pastikan anda mengarangnya dari awal dan buat masa berjalan apa sahaja bahasa pengaturcaraan yang anda mahukan. Saya menggunakan Node.js. Untuk menambahkan Skill Alexa, tambahkan pemicu dan pilih Alexa Skills Kit (ASK). Salin Lambda ARN anda dan kembali ke Alexa Skill. Sekarang, pergi ke titik akhir. Anda boleh menampal ARN anda, menyimpan dan membina model baru. Kemudian, ambil Alexa Skill ID, dan tampal di bahagian pencetus di mana ia meminta anda di Lambda. Seterusnya, tatal ke bawah pada Lambda dan cari tetapan asas dan buat masa tamat 10 saat. Sekarang, terserah anda untuk mengetahui kodnya. Untuk petunjuk, anda boleh melayari laman web di bawah.

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

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

dan anda boleh menggunakan fail yang saya lampirkan, tetapi tidak lengkap dan tidak akan berfungsi.

/ ** * Kawal quadcopter APM / Pixhawk anda dengan suara anda, menggunakan Amazon Alexa, Lambda, 2lemetry MQTT.* / var awsIot = memerlukan ('aws-iot-device-sdk'); var config = memerlukan ("./ config"); var deviceName = "EchoDroneControl"; // peranti ini benar-benar pengawal var mqtt_config = {"keyPath": config.privateKey, "certPath": config.certificate, "caPath": config.rootCA, "host": config.host, "port": 8883, "clientId": "Lambda-" + deviceName, // + "-Lambda-" + (Date baru (). getTime ()), "region": "us-east-1", "debug": true}; var ctx = null; pelanggan var = null; // Rutekan permintaan masuk berdasarkan jenis (LaunchRequest, IntentRequest, dll.) Badan permintaan dari JSON disediakan dalam parameter peristiwa. eksport.handler = fungsi (peristiwa, konteks) {cuba {console.log ("event.session.application.applicationId =" + event.session.application.applicationId); ctx = konteks; jika (event.session.application.applicationId! == app_id) {ctx.fail ("ID Aplikasi Tidak Sah"); } pelanggan = awsIot.device (mqtt_config); client.on ("connect", function () {console.log ("Disambungkan ke AWS IoT"); // callback ();});

jika (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}, event.session); } if (event.request.type === "LaunchRequest") {onLaunch (event.request, event.session); } lain jika (event.request.type === "IntentRequest") {onIntent (event.request, event.session); } lain jika (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request, event.session); ctx. berjaya (); }} tangkapan (e) {console.log ("PENGECUALIAN dalam pengendali:" + e); ctx.fail ("Pengecualian:" + e); }}; / ** * Dipanggil semasa sesi dimulakan. * / function onSessionStarted (sessionStartedRequest, session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + ", sessionId =" + session.sessionId); }

/**

* Dipanggil ketika pengguna melancarkan kemahiran tanpa menentukan apa yang mereka mahukan. * / function onLaunch (launchRequest, session, callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + ", sessionId =" + session.sessionId); // Hantar pelancaran kemahiran anda. getWelcomeResponse (panggilan balik); } / ** * Dipanggil ketika pengguna menentukan maksud untuk kemahiran ini. * / 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)); panggilan balik var = null; // Hantar ke pengendali niat kemahiran anda jika ("GoIntent" === intentName) {doGoIntent (niat, sesi); } lain jika ("CommandIntent" === intentName) {doCommandIntent (niat, sesi); } lain jika ("TurnIntent" === intentName) {doTurnIntent (niat, sesi); } lain jika ("HelpIntent" === intentName) {getWelcomeResponse (); } lain {buang "Niat tidak sah"; }} / ** * Dipanggil semasa pengguna mengakhiri sesi. * Tidak dipanggil ketika kemahiran kembali harusEndSession = true. * / function onSessionEnded (sessionEndedRequest, session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + ", sessionId =" + session.sessionId); // Tambahkan logik pembersihan di sini} // --------------- Fungsi yang mengawal tingkah laku kemahiran -------------------- --- function getWelcomeResponse () {// Sekiranya kita ingin memulakan sesi untuk mempunyai beberapa atribut, kita boleh menambahkannya di sini. var sessionAttributes = {}; var cardTitle = "Selamat Datang"; var speechOutput = "Selamat Datang ke KAWALAN DRONE."; // TODO: adakah drone dalam talian atau luar talian? Sekiranya dalam talian, adakah itu SENANG? var repromptText = "Drone siap untuk arahan."; var tatauEndSession = false; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } / ** * menangani maksud GO. * / fungsi doGoIntent (maksud, sesi, panggilan balik) {// var cardTitle = "Drone GO…"; var repromptText = ""; var sessionAttributes = {}; var tatauEndSession = false; var speechOutput = ""; var direction = intent.slots. Direction.value; var jarak = intent.slots. Distance.value; var unit = intent.slots. Unit.value; var validDirections = ["maju", "depan", "mundur", "belakang", "kanan", "kiri", "atas", "bawah", "lurus", "depan", "lurus ke depan"]; var validUnits = ["kaki", "kaki", "meter", "meter", "halaman", "ela"]; repromptText = "Beritahu saya sejauh mana untuk pergi dan ke arah mana."; var fail = salah; // sahkan input jika (! (parseInt (jarak)> = 1)) {speechOutput = "Saya tidak dapat memahami jarak yang anda mahu saya tempuh."; gagal = benar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validDirections.indexOf (direction) == -1) {speechOutput = "Saya tidak dapat memahami arah yang anda mahu saya lalui."; gagal = benar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (validUnits.indexOf (unit) == -1) {speechOutput = "Saya tidak dapat memahami unit yang anda mahu saya tempuh."; gagal = benar; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } if (! fail) {var cardTitle = "Drone going" + direction + "" + jarak + "" + unit; speechOutput = "Menuju" + arah + "" + jarak + "" + unit; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

fungsi doCommandIntent (maksud, sesi, panggilan balik) {

// var cardTitle = "Perintah Drone…"; var repromptText = null; var sessionAttributes = {}; var tatauEndSession = false; var speechOutput = ""; repromptText = "Beritahu saya apakah perintah untuk drone tersebut."; var task = intent.slots. Task.value; var validTasks = ["launch", "land", "r. t. l.", "hold", "stay", "stop", "return to launch", "batalkan"]; if (validTasks.indexOf (task) == -1) {speechOutput = "Saya tidak dapat memahami perintahnya."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } lain {var cardTitle = "Melaksanakan perintah Drone" + tugas; ucapanOutput = "Melaksanakan perintah" + tugas; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

fungsi doTurnIntent (maksud, sesi, panggilan balik) {

// var cardTitle = "Drone Turn…"; var repromptText = null; var sessionAttributes = {}; var tatauEndSession = false; var speechOutput = ""; repromptText = "Beritahu saya bagaimana anda mahu menghidupkan drone."; var direction = intent.slots. Direction.value; var validDirections = ["kanan", "kiri", "sekitar"]; if (validDirections.indexOf (direction) == -1) {speechOutput = "Saya tidak dapat memahami arah giliran."; ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession))); } lain {var cardTitle = "Putar drone" + arah; ucapanOutput = "Menoleh" + arah; mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, shouldEndSession); }}

fungsi mqttPublish (intent, sessionAttributes, cardTitle, speechOutput, repromptText, tatauEndSession)

{var strIntent = JSON.stringify (niat); console.log ("mqttPublish: INTENT text =" + strIntent); // client.publish ("ikw1zr46p50f81z / drone / echo", strIntent, false); client.publish (config.topic, strIntent, false); pelanggan.end (); client.on ("close", (function () {console.log ("MQTT CLIENT CLOSE - think it selesai, berjaya."); ctx.succeed (buildResponse (sessionAttributes, buildSpeechletResponse (cardTitle, speechOutput, repromptText, shouldEndSession)));})); client.on ("ralat", (fungsi (err, diberikan) {console.log ("ERROR KLIEN MQTT !!" + err);})); }

// --------------- Pembantu yang membina semua respons -----------------------

function buildSpeechletResponse (tajuk, output, repromptText, shouldEndSession) {return {outputSpeech: {type: "PlainText", teks: output}, kad: {type: "Simple", tajuk: tajuk, kandungan: output}, reprompt: {outputSpeech: {type: "PlainText", text: repromptText}}, shouldEndSession: shouldEndSession}} function buildResponse (sessionAttributes, speechletResponse) {return {version: "1.0", sessionAttributes: sessionAttributes, respons: speechletResponse}}

Disyorkan: