دخول Aeronet الحلقة 2: صاروخ موجه بدون طيار


في المقالة السابقة ، درسنا إجراء إطلاق طائرة افتراضية ذاتية الحكم في الهواء. تحت إشراف المعلم ، حتى تلاميذ المدارس يتمكنون من إطلاق الطائرة بدون طيار وفقًا لهذه التعليمات. السؤال الذي يطرح نفسه: ماذا بعد؟ حسنا ، بدون طيار ، ارتفعت بشكل جيد. وعلاوة على ذلك ، الظاهري - في اللعب والمحاكاة وأكثر رسمت بشكل جميل.


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


هذه المهمة (لتفجير كرة بدون طيار ذاتية الحكم) تم تنفيذها مؤخرًا بواسطة فرق في قسم Aeronet في All-Russian Robocross-2019 . استلهمنا من أغنية "ابحث ودمر" من ألبومها الأول لمجموعة أمريكية كانت تحظى بشعبية كبيرة خلال شبابي المضطرب.
في سلسلة المقالات التالية ، سننظر في كيفية تعليم طائرة بدون طيار مستقلة لاتباع تعليمات بسيطة من الامتناع عن الأغنية المذكورة أعلاه.


لذلك ، نحن بحاجة إلى ما يلي:


  1. طائرة بدون طيار تحلق يمكننا التحكم من البرنامج
  2. التعرف على الهدف ونظام التوجيه
  3. اجمع بين النقطتين السابقتين معًا - وفويلا ، يمكنك التنافس ، حيث ستطير الطائرة بدون طيار بشكل أسرع وأكثر.

بعد ذلك ، أول الأشياء أولاً.


jMAVSim لوحة المفاتيح التي تسيطر عليها


تخيل طائرة بدون طيار ترى الكرة ، كما في الصورة أعلاه. كاميرا الطائرة بدون طيار تتطلع إلى الأمام مباشرة.


لكي تطير على الكرة ، يجب أن تكون الطائرة بدون طيار لدينا قادرة على: التحرك للأمام / الخلف ، الاتجاه يسارًا ويمينًا ، الطيران أعلى وأعلى سوف تتحرك الكرة في عدسة الكاميرا ليس فقط من هبوب رياح ، ولكن أيضًا من إمالة الطائرة بدون طيار على طول اللفافة والملعب ، لكننا نهمل هذه الميلات حتى الآن.


سنتحكم في سرعة الطائرة بدون طيار عن طريق إرسال رسائل عبر mavros إلى الموضوع /mavros/setpoint_velocity/cmd_vel_unstamped .


لمعالجة الطائرة بدون طيار من لوحة المفاتيح ، نستخدم وحدة الشتائم ( الوصف باللغة الروسية ، باللغة الإنجليزية ).


الخوارزمية بسيطة: يتم تخزين القيم الحالية للسرعات المرغوبة في متغير setvel من النوع geometry_msgs.msg.Twist . بالضغط على زر على لوحة المفاتيح ، نقوم بزيادة / تقليل مكون السرعة المطلوبة. من خلال الموقت 20 مرة في الثانية ننشر السرعة في الموضوع المحدد.


للسرعة إلى الأمام (نسبة إلى الطائرة بدون طيار) ، مطلوب توضيح. الحقيقة هي أنه يجب ضبط سرعات الطيران في نظام الإحداثيات المحلي في "العالم" الذي تطير فيه طائراتنا بدون طيار. لذلك ، تحتاج إلى تتبع الموضع الحالي (تشكل) للطائرة بدون طيار في نظام الإحداثيات هذا. يتم تدوير محور X للطائرة بدون طيار بالنسبة إلى محور X في "العالم" بزاوية محددة. ينشر Mavros الموضع الحالي /mavros/local_position/pose بدون طيار في إحداثيات "العالم" في الموضوع /mavros/local_position/pose . بعد الحصول على الزاوية yaw من الموضع من أجل الحصول على سرعة الطائرة المطلوبة ونشرها في إحداثيات العالم ، نقوم بضرب السرعة الأمامية المطلوبة setvel_forward بواسطة cos (yaw) للمحور X و sin (yaw) للمحور Y للعالم ، على التوالي.



النص الكامل للبرنامج:
 #!/usr/bin/env python # coding=UTF-8 import rospy import mavros import mavros.command as mc from mavros_msgs.msg import State from geometry_msgs.msg import PoseStamped, Twist, Quaternion from mavros_msgs.srv import CommandBool from mavros_msgs.srv import SetMode import tf.transformations as t import math current_state=State() current_pose = PoseStamped() current_vel = Twist() def localpose_callback(data): global current_pose current_pose = data def publish_setvel(event): global current_pose, setvel_pub, setvel, setvel_forward q=current_pose.pose.orientation.x, current_pose.pose.orientation.y,current_pose.pose.orientation.z,current_pose.pose.orientation.w roll, pitch, yaw = t.euler_from_quaternion(q) setvel.linear.x = setvel_forward * math.cos(yaw) setvel.linear.y = setvel_forward * math.sin(yaw) setvel_pub.publish(setvel) def main(): global current_pose, setvel, setvel_pub, setvel_forward rospy.init_node("offbrd",anonymous=True) rate=rospy.Rate(10) pose_sub=rospy.Subscriber("/mavros/local_position/pose",PoseStamped,localpose_callback) setvel_pub=rospy.Publisher("/mavros/setpoint_velocity/cmd_vel_unstamped",Twist,queue_size=1) arming_s=rospy.ServiceProxy("/mavros/cmd/arming",CommandBool) set_mode=rospy.ServiceProxy("/mavros/set_mode",SetMode) setvel=Twist() setvel_forward = 0 arming_s(True) set_mode(0,"AUTO.TAKEOFF") print 'Taking off.....\r' rospy.sleep(5) # keyboard manipulation import curses stdscr = curses.initscr() curses.noecho() stdscr.nodelay(1) stdscr.keypad(1) for i in range (0,10): setvel_pub.publish(setvel) rate.sleep() set_mode(0,"OFFBOARD") setvel_timer = rospy.Timer(rospy.Duration(0.05), publish_setvel) while (rospy.is_shutdown()==False): rate.sleep() # keyboard hcommands handling c = stdscr.getch() if c == ord('q'): break # Exit the while() elif c == ord('u'): setvel.linear.z += 0.25 elif c == ord('d'): setvel.linear.z -= 0.25 elif c == curses.KEY_LEFT: setvel.angular.z += 0.25 elif c == curses.KEY_RIGHT: setvel.angular.z -= 0.25 elif c == curses.KEY_UP: setvel_forward += 0.25 elif c == curses.KEY_DOWN: setvel_forward -= 0.25 elif c == ord('s'): setvel_forward=setvel.linear.z=setvel.angular.z=0 if c!=curses.ERR: print setvel,'\r' curses.endwin() set_mode(0,"AUTO.LAND") print 'Landing.......\r' if __name__=="__main__": main() 

لتشغيل البرنامج للتنفيذ ، نحتاج إلى تشغيل jMAVSim ، وتوصيل mavros به باستخدام الأمر roslaunch mavros (بعد تشغيل roscore إذا لم يتم تشغيله تلقائيًا):


 roslaunch mavros mavros_sitl.launch fcu_url:="udp://@192.168.7.14:14580" 

تأكد من أننا متصلون باستخدام الصدى / mavros / الحالة. يجب أن يكون الحقل المتصل = صحيح.


بعد ذلك ، احفظ رمز البرنامج في ملف وقم بتشغيله باستخدام python fly_mavsim.py . يجب أن يرتفع quadrocopter الظاهري إلى ارتفاع حوالي 2 متر (يتم تعيين ارتفاع الإقلاع في المعلمة MIS_TAKEOFF_ALT في QGroundControl) وتوقف. باستخدام الأزرار الموجودة على لوحة المفاتيح ، يمكن التحكم فيه: أسهم لليمين الأيسر - انعطاف ، سهم للأعلى والأسفل - حركة للأمام / الخلف ، u - الطيران لأعلى (UP) ، d - الطيران لأسفل (DOWN) ، s - تعليق في مكانه (STOP ، جميع السرعات = 0) ، ف - الخروج من البرنامج (QUIT) والهبوط في quadrocopter.


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


في الطائرة بدون طيار


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


ثم تبدأ المتعة: من طائرة بدون طيار كروية في فراغ ، ننتقل إلى العالم الحقيقي.


لوحة المفاتيح تسيطر بدون طيار حقيقي


هناك العديد من التعليمات على الشبكة لتجميع وتكوين المروحيات على مكدس PX4. تم توضيح العملية بشيء من التفصيل في وثائق المطورين .


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


كجهاز كمبيوتر داخلي ، نستخدم Raspberry PI 3 Model B + ، مع تثبيت Raspbian + ROS Kinetic. توت العليق متصل بوحدة التحكم في طيران Pixracer عبر uart ، وفقًا للمخطط:


Pixracer + التوت PI


يتم توصيل وحدة GPS بمنفذ GPS بوحدة التحكم في الرحلة. يمكنني استخدام وحدة TS100 من Radiolink ، ونوعية جيدة ، والتكلفة ليست عالية.


يمكن تثبيت ROS Kinetic بنفسك باستخدام الإرشادات . في Raspberry ، يجب عليك تكوين الوصول عبر Wifi و ssh (فيما يلي إرشادات ، على سبيل المثال ).


يمكنك أيضًا استخدام صورة جاهزة لـ Raspberry من شركة "Copter Express". في هذه الحالة ، يجب عليك تعطيل الحزمة الذكية الافتراضية ، والتي لا نحتاج إليها:


 sudo systemctl stop clever sudo systemctl disable clever 

تم وصف صورة أخرى لـ Raspberry مع ROS و OpenCV هنا ، لم أجربها في عملي ، لكن الأدوات المستخدمة متشابهة.


بعد تشغيل الطائرة بدون طيار والاتصال بـ Raspberry عبر ssh ، نطلق mavros ونتحقق من الاتصال بجهاز التحكم في الرحلة:


 roslaunch mavros px4.launch fcu_url:='/dev/ttyAMA0:921600' gcs_url:='tcp-l://0.0.0.0:5760' rostopic echo /mavros/state 

إذا كان كل شيء يعمل بشكل صحيح ، مرة واحدة في الثانية نتلقى رسائل حول حالة وحدة تحكم الرحلة مع الحقل متصل = صحيح.



هناك gcs_url المعلمة gcs_url في استدعاء gcs_url حتى نتمكن من توصيل QGroundControl بوحدة التحكم في طيران الطائرة بدون طيار عبر WiFi عبر جسر TCP. يتم تعيين معلمات الاتصال في QGroundControl:



لإعداد الطائرة بدون طيار لرحلة مستقلة ، اتبع بعض الخطوات البسيطة:


1. تأكد من أن الطائرة بدون طيار تطير بشكل جيد في الوضع اليدوي. للقيام بذلك ، يجب تحديد إعدادات المعلمة الصحيحة ومعايرة جميع أجهزة الاستشعار. باستخدام طائرة بدون طيار المتاحة تجاريا أنقذني من المتاعب في هذه المرحلة. لقد استخدمت أداة تقدير LPE مع تمكين GPS ومقياس:



2. في حالة بدء تشغيل النظام في مكان جديد أو لأول مرة ، يجب أن تنتظر وحدة "GPS" حتى "الاحماء". مع العمل المنتظم في الشارع ، يمسك GPS عادة من 16 إلى 22 قمرا صناعيا.



3. قبل الانتقال إلى مكان جديد ، وإذا كانت الطائرة بدون طيار تحمل نقطة ، فيجب إعادة معايرة البوصلة:



يجب عليك استخدام بوصلة خارجية ، وتأكد من تعيين الاتجاه الصحيح في الإعدادات:



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


بعد الرحلات التجريبية الناجحة في الوضع اليدوي ، يمكننا التحقق من كيفية عمل برنامج fly_jmavsim.py الخاص بنا على طائرة بدون طيار حقيقية: الفيديو .


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


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


يتم نشر إعدادات برنامج التحكم في الطيران + كودنا على جيثب .

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


All Articles