جدول المحتويات:

طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS: 6 خطوات (بالصور)
طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS: 6 خطوات (بالصور)

فيديو: طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS: 6 خطوات (بالصور)

فيديو: طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS: 6 خطوات (بالصور)
فيديو: Дрон с голосовым управлением Alexa — часть 1 2024, شهر نوفمبر
Anonim
Image
Image
طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS
طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS
طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS
طائرة بدون طيار Raspberry Pi للتحكم الصوتي من Alexa مزودة بإنترنت الأشياء و AWS

أهلا! اسمي ارمان. عمري 13 عاما من ولاية ماساتشوستس. يوضح هذا البرنامج التعليمي ، كما يمكنك الاستدلال من العنوان ، كيفية بناء Raspberry Pi Drone. يوضح هذا النموذج الأولي كيف تتطور الطائرات بدون طيار وأيضًا حجم الدور الذي قد تلعبه في المستقبل. يمكنني بالتأكيد أن أرى نفسي أستيقظ في غضون 10 سنوات وأطلب من طائرة بدون طيار أن تحضر لي وجبة الإفطار. تستخدم الطائرة بدون طيار Amazon Alexa و Amazon Web Services و IoT (إنترنت الأشياء) والأهم من ذلك Raspberry Pi لتشغيلها. من المفترض أن توضح وتعلم عن الطائرات بدون طيار وكيف تتحسن كل يوم. نأمل أن تكون ناجحًا وأن تتعرف على الطائرات بدون طيار في هذه العملية. حظا سعيدا والشكر للقراءة. ارمان

اللوازم

لبناء النموذج الأولي ، هناك العديد من احتياجات الأجهزة والبرامج. لقد استخدمت برنامجًا تعليميًا عبر الإنترنت من قبل The Drone Dojo لبناء الطائرة بدون طيار ودمج التقنيات المدرجة ، بالنسبة للطائرة بدون طيار ، يمكنك العثور على قائمة الأجزاء هنا:

قائمة أجزاء الطائرة بدون طيار

متطلبات البرنامج:

  • خدمات أمازون ويب
  • كمبيوتر محمول
  • برنامج مخطط المهمة
  • بالينا إيتشر
  • تم العثور هنا على بطاقة MicroSD مع ملف Raspbian
  • أمازون أليكسا ، المادية أو الافتراضية

الخطوة 1: تجميع الأجزاء وفهمها

تجميع وفهم الأجزاء
تجميع وفهم الأجزاء

كل جزء مذكور في قائمة التوريد ضروري ، وكذلك فهم واضح لكل جزء. يمكنك العثور على الأجزاء عبر الإنترنت وبمجرد تجميعها ، تابع القراءة. يمكن العثور هنا على قائمة تشغيل بواسطة The Drone Dojo لفهم الأجزاء بشكل كامل. يمكن العثور على شرح لمدة 4 دقائق على قناة يوتيوب الخاصة بي هنا. عندما يتعلق الأمر بالطائرات بدون طيار ، فإن الأجزاء الوحيدة ، على الرغم مما يعتقده معظم الناس ، ليست مجرد محركات ومراوح. فيما يلي الأغراض الأساسية لكل جزء.

Raspberry Pi مع Emlid Navio2

هذا الجزء هو إلى حد كبير معالج مركزي والنقطة الرئيسية للطائرة بدون طيار. يعمل Raspberry Pi مثل وحدة المعالجة المركزية للكمبيوتر الذي يرسل أوامر إلى Navio2 لتنفيذها من خلال PWM (إشارات تعديل عرض النبض) إلى أجزاء أخرى من الطائرة بدون طيار

2. ESC (وحدات التحكم في السرعة الإلكترونية)

تم العثور على هذه الأجزاء الصفراء أسفل الإطار. يتم توصيل 4 منهم بالنافيو ، واحد لكل محرك. عند تلقي إشارات PWM ، يقومون بتدوير المحركات وبدء الطيران.

3. المحركات

لا تحتاج المحركات إلى الكثير من الشرح لأنك ربما تكون على دراية بها. يقومون بتدوير وتدوير المراوح لخلق قوة دفع.

4. مراوح

المراوح تخلق قوة دفع للطائرة بدون طيار لتطير. إنها تدور في نفس اتجاه المحركات لرفع السيارة.

5. وحدة البطارية والطاقة

تعمل بطارية LiPo على تشغيل الطائرة بدون طيار بالكامل من خلال الإطار باستخدام وحدة الطاقة. يعطي حوالي 15-20 دقيقة من وقت الرحلة ويعمل كمصدر للطاقة.

6. GPS

يتواصل GPS مع الأقمار الصناعية لتحديد موقع الطائرة بدون طيار. يحدد الارتفاع وخط العرض وخط الطول. يمكن استخدامه في Geofencing ونقاط الطريق وأيضًا الانتقال إلى مواقع أو اتجاهات معينة.

7. وحدة القياس عن بعد

تقوم وحدة القياس عن بعد بتوصيل طائرتنا بدون طيار بمحطة تحكم أرضية ، في حالتنا مخطط المهمة ، ليتم مراقبتها.

8. وحدة التحكم RC والوحدة النمطية جنبًا إلى جنب مع وحدة التشفير PPM

تستخدم وحدة التحكم RC الراديو لنقل الإشارات والأوامر إلى وحدة RC لتوجيه الطائرة بدون طيار يدويًا. يقوم PPM Encoder بترجمة هذه الإشارات حتى يقوم Navio + RPI بمعالجتها وتنفيذها.

9. الإطار

يعمل هذا الإطار الأحمر والأبيض كقاعدة أو منصة لوضع الأجزاء الأخرى. الإطار ديناميكي هوائي وخفيف الوزن ، وبالتالي فهو مثالي لبناء الطائرات بدون طيار.

الآن بمعرفة كل جزء ، يمكننا أخيرًا بناء الطائرة بدون طيار! فصاعدًا إلى الخطوة التالية!

الخطوة 2: تجميع الطائرة بدون طيار

تجميع الطائرة بدون طيار
تجميع الطائرة بدون طيار

ربما تكون هذه الخطوة هي الأصعب من حيث الجهد البدني. أوصي بوجود شخص آخر للمساعدة أو محاولة استخدام يد المساعدة في قائمة الأجزاء. العملية طويلة جدًا للشرح هنا ، لذا سأقدم رابطًا آخر استخدمته بواسطة The Drone Dojo.

بناء طائرة بدون طيار Raspberry Pi

مرة أخرى ، نظرًا لأنني لن أخوض في الكثير من التفاصيل ، سأقوم فقط بتسليط الضوء على أساسيات كل خطوة.

1. تنظيم المستلزمات الخاصة بك - اجمع موادنا وتأكد من سهولة الوصول إليها

2. خطط للبناء - نظّم أجزائك على الإطار لعمل مخطط لما ستبنيه

3. عمل اللحام - هذا هو العمل الذي يصعب القيام به بمفرده. يجب عليك لحام موصلات الرصاصة الذهبية التي تأتي مع المحركات إلى ESC. بعد ذلك ، يجب أن تأخذ الجزء السفلي من الإطار ولحام ESC بالإطار السفلي أو لوحة توزيع الطاقة. سيتم أيضًا لحام وحدة البطارية بلوحة توزيع الطاقة

4. إعداد الإطار - يجب عليك بعد ذلك ربط الجزء العلوي من الإطار مع الذراعين. يمكنك بعد ذلك إرفاق Raspberry Pi بالأعلى بالطريقة التي تريدها (لقد استخدمت الشريط اللاصق). ثم يمكنك تأمين ESC إلى الذراعين باستخدام روابط مضغوطة. نحن الآن على وشك الانتهاء.

5. ربط وحدة تحكم RC بجهاز الاستقبال - حاول اتباع الإرشادات الموجودة في قائمة التشغيل أعلاه لربط وحدة التحكم RC باستخدام ESC.

6. وضع اللمسات الأخيرة على أجزاء الإطار - شريط لاصق أو حزام على وحدة القياس عن بعد على الإطار. الصق مجرى الهواء PPM Encoder على ذراع أيضًا. الآن يمكنك توصيل ESC's و PPM Encoder إلى Navio.

7. GPS Mount + Battery - قم بتجميع حامل GPS باستخدام المسامير والقطع المختلفة. باستخدام الروابط المضغوطة ، قم بتوصيل GPS بالإطار. لم أستخدم بالضرورة GPS Mount بسبب هشاشته ، لكن الأمر متروك لك. بعد ذلك ، يمكنك إدخال البطارية بين Power Dist. مجلس. لقد قمت بربط وحدة الطاقة وإلصاقها بالإطار أيضًا. الآن تم إعداد أجهزتك إلى حد كبير. الآن للجزء الذي ننتظره!

8. تركيب المراوح !!! - يمكنك تشديد المراوح باستخدام الرسم البياني المذكور في قائمة التشغيل. ثم يمكنك توصيل وحدات التحكم الإلكترونية بالمحركات ، وقد انتهينا أخيرًا من بناء الطائرة بدون طيار.

البرنامج التالي ، وهكذا فصاعدا!

الخطوة 3: تكوين Raspberry Pi و GCS (مخطط المهمة)

تكوين Raspberry Pi و GCS (مخطط المهمة)
تكوين Raspberry Pi و GCS (مخطط المهمة)

مرة أخرى ، يمكنك العثور على إرشادات أكثر تفصيلاً في قائمة التشغيل من الخطوة الأخيرة. ومع ذلك ، ربما تعرف كيفية إعداد RasPi. لكن هذه المرة ، نحن نفعل ذلك بلا رأس. استخدم Balena Etcher لنسخ نظام التشغيل من موقع Navio OS على بطاقة MicroSD. أثناء توصيله بجهاز الكمبيوتر الخاص بك ، انتقل إلى طالب wpa باستخدام notepad ++. بعد ذلك ، أدخل ssid وكلمة المرور لـ Raspberry Pi للاتصال بشبكة WiFi الخاصة بك. ثم يجب عليك إضافة ملف يسمى SSH. يمكن أن يكون هذا من خلال سطر الأوامر أو طريقة أخرى. الآن يمكننا SSH. يمكنك استخدام موجه الأوامر أو المعجون. لقد استخدمت موجه الأوامر وكتبت "ssh pi @ navio" للاتصال في حالتي ، أو يمكنك العثور على عنوان IP و ssh بهذه الطريقة. عند الاتصال ، استخدم هذا الفيديو لإعداد Navio وتكوينه. لإعداد التتبع عن بعد ، يجب عليك أولاً إجراء تعديل على Raspberry Pi. اتبع هذا لإجراء التعديل وحاول الاتصال بـ Mission Planner. إذا لم يعمل القياس عن بُعد ، فيمكنك التراجع عن التحرير والاتصال باستخدام اتصال UDB عن طريق إدخال عنوان IP الخاص بـ GCS (محطة التحكم الأرضية مثل الكمبيوتر المحمول). بمجرد الاتصال بـ Mission Planner ، يمكنك استخدام معالج الإعداد لمعايرة جميع أجزاء الطائرة بدون طيار. إذا كنت بحاجة إلى مساعدة ، فارجع مرة أخرى إلى قائمة التشغيل. عادةً ما يكون هناك خطأ دائمًا في كل مرة تقوم فيها بالإعداد. يعد استكشاف الأخطاء وإصلاحها أحد أكبر أجزاء هذا المشروع. لا يمكنني مساعدتك حقًا لأنني لست على دراية بأخطائك ، ولكن يمكن إصلاح معظم الأخطاء بمساعدة من الإنترنت. بعد أن يصبح كل شيء جاهزًا ، تكون الطائرة بدون طيار جاهزة للطيران! يمكنك إعداد وحدة التحكم RC وأوضاع الطيران في مخطط المهمة. حاول تثبيت العصا اليسرى على أسفل اليمين تمامًا لمدة خمس ثوانٍ لتسليح الطائرة بدون طيار. لا أوصي بالطيران دون النظر إلى البرنامج التعليمي لأن الطائرة بدون طيار هشة للغاية وسهلة الكسر. بالنسبة لي ، في المرة الأولى التي قمت فيها بالطيران ، كسرت GPS Mount وبعض المراوح. إذا كنت لا تحتاج إلى التحكم الصوتي ، فيمكنك التوقف هنا. للتعرف على AWS والبرمجة ، تابع الطائرة بدون طيار!

الخطوة 4: برمجة الطائرة بدون طيار للطيران باستخدام Python

برمجة الطائرة بدون طيار للطيران باستخدام بايثون
برمجة الطائرة بدون طيار للطيران باستخدام بايثون

قبل الدخول إلى AWS ، يجب أن نفهم أولاً كيفية برمجة الطائرة بدون طيار للطيران. بعد الإعداد الأولي ، لن يكون دمج التحكم الصوتي صعبًا للغاية. أول شيء يمكننا محاولة فهمه هو عمل برنامج إقلاع وهبوط بسيط. بعد إعداد Raspberry Pi ، يمكننا استخدام SSH مرة أخرى. يمكنك إلقاء نظرة على قائمة التشغيل مرة أخرى أو اتباع تعليماتي.

1. لنقم أولاً بتنزيل كود مصدر ArduPilot في دليل على Raspberry Pi

mkdir src

بعد ذلك ، احصل على الملفات من GitHub باستخدام git clone

git clone -b Copter-3.6.11

الآن ، دعنا ننتقل إلى / src / ardupilot

قرص مضغوط src

قرص مضغوط ardupilot

الآن ، دعنا نهيئ الملفات المصدر

تحديث الوحدة الفرعية git --init - متسلسل

2. بعد ذلك ، يتعين علينا تجميع البرامج الثابتة على Raspberry Pi

تأكد من الانتقال إلى / src / ardupilot / باستخدام القرص المضغوط قبل تنفيذ الخطوات التالية

ثم للمشاركة على وجه التحديد في Navio باستخدام

./waf تكوين - اللوحة = navio2

ثم يمكنك تجميع مع

./waf - أهداف بن / arducopter

3. يمكننا الآن تثبيت الكود المصدري على Navio

أولاً ، دعنا ننتقل إلى الدليل الصحيح.

cd / etc / systemd / system

ثم قم بتحرير الملف

sudo vi arducopter.service

حيث تقول ExecStart ، أدخل ما يلي بدلاً من ما هو موجود بالفعل

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

الآن ، لوضع شفرة مصدر ardupilot موضع التنفيذ ، يمكننا استخدام

تحميل برنامج sudo systemctl daemon-reload

ثم يمكننا إعادة التشغيل مع

إعادة تشغيل sudo systemctl arducopter

مع الخطوة الأخيرة ، انتهينا أخيرًا من إعداد ArduPilot على طائرتنا بدون طيار

4. تثبيت DroneKit

DroneKit هو البرنامج الذي سنستخدمه لبرمجة الطائرة بدون طيار للطيران. لفهم بعض التعليمات البرمجية ، يمكنك العثور على الوثائق هنا. أولاً ، يجب أن نثبت الحزمة على طائرتنا بدون طيار قبل كتابة البرنامج النصي.

يمكننا تثبيت حزمة python باستخدام

نقطة تثبيت dronekit == 2.9.1

قد يكون هذا الإصدار الأحدث وقد لا يكون ، ولكنه الإصدار الذي استخدمته حتى أتمكن من المساعدة في استكشاف الأخطاء وإصلاحها.

للتحقق مما إذا كان مثبتًا ، يمكننا إجراء ملف

تجميد الأنابيب | grep dronekit

نحن الآن جاهزون أخيرًا لعمل أول نص برمجي للبيثون

5. takeoff_and_land.py

تحذير! أقترح إنشاء فهم أساسي للبايثون ، حتى تتمكن من تعلم وفهم الكود. إذا كنت ترغب في كتابة البرنامج بنفسك اتبع هذا الفيديو.

## أولاً ، لا ننشئ دليلًا لتخزين هذا الرمز

cd dk ## إذا كنت تريد أن تفعل ذلك بنفسك ، فاستخدم vi takeoff_and_land.py ## لإنشاء برنامج

خلاف ذلك ، يمكنك إلقاء نظرة أو استخدام الملف المرفق واستخدام بروتوكول نقل الملفات. يمكننا تجربة هذا البرنامج بعد ذلك. أولا لتوضيح أنه ملف بيثون يجب أن نستخدمه

chmod + x takeoff_and_land.py

بعد ذلك ، لمحاولة استخدام التعليمات البرمجية التالية للتشغيل

python takeoff_and_land.py --connect 127.0.0.1:14550

في المرة الأولى لم ينجح الأمر بالنسبة لي أيضًا. إذا كانت هناك مهلة ارتباط ، فلا داعي للقلق بشأن وجود شيء يمكنك القيام به. افتح موجهًا آخر و ssh. يمكنك محاولة تثبيت شيء يسمى mavproxy ومحاولة تشغيله. بعد ذلك ، يمكنك تشغيل كليهما في وقت واحد. هذا من شأنه أن يساعد في توصيل الطائرة بدون طيار. بمجرد أن يتم ذلك ، لدي تحدي بالنسبة لك. حاول معرفة ما يفعله البرنامج الآخر (set_velocity_body.py) وكيفية إنجاحه. إذا كنت تفعل ، عمل جيد.

6. فصاعدا!

يمكننا الآن استخدام هذه المعرفة لجعل التحكم في صوت طائراتنا بدون طيار. يستخدم التحكم في طائرة Alexa بدون طيار الكثير من هذه الميزات والمزيد. حظا سعيدا وما بعده!

الخطوة 5: استخدام Amazon Alexa و Amazon Web Services لدمج التحكم الصوتي

استخدام Amazon Alexa و Amazon Web Services لدمج التحكم الصوتي
استخدام Amazon Alexa و Amazon Web Services لدمج التحكم الصوتي
استخدام Amazon Alexa و Amazon Web Services لدمج التحكم الصوتي
استخدام Amazon Alexa و Amazon Web Services لدمج التحكم الصوتي

هذه الخطوة هي واحدة من أقلها توثيقًا. هذا يعني أنه سيكون من الأصعب استكشاف الأخطاء وإصلاحها. استغرق الأمر شهرًا تقريبًا ، وربما أكثر من ذلك. أهم شيء هنا هو التحلي بالصبر. هذه الميزة ، إذا تم تنفيذها في الحياة الواقعية ، يمكن أن تغير الحياة. يمكنك فقط إخبار Alexa بالحصول على مشترياتك من البقالة بدلاً من الذهاب بنفسك. تخيل ذلك! لذلك دون مزيد من اللغط دعنا ندخل في الأمر!

1. تسجيل Raspberry Pi كشيء على AWS IoT

لاستخدام IoT (إنترنت الأشياء) ، نحتاج إلى شيء ما. لذلك يتعين علينا تسجيل الدخول إلى وحدة تحكم AWS لاستخدام AWS IoT أولاً. ثم انتقل إلى IoT Core. بمجرد الوصول إلى هناك ، يجب النقر فوق إدارة ثم إنشاء شيء. بعد إضافة اسم للاتصال ، نحتاج إلى شهادة. أوصي بالنقر فوق شهادة بنقرة واحدة. ثم بعد رؤية شاشة الشهادة ، تأكد من تنزيل كل مفتاح بما في ذلك المرجع المصدق الجذر. ثم يمكنك أن تذهب وتنتهي من إنشاء الشيء. بعد ذلك علينا إنشاء سياسة. عد إلى IoT Core. ثم انقر فوق تأمين وانقر فوق السياسات. ثم اضغط على إنشاء السياسة. يمكنك بعد ذلك إنشاء اسم وإضافة موارد. ضمن الإجراء ، اكتب iot * واكتب * ضمن المورد واضغط على سماح للتأثير. ثم عد إلى الشيء الخاص بك وانتقل إلى شهادتك. مرة واحدة هنا ، انقر فوق السياسات. يمكنك بعد ذلك إرفاق سياستك الخاصة بهذا الشيء ويتم تعيينه بالكامل!

2. إعداد الكود على Raspberry Pi والتفاعل مع إنترنت الأشياء

في هذا الجزء ، ستحتاج إلى عميل SFTP (استخدمت WinSCP) لنقل الملفات. عند الاتصال بـ Raspberry Pi الخاص بنا ، سنحتاج إلى الحصول على مفاتيح الشهادة في متناول اليد. يجب عليك نقل ملفات المفاتيح إلى Raspberry Pi. يجب عليك أيضًا تثبيت AWSIoTPythonSDK على Raspberry Pi. ثم انتقل إلى دليل dk على Raspberry Pi. أنت تستخدم ملف Alexa Drone Control الذي قدمته للتواصل مع إنترنت الأشياء. لاستخدام هذا الملف ، استخدمت برنامج Shell Script لبدء التشغيل. سأعرض الكود أدناه حيث لا يمكنني تحميل الملف لسبب ما. إذا لم يلتقط البرنامج الرسائل من AWS IoT أثناء الاختبار ، فلا داعي للقلق! قد يكون هذا خطأي لأن ملف Alexa Drone Control قد لا يناسبك. لذا ، لإصلاحها ، ارجع إلى AWS IoT واضغط على Learn على اللوحة اليمنى. اتبع التعليمات وقد تضطر إلى إعادة التشغيل. اسف بشأن ذلك. بمجرد أن يبدأ إنترنت الأشياء الخاص بك في العمل مع البرنامج الموجود على RasPi ، يمكنك دمج رمز dronekit من ملف Alexa Drone Control الذي قدمته. بعد ذلك ، استخدم برنامج Shell Script الذي قدمته مع شهاداتك ونقطة نهاية Rest API من إنترنت الأشياء.

# stop script on errorset -e # تحقق لمعرفة ما إذا كان ملف CA الجذر موجودًا ، قم بالتنزيل إذا لم يكن [! -f./root-CA.crt] ؛ ثم printf "\ n تنزيل شهادة AWS IoT Root CA من AWS… / n" curl https://www.amazontrust.com/repository/AmazonRoot…>> root-CA.crt fi # تثبيت AWS Device SDK لـ Python إذا لم تكن مثبتة بالفعل لو [! -d./aws-iot-device-sdk-python] ؛ ثم printf "\ n تثبيت AWS SDK… / n" git clone https://www.amazontrust.com/repository/AmazonRoot…> pushd aws-iot-device-sdk-python python setup.py install popd fi

# قم بتشغيل تطبيق pub / sub باستخدام الشهادات التي تم تنزيلها في الحزمة

printf "\ n تشغيل تطبيق pub / sub sample… / n" python dk / AlexaDroneControl.py --connect 127.0.0.1:14550 -e "Your IoT ARN" -r root-CA.crt -c PiGroundStation01.cert.pem -k PiGroundStation01.private.key

لن يعمل هذا معكم جميعًا لأن الأسماء مختلفة. بدلاً من المفاتيح التي استخدمتها ، استبدل أسماء المفاتيح عند نقل الملف. تأكد من الخروج من dk قبل نقل الملف! يجب أن يكون هذا كل ما عليك فعله الآن.

3. بناء مهارات اليكسا الخاصة بك

تبدو هذه الخطوة أصعب بكثير مما هي عليه بالفعل. أولاً ، يجب علينا تسجيل الدخول إلى وحدة تحكم مطور Alexa. ثم ، فقط اضغط على إنشاء مهارة. عندما يطلب منك اختيار نموذج لمهاراتك ، فقط اضغط على Custom. عندما يطلب منك اختيار طريقة ، اضغط على توفير الطريقة الخاصة بك. يمكنك تسميته ما تريد. لا يوجد قالب مطلوب ، لذا اختر البدء من البداية. بعد ذلك ، بعد إنشاء مهارتك ، يجب أن تصل إلى شاشة Skill Builder مع قائمة تحقق على اليمين. من هنا ، يمكننا البدء في بناء مهاراتنا. الأول في قائمة التحقق هو اسم الاستدعاء. هذا ما ستطلبه من Alexa لاستدعاء مهارتك. بالنسبة لي ، لقد وضعت اسم الاحتجاج الخاص بي على أنه طائرة بدون طيار. الآن يمكننا الانتقال إلى نوايانا وأقوالنا وخاناتنا. هنا ، يمكنك إصدار أوامر للطائرة بدون طيار مثل الصعود مترًا واحدًا أو التحرك يمينًا أو لأسفل. يعمل المنجم بالفعل مع متر واحد فقط في الوقت الحالي. يمكنك النقر فوق محرر JSON في الجزء السفلي من اللوحة اليمنى. يمكنك بعد ذلك لصق الكود التالي فيه.

بعد لصق الكود في محرر JSON ، يمكنك النقر فوق الخطوة الثالثة من قائمة التحقق وستقوم ببناء نموذج التفاعل الخاص بك. بهذه الخطوة ، ستنتهي الآن. يمكنك ترك فتحة نقطة النهاية فارغة الآن!

الخطوة 4: بناء وظيفة Lambda الخاصة بك

الآن ، هذه الخطوة هي الخطوة التي يجب عليك اكتشافها بنفسك. سأخبرك بكيفية توصيله بـ Alexa Skill ، لكن سيتعين عليك ترميزه بنفسك. لذلك ، انتقل أولاً إلى وحدة التحكم الإدارية في AWS. ثم اذهب إلى Lambda. يمكنك بعد ذلك إنشاء وظيفة تسميها ما تريد. تأكد من تأليفه من البداية واجعل وقت التشغيل مهما كانت لغة البرمجة التي تريدها. لقد استخدمت Node.js. لإضافة Alexa Skill ، قم بإضافة مشغل وحدد Alexa Skills Kit (ASK). انسخ Lambda ARN وارجع إلى Alexa Skill. الآن ، انتقل إلى نقطة النهاية. يمكنك لصق ARN الخاص بك وحفظه وبناء نموذج جديد. ثم ، خذ معرّف Alexa Skill ID ، والصقه في قسم المشغل حيث يطلب منك Lambda. بعد ذلك ، قم بالتمرير لأسفل على Lambda وابحث عن الإعدادات الأساسية واجعل المهلة 10 ثوانٍ. الآن ، الأمر متروك لك لمعرفة الكود. للحصول على تلميحات ، يمكنك المواقع أدناه.

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

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

ويمكنك استخدام الملف الذي أرفقته ولكنه غير مكتمل ولن يعمل.

/ ** * تحكم في المروحية الرباعية APM / Pixhawk بصوتك ، باستخدام Amazon Alexa و Lambda و 2lemetry MQTT.* / var awsIot = يتطلب ('aws-iot-device-sdk') ؛ var config = تتطلب ("./ config") ؛ var deviceName = "EchoDroneControl" ؛ // هذا الجهاز هو وحدة التحكم 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 = فارغ ؛ var client = null ؛ // توجيه الطلب الوارد بناءً على النوع (LaunchRequest و IntentRequest وما إلى ذلك) يتم توفير نص JSON للطلب في معلمة الحدث. export.handler = function (event، Context) {try {console.log ("event.session.application.applicationId =" + event.session.application.applicationId)؛ ctx = السياق ؛ if (event.session.application.applicationId! == app_id) {ctx.fail ("معرف التطبيق غير صالح") ؛ } العميل = awsIot.device (mqtt_config) ؛ client.on ("connect"، function () {console.log ("Connected to AWS IoT")؛ // callback ()؛})؛

إذا (event.session.new) {

onSessionStarted ({requestId: event.request.requestId}، event.session) ؛ } if (event.request.type === "LaunchRequest") {onLaunch (event.request، event.session) ؛ } else if (event.request.type === "IntentRequest") {onIntent (event.request، event.session) ؛ } else if (event.request.type === "SessionEndedRequest") {onSessionEnded (event.request، event.session)؛ ctx.succeed () ؛ }} catch (e) {console.log ("EXCEPTION in handler:" + e)؛ ctx.fail ("استثناء:" + e) ؛ }}؛ / ** * يتم الاتصال به عند بدء الجلسة. * / function onSessionStarted (sessionStartedRequest، session) {console.log ("onSessionStarted requestId =" + sessionStartedRequest.requestId + "، sessionId =" + session.sessionId) ؛ }

/**

* يتم استدعائها عندما يبدأ المستخدم المهارة دون تحديد ما يريد. * / function onLaunch (launchRequest، session، callback) {console.log ("onLaunch requestId =" + launchRequest.requestId + "، sessionId =" + session.sessionId) ؛ // أرسل إلى إطلاق مهارتك. getWelcomeResponse (رد الاتصال) ؛ } / ** * يتم الاستدعاء عندما يحدد المستخدم نية لهذه المهارة. * / function onIntent (intentRequest، session) {//، callback) {console.log ("onIntent requestId =" + intentRequest.requestId + "، sessionId =" + session.sessionId) ؛ var intent = intentRequest.intent، intentName = intentRequest.intent.name ؛ console.log ("REQUEST to string =" + JSON.stringify (intentRequest)) ؛ رد الاتصال var = null ؛ // إرسال إلى معالجات نوايا المهارة الخاصة بك إذا ("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 "Invalid intent"؛ }} / ** * يتم الاتصال بها عندما ينهي المستخدم الجلسة. * لا يتم استدعاؤها عندما تعود المهارة يجب أن تنتهي الجلسة = صحيح. * / function onSessionEnded (sessionEndedRequest، session) {console.log ("onSessionEnded requestId =" + sessionEndedRequest.requestId + "، sessionId =" + session.sessionId) ؛ // أضف منطق التنظيف هنا} // --------------- الوظائف التي تتحكم في سلوك المهارة -------------------- --- function getWelcomeResponse () {// إذا أردنا تهيئة الجلسة للحصول على بعض السمات ، فيمكننا إضافتها هنا. var sessionAttributes = {} ، var cardTitle = "مرحبًا" ؛ vareechOutput = "مرحبًا بك في DRONE CONTROL."؛ // TODO: هل الطائرة بدون طيار متصلة أم غير متصلة بالإنترنت؟ إذا كان متصلاً بالإنترنت ، فهل هو مسلح؟ var repromptText = "الطائرة بدون طيار جاهزة للأمر."؛ var shouldEndSession = false ؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } / ** * يعالج هدف GO. * / function doGoIntent (intent، session، callback) {// var cardTitle = "Drone GO…" ؛ var repromptText = ""؛ var sessionAttributes = {} ، var shouldEndSession = false ؛ vareechOutput = "" ؛ var direction = intent.slots. Direction.value ؛ var مسافة = intent.slots. Distance.value ؛ var unit = intent.slots. Unit.value ؛ var validDirections = ["forward"، "forward"، "backwards"، "back"، "right"، "left"، "up"، "down"، "straight"، "forward"، "straight forward"]؛ var validUnits = ["foot"، "feet"، "meter"، "meter"، "yard"، "yards"]؛ repromptText = "أخبرني إلى أي مدى يجب أن أذهب وفي أي اتجاه."؛ var فشل = خطأ ؛ // تحقق من صحة المدخلات إذا (! (parseInt (مسافة)> = 1)) {speechOutput = "لم أستطع فهم المسافة التي تريد مني قطعها."؛ فشل = صحيح ؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } if (validDirections.indexOf (direction) == -1) {speechOutput = "لم أستطع فهم الاتجاه الذي تريدني أن أسافر فيه."؛ فشل = صحيح ؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } if (validUnits.indexOf (unit) == -1) {eechOutput = "لم أستطع فهم الوحدة التي تريد مني السفر إليها." ؛ فشل = صحيح ؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } إذا (! فشل) {var cardTitle = "طائرة بدون طيار تسير" + اتجاه + "" + مسافة + "" + وحدة ؛ الكلامOutput = "الذهاب" + الاتجاه + "" + المسافة + "" + الوحدة ؛ mqttPublish (intent، sessionAttributes، cardTitle، speechOutput، repromptText، shouldEndSession) ؛ }}

function doCommandIntent (intent ، session ، callback) {

// var cardTitle = "قيادة الطائرة بدون طيار …" ؛ var repromptText = فارغ ، var sessionAttributes = {} ، var shouldEndSession = false ؛ vareechOutput = "" ؛ repromptText = "أخبرني ما هو الأمر للطائرة بدون طيار."؛ var مهمة = intent.slots. Task.value ؛ var validTasks = ["launch" ، "land" ، "r. t. l." ، "Hold" ، "stay" ، "stop" ، "return to launch" ، "abort"] ؛ if (validTasks.indexOf (مهمة) == -1) {speechOutput = "لم أستطع فهم الأمر."؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } else {var cardTitle = "تنفيذ أمر الطائرة بدون طيار" + مهمة ؛ الكلامOutput = "تنفيذ الأمر" + المهمة ؛ mqttPublish (intent، sessionAttributes، cardTitle، speechOutput، repromptText، shouldEndSession) ؛ }}

function doTurnIntent (intent ، session ، callback) {

// var cardTitle = "Drone Turn…" ؛ var repromptText = فارغ ، var sessionAttributes = {} ، var shouldEndSession = false ؛ vareechOutput = "" ؛ repromptText = "أخبرني كيف تريد أن تدير الطائرة بدون طيار."؛ var direction = intent.slots. Direction.value ؛ var validDirections = ["right"، "left"، "around"]؛ if (validDirections.indexOf (direction) == -1) {speechOutput = "لم أستطع فهم اتجاه الانعطاف." ؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛ } else {var cardTitle = "Drone turn" + direction؛ الكلامOutput = "الدوران" + الاتجاه ؛ mqttPublish (intent، sessionAttributes، cardTitle، speechOutput، repromptText، shouldEndSession) ؛ }}

function 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 - يعتقد أنه تم بنجاح.")؛ ctx.succeed (buildResponse (sessionAttributes، buildSpeechletResponse (cardTitle، speechOutput، repromptText، shouldEndSession))) ؛})) ؛ client.on ("خطأ"، (الوظيفة (خطأ ، ممنوح) {console.log ("MQTT CLIENT ERROR !!" + err)؛}))؛ }

// --------------- المساعدون الذين يصنعون جميع الردود -----------------------

function buildSpeechletResponse (title، output، repromptText، shouldEndSession) {return {outputSpeech: {type: "PlainText"، text: output}، card: {type: "Simple"، title: title، content: output}، reprompt: {outputSpeech: {type: "PlainText"، text: repromptText}}، shouldEndSession: shouldEndSession}} function buildResponse (sessionAttributes، speechletResponse) {return {version: "1.0"، sessionAttributes: sessionAttributes، response: speechletResponse}}

موصى به: