Quadrotor'u Hedefe Doğru Yönlendirme


9

Bir quadrotor üzerinde çalışıyorum. Pozisyonunu biliyorum -a, nereye gitmek istiyorum - hedef pozisyon bve bundan bir vektör hesaplıyorum c - beni hedefime götürecek bir birim vektörü:

c = b - a
c = normalize(c)

Bir quadrotor dönmeden herhangi bir yönde hareket edebileceğinden, yapmaya çalıştığım şey

  1. döndür c robotların sapma açısı
  2. içine böl x,y bileşenler
  3. onları yuvarlanma ve eğim açıları olarak robota geçirin.

Sorun şu ki, sapma 0 ° ± 5 ise, bu işe yarar, ancak sapma +90 veya -90'a yakınsa başarısız olur ve yanlış yönlere yönelir. Sorum şu: Burada bariz bir şeyi mi kaçırıyorum?


1
Sapma açısını nasıl hesaplıyorsunuz? Ayrıca, hangi denetleyiciyi kullanıyorsunuz ve veriyi nasıl gönderiyorsunuz?
DaemonMaker

İlginç bir soru @Hamza, hoş geldiniz Robotik .
Mark Booth

@Hamza, Hangi dili ve sistemi kullanıyorsunuz? Ayrıca Atmega328 ve Ada programlama dili ile bir quadcopter üzerinde çalışıyorum. Proje hakkında bir blogunuz varsa lütfen paylaşın.

@MarkBooth doğru, açık iki sekme vardı ve diğer yazı yinelenen olarak işaretlemek niyetindeydim. Bunu yanlışlıkla işaretledim ve geri almanın bir yolunu görmedim. Kapatmanın birden fazla oy alması göz önüne alındığında, bunun bir sorun olmayacağını düşündüm. Ancak benim adıma bir yorum gönderdi farkında değildi.
DaemonMaker

Sorun yok @DaemonMaker bu şeyler olur. Yinelenen oylar artık otomatik olarak yorum gönderirken, insanların yakın bir oy vermeden önce diğer soruyu gözden geçirmelerini isteyen yararlı bir özellik olduğunu düşünüyorum.
Mark Booth

Yanıtlar:


6

Çözümünüzü yeniden uygulayarak şunu elde ederim:

Vektörler Arası Açı

İlk olarak, noktalar arasındaki açıyı istiyorsunuz A ve B - özellikle birim vektörü değil. 2 nokta arasındaki açı

( Fx Programlama ile ): θ=math.atan2(BxAx,ByAy)

Araç Sapma Açısı

Sonraki (ve bu sorunu olduğunu sanıyorum) yapmanız gerekir çıkarma aracın sapma açısıψ hesapladığınızdan θ.

Heading vs Yaw

Aracınızın "yalpa açısı" için bir pusula kullanıyorsanız, bu da sizin hatanız olabilir; yön ve sapma aynı değil . Pusula yönü pozitif boyunca sıfıryekseni, saat yönünde döndükçe artar :

Pusula gülü

Pozlama boyunca yaw sıfır xsaat yönünün tersine döndükçe artan eksen :

Kutup grafiği

Bu ölçümler arasındaki 90 derece üst üste binme, aracın istenen yalpadan sapmasını (çıkarmak yerine) eklemekle birleştiğinde, hedefiniz ± 5 ° içinde olduğunda ve ± 90 ° 'de kötü davrandığında neden olabilir.

X ve Y Bileşenlerine Dönüşüm

Oradan, bu sonucu dönüştürdüğünüzü söylüyorsunuz (θψ) onun içine x ve ybileşenleri, onları rulo ve eğim açıları olarak robota geçirir. Yukarıdaki düzeltmelerle, bu noktada istenen sonucu almalısınız. Bununla birlikte, bu bileşenleri eğim açılarına doğrudan eşlemek sorunlu olabilir, çünkü aracın hızını (gerçekten, momentumu) değil, sadece konum farkını düşünürsünüz.

PID Kontrolü

En iyi şekilde aracın rulo ve eğimi için PID kontrol döngüleri kullanılarak servis yapılabilir. Yani, kodunuzu düzelttikten ve hedefinize vurabildiğinizde, tahminim bunun yerine onu aşmaya başlayacaksınız - ileri geri salınıyor. Doğru ayarlanmış bir PID, hedefe hızlı bir şekilde yaklaşmanıza izin verirken bunun olmasını önler.

Takmak yerine x ve yyuvarlanma ve eğimde, bunları yuvarlanma ve eğim PID'lerinin girdi olarak kabul ettiği hata değerleri olarak düşünün .


Bu bazı düzenleme var,% 90'ın üzerinde ve cevabı tamamen değiştiriyor (PID'den ATAN2'ye). Ama gösterişli grafik formül becerileriniz canavardır!
Spiked3

Hala PID'yi tavsiye ediyorum (altta var), sadece varsayımlarımın doğru olduğundan emin olmak için sorunun başlangıç ​​kısmında çalıştım. Grafik formüller, görülmeye değer Lateks biçimlendirmesinin bir parçasıdır.
Ian

"pusula yönü pozitif y ekseninden başlar ve saat yönünde artarken sapma pozitif x ekseninden başlar ve saat yönünün tersine artar" referansı? "(θ − ψ) x bileşeni rulo ve y bileşeni adım dönüştürme" Hiç anlamıyorum - daha fazla açıklama lütfen (bir şey eksik).
Spiked3

Orijinal soru, "[x ve y bileşenlerini] robota dönüş ve eğim açıları olarak geçirmekten" bahsetti. Biraz açıklık getireceğim.
Ian

düzgün. Hiç böyle yapıldığını görmedim. Aynı sonuçları elde etmek için gördüm ve kendim yapıyorum. Rulo / saha üzerinde biraz daha düşünmem gerekecek. Evet, bu harekete neden olur, ancak bunun, bulunduğunuz yer ve gidişinizle nasıl bir ilgisi olduğundan emin değilim. Teşekkürler.
Spiked3

5

Burada bir 3B vektörden bahsettiğinizi varsayalım. Bu şekilde genelleme yapabilir misiniz normalize()? Bu yaygın mı (daha önce hiç görmedim, eğer öyleyse, bana haber). Aksi takdirde, X ve Y bileşenlerinin her biri için belirgin pusula sarma sorunları geçerlidir. Neden onlara yuvarlanma ve / veya eğim ve / veya sapma demiyorsunuz? (3D ve 2D adlandırmaların karıştırılması soruyu karıştırır).

2B normalleştirmem şöyle görünür;

int Pilot_QuickestTurnTo(int hdgNow, int hdgNew)
{
    hdgNow = Pilot_Hdg360(hdgNow);
    hdgNew = Pilot_Hdg360(hdgNew);
    if (hdgNow < hdgNew)
        hdgNow += 360;
    int left = hdgNow - hdgNew;
        return (left < 181 ? -left : 360 - left);
}

Gerçekten bir dörtlü ise, X ve Y bileşenlerinizin gerçekten YAW, Rakım ((X, Y) ve Z) olduğunu varsayıyorum. 2D'yi ele almanız YAW(X, Y)ve Z için düşmeniz veya irtifa almanız gerekecek (ve bu yüzden normalleştirmenin sahip olduğunuzdan daha fazla olduğundan şüpheleniyorum).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.