Memasuki Aeronet Episode 2: Dring Homing


Pada artikel sebelumnya, kami memeriksa prosedur untuk meluncurkan drone virtual otonom ke udara. Di bawah bimbingan guru, bahkan anak sekolah dapat meluncurkan drone sesuai dengan instruksi ini. Muncul pertanyaan: apa selanjutnya? Drone, melambung tinggi. Apalagi mainan virtual dan simulator dan lukisan yang lebih indah.


Sebagai langkah berikutnya, kami mengusulkan untuk membuat pesawat pengintai yang mampu melihat tujuan Anda dan berhasil mencapainya. Paling mudah menggunakan balon berwarna sebagai sasaran.


Tugas semacam itu (meledakkan bola dengan drone otonom) baru-baru ini dilakukan oleh tim di bagian Aeronet dari All-Russian Robocross-2019 . Kami terinspirasi oleh lagu โ€œSeek and destroyโ€ dari album debut grup Amerika yang sangat populer di masa muda saya yang penuh gejolak.
Dalam seri artikel selanjutnya, kita akan melihat bagaimana cara mengajar drone yang otonom untuk mengikuti instruksi sederhana dari refrain dari lagu tersebut.


Jadi, kami membutuhkan yang berikut:


  1. Drone terbang yang bisa kita kontrol dari program
  2. Pengakuan target dan sistem bimbingan
  3. Kombinasikan dua poin sebelumnya bersama-sama - dan, voila, Anda bisa bersaing, yang drone-nya akan terbang lebih cepat dan lebih banyak bola.

Selanjutnya, hal pertama yang pertama.


jMAVSim dikontrol keyboard


Bayangkan sebuah drone melihat bola, seperti pada gambar di atas. Kamera drone sedang menatap lurus ke depan.


Untuk terbang dengan bola, drone kami harus dapat: bergerak maju / mundur, belok kiri dan kanan, terbang lebih tinggi dan lebih rendah. Bola akan bergerak dalam lensa kamera tidak hanya dari hembusan angin, tetapi juga dari kemiringan drone dalam gulungan dan pitch, tetapi kami mengabaikan kemiringan ini sejauh ini.


Kami akan mengontrol kecepatan drone dengan mengirim pesan melalui mavros ke topik /mavros/setpoint_velocity/cmd_vel_unstamped .


Untuk memanipulasi drone dari keyboard, kami menggunakan modul kutukan ( deskripsi dalam bahasa Rusia , dalam bahasa Inggris ).


Algoritma ini sederhana: nilai saat ini dari kecepatan yang diinginkan disimpan dalam variabel setvel dari tipe geometry_msgs.msg.Twist . Dengan menekan tombol pada keyboard, kami menambah / mengurangi komponen kecepatan yang diinginkan. Pada penghitung waktu 20 kali per detik kami mempublikasikan kecepatan dalam topik yang ditentukan.


Untuk kecepatan maju (relatif terhadap drone), klarifikasi diperlukan. Faktanya adalah bahwa kecepatan penerbangan harus ditetapkan dalam sistem koordinat lokal "dunia" di mana drone kami terbang. Karena itu, Anda perlu melacak posisi drone saat ini dalam sistem koordinat ini. Sumbu X drone diputar relatif terhadap sumbu X "dunia" oleh sudut tertentu yaw. Mavros menerbitkan posisi drone saat ini dalam koordinat "dunia" dalam topik /mavros/local_position/pose . Setelah memperoleh sudut yaw dari posisi untuk mendapatkan dan mempublikasikan kecepatan drone yang diinginkan dalam koordinat dunia, kami mengalikan setvel_forward kecepatan maju yang diinginkan dengan cos (menguap) untuk sumbu X dan sin (menguap) untuk sumbu Y dunia, masing-masing.



Teks lengkap program:
 #!/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() 

Untuk menjalankan program untuk dieksekusi, kita perlu menjalankan jMAVSim, dan menghubungkan mavros dengan menggunakan perintah roslaunch mavros (setelah menjalankan roscore jika tidak dimulai secara otomatis):


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

Pastikan kita terhubung menggunakan rostopic echo / mavros / state. Bidang yang terhubung harus = Benar.


Setelah itu, simpan kode program ke file dan jalankan dengan perintah python fly_mavsim.py . Quadrocopter virtual harus naik ke ketinggian sekitar 2 meter (ketinggian lepas landas diatur dalam parameter MIS_TAKEOFF_ALT di QGroundControl) dan membeku. Dengan menggunakan tombol-tombol pada keyboard, dapat dikontrol: panah kanan-kiri - panah atas, bawah-atas - gerakan maju / mundur, u - terbang ke atas (ATAS), d - terbang ke bawah (BAWAH), s - menggantung di tempat (BERHENTI, semua kecepatan = 0), q - keluar dari program (QUIT) dan mendaratkan quadrocopter.


Anda dapat terbang di sekitar dunia virtual, periksa bagaimana drone virtual yang ideal berperilaku dalam penerbangan.


Drone dalam penerbangan


Perubahan kecepatan dari penekanan tombol disimpulkan, Anda dapat membuat drone terbang dalam lingkaran, dalam spiral, di sekitar titik tertentu, mensimulasikan sistem penargetan.


Kemudian kesenangan dimulai: dari sebuah pesawat tak berawak dalam ruang hampa, kami pindah ke dunia nyata.


Keyboard dikendalikan drone nyata


Ada banyak instruksi pada jaringan untuk merakit dan mengkonfigurasi copters pada tumpukan PX4. Proses yang cukup terperinci dijelaskan dalam dokumentasi pengembang .


Karena saya menggunakan drone yang sudah jadi, ini menyelamatkan saya dari banyak squat selama perakitan dan konfigurasi awal sistem.


Sebagai komputer on-board, kami menggunakan Raspberry PI 3 Model B +, dengan Raspbian + ROS Kinetic diinstal. Raspberry terhubung ke pengontrol penerbangan Pixracer via uart, sesuai dengan skema:


Pixracer + Raspberry PI


Modul GPS terhubung ke porta GPS dari pengontrol penerbangan. Saya menggunakan modul TS100 dari Radiolink, kualitasnya bagus, biayanya tidak tinggi.


ROS Kinetic dapat diinstal sendiri menggunakan instruksi . Di Raspberry, Anda harus mengonfigurasi akses melalui Wifi dan ssh ( berikut ini adalah instruksi, misalnya ).


Anda juga dapat menggunakan gambar yang sudah jadi untuk Raspberry dari perusahaan "Copter Express". Dalam hal ini, Anda harus menonaktifkan paket pintar bawaan, yang tidak kita butuhkan:


 sudo systemctl stop clever sudo systemctl disable clever 

Gambar Raspberry lain dengan ROS dan OpenCV dijelaskan di sini , saya belum mencobanya dalam pekerjaan saya, tetapi alat yang digunakan serupa.


Setelah menyalakan drone dan menghubungkan ke Raspberry melalui ssh, kami meluncurkan mavro dan memeriksa koneksi dengan pengendali penerbangan:


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

Jika semuanya berfungsi dengan benar, satu detik kami menerima pesan tentang status pengontrol penerbangan dengan bidang Connected = True.



Parameter gcs_url dalam panggilan gcs_url diperlukan agar kita dapat menghubungkan QGroundControl ke pengontrol penerbangan drone melalui WiFi melalui TCP-bridge. Parameter koneksi diatur dalam QGroundControl:



Untuk mempersiapkan drone untuk penerbangan mandiri, saya mengikuti beberapa langkah sederhana:


1. Pastikan drone terbang dengan baik dalam mode manual. Untuk melakukan ini, pengaturan parameter yang benar harus dipilih dan semua sensor dikalibrasi. Menggunakan drone yang tersedia secara komersial menyelamatkan saya dari masalah pada saat ini. Saya menggunakan estimator LPE dengan GPS diaktifkan dan barometer:



2. Jika sistem dimulai di tempat baru atau untuk pertama kalinya, Anda harus menunggu modul GPS untuk "menghangat". Dengan pekerjaan rutin di jalan, GPS biasanya menangkap dari 16 hingga 22 satelit.



3. Sebelum terbang ke tempat baru, dan jika drone tidak memiliki titik, Anda harus mengkalibrasi ulang kompas:



Anda harus menggunakan kompas eksternal , dan pastikan bahwa orientasi yang benar diatur dalam pengaturan:



Jika semua pengaturan dilakukan dengan benar, drone harus dengan yakin menahan titik dalam mode HOLD dan terbang secara stabil dalam mode Posisi.


Setelah penerbangan uji yang berhasil dalam mode manual, kami dapat memeriksa bagaimana program fly_jmavsim.py kami bekerja pada drone nyata: video .


Drone nyata tidak terbang sesempurna yang virtual - tetapi juga harus mematuhi perintah dari keyboard - terbang ke arah yang benar dan berhenti pada perintah.


Jika ini terjadi, alih-alih kontrol keyboard, kita dapat menggunakan visi komputer, yang akan kita bahas tentang pengaturan di artikel berikutnya. Tes berburu bola pertama terlihat seperti ini .


Pengaturan kode pengendali penerbangan + program kami diposting di github .

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


All Articles