Bir robotu düz bir çizgide sürmek için Arduino PID kütüphanesini nasıl kullanabilirim?


19

2 tekerlekli Arduino tabanlı bir robot, her bir tekerlekte dördün kodlayıcılar, bir H-köprü sürücü çipi (veya motor kontrol cihazı) ve bir tekerlek oluşturmak istiyorum. Hızın seyahat mesafesi ile orantılı olmasını sağlamak için PID kütüphanesini kullanmak istiyorum.

Kavramsal düzeyde, (motorların PWM seviyelerine aynı tepki vermediği varsayılarak) PID kontrolünü düz bir çizgide ve seyahat için kalan mesafeyle orantılı bir hızda seyahat edecek şekilde nasıl uygulayabilirim?


Özellikle Arduino PID kütüphanesine dayandığı için bu sorunun yeri de burada .
Anindo Ghosh

Yanıtlar:


18

Ayrıntılı Bilgiler

PID Temel Örneğine baktığımda, her bir tekerlek, kodlayıcı ve pwm için bir tane olmak üzere PID denetleyicisinin iki kopyasını başlatmanız gerektiğini düşünüyorum:

PID leftPID(&InputLeft, &OutputLeft, &SetpointLeft,2,5,1, DIRECT);
PID rightPID(&InputRight, &OutputRight, &SetpointRight,2,5,1, DIRECT);

Daha sonra, loop()eşdeğerinizde, her iki kodlayıcıyı da okur, her bir kodlayıcı değerini ilgili PIDolana iletir ve son olarak her iki PWM değerini yazarsınız.

Şimdilik SetpointLeftve SetpointRightaslında aynı değere işaret edebilir, ancak bunları ayrı ayrı tanımlamak, daha sonra dönme yeteneğini eklemenizi sağlar.

Kavramlar

Bu temel durum için işe yarayabilir, ancak yeterli olup olmadığı gerçekten düz çizginizin ne kadar doğru olması gerektiğine bağlıdır.

Ölü hesaplaşma

Her tekerlekte kodlayıcılarınız olduğu göz önüne alındığında, iki PID döngüsü çalıştırır ve her bir tekerleğin aşağıdaki hatasını karşılaştırırsanız, tekerleklerinizin kaymadığı varsayılarak, mesafe üzerindeki maksimum abbe hatasını hesaplayabilirsiniz . Bu hata gereksinimlerinizden daha küçükse, ihtiyacınız olan tek şey ölü hesaplaşmadır .

Ancak tekerlekleriniz kaymaya eğilimliyse, kontrol sisteminizin algılayamadığı gizli bir hataya sahip olabilirsiniz ve tekerlek enkoderlerinizden bağımsız olarak bir kayma algılamanız veya konumu hesaplamanız ve daha sonra düzeltmek için daha yüksek seviye yazılım kullanmanız gerekebilir. düz bir çizgiyi korumak için gerekli tekerlek konumları / hızları.

Göreceli konum belirleme

As John anlaşılacağı , sen konumunu belirlemek için bir ivme kullanabilmek için, ama onların doğruluğunu ve zaman içinde biriken hataların etkisini verilen edebilir, algılayabilir ve tekerlek kayma için doğru için ivmeölçer verileri kullanarak daha iyi olabilir.

Mobil robotikte, mevcut pozisyonu daha iyi belirlemek için bir ivmeölçer ve tekerlek kodlayıcılar gibi birden çok kaynaktan verileri birleştirmek için Kalman filtreleme teknikleri yaygın olarak kullanılır.

Zaman içinde, ancak nispi pozisyon kararlılıkla kendinizi ettiğine inandığımız pozisyonu ne yaparsanız edecektir gerçek fiziksel konumdan sürüklenip.

Mutlak konum belirleme

Bu sorunu aşmanın tek yolu, araçlarınızın referans çerçevesinin dışında bir referans noktasına sahip olmaktır.

Örneğin, bir odaba, bir odanın etrafında hareket etmek için ölü hesaplaşma kullanır, ancak bağlantıya ihtiyaç duyduğunda, şarj istasyonu tarafından gönderilen kızıl ötesi bir ışık demeti arar. Roomba bu ışın boyunca rastgele hareket ettiğinde, onu algılar, ışın üzerine kilitler ve kaynağına geri takip eder. Yumru sensörleri ile birlikte, kendini şarj kontaklarına doğru bir şekilde yerleştirebilir.

Robotunuz için, geri dönüp bilinen bir konumda olduğunu algılayabileceği bir ev konumu olabilir. Bu noktada tam olarak nerede olduğunu bilir ve hesaplanan konumun gerçek konumundan ne kadar uzakta olduğunu rapor edebilir.

Başka bir seçenek, robotunuzun yüzlerce metrenin üzerinde düz bir çizgide seyahat etmesi gerekiyorsa, Arduino GPS kalkanı eklemek gibi farklı bir tekniğe geçmek olacaktır .

Tekniklerin bir kombinasyonu

Sonuç olarak, doğruluk gereksinimlerinize bağlı olarak, bu tekniklerin bir kombinasyonunu kullanmanız gerekebilir.

Bir kılavuz ışını mümkünse, görünmez bir çizgi takip tekniği ile istediğinizi çok basit bir şekilde yapabilirsiniz . Kısıtlı bir alanda herhangi bir keyfi düz çizgide hareket etmeniz gerekiyorsa, o zaman roomba gibi, bir Kartezyen ekseninde sentezlenmiş konumunuzu düzeltmenize izin vermek için bir çift kılavuz kiriş kullanabilirsiniz (birbirlerine dik açılarla). robot her bir kirişten geçtiğinde.

Burada birçok seçenek var ve seçtiğiniz şey neye ihtiyacınız olduğuna bağlı olacaktır.


1

Her iki tekerleği sürmek için tek bir aks kullanmıyorsanız, görebildiğim tek çözüm, robotun yönünü algılamak için 3 eksenli bir ivmeölçer veya başka bir sensör eklemektir ve her motora sinyalleri uygun şekilde ayarlamaktır.


0

Yukarıda belirtildiği gibi, her tekerleğe aynı hızda hareket etmesini söyleyerek başlarsınız ve ardından PID bu hızda çalıştıklarından emin olur. Ama bu mükemmel olmayacak. İki tekerlek kodlayıcı sayısını periyodik olarak okuyun ve karşılaştırın ve sayıları eşitlemek için gerekirse bir tekerleğin biraz daha hızlı gitmesini sağlayın. ve (2) kodlayıcılar ASLA bir ivmeölçer ve bir pusulaya ihtiyacınız yoktur.

Bir Kalman filtresine bakıyorsunuz. Eğer enkoderi, pusulayı ve ivmeölçer verilerini birleştirmek istiyorsanız başlığı size verin.


0

Bu bağlantı , iki PID hesaplaması olmadan iyi bir örnek verir. Ayrıca düz yolu ölçmek için imu / pusula uygulayabilirsiniz

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.