Menerapkan kembali solusi Anda, saya mengerti:
Sudut Antara Vektor
Pertama, Anda ingin sudut antara titik dan - tidak secara khusus vektor satuan.
AB
( via Pemrograman Fx ):
θ=math.atan2(Bx−Ax,By−Ay)
Sudut Yaw Kendaraan
Selanjutnya (dan saya menduga ini adalah masalah Anda), Anda perlu mengurangi sudut yaw kendaraan dari dihitung . ψθ
Tajuk vs Yaw
Jika Anda menggunakan kompas untuk "yaw angle" kendaraan Anda, ini juga bisa menjadi kesalahan Anda; heading dan yaw tidak sama . Judul kompas adalah nol di sepanjang sumbu positif , meningkat saat berputar searah jarum jam :y
Yaw adalah nol di sepanjang sumbu positif , meningkat saat berputar berlawanan arah jarum jam :x
90 derajat tumpang tindih antara pengukuran ini, dikombinasikan dengan menambahkan (bukannya mengurangi) menguap kendaraan dari menguap yang diinginkan, mungkin mengapa hal-hal bekerja ketika target Anda berada di dalam ± 5 ° dan berperilaku buruk di ± 90 °.
Konversi ke Komponen X dan Y
Dari sana, Anda mengatakan bahwa Anda mengubah hasil ini menjadi komponen dan , meneruskannya ke robot sebagai sudut roll dan pitch. Dengan koreksi di atas, Anda harus mendapatkan hasil yang diinginkan pada saat ini. Namun, memetakan komponen-komponen ini secara langsung ke sudut kemiringan mungkin menjadi masalah karena Anda hanya mempertimbangkan perbedaan posisi, dan bukan kecepatan (sebenarnya, momentum) kendaraan.(θ−ψ)xy
Kontrol PID
Anda mungkin paling baik dilayani dengan menggunakan loop kontrol PID untuk roll dan pitch kendaraan. Yaitu, setelah Anda memperbaiki kode Anda dan dapat mencapai target Anda, tebakan saya adalah Anda akan mulai melakukan overshooting - berosilasi bolak-balik. PID yang disetel dengan benar akan mencegah hal itu terjadi sementara masih memungkinkan Anda untuk mendekati target dengan cepat.
Alih-alih memasukkan dan ke roll and pitch, anggap itu sebagai nilai kesalahan yang diterima roll dan pitch PID sebagai input.xy