DIY drone mandiri dengan kontrol atas Internet. Bagian 2 tentang perangkat lunak

Ini adalah kelanjutan dari kisah drone otonom. Bagian pertama berbicara tentang perangkat keras, yang ini akan berbicara tentang perangkat lunak. Untuk mulai dengan, program pendidikan kecil tentang interaksi operator dengan helikopter. Berikut adalah tata letak khas untuk kebanyakan drone rakitan:

gambar

Dan inilah skema untuk drone canggih:

gambar

Beginilah cara kerja drone mainan, yang dikendalikan dari smartphone:

gambar

Anda dapat mengontrol drone melalui Internet (jika Anda memiliki kartu SIM dengan alamat IP statis):

gambar

Atau lebih jika alamat IP dinamis:

gambar

Untuk keandalan dan redundansi saluran komunikasi, opsi terakhir dapat dikembangkan ke kondisi seperti itu:

gambar

Selanjutnya, saya akan menjelaskan proses pengaturan untuk pengendali penerbangan Emlid Navio 2 dan komputer mikro Raspberry Pi 3.

gambar
Tetapi, dengan sedikit modifikasi, pengaturan ini cocok untuk pengontrol penerbangan apa pun, yang dengannya Anda dapat berkomunikasi melalui protokol MAVLink bersama dengan komputer mana pun di keluarga Linux OS.

gambar

Penting! Pengaturan harus dilakukan dengan mematikan power pada pengontrol kecepatan agar mesin tidak sengaja hidup.

Perangkat lunak kontrol drone untuk PC dan tablet


Untuk mengontrol UAV, program khusus GCS (Ground Control Station) digunakan. Lebih jauh dalam teks saya akan menggunakan singkatan ini. Saya menyukai QGroundControl , sebuah multi-platform open source (Windows, Linux, MacOS, iOS, Android) GCS yang menjadi bagian dari proyek DroneCode . Tetapi ada alternatif, gratis dan komersial: Perencana APM , MissionPlanner , UgCS , LibrePilot , OpenPilot , Tower (DroidPlanner) untuk Android, MAVPilot (iOS), SidePilot (iOS). Serta konsol MAVProxy .

Instal gambar OS pada kartu SD


Untuk operasi autopilot normal, sangat disarankan untuk menggunakan kartu SD "cepat" (kelas 10). Kartu memori lambat tidak punya waktu untuk menyimpan log autopilot bahkan pada frekuensi rendah, akibatnya kartu itu bengkok atau tidak ditulis sama sekali. Bukti ini mungkin merupakan kesalahan " Detak jantung IO ", yang dapat diamati di konsol MAVLink (cara menonton konsol MAVLink dijelaskan di bawah). Saat membeli, lihat kemampuan untuk menulis video 4K: kemungkinan besar itu akan menjadi SD cepat. Sayangnya, saya mengetahui hal ini setelah jatuhnya drone, ketika itu perlu untuk menganalisis log dan mencari tahu alasannya. Log tidak dapat dibaca untuk beberapa GCS. Alasan mematikan motor selama penerbangan ternyata dangkal: Saya lupa menyesuaikan tegangan minimum pada baterai dalam pengaturan untuk operasi yang gagal.

Jadi, unduh gambar Raspbian Stretch yang sudah selesai dengan Ardupilot dan ROS yang sudah diinstal dari Emlid dari halaman instruksi asli . Dan kami menulisnya ke kartu memori menggunakan Etcher atau program serupa.

Untuk menghubungkan Raspberry ke jaringan WiFi Anda segera setelah dinyalakan, Anda perlu mengedit file wpa_supplicant.conf di root kartu SD. Itu harus berisi baris berikut:

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

Anda juga dapat mengonfigurasinya tanpa WiFi dengan menghubungkan komputer satu-pelat ke router dengan kabel Ethernet. Sekarang lepaskan kartu SD dari PC, masukkan ke dalam Raspberry dan nyalakan daya. Setelah setengah menit, itu akan muncul di panel admin router pada halaman perangkat yang terhubung (navio hostname ).

Memperbarui kit distribusi dan menginstal paket yang diperlukan


Buka klien SSH dan sambungkan ke Raspberry (alamat IP navio lokal alih-alih RASPBERRY_IP_ADDRESS ):

 ssh pi@RASPBERRY_IP_ADDRESS 

Kata sandi standar: raspberry . Pertama-tama, perlu untuk memperluas sistem file OS ke seluruh volume kartu SD:

 sudo raspi-config --expand-rootfs 

dan reboot:

 sudo reboot 

Setelah reboot, hubungkan lagi dan perbarui distribusi:

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

Instal paket tambahan:

 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 

dan kompilasi pembungkus gst-rpicamsrc untuk gstreamer dan kamera asli 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 

Periksa apakah kamera berfungsi (file video test.h264 dibuat):

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

Jika gstreamer mulai, tunggu beberapa detik hingga video direkam. Anda dapat menghentikan proses dengan menekan Ctrl + C. Jika ada video, maka kamera berfungsi.

Konfigurasikan dan jalankan Ardupilot


Rilis versi baru Ardupilot agak terlambat dalam perakitan dari Emlid. Jika fungsionalitas yang diperlukan tersedia dalam versi terbaru, maka Anda dapat menginstalnya dari sumber menggunakan instruksi ini .

Pengembang Navio menambahkan utilitas alat Emlid yang sederhana dan nyaman ke sensor mereka untuk memeriksa sensor dan mengatur Ardupilot. Pertama, periksa apakah Raspberry melihat pengontrol Navio:

 emlidtool info 

Jika dalam menanggapi perintah ini menghasilkan sesuatu seperti:

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

itu berarti dia melihat. Periksa status sensor (tampilkan daftar dan status):

 emlidtool test 

dan pengontrol PWM di kernel Linux:

 cat /sys/kernel/rcio/status/alive 

0 = tidak bekerja, 1 = bekerja.

Firmware dari pengontrol PWM diperbarui sebagai berikut:

 sudo emlidtool rcio update 

Sekarang konfigurasikan Ardupilot:

 sudo emlidtool ardupilot 

GUI teks dengan menu langkah demi langkah akan terbuka di terminal. Kami memilih copter versi terbaru, ketik arducopter , autostart saat startup ( Saat boot: aktifkan ), mulai setelah konfigurasi ( Ardupilot: start ).

gambar

Kami keluar melalui item menu Keluar .

Periksa apakah Ardupilot sudah mulai:

 sudo systemctl status arducopter 

Harap dicatat bahwa file startup di systemd disebut arducopter , karena opsi copter dikonfigurasi.

Sekarang kita perlu mengkonfigurasi Ardupilot sehingga mengirimkan kita telemetri. Untuk melakukan ini, edit file konfigurasi:

 sudo nano /etc/default/arducopter 

Itu harus berisi baris berikut:

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

Simpan file ( Ctrl + X , lalu Y ) dan mulai ulang Ardupilot:

 sudo systemctl daemon-reload sudo systemctl restart arducopter 

Anda dapat memeriksa status proses Ardupilot dengan perintah berikut:

 sudo systemctl status arducopter 

Dengan pengaturan ini, Ardupilot akan mengirimkan telemetri (paket MAVLink ) ke port UDP lokal 14550. Selanjutnya, skrip MAVProxy (uraian di bawah) akan mengambil telemetri dari sana dan mengirimkannya ke GCS atau skrip, serta mengirim paket dengan perintah di arah yang berlawanan.

Alih-alih alamat dan port lokal, Anda dapat merekam alamat IP PC atau tablet di jaringan lokal dan paket akan segera disiarkan di sana.

gambar

Namun, pendekatan ini dibenarkan jika data telemetri tidak digunakan di tempat lain dan perangkat dengan GCS memiliki alamat IP statis. Jika tidak, setiap kali Anda harus mendaftarkan Ardupilot baru dalam pengaturan. Untuk berkomunikasi dengan autopilot melalui TCP, beberapa GCS dengan alamat dinamis dan beberapa skrip lain di komputer on-board dapat secara bersamaan, lebih mudah menggunakan MAVProxy.

gambar

Skrip ini (ditulis dengan Python) dapat menerima paket MAVLink ke alamat UDP lokal dan menyampaikannya ke beberapa alamat IP lokal atau jarak jauh, baik melalui UDP dan TCP. Paket dikirim di kedua arah ke Ardupilot ⇔ GCS. Selain itu, MAVProxy adalah GCS lengkap, tetapi dengan antarmuka teks.

MAVProxy


MAVProxy sudah diinstal pada gambar Navio. Itu juga dapat diinstal pada PC (Windows, Linux, MacOS) untuk komunikasi lebih lanjut dengan autopilot dalam mode konsol.

Setelah memastikan Ardupilot berfungsi, jalankan skrip MAVProxy di Raspberry dengan perintah ini:

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

Parameter --master = udp: 127.0.0.1: 14550 menetapkan sumber data untuk skrip. Ini adalah port UDP lokal yang terdaftar dalam file konfigurasi Ardupilot. Setelah menjalankan perintah, MAVProxy akan terhubung ke port ini dan menampilkan pesan autopilot, mirip dengan milik saya:

 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 

Karena autopilot belum dikalibrasi dan tidak sepenuhnya disetel, pesan juga fasih berbicara tentang ini. Dalam mode ini, Anda dapat berkomunikasi dengan autopilot melalui perintah. Jika drone disetel sepenuhnya, maka urutan dua perintah seperti itu akan menyebabkan awal mesin dan drone lepas landas hingga ketinggian 20 m:

 arm throttle takeoff 20 

Autopilot yang tidak dikalibrasi tidak akan terbang, tetapi akan menampilkan pesan dengan alasan mengapa ia tidak dapat melakukan ini.

Membangun komunikasi dengan drone di jaringan lokal


Hentikan skrip ( Ctrl + C ) dan jalankan kembali dalam formulir ini:

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

Dengan parameter tambahan --out = tcpin: 0.0.0.0: 5762, MAVProxy akan mendengarkan pada port 5762 untuk koneksi TCP yang masuk dari GCS. Segera setelah GCS terhubung, paket data akan mulai bergerak antara drone dan GCS. Mari kita coba sambungkan dari PC:

gambar

Jika koneksi berhasil, maka GCS akan menampilkan banyak pesan dengan permintaan untuk mengkalibrasi sensor dan memuat parameter on-board dengan nilai saat ini:

gambar

gambar

Kalibrasi sensor dan penyetelan parameter autopilot


Kalibrasi autopilot dapat dilakukan di hampir semua GCS. Dokumentasi Ardupilot menggambarkannya dengan sangat rinci. Pertama-tama, kita mengatur jenis bingkai. Saya memiliki tata letak 4-motor standar, jadi ini Quad X.

gambar

Penerbangan pertama masih lebih baik dilakukan dalam mode manual. Kami menghubungkan dan mengkalibrasi kontrol radio (penerima dan pemancar).

gambar

Tetap mengkalibrasi accelerometer dan kompas.

gambar

Agar Ardupilot dapat melihat dan memperhitungkan data akun dari sensor eksternal, tetapkan parameter yang diperlukan:

Untuk PX4Flow ( kalibrasi sensor itu sendiri dan pembaruan firmware )

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


Untuk laser altimeter VL53L0X ( instruksi )

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 ( , )


Untuk IRLock ( petunjuk terperinci , wiki IR-Lock )

PLND_ENABLED = 1
PLND_TYPE = 2
PLND_BUS = 1


Untuk tampilan depan sonar ( instruksi )

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


Daftar lengkap opsi Ardupilot.

Sekarang restart Ardupilot dari menu GCS, sambungkan kembali ke board dan buka jendela MAVLink Inspector untuk melihat data dari sensor.

gambar

Sayangnya, pembacaan IR-Lock tidak terlihat di sini, untuk analisis pekerjaannya Anda harus melihat log on-board. Cara melakukan ini dijelaskan di sini .

Tetap mengkonfigurasi pengaturan keamanan dan Anda dapat memulai drone:

gambar

Cara mengkonfigurasi gyro-suspensi dan mengontrol kamera utama secara rinci Saya akan menulis di salah satu artikel berikut, poin utama diuraikan di sini .

Siaran video


Mari kita periksa bagaimana penyiaran video bekerja di jaringan WiFi. Dengan perintah ini, Anda dapat menjalankan video dalam port TCP pada Raspberry menggunakan utilitas raspivid asli untuk kamera 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 

Tetapi perintah ini melakukan hal yang sama, hanya menggunakan pembungkus rpi-camsrc yang telah dikompilasi sebelumnya untuk 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 

Dalam kedua kasus, siaran H264 tersedia di alamat IP Raspberry pada port 5001.

Anda dapat melihatnya dengan menjalankan perintah seperti itu di PC Anda ( gstreamer harus diinstal), alih-alih RPI_ADDRESS, tentukan alamat Raspberry di jaringan:

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

Akibatnya, jendela dengan video harus terbuka.

Hampir semua GCS memiliki pemutar video bawaan yang dapat menampilkan aliran video RTSP. Untuk membuat server RTSP dari Raspberry, Anda dapat menggunakan VLC console player . Instalasi:

 sudo apt-get install vlc 

Siaran video dimulai sebagai berikut:

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

Video tersedia di (bukan RPI_ADDRESS , alamat Raspberry):

rtsp://RPI_ADDRESS:8554/live

Penyiapan GCS:

gambar

gambar

Alamat aliran dapat digunakan untuk menghubungkan beberapa pemain pada perangkat yang berbeda, tetapi karena menangkap dan menyiarkan video untuk Raspberry adalah proses yang sangat memakan waktu, lebih baik bagi beberapa konsumen video untuk menggunakan server eksternal (uraian di bawah).

Telemetri melalui Internet


Agar GCS dapat terhubung melalui Internet ke drone dengan alamat IP dinamis, diperlukan server perantara dengan IP statis di mana skrip MAVProxy akan diluncurkan. Untuk tujuan ini, saya mengambil keuntungan dari penyewaan server cloud dari salah satu penyedia terkenal. Untuk MAVProxy, konfigurasi paling minimal cocok, tetapi karena saya akan menggunakan server yang sama untuk menyampaikan video, saya memilih opsi dengan memori sedikit lebih banyak (satu inti dan 1GB memori, Ubuntu 18.04). Untuk keterlambatan minimum dalam lewatnya data antara board dan GCS, server harus berada dalam kedekatan geografis maksimum dengan drone dan GCS.

gambar

Instal MAVProxy di server. Ketergantungan pertama:

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

dan kemudian skrip itu sendiri melalui PIP:

 sudo pip install MAVProxy 

tulis jalannya:

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

dan jalankan skrip dengan parameter berikut:

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

MAVProxy mendengarkan pada port 15001 untuk paket telemetri yang masuk dari drone melalui UDP, dan port 15002 untuk koneksi TCP yang masuk dari GCS.

Jalankan MAVProxy di Raspberry dengan satu parameter lagi, sehingga telemetri juga disiarkan ke server (bukan SERVER_IP alamat server Anda):

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

Setelah memulai skrip pada komputer terpasang, pesan dari autopilot akan muncul di konsol server. Seperti yang disebutkan di atas, MAVProxy adalah GCS lengkap dengan antarmuka teks dan dalam keadaan ini sudah mungkin untuk mengedit parameter dan mengontrol drone melalui perintah di konsol server.

Hubungkan GCS pada PC atau tablet ke server. Pengaturan koneksi sama seperti untuk jaringan lokal, hanya alih-alih alamat IP Raspberry kami menentukan alamat server dan port 15002.

gambar

Sekarang Anda dapat menghubungkan modem USB 4G ke Raspberry dan mengevaluasi penundaan reaksi cakrawala di layar.

Video internet


gambar

Untuk menyampaikan video, instal pemutar VLC di server:

 sudo apt-get install vlc 

Setelah instalasi, jalankan sebagai relay dari port UDP 5001 di kanal RTSP SERVER_IP: 8554 / live :

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

Di papan, kami akan memulai siaran video dari kamera ke server melalui UDP (bukan alamat server 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 

Alamat aliran sekarang dapat digunakan sebagai sumber video dalam pengaturan GCS atau dibuka di sembarang pemain yang mendukung protokol ini.

Sekarang Anda dapat merencanakan rute penerbangan dan meluncurkan drone melalui Internet, setelah sebelumnya menyalakannya, misalnya, menggunakan asisten telepon.

Jelas, karena waktu tempuh video dan telemetri yang relatif lama melalui jaringan, metode ini hampir tidak cocok untuk penerbangan FPV dalam mode manual antar rintangan.



Subjek untuk publikasi selanjutnya:

  • Opsi untuk mengisi ulang drone di rumah burung saya dan yang mana saya berhenti.
  • Menerapkan GCS berbasis web menggunakan MAVProxy, NodeJS, socket.io, dan server media untuk mengelola beberapa drone secara bersamaan.
  • Saluran komunikasi berlebihan dan sistem penyelamatan drone
  • Visi dan kap mesin untuk menghindari tabrakan dengan rintangan

Dilanjutkan ...

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


All Articles