mbedRTOS quadcopter quadrotor RATE and ATTITUDE mode (default). Altitude Hold soon to come. pHysiX Coding 2014.

2 Flight Controller Software

Introduction

Quadcopter (X-Mode) using RTOS.

Insert picture of build

Control loop: PI-PI.

D Gain will not be used as data is noisy and caused instability shortly after liftoff.

Progress:

  1. Code now utilises threads and ticker.
  • Highest priority given to inner loop and plant output. Next priority given to outer loop. Lowest priority given to telemetry.
  • Time critical routine given to command input.
  1. Code uses semaphores and mutexes.
  • Threads are triggered periodically and optimised to run within a bound guarantee.
  • Bus resource protected by mutex to ensure no corruption of data.
  1. Code is now ran at maximum speed for every task.
  • 400Hz pulse, update and loop.
  • 200Hz loop
  • 50Hz time-guaranteed for command input
  • 50Hz lowest priority telemetry.
  1. Code uses non-blocking I2C
  • Will need to monitor state machine improvements.
  • So far, RTOS has not entered deadlock for > 8 hours of continuous operation! Code is stress testing by having it simulate the worst flying conditions it may be subjected to.
  • MPU DMP quirks for setup are overcome by creating a separate class for non-blocking implementation, and adding a destructor to the original library for house-keeping purposes.
  1. Control loop now solid.
  • PID gains now fully tuned.
  • PID control theory, especially for early warning disturbance rejection almost compliant. There is no motivation to achieve compliance as even with flashed ESCs, the max input update rate is 400Hz. A naive Nyqist analysis would suggest that running the ESC at the same speed as a control loop would have ill consequences with aliasing.

Loop will soon incorporate altitude hold. Debating whether to use APM, Ardu- or Aeroquad approach. Algorithm will be posted here, no code until licencing and citation issues are pursuant.

Implementation

RTOS

4 main threads:

  • Thread1: Output telemetry.
    • Outputs: YPR, Gyro, Altitude, Voltage, RC Input, RC Command, PID output, ESC Power
    • Thread frequency: 50Hz.
  • Thread 2-Master: YPR sample, PI Master/Outer control loop. Attitude control.
    • Subfunction: Sample MPU6050 and calculate Yaw Pitch Roll angles from DMP quaternion.
      • Settings: 50Hz sampling rate (Attitude), 100Hz output FIFO buffer.
    • Settings: Input limits: -500.0, 500.0; Output limits: -200.0, 200.0; Output bias: 0.0, Automatic mode
    • Settings: KP: 0.5, TI: 1.0, TD = 0.0
    • Thread frequency: 200Hz
  • Thread 2-Slave: Gyro sample, PI Slave/Inner control loop. Rate control.
    • Settings: Input limits: -500.0, 500.0; Output limits: -200.0, 200.0; Output bias: 0.0, Automatic mode
    • Settings: KP: 7.0, TI:2.0, TD = 0.0
    • Thread frequency: 400Hz
  • Thread 3: RC & Bluetooth Command
    • Settings: Default quadcopter is unarmed
    • Thread frequency: 50Hz
  • Thread 4: Update ESC pulsewidth
    • Note: My ESCs can apparently handle refresh rates of up to 400Hz. This means that the ESC should handle a 400Hz PWM pulse. This is distinguished from how fast I update the actual pulsewidth/duty cycle of my pulse!!!
    • Settings: PWM frequency: 400Hz
    • Thread frequency: 400Hz.

AHRS Sampling

Thread frequency: 200Hz

MPU6050 Sampling rate: 100Hz

FIFO Buffer Output rate: 100Hz

To be completed

Gyro Sampling & PID calculations

Master PID Loop

Thread frequency: 200Hz Control: PI

To be completed

Slave PID Loop

Thread frequency: 400Hz Control: PI

To be completed

RC & Bluetooth Command

Thread frequency: 50Hz

To be completed

Update ESC

Thread frequency: 400Hz

Pulse period: 400HZ

Pulse update rate = Thread frequency = 400Hz

To be completed


All wikipages