Top Banner
Embedded Programming Quadcopters for
69

Embedded Programming for Quadcopters

Jul 15, 2015

Download

Technology

Ryan Boland
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Embedded Programming for Quadcopters

Embedded Programming

Quadcoptersfor

Page 2: Embedded Programming for Quadcopters

I’m Ryan Boland

Web Developer@ Tanooki Labs

@bolandrm (github, twitter)

Page 3: Embedded Programming for Quadcopters
Page 4: Embedded Programming for Quadcopters
Page 5: Embedded Programming for Quadcopters

1. Components

2. Quadcopter physics

3. Sensor Inputs

4. Motor Outputs

5. Safety

Page 6: Embedded Programming for Quadcopters

Frame

Page 7: Embedded Programming for Quadcopters

Electronic Speed Controllers (ESCs) & Motors

Page 8: Embedded Programming for Quadcopters

Lithium Polymer (LiPo) Battery

Page 9: Embedded Programming for Quadcopters

Remote Control Transmitter + Receiver

Page 10: Embedded Programming for Quadcopters

Flight Controller

Microprocessor & Inertial measurement Unit (IMU)

Page 11: Embedded Programming for Quadcopters

My Project - Custom Flight Controller

Arduino Mega 2560 & Prototyping Shield

8-bit AVR 16 MHz clock

256K Flash 8K Ram

Arduino Nano Clone 8-bit AVR

16 MHz clock 32K Flash 2K Ram

Teensy 3.1 32-bit ARM

96 MHz clock 256K Flash 64K Ram

$5$55 $20

Page 12: Embedded Programming for Quadcopters

My Project - Inertial Measurement Unit

MPU6050 - 3 axis gyroscope, 3 axis accelerometer HMC5883L - 3 axis magnetometer

BMP180 Barometer 3.3V or 5V

GY-87

$8

Page 13: Embedded Programming for Quadcopters

Sourcing Components/Parts

Page 14: Embedded Programming for Quadcopters

Configuration - + vs X

Page 15: Embedded Programming for Quadcopters

Orientation - Angles

x axis == roll y axis == pitch z axis == yaw

Page 16: Embedded Programming for Quadcopters

Maneuvering

Page 17: Embedded Programming for Quadcopters

The Code

Page 18: Embedded Programming for Quadcopters

Control Loop

void loop() { while(!imu_read()); rc_read_values(); fc_process(); }

Page 19: Embedded Programming for Quadcopters

Control Loop

void loop() { while(!imu_read()); rc_read_values(); fc_process(); }

Page 20: Embedded Programming for Quadcopters

Orientation (IMU)

• rotational rates (x, y, z) (degrees per second)

• angles (x, y) (degrees)

Page 21: Embedded Programming for Quadcopters

IMU - Gyroscope

measures rotational rate in °/sec

Page 22: Embedded Programming for Quadcopters

IMU - Gyroscope

average = -2.599 (°/s)

Page 23: Embedded Programming for Quadcopters

Orientation (IMU)

• rotational rates (x, y, z) (degrees per second)

• angles (x, y) (degrees)

Page 24: Embedded Programming for Quadcopters

Gyroscope - Angles

Rotational Rate Duration Total

MovementQuad Angle

0 0 0 0 °

5 °/s 2 s 10 ° 10 °

-10 °/s 2 s -20 ° -10 °

-5 °/s 1 s -5 ° -15 °

Page 25: Embedded Programming for Quadcopters

Gyroscope - Angles

uint32_t gyro_last_update = micros();

void compute_gyro_angles() { mpu6050_read_gyro(&gyro_rates); rates.x = gyro_rates.x + GYRO_X_OFFSET;

delta_t = (micros() - gyro_last_update) / 1000000; gyro_angles.x += rates.x * delta_t;

gyro_last_update = micros(); }

Page 26: Embedded Programming for Quadcopters

Gyroscope - Angles

uint32_t gyro_last_update = micros();

void compute_gyro_angles() { mpu6050_read_gyro(&gyro_rates); rates.x = gyro_rates.x + GYRO_X_OFFSET;

delta_t = (micros() - gyro_last_update) / 1000000; gyro_angles.x += rates.x * delta_t;

gyro_last_update = micros(); }

Page 27: Embedded Programming for Quadcopters

Gyroscope - Angles

uint32_t gyro_last_update = micros();

void compute_gyro_angles() { mpu6050_read_gyro(&gyro_rates); rates.x = gyro_rates.x + GYRO_X_OFFSET;

delta_t = (micros() - gyro_last_update) / 1000000; gyro_angles.x += rates.x * delta_t;

gyro_last_update = micros(); }

Page 28: Embedded Programming for Quadcopters

Gyroscope - Angles

uint32_t gyro_last_update = micros();

void compute_gyro_angles() { mpu6050_read_gyro(&gyro_rates); rates.x = gyro_rates.x + GYRO_X_OFFSET;

delta_t = (micros() - gyro_last_update) / 1000000; gyro_angles.x += rates.x * delta_t;

gyro_last_update = micros(); }

Page 29: Embedded Programming for Quadcopters

Gyroscope - Angles

How is our estimation?

Page 30: Embedded Programming for Quadcopters

Gyro Drift

Occurs when gyroscope data changes between samples

Page 31: Embedded Programming for Quadcopters

Orientation (IMU)

• rotational rates (x, y, z) (degrees per second)

• angles (x, y) (degrees) ?

Page 32: Embedded Programming for Quadcopters

IMU - Accelerometer

• measures acceleration in terms of g-force (g)

• requires offset calibration, similar to gyroscope data

• z axis should be calibrated to 1G!

Page 33: Embedded Programming for Quadcopters

IMU - Accelerometer

http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf

(y, pitch)(x, roll)

x = accel_filtered.x; y = accel_filtered.y; z = accel_filtered.z;

accel_angles.x = atan2(y, z) * RAD_TO_DEG; accel_angles.y = atan2(-1 * x, sqrt(y*y + z*z)) * RAD_TO_DEG;

Page 34: Embedded Programming for Quadcopters

IMU - Accelerometer

http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf

(y, pitch)(x, roll)

x = accel_filtered.x; y = accel_filtered.y; z = accel_filtered.z;

accel_angles.x = atan2(y, z) * RAD_TO_DEG; accel_angles.y = atan2(-1 * x, sqrt(y*y + z*z)) * RAD_TO_DEG;

(median filters)

Page 35: Embedded Programming for Quadcopters

IMU - Accelerometer

http://www.freescale.com/files/sensors/doc/app_note/AN3461.pdf

(y, pitch)(x, roll)

x = accel_filtered.x; y = accel_filtered.y; z = accel_filtered.z;

accel_angles.x = atan2(y, z) * RAD_TO_DEG; accel_angles.y = atan2(-1 * x, sqrt(y*y + z*z)) * RAD_TO_DEG;

Page 36: Embedded Programming for Quadcopters

IMU - Accelerometer

Page 37: Embedded Programming for Quadcopters

IMU - Accelerometer

Susceptible to vibrations

Page 38: Embedded Programming for Quadcopters

Combining Approaches

Gyroscope - Good for short durations Accelerometer - Good for long durations

Complementary Filter!#define GYRO_PART 0.995 #define ACC_PART 0.005

dt = <time since last update>;

angles.x = GYRO_PART * (angles.x + (rates.x * dt)) + ACC_PART * accel_angles.x;

Page 39: Embedded Programming for Quadcopters

Combining Approaches

Gyroscope - Good for short durations Accelerometer - Good for long durations

Complementary Filter!#define GYRO_PART 0.995 #define ACC_PART 0.005

dt = <time since last update>;

angles.x = GYRO_PART * (angles.x + (rates.x * dt)) + ACC_PART * accel_angles.x;

Page 40: Embedded Programming for Quadcopters

Combining Approaches

Gyroscope - Good for short durations Accelerometer - Good for long durations

Complementary Filter!#define GYRO_PART 0.995 #define ACC_PART 0.005

dt = <time since last update>;

angles.x = GYRO_PART * (angles.x + (rates.x * dt)) + ACC_PART * accel_angles.x;

Page 41: Embedded Programming for Quadcopters

Combining Approaches

Gyroscope - Good for short durations Accelerometer - Good for long durations

Complementary Filter!#define GYRO_PART 0.995 #define ACC_PART 0.005

dt = <time since last update>;

angles.x = GYRO_PART * (angles.x + (rates.x * dt)) + ACC_PART * accel_angles.x;

Page 42: Embedded Programming for Quadcopters

complementary filter vs

previous approaches

Page 43: Embedded Programming for Quadcopters

Orientation (IMU)

• rotational rates (x, y, z) (degrees per second)

• angles (x, y) (degrees)

Page 44: Embedded Programming for Quadcopters

Control Loop

void loop() { while(!imu_read()); rc_read_values(); fc_process(); }

Page 45: Embedded Programming for Quadcopters

Remote Control

http://rcarduino.blogspot.com/2012/01/how-to-read-rc-receiver-with.html

Channel Function Min/Max Mapped Min/Max

1 Roll (1000μs, 2000μs) (-25, 25)

2 Pitch (1000μs, 2000μs) (-25, 25)

3 Throttle (1000μs, 2000μs) (1000, 2000)

4 Yaw (1000μs, 2000μs) (-50, 50)

Page 46: Embedded Programming for Quadcopters

Control Loop

void loop() { while(!imu_read()); rc_read_values(); fc_process(); }

Page 47: Embedded Programming for Quadcopters

Controlling Motors (ESCs)

Made to work with the remote control.

Motor Max - 2000μs Motor Min - 1000μs

Page 48: Embedded Programming for Quadcopters

Rate Mode

Page 49: Embedded Programming for Quadcopters

3 problems to correct

Flight Controller Code

Page 50: Embedded Programming for Quadcopters

Flight Controller Code

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;

motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;

motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;

correcting roll, pitch, yaw

Page 51: Embedded Programming for Quadcopters

Flight Controller Code

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;

motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;

motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;

correcting roll, pitch, yaw

Page 52: Embedded Programming for Quadcopters

Flight Controller Code

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;

motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;

motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;

correcting roll, pitch, yaw

Page 53: Embedded Programming for Quadcopters

Flight Controller Code

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;

motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;

motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;

correcting roll, pitch, yaw

Page 54: Embedded Programming for Quadcopters

Flight Controller Codemotor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

Page 55: Embedded Programming for Quadcopters

The PI Controller(Proportional-Integral)

• Calculates error based on difference between sensor reading and pilot command

• Proportional term depends on present error • Integral term depends on accumulation of

past errors

Page 56: Embedded Programming for Quadcopters

The PI Controller(Proportional-Integral)

#define KP 2.0 # ??? #define KI 2.0 # ???

float error = desired_pitch - current_pitch;

proportional = KP * error; integral += KI * error * dt;

output = proportional + integral;

Page 57: Embedded Programming for Quadcopters

The PI Controller(Proportional-Integral)

#define KP 2.0 # ??? #define KI 2.0 # ???

float error = desired_pitch - current_pitch;

proportional = KP * error; integral += KI * error * dt;

output = proportional + integral;

Page 58: Embedded Programming for Quadcopters

The PI Controller(Proportional-Integral)

#define KP 2.0 # ??? #define KI 2.0 # ???

float error = desired_pitch - current_pitch;

proportional = KP * error; integral += KI * error * dt;

output = proportional + integral;

Page 59: Embedded Programming for Quadcopters

The PI Controller(Proportional-Integral)

#define KP 2.0 # ??? #define KI 2.0 # ???

float error = desired_pitch - current_pitch;

proportional = KP * error; integral += KI * error * dt;

output = proportional + integral;

Page 60: Embedded Programming for Quadcopters

Flight Controller Code

motor1 = rc_throttle - roll_adjust - pitch_adjust - yaw_adjust;

motor2 = rc_throttle + roll_adjust + pitch_adjust - yaw_adjust;

motor3 = rc_throttle - roll_adjust + pitch_adjust + yaw_adjust;

motor4 = rc_throttle + roll_adjust - pitch_adjust + yaw_adjust;

correcting roll, pitch, yaw

Page 61: Embedded Programming for Quadcopters

Stabilize Mode

3 new PI controllers!

Page 62: Embedded Programming for Quadcopters

Ready to fly! (??)

Page 63: Embedded Programming for Quadcopters

Ready to fly! (??)

Tuning is hard!

Page 64: Embedded Programming for Quadcopters

Tuning

Page 65: Embedded Programming for Quadcopters

Safety & Handling Failure

Page 66: Embedded Programming for Quadcopters

Safety & Handling Failure

• Stale IMU values

• Stale remote control values

• Angles too high?

• Motor outputs too high? (indoor safe mode)

Page 67: Embedded Programming for Quadcopters

Some Takeaways

• Be Safe

• Start small (balancing robot?)

• Break things down into subcomponents

Page 68: Embedded Programming for Quadcopters

ResourcesHow-to Guide:

https://ghowen.me/build-your-own-quadcopter-autopilot/

Similar Projects:

https://github.com/cTn-dev/Phoenix-FlightController

https://github.com/baselsw/BlueCopter

My Code:

https://github.com/bolandrm/rmb_multicopter

https://github.com/bolandrm/arduino-quadcopter (old)

Page 69: Embedded Programming for Quadcopters

Thanks!

@bolandrm