Tarama robotu için yumuşak servo hareketi


11

Bir süre önce, her biri iki serbestlik derecesine sahip iki bacağı olan küçük bir paletli robot yaptım, bu yüzden toplamda 4 RC servo. Bacakların hareketini programlarken oldukça sert hareket ettiklerini fark ettim. RC servo dahili kontrol cihazının konum komutlarına çok hızlı bir tepki vermesi mantıklıdır, ancak tarayıcımın biraz daha pürüzsüz ve hayata benzeyen bir şekilde hareket etmesini istedim.

Benim çözümüm, servoların yolunu tanımlayan kübik bir zaman fonksiyonu oluşturmak ve daha sonra, daha yumuşak bir hareketle sonuçlanacak şekilde küçük zaman aralıklarında konumlarını ayarlamaktı. Aslında yaptığım şey , zaman aralığını, servonun başlangıç ​​ve bitiş konumunu ve servonun hareket etmesi gereken başlangıç ​​ve bitiş oranlarını kullanarak kübik bir denklemdeki katsayıları için çözmekti (sadece konumun türevi):birben

İçin çözün , , ve :a 1 a 2 a 3bir0bir1bir2a3

position(t)=a0+a1t+a2t2+a3t3
rate(t)=position(t)=a1+2a2t+3a3t2

Verilen: , , ,p o s i t i o n ( t f ) r a t e ( 0 ) r a t e ( t f )position(0)position(tf)rate(0)rate(tf)

Hareketlerin zıt yönlerde olması durumunda bir çift hareket arasındaki servo oranını sıfır ve hareketlerin her ikisi de pozitif veya negatif yönde ise pozitif veya negatif olarak ayarladım.

Bu oldukça işe yaradı, ancak bu çözüm birkaç şekilde sınırlıdır. Birincisi, aynı yöne giden hareketler arasındaki oranların tam olarak ne olacağına karar vermek zor. Hareketler arasındaki belirli bir konumun önündeki ve arkasındaki eğimlerin ortalamasını kullandım, ancak benim için en uygun olduğu net değil. İkincisi, kübik eğriler servoyu bir hareketin başlangıcındaki ve sonundaki konum aralığının dışında bir konuma götürebilir, bu istenmeyen bir durumdur. Örneğin, zaman aralığı boyunca bir noktada, eğri, servonun ikinci konumun ötesine veya ilk konumun altına gitmesine neden olabilir. Üçüncüsü, buradaki eğri oluşumu, servonun dönebileceği maksimum hızı dikkate almaz, bu nedenle bir eğri, servoun gerçekçi olmayan bir hızda hareket etmesini sağlayabilir. Bununla,

Son kaygıyı ihmal ederek, bu sorunlar polinom derecesini artırarak ve katsayıları çözmek için kısıtlamalar ekleyerek çözülebilir, ancak şimdi merak etmeye başlıyorum ...

Servo hareketi pürüzsüz hale getirmek ve daha gerçekçi görünmek için bundan daha iyi bir yol var mı?


Kod nispeten düz ileri olmalıdır. Neden dahil edildiğinden daha fazla bahsedebilir misiniz?
DaemonMaker

1
Haklısın, kod oldukça basitti, ancak servoları kontrol etmek için ortaya çıkan yöntem öncekinden daha karmaşıktı. Sorumu bunun yerine bu yöntemin sınırlamalarının bir açıklamasını içerecek şekilde düzenledim.
Robz

NURBS , üniform olmayan rasyonel B-spline, işi yapabilir
James Waldby - jwpat7

@ jwpat7 Girdiğiniz için teşekkürler, ancak bu eğrilerin sağlanan noktalara ulaşması garanti
edilmediğinden NURBS'un işe yarayacağını sanmıyorum

Kp

Yanıtlar:


6

Hareket Profili Üretimi

Geçmişte, bu sorunu çözmek için bir hareket profili oluşturucu kullandım. Bunu kullanmak için, motorlarınızla ilişkili istenen hedef konuma (ayar noktası), maksimum hıza ve hızlanma değerlerine ihtiyacınız olacaktır. Düzgün bir konum profili elde etmek için yamuk hız eğrisini entegre ederek çalışır. Hareketin daha düzgün olması gerekiyorsa bir S eğrisi kullanılabilir. Hareket profilini açıklayan makaleye referans .

Ayar Noktası Ön Filtreleme

Hareket profili oluşturma yolunun yanı sıra, komutu servolara düşük geçişli filtrelemeyi deneyebilirsiniz. Bu tür ayar noktası filtreleme, yanıtınızı yavaşlatır, ancak aynı zamanda düzgünleştirir ve uygulanması kolaydır. Kesme frekansı, sisteminizin bant genişliğini destekleyecek şekilde seçilmelidir (böylece istenen hareketi filtrelemez). C'de basit alçak geçiren filtre uygulaması


+1: kesinlikle hareket profili oluşturma.
Guy Sirton

2

Bence soru bu tür bir cihaza atıfta bulunur: RC servo

Bunlar genellikle çok yüksek performansa sahip değildir, bu nedenle oluşturulan hareket profilini çok iyi izleyemezler. Çoğu ticari motor kontrol sistemi, her bölümün farklı bir denklem kullandığı parçadan oluşan bir profil yapan bir noktadan noktaya hareket (bkz. @ Ddevaz'ın cevabı) için bir S eğrisi kullanır. Sorununuz, motorunuzun oluşturulan profili izlemesi için muhtemelen çok "yavaş" bir profilinizin olması olacaktır. Aksi takdirde, cihazı denemeye ve cihaza komut vermeyi denediğiniz profilde cihazın gerçek konumuna göre büyük bir konum hatası olur.

İdeal olarak, hareketi yürütürken bakabileceğiniz bir tür geri bildirim isteyeceksiniz, böylece cihazın komutu ne kadar iyi izlediğini görebilirsiniz. Daha pratik bir bakış açısıyla, önemli ölçüde daha iyi hareket istiyorsanız, farklı motorlara ve farklı motor kontrolüne ihtiyacınız olabilir.

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.