Probleme mit Neigungssensor/Aufbau oder PID angelegenheit?

    ACHTUNG: Mit der neuen EU Drohnenverordnung muß sich jeder Drohnen-Betreiber beim Luftfahrtbundesamt registrieren und seine Drohne mit der e-ID kennzeichnen! Ein passendes Kennzeichen bekommst Du hier im Shop. Außerdem benötigst Du eine Drohnen-Versicherung. Hier geht es zu unserem Drohnen-Versicherungsvergleich. Informationen zum neuen EU Drohnenführerschein gibt es hier.

    • Probleme mit Neigungssensor/Aufbau oder PID angelegenheit?

      Hallo liebe Copter Freunde,

      ich hatte ja schonmal von meinem Projekt einen Quadrocopter mit dem Raspberry-Pi selber zu bauen berichtet.
      Mitlerweile bin ich schon ein ganzes Stück weiter:

      dropbox.com/s/b7h8835shyyroag/20160525_141921.jpg?dl=0

      Als Neigungssensor verwende ich den MPU6050 (3-Achsen Gyroskop + 3-Achsen Beschleunigungssensor).
      Hierbei habe ich den internen DLPF (Digital-Low-Pass-Filter) aktiviert und taste die Werte mit 100Hz ab.

      Um aus den Werten die Tatsächlich Neigung zu bestimmen habe ich einen Kalman-Filter und einen Komplementärfilter implementiert.
      Der Kalman scheint stabiler zu sein, der Komplementär hingegen reagiert schneller auf veränderungen.
      Selbst der Komplementärfilter liefert mir zuverlässige werte im bereich von +- 0,5°.

      Für den Übergang habe ich eine kleine Fernsteuerung programmiert, die mir alle Sensordaten zurückgibt und ganz staatisch die Motoren ansteuern kann.

      dropbox.com/s/m77d894cmog53sz/Selection_001.png?dl=0

      Hierbei ist mir aufgefallen, dass, sobald die Motoren laufen, meine Sensoren anfangen zu schwanken.
      Ich hatte zwar auf Grund der Motorvibration damit gerechnet.
      Allerdings befinden sich die Schwankungen in einem Bereich von bis zu +-10°.

      Hier stellt sich mir jetzt die Frage ob das normal ist, oder ich gegebenenfalls noch irgendwo nachbessern muss.

      Mögliche Fehlerquellen wären:

      Der Rahmen (vllt dämpfer einbauen?, position des Sensors ändern?)
      Der Sensor selber (Median/Mittelwert-filtern, wie stark darf ich die update-Frequenz überhaupt reduzieren für Tiefpassfilterungen?)
      Oder ist es sogar normal und der PID-Regler kommt damit klar?

      Erstaunlicher weise konnte ich zu dem Problem bisher keine nützlichen Hinweise finden.

      Ich wäre für Erfahrungswerte und Tipps diesbezüglich sehr dankbar.

      Lieben Gruß

      Jango
    • Brachte leider keine Nennenswerte Verbesserung.

      hat denn jemand Erfahrungen mit dem MPU6050 gemacht und kann mir sagen, ob ich ihn ggf falsch eingestellt habe?

      Quellcode

      1. /* reset device */
      2. i2c_send_buf[0] = MPU6050_PWR_MGMT_1;
      3. i2c_send_buf[1] = 0b10000000;
      4. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      5. /* wait until reset is done */
      6. reg_adr = MPU6050_PWR_MGMT_1;
      7. do {
      8. i2c_master_send(mpu6050_client, &reg_adr, 1);
      9. i2c_master_recv(mpu6050_client, &tmp, 1);
      10. } while((tmp & 0b10000000) > 0);
      11. /* test who_am_i register */
      12. reg_adr = MPU6050_WHO_AM_I;
      13. i2c_master_send(mpu6050_client, &reg_adr, 1);
      14. i2c_master_recv(mpu6050_client, &tmp, 1);
      15. if(tmp != 0x68) {
      16. printk("MPU6050_WHO_AM_I request failed\n");
      17. return -EAGAIN;
      18. }
      19. /* set sample rate to (gyro 8000/1+REG_ENTRY Hz) */
      20. i2c_send_buf[0] = MPU6050_SMPRT_DIV;
      21. i2c_send_buf[1] = 0x00;
      22. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      23. /* configure FSync and DLPF(digital lowpass filter) */
      24. i2c_send_buf[0] = MPU6050_CONFIG;
      25. i2c_send_buf[1] = 0b00000010;
      26. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      27. /* configure Clock source */
      28. i2c_send_buf[0] = MPU6050_PWR_MGMT_1;
      29. i2c_send_buf[1] = 0b01000000;
      30. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      31. /* configure gyro range */
      32. i2c_send_buf[0] = MPU6050_GYRO_CONFIG;
      33. i2c_send_buf[1] = 0b00000000; /* turn off selftest - set range to +- 250deg/s */
      34. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      35. /* configure accel range */
      36. i2c_send_buf[0] = MPU6050_ACCEL_CONFIG;
      37. i2c_send_buf[1] = 0b00000000; /* turn off selftest - set range to +- 2g */
      38. i2c_master_send(mpu6050_client, i2c_send_buf, 2);
      39. configure_offsets();
      Alles anzeigen

      anschließend werden gie Gyro-Werte durch 131 geteilt.
      Die accel Werte analog dazu durch 16384 und zusätzlich per atan2 in einen winkel verrechnet.
      beide Werte werden mittels Kalman kombiniert.