embedded programming for quadcopters

69
Embedded Programming Quadcopters for

Upload: ryan-boland

Post on 15-Jul-2015

490 views

Category:

Technology


2 download

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