czorgormez
Temporary user
- Katılım
- 27 Ekim 2022
- Mesajlar
- 1,628
üzerinde çalıştığım projede tam mekatroniklik bazı sorunlar var.
kısaca projeden bahsedeyim. azimuth ve elevation (veya yaw - pitch ) eksenlerinde bir platform var. bu platformu bir kamera gibi düşünebiliriz. gökyüzünde sabit bir noktaya bakıyor. her eksen için 200 adımlı bir step motor ve bu motorları 16-32 mikrostepte süren step motor sürücülerim var.
kod epey hızlı 200mhz bir stm32 içinde koşuyor. step motor sürücü kodlarım 3 adet timer ile kontrol ediliyor. 2 adet timer motorlar için gerekli sabit 2.5us step pulse üretirken diğer timer her 100usde bir gerekli hesapları yaparak motorların ivmelenme ve yavaşlama profillerini çıkarıyor. kod motorları rahatlıkla 100hz - 30 khz arasında sürebiliyor. bu kısma kadar sorun yok. yani motorlara şu kadar adım şu hızda git dediğimde rampa hesapları yapılmış şekilde trapezoidal formda hedefe gidiyor.
stabilizasyon kısmında 1 adet 9 eksen MPU9250 accelerometer-gyroscope-magnetometer chip var.
sorun burada başlıyor. ben gyroskoptan gelen feedback verisini alır basit bir pid yapar ve motorları sürerek müthiş olmasa da iş görecek bir hareket takip sistemi yaparım zannetmiştim ama yanılmışım. bir türlü istediğim kadar iyi olmadı.
bilindiği üzere accelerometer verileri çok gürültülüdür ve gyroscoper verileri de zaman içinde ufau ufak drift eder bu yüzden çeşitli filtreler ve yöntemler kullanılır. MPU9250 hareket sensöründen gelen veriyi 3 şekilde temizleyip stabil hale getirebilirim.
1- raw gyro verisini alıp drift ettiği kısmı görmezden gelerek sonuç üzerinden ilerlemek
2- gyro ve accel. verisini stm32 içinde complementary filtreden geçirerek açı veya euler datasını işlemek
3- gyro ve accel datasını kalman veya extended kalman filtresinden geçirerek euler datasını (veya quaternion) işlemek
4- MPU9250 içindeki invensense Motion engine kullarak bunun ürettiği euler (veya quaternion)datasını işlemek
burada 3 hariç diğer yöntemleri denedim ve çalıştırdım. basitçe terminalde çok düşük sapma ile tüm eksenlerde akıcı ve tutarlı veriler elde ettim.
ilk yöntemde doğal olarak bir açı veya eksen bilgisi yok sadece anlık tepkiler var elimde. complementary filter dahili motion engine kıyasla biraz daha yavaş ama
tutarlı görünüyor. en temiz ve en çok datayı üreten aynı zamanda işlemciyi de meşgul etmeyen internal invensense motion engine.
devamında birkaç pid kodu denedim. Brett Beauregard yönteminden türetilmiş ve sağlam çıktı ürettiği iddia edilen birkaç tane C kodunu stm32 uyarladım ve çalıştırdım.
grafik ekranda da aslında tutarlı görünüyor ama tepki sürelerini tam çözemedim.
mesela benim elimdeki pid kodunda kP kI kD değerleri 2,3,5 gibi set edilmiş başka kodlarda 0.020 - 0.15 - 0.0018 gibi çok farklı parametreler mevcut.
şimdi sorularım burada başlıyor:
- yukarıdaki gyro verilerini filtreleme yöntemlerinden hangisi benim amacıma en uygundur ?
- pid kodlarında hareket kontrol algoritmalarına uygun al bunu kullan diyeceğiniz test edilmiş bir örnek var mıdır
- pid çıktısını motora aktarırken çıktıyı motor hızı verisi olarak değerlendiriyorum. yani hedefe ne kadar uzaksan o kadar hızlı ve sürekli adım at zaten hedefe geldiğinde pid hızını düşürerek bir noktada sıfırı hata üretecek diye yaklaşıyorum. bu yaklaşım hatalı mıdır ?
son aşamada gyro ile stabilizatör yaparken trapezoidal formda motor sürmenin hatalı olduğunu fark ettim. çünkü bu sistem motorları hep bir adım aralığında mesela 100 adım gitmeye zorluyor. bunun yerine motora git ve ben değiştirene kadar şu hızda-şu yönde git demenin daha doğru olduğunu buldum.
işin özü sistem temellerine tam öğrenmeden parçaları birleştirerek bir altyapı yapmaya çalıştım ama anlamadığım yerler olunca sistem stabil olmadı.
şunu ekle, şunu çıkar, böyle olmaz, şunu oku, şu kodu incele vs. gibi fikirlerinizi bekliyorum.
kısaca projeden bahsedeyim. azimuth ve elevation (veya yaw - pitch ) eksenlerinde bir platform var. bu platformu bir kamera gibi düşünebiliriz. gökyüzünde sabit bir noktaya bakıyor. her eksen için 200 adımlı bir step motor ve bu motorları 16-32 mikrostepte süren step motor sürücülerim var.
kod epey hızlı 200mhz bir stm32 içinde koşuyor. step motor sürücü kodlarım 3 adet timer ile kontrol ediliyor. 2 adet timer motorlar için gerekli sabit 2.5us step pulse üretirken diğer timer her 100usde bir gerekli hesapları yaparak motorların ivmelenme ve yavaşlama profillerini çıkarıyor. kod motorları rahatlıkla 100hz - 30 khz arasında sürebiliyor. bu kısma kadar sorun yok. yani motorlara şu kadar adım şu hızda git dediğimde rampa hesapları yapılmış şekilde trapezoidal formda hedefe gidiyor.
stabilizasyon kısmında 1 adet 9 eksen MPU9250 accelerometer-gyroscope-magnetometer chip var.
sorun burada başlıyor. ben gyroskoptan gelen feedback verisini alır basit bir pid yapar ve motorları sürerek müthiş olmasa da iş görecek bir hareket takip sistemi yaparım zannetmiştim ama yanılmışım. bir türlü istediğim kadar iyi olmadı.
bilindiği üzere accelerometer verileri çok gürültülüdür ve gyroscoper verileri de zaman içinde ufau ufak drift eder bu yüzden çeşitli filtreler ve yöntemler kullanılır. MPU9250 hareket sensöründen gelen veriyi 3 şekilde temizleyip stabil hale getirebilirim.
1- raw gyro verisini alıp drift ettiği kısmı görmezden gelerek sonuç üzerinden ilerlemek
2- gyro ve accel. verisini stm32 içinde complementary filtreden geçirerek açı veya euler datasını işlemek
3- gyro ve accel datasını kalman veya extended kalman filtresinden geçirerek euler datasını (veya quaternion) işlemek
4- MPU9250 içindeki invensense Motion engine kullarak bunun ürettiği euler (veya quaternion)datasını işlemek
burada 3 hariç diğer yöntemleri denedim ve çalıştırdım. basitçe terminalde çok düşük sapma ile tüm eksenlerde akıcı ve tutarlı veriler elde ettim.
ilk yöntemde doğal olarak bir açı veya eksen bilgisi yok sadece anlık tepkiler var elimde. complementary filter dahili motion engine kıyasla biraz daha yavaş ama
tutarlı görünüyor. en temiz ve en çok datayı üreten aynı zamanda işlemciyi de meşgul etmeyen internal invensense motion engine.
devamında birkaç pid kodu denedim. Brett Beauregard yönteminden türetilmiş ve sağlam çıktı ürettiği iddia edilen birkaç tane C kodunu stm32 uyarladım ve çalıştırdım.
grafik ekranda da aslında tutarlı görünüyor ama tepki sürelerini tam çözemedim.
mesela benim elimdeki pid kodunda kP kI kD değerleri 2,3,5 gibi set edilmiş başka kodlarda 0.020 - 0.15 - 0.0018 gibi çok farklı parametreler mevcut.
şimdi sorularım burada başlıyor:
- yukarıdaki gyro verilerini filtreleme yöntemlerinden hangisi benim amacıma en uygundur ?
- pid kodlarında hareket kontrol algoritmalarına uygun al bunu kullan diyeceğiniz test edilmiş bir örnek var mıdır
- pid çıktısını motora aktarırken çıktıyı motor hızı verisi olarak değerlendiriyorum. yani hedefe ne kadar uzaksan o kadar hızlı ve sürekli adım at zaten hedefe geldiğinde pid hızını düşürerek bir noktada sıfırı hata üretecek diye yaklaşıyorum. bu yaklaşım hatalı mıdır ?
son aşamada gyro ile stabilizatör yaparken trapezoidal formda motor sürmenin hatalı olduğunu fark ettim. çünkü bu sistem motorları hep bir adım aralığında mesela 100 adım gitmeye zorluyor. bunun yerine motora git ve ben değiştirene kadar şu hızda-şu yönde git demenin daha doğru olduğunu buldum.
işin özü sistem temellerine tam öğrenmeden parçaları birleştirerek bir altyapı yapmaya çalıştım ama anlamadığım yerler olunca sistem stabil olmadı.
şunu ekle, şunu çıkar, böyle olmaz, şunu oku, şu kodu incele vs. gibi fikirlerinizi bekliyorum.
Son düzenleme: