DIY طائرة بدون طيار مستقلة مع التحكم في الإنترنت. الجزء الثاني حول البرامج

هذا استمرار لقصة طائرة بدون طيار مستقلة. تحدث الجزء الأول عن الأجهزة ، سيتحدث هذا عن البرامج. بادئ ذي بدء ، برنامج تعليمي صغير حول تفاعل العامل مع المروحية. فيما يلي تخطيط نموذجي لمعظم الطائرات بدون طيار المجمعة ذاتيًا:

الصورة

وهنا مخطط الطائرات بدون طيار المتقدمة:

الصورة

هذه هي الطريقة التي تعمل بها الطائرات بدون طيار ، والتي يتم التحكم فيها من هاتف ذكي:

الصورة

يمكنك التحكم في الطائرة بدون طيار عبر الإنترنت (إذا كان لديك بطاقة SIM بعنوان IP ثابت):

الصورة

أو إذا كان عنوان IP ديناميكيًا:

الصورة

من أجل موثوقية وفائض قنوات الاتصال ، يمكن تطوير الخيار الأخير لمثل هذه الحالة:

الصورة

بعد ذلك ، سأصف عملية الإعداد لجهاز التحكم في الطيران Emlid Navio 2 والحاسوب الصغير Raspberry Pi 3.

الصورة
ولكن ، مع تعديلات طفيفة ، فإن هذه الإعدادات مناسبة لأي جهاز تحكم في الطيران ، يمكنك التواصل معه عبر بروتوكول MAVLink بالاقتران مع أي جهاز كمبيوتر على عائلة Linux من نظام التشغيل.

الصورة

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

برنامج التحكم في الطائرات بدون طيار لأجهزة الكمبيوتر والأجهزة اللوحية


للسيطرة على الطائرات بدون طيار ، يتم استخدام برامج GCS (محطة التحكم الأرضية) الخاصة. كذلك في النص سأستخدم هذا الاختصار. أحببت QGroundControl ، وهو نظام أساسي متعدد المصادر مفتوح المصدر (Windows و Linux و MacOS و iOS و Android) أصبح GCS جزءًا من مشروع DroneCode . ولكن هناك بدائل مجانية وتجارية: APM Planner و MissionPlanner و UgCS و LibrePilot و OpenPilot و Tower (DroidPlanner) لنظام Android و MAVPilot (iOS) و SidePilot (iOS). وكذلك وحدة التحكم MAVProxy .

قم بتثبيت صورة نظام تشغيل على بطاقة SD


من أجل تشغيل الطيار الآلي العادي ، يوصى بشدة باستخدام بطاقات SD "سريعة" (الفئة 10). بطاقات الذاكرة البطيئة ليس لديها وقت لحفظ سجلات الطيار الآلي حتى عند تردد منخفض ، ونتيجة لذلك تبين أنها ملتوية أو غير مكتوبة على الإطلاق. قد يكون الدليل على ذلك خطأ " لا يوجد نبضات IO " ، والذي يمكن ملاحظته في وحدة تحكم MAVLink (يتم وصف كيفية مشاهدة وحدة تحكم MAVLink أدناه). عند الشراء ، انظر إلى القدرة على كتابة فيديو 4K: على الأرجح سيكون SD سريعًا. لسوء الحظ ، اكتشفت ذلك بعد سقوط الطائرة بدون طيار ، عندما كان من الضروري تحليل السجلات ومعرفة السبب. كانت السجلات غير قابلة للقراءة لعدة GCS. تبين أن سبب إيقاف تشغيل المحركات أثناء الرحلة كان عاديًا: نسيت أن أضبط الحد الأدنى من الجهد على البطارية في إعدادات التشغيل الآمن.

لذلك ، قم بتنزيل صورة Raspbian Stretch النهائية مع Ardupilot و ROS المثبتة مسبقًا من Emlid من صفحة التعليمات الأصلية . ونكتبها على بطاقة ذاكرة باستخدام Etcher أو أي برنامج مماثل.

لتوصيل Raspberry بشبكة WiFi مباشرة بعد التشغيل ، تحتاج إلى تعديل ملف wpa_supplicant.conf في جذر بطاقة SD. يجب أن يحتوي على الأسطر التالية:

network={ ssid="_wifi_" psk="_wifi_" } 

يمكنك أيضًا تكوينه بدون WiFi عن طريق توصيل جهاز كمبيوتر أحادي اللوحة بجهاز التوجيه باستخدام كبل Ethernet. الآن قم بإزالة بطاقة SD من جهاز الكمبيوتر ، وأدخلها في Raspberry وقم بتشغيل الطاقة. بعد نصف دقيقة ، يجب أن يظهر في لوحة المشرف الخاصة بالموجه على صفحة الأجهزة المتصلة ( اسم مضيف التنقل).

تحديث مجموعة التوزيع وتركيب الحزم اللازمة


افتح عميل SSH واتصل بـ Raspberry (عنوان IP المحلي للملاحة بدلاً من RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

كلمة المرور القياسية: التوت . بادئ ذي بدء ، من الضروري توسيع نظام الملفات الخاص بنظام التشغيل إلى الحجم الكامل لبطاقة SD:

 sudo raspi-config --expand-rootfs 

وإعادة التشغيل:

 sudo reboot 

بعد إعادة التشغيل ، اتصل مرة أخرى وقم بتحديث التوزيع:

 sudo apt-get update && sudo apt-get dist-upgrade -y 

تثبيت حزم إضافية:

 sudo apt-get install autoconf automake libtool pkg-config libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libraspberrypi-dev gstreamer1.0-tools gstreamer1.0-plugins-good gstreamer1.0-plugins-bad 

وتجميع غلاف gst-rpicamsrc لـ gstreamer وكاميرا Raspicam الأصلية:

 git clone https://github.com/thaytan/gst-rpicamsrc.git rpicamsrc cd rpicamsrc chmod +x autogen.sh ./autogen.sh --prefix=/usr --libdir=/usr/lib/arm-linux-gnueabihf/ make sudo make install 

تحقق مما إذا كانت الكاميرا تعمل (تم إنشاء اختبار ملف الفيديو. h264):

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! filesink location=test.h264 

إذا بدأ gstreamer ، انتظر بضع ثوان حتى يتم تسجيل الفيديو. يمكنك مقاطعة العملية بالضغط على Ctrl + C. إذا كان هناك فيديو ، فإن الكاميرا تعمل.

تكوين وتشغيل Ardupilot


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

أضاف مطورو Navio أداة أداة Emlid بسيطة ومريحة إلى مستشعراتهم لفحص المستشعرات وإعداد Ardupilot. أولاً ، تحقق مما إذا كان Raspberry يرى وحدة تحكم Navio:

 emlidtool info 

إذا أنتجت استجابة لهذا الأمر شيئًا مثل:

 Vendor: Emlid Limited Product: Navio 2 Issue: Emlid 2018-06-05 831f3b08594f2da17dccae980a2e3659115ef71f Kernel: 4.14.34-emlid-v7+ RCIO firmware: 0xcaec2284 

هذا يعني أنه يرى. تحقق من حالة أجهزة الاستشعار (إظهار القائمة والحالة):

 emlidtool test 

ومحركات PWM في نواة لينكس:

 cat /sys/kernel/rcio/status/alive 

0 = لا يعمل ، 1 = لا يعمل.

يتم تحديث البرنامج الثابت لوحدة التحكم PWM على النحو التالي:

 sudo emlidtool rcio update 

الآن تكوين Ardupilot:

 sudo emlidtool ardupilot 

سيتم فتح واجهة المستخدم الرسومية النصية مع القوائم خطوة بخطوة في الوحدة الطرفية. نختار المروحية من أحدث إصدار ، اكتب arducopter ، autostart عند بدء التشغيل ( عند التمهيد: تمكين ) ، ابدأ بعد التكوين ( Ardupilot: start ).

الصورة

نخرج من خلال عنصر القائمة إنهاء .

تحقق مما إذا كان Ardupilot قد بدأ:

 sudo systemctl status arducopter 

يرجى ملاحظة أن ملف بدء التشغيل في systemd يسمى arducopter ، حيث تم تكوين خيار المروحية .

الآن نحن بحاجة إلى تكوين Ardupilot بحيث يرسل لنا القياس عن بعد. للقيام بذلك ، قم بتحرير ملف التكوين:

 sudo nano /etc/default/arducopter 

يجب أن يحتوي على الأسطر التالية:

 TELEM1="-A udp:127.0.0.1:14550" ARDUPILOT_OPTS="$TELEM1" 

احفظ الملف ( Ctrl + X ثم Y ) وأعد تشغيل Ardupilot:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

يمكنك التحقق من حالة عملية Ardupilot باستخدام الأمر التالي:

 sudo systemctl status arducopter 

باستخدام هذه الإعدادات ، سيرسل Ardupilot القياس عن بُعد (حزم MAVLink ) إلى منفذ UDP المحلي 14550. بعد ذلك ، سينقل برنامج MAVProxy النصي (الوصف أدناه) القياس عن بعد وإرساله إلى GCS أو البرنامج النصي ، بالإضافة إلى إرسال الحزم بأوامر في الاتجاه المعاكس.

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

الصورة

ومع ذلك ، فإن هذا النهج له ما يبرره إذا لم يتم استخدام بيانات القياس عن بُعد في أي مكان آخر وكان للجهاز المزود بنظام GCS عنوان IP ثابت. خلاف ذلك ، في كل مرة يتعين عليك تسجيل Ardupilot جديد في الإعدادات. للتواصل مع الطيار الآلي عبر TCP ، يمكن للعديد من GCSs ذات العناوين الديناميكية وبعض البرامج النصية الأخرى الموجودة على الكمبيوتر المحمول في نفس الوقت ، أن يكون أكثر ملاءمة لاستخدام MAVProxy.

الصورة

يمكن أن يتلقى هذا البرنامج النصي (المكتوب في Python) حزم MAVLink إلى عنوان UDP محلي وينقلها إلى العديد من عناوين IP المحلية أو البعيدة ، سواء عبر UDP و TCP. يتم إرسال الحزم في كلا الاتجاهين إلى Ardupilot ⇔ GCS. بالإضافة إلى ذلك ، MAVProxy هو GCS كامل ولكن مع واجهة نصية.

MAVProxy


تم تثبيت MAVProxy بالفعل في صورة Navio. يمكن أيضًا تثبيته على جهاز كمبيوتر (Windows و Linux و MacOS) لمزيد من التواصل مع الطيار الآلي في وضع وحدة التحكم.

بعد التأكد من عمل Ardupilot ، قم بتشغيل البرنامج النصي MAVProxy على Raspberry باستخدام هذا الأمر:

 mavproxy.py --master=udp:127.0.0.1:14550 

تقوم المعلمة --master = udp: 127.0.0.1: 14550 بتعيين مصدر البيانات للبرنامج النصي. هذا هو منفذ UDP المحلي الذي تم تسجيله في ملف تكوين Ardupilot. بعد تشغيل الأمر ، سيقوم MAVProxy بالاتصال بهذا المنفذ وعرض رسائل الطيار الآلي ، على غرار الألغام:

 pi@navio:~ $ mavproxy.py --master=udp:127.0.0.1:14550 Connect udp:127.0.0.1:14550 source_system=255 Failed to load module: No module named adsb. Use 'set moddebug 3' in the MAVProxy console to enable traceback Log Directory: Telemetry log: mav.tlog Waiting for heartbeat from 127.0.0.1:14550 MAV> online system 1 STABILIZE> Mode STABILIZE fence breach GPS lock at 0 meters APM: APM:Copter V3.5.5 (88a1ecdd) APM: Frame: UNKNOWN APM: PreArm: RC Roll not configured APM: PreArm: Compass not calibrated APM: PreArm: 3D Accel calibration needed APM: PreArm: check firmware or FRAME_CLASS APM: PreArm: Throttle below Failsafe 

نظرًا لأن الطيار الآلي لم تتم معايرته بعد ولم يتم ضبطه بالكامل ، فإن الرسائل تتحدث أيضًا ببلاغة عن ذلك. في هذا الوضع ، يمكنك التواصل مع الطيار الآلي من خلال الأوامر. إذا كانت الطائرة بدون طيار مضبوطة بالكامل ، فإن مثل هذا التسلسل من أمرين سيؤدي إلى بدء تشغيل المحركات والطائرة بدون طيار إلى ارتفاع 20 م:

 arm throttle takeoff 20 

لن يطير الطيار الآلي غير المعاير ، ولكنه سيعرض الرسائل مع أسباب عدم قدرته على القيام بذلك.

إقامة تواصل مع الطائرة بدون طيار على الشبكة المحلية


قم بإيقاف البرنامج النصي ( Ctrl + C ) وتشغيله مرة أخرى في هذا النموذج:

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 

باستخدام المعلمة الإضافية - out = tcpin: 0.0.0.0: 5762 ، سيستمع MAVProxy على المنفذ 5762 لاتصالات TCP الواردة من GCS. بمجرد اتصال GCS ، ستبدأ حزم البيانات في التنقل بين الطائرة بدون طيار و GCS. دعنا نحاول الاتصال من جهاز كمبيوتر:

الصورة

إذا كان الاتصال ناجحًا ، فسيعرض GCS مجموعة من الرسائل مع طلب لمعايرة المستشعرات وتحميل المعلمات الموجودة على اللوحة بقيمها الحالية:

الصورة

الصورة

معايرة أجهزة الاستشعار وضبط معلمات الطيار الآلي


يمكن إجراء معايرة الطيار الآلي في أي GCS تقريبًا. تصف وثائق Ardupilot بالتفصيل الكامل. بادئ ذي بدء ، قمنا بتعيين نوع الإطار. لدي تخطيط قياسي بأربعة محركات ، لذلك هذا هو Quad X.

الصورة

لا يزال من الأفضل القيام بالرحلة الأولى في الوضع اليدوي. نقوم بتوصيل ومعايرة التحكم اللاسلكي (المتلقي والمرسل).

الصورة

يبقى معايرة مقياس التسارع والبوصلة.

الصورة

من أجل أن يرى Ardupilot البيانات من أجهزة الاستشعار الخارجية ويأخذها بعين الاعتبار ، قم بتعيين المعلمات الضرورية:

بالنسبة إلى PX4Flow ( معايرة المستشعر نفسه وتحديث البرامج الثابتة )

FLOW_ENABLE = 1 (Enabled)
FLOW_ADDR = 0 (0 = 042)


مقياس الارتفاع بالليزر VL53L0X ( تعليمات )

RNGFND_TYPE = 16 (VL53L0X)
RNGFND_ORIENT = 25 ( )
RNGFND_ADDR = 41 (I2C- ). - 0x29, = 41.
RNGFND_SCALING = 1
RNGFND_MIN_CM = 5
RNGFND_MAX_CM = 120
RNGFND_GNDCLEAR = 15 ( , )


لـ IRLock ( تعليمات مفصلة ، wiki IR-Lock )

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


السونار المنظر الأمامي ( تعليمات )

RNGFND2_TYPE = 2 (MaxbotixI2C sonar)
RNGFND2_ORIENT = 0 ( )
RNGFND2_MAX_CM = 700 ( )


قائمة كاملة بخيارات Ardupilot.

الآن قم بإعادة تشغيل Ardupilot من قائمة GCS ، وأعد الاتصال باللوحة وافتح نافذة MAVLink Inspector لرؤية البيانات من أجهزة الاستشعار.

الصورة

لسوء الحظ ، فإن قراءات IR-Lock غير مرئية هنا ، لتحليل عملها ، سيكون عليك إلقاء نظرة على السجلات الموجودة على متن الطائرة. يتم وصف كيفية القيام بذلك هنا .

يبقى لتكوين إعدادات الأمان ويمكنك بدء تشغيل الطائرة بدون طيار:

الصورة

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

بث الفيديو


دعنا نتحقق من كيفية عمل بث الفيديو في شبكة WiFi. باستخدام هذا الأمر ، يمكنك تشغيل الفيديو في منفذ TCP على Raspberry باستخدام الأداة المساعدة raspivid الأصلية لكاميرا Raspicam:

 raspivid -t 0 -hf -fps 25 -w 640 -h 480 -o - | gst-launch-1.0 fdsrc ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

لكن هذا الأمر يفعل الشيء نفسه ، فقط باستخدام برنامج rpi-camsrc المجمع السابق لـ gstreamer:

 gst-launch-1.0 rpicamsrc sensor-mode=4 ! h264parse ! rtph264pay config-interval=1 pt=96 ! gdppay ! tcpserversink host=0.0.0.0 port=5001 

في كلتا الحالتين ، يتوفر بث h264 على عنوان IP Raspberry على المنفذ 5001.

يمكنك رؤيته عن طريق تشغيل مثل هذا الأمر على جهاز الكمبيوتر الخاص بك (يجب تثبيت gstreamer ) ، بدلاً من RPI_ADDRESS ، حدد عنوان Raspberry على الشبكة:

 gst-launch-1.0 -v tcpclientsrc host=RPI_ADDRESS port=5001 ! gdpdepay ! rtph264depay ! avdec_h264 ! videoconvert ! autovideosink sync=false 

نتيجة لذلك ، يجب فتح النافذة التي تحتوي على الفيديو.

يحتوي أي GCS تقريبًا على مشغل فيديو مدمج يمكنه عرض دفق فيديو RTSP. لإنشاء خادم RTSP من Raspberry ، يمكنك استخدام مشغل وحدة التحكم VLC . التثبيت:

 sudo apt-get install vlc 

يبدأ بث الفيديو على النحو التالي:

 raspivid -o - -t 0 -n -w 320 -h 240 -fps 25 | cvlc -vvv stream:///dev/stdin --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

الفيديو متاح في (بدلاً من RPI_ADDRESS ، عنوان Raspberry):

rtsp://RPI_ADDRESS:8554/live

إعداد GCS:

الصورة

الصورة

يمكن استخدام عنوان البث لتوصيل عدة مشغلات على أجهزة مختلفة ، ولكن نظرًا لأن التقاط الفيديو وبثه لـ Raspberry عملية تستغرق وقتًا طويلاً ، فمن الأفضل للعديد من مستهلكي الفيديو استخدام خادم خارجي (الوصف أدناه).

القياس عن بعد عبر الإنترنت


لكي يتمكن GCS من الاتصال عبر الإنترنت بطائرة بدون طيار بعنوان IP ديناميكي ، يلزم وجود خادم وسيط مع عنوان IP ثابت يتم فيه تشغيل البرنامج النصي MAVProxy. لهذه الأغراض ، استفدت من تأجير خادم سحابي من أحد المزودين المعروفين. بالنسبة لـ MAVProxy ، يكون الحد الأدنى من التكوين مناسبًا ، ولكن نظرًا لأنني سأستخدم نفس الخادم لترحيل الفيديو ، فقد اخترت الخيار مع ذاكرة أكثر قليلاً (جوهر واحد وذاكرة 1 جيجابايت ، Ubuntu 18.04). للحصول على الحد الأدنى من التأخير في مرور البيانات بين اللوحة و GCS ، يجب أن يكون الخادم موجودًا في أقصى مسافة جغرافية من الطائرة بدون طيار و GCS.

الصورة

قم بتثبيت MAVProxy على الخادم. التبعيات الأولى:

 sudo apt-get install python-dev python-opencv python-wxgtk3.0 python-pip python-matplotlib python-pygame python-lxml python-yaml 

ثم النص نفسه من خلال PIP:

 sudo pip install MAVProxy 

اكتب المسار:

 echo "export PATH=$PATH:$HOME/.local/bin" >> ~/.bashrc 

وتشغيل البرنامج النصي بالمعلمات التالية:

 mavproxy.py --master=udp:0.0.0.0:15001 --out=tcpin:0.0.0.0:15002 

يستمع MAVProxy على المنفذ 15001 لحزم القياس عن بُعد الواردة من الطائرة بدون طيار عبر UDP ، ومنفذ 15002 لاتصال TCP الوارد من GCS.

قم بتشغيل MAVProxy على Raspberry بمعلمة واحدة أخرى ، بحيث يتم بث القياس عن بُعد أيضًا إلى الخادم (بدلاً من SERVER_IP عنوان الخادم الخاص بك):

 mavproxy.py --master=udp:127.0.0.1:14550 --out=tcpin:0.0.0.0:5762 --out=udpout:SERVER_IP:15001 

بعد بدء البرنامج النصي على جهاز الكمبيوتر المحمول ، ستظهر الرسائل من الطيار الآلي في وحدة تحكم الخادم. كما ذكرنا أعلاه ، MAVProxy هو GCS كامل مع واجهة نصية وفي هذه الحالة من الممكن بالفعل تحرير المعلمات والتحكم في الطائرة بدون طيار من خلال الأوامر في وحدة تحكم الخادم.

قم بتوصيل GCS على الكمبيوتر الشخصي أو الكمبيوتر اللوحي بالخادم. إعدادات الاتصال هي نفسها للشبكة المحلية ، فقط بدلاً من عنوان IP Raspberry نحدد عنوان الخادم والمنفذ 15002.

الصورة

يمكنك الآن توصيل مودم 4G USB بـ Raspberry وتقييم التأخير الذي يتفاعل به الأفق على الشاشة.

فيديو على الإنترنت


الصورة

لترحيل الفيديو ، قم بتثبيت مشغل VLC على الخادم:

 sudo apt-get install vlc 

بعد التثبيت ، قم بتشغيله كترحيل من منفذ UDP 5001 في قناة RTSP SERVER_IP: 8554 / مباشر :

 cvlc -vvv udp://@:5001 --sout '#rtp{sdp=rtsp://:8554/live}' :demux=h264 

على متن الطائرة ، سنبدأ بث الفيديو من الكاميرا إلى الخادم عبر UDP (بدلاً من عنوان خادم SERVER_IP ):

 gst-launch-1.0 rpicamsrc bitrate=1000000 ! video/x-h264,width=640,height=480,framerate=25/1 ! h264parse ! udpsink host=SERVER_IP port=5001 

يمكن الآن استخدام عنوان الدفق كمصدر فيديو في إعدادات GCS أو فتحه في أي مشغل يدعم هذا البروتوكول.

يمكنك الآن تخطيط مسار الرحلة وإطلاق الطائرة بدون طيار عبر الإنترنت ، بعد تشغيلها مسبقًا ، على سبيل المثال ، باستخدام مساعد الهاتف.

من الواضح ، نظرًا لوقت السفر الطويل نسبيًا للفيديو والقياس عن بُعد عبر الشبكة ، فإن هذه الطريقة لا تكاد تتناسب مع رحلات FPV في الوضع اليدوي بين العوائق.



مواضيع المنشورات اللاحقة:

  • خيارات لشحن الطائرة بدون طيار تلقائيًا في منزل الطيور الخاص بي والتي توقفت عندها.
  • تطبيق GCS على الويب باستخدام MAVProxy و NodeJS و socket.io وخادم وسائط لإدارة عدة طائرات بدون طيار في وقت واحد.
  • قنوات اتصال زائدة وأنظمة إنقاذ الطائرات بدون طيار
  • آلة الرؤية و Lidars لتجنب الاصطدام بالعقبات

يتبع ...

Source: https://habr.com/ru/post/ar414587/


All Articles