Library containing Crazyflie 2.0 controller classes: - Attitude estimator - Horizontal estimator - Vertical estimator - Attitude controller - Horizontal controller - Vertical controller - Mixer
Mixer/Mixer.cpp
- Committer:
- fbob
- Date:
- 2018-10-05
- Revision:
- 17:f682b4a5686d
- Parent:
- 12:9fed6f656f88
- Child:
- 22:5f2323e30cdc
File content as of revision 17:f682b4a5686d:
#include "mbed.h" #include "Mixer.h" // Class constructor Mixer::Mixer() : motor_1(PA_1), motor_2(PB_11), motor_3(PA_15), motor_4(PB_9_ALT1), led_1_red(PC_3), led_1_green(PC_2), led_4_red(PC_0), led_4_green(PC_1) { led_1_red = 1; led_1_green = 0; led_4_red = 1; led_4_green = 0; motor_1 = 0.0f; motor_2 = 0.0f; motor_3 = 0.0f; motor_4 = 0.0f; } // Actuate motors with desired total trust force (N) and torques (N.m) void Mixer::actuate(float f_t, float tau_phi, float tau_theta, float tau_psi) { force_and_torques_to_angular_velocities(f_t,tau_phi,tau_theta,tau_psi); motor_1 = angular_velocity_to_pwm(omega_1); motor_2 = angular_velocity_to_pwm(omega_2); motor_3 = angular_velocity_to_pwm(omega_3); motor_4 = angular_velocity_to_pwm(omega_4); if ((omega_1 == 0) & (omega_2 == 0) & (omega_3 == 0) & (omega_4 == 0)) { led_1_red = 1; led_1_green = 0; led_4_red = 1; led_4_green = 0; } else { led_1_red = 0; led_1_green = 1; led_4_red = 0; led_4_green = 1; } } // Converts total trust force (N) and torques (N.m) to angular velocities (rad/s) void Mixer::force_and_torques_to_angular_velocities(float f_t, float tau_phi, float tau_theta, float tau_psi) { float omega_1_squared = (1.0f/4.0f)*(f_t/kl-tau_phi/(kl*l)-tau_theta/(kl*l)-tau_psi/kd); float omega_2_squared = (1.0f/4.0f)*(f_t/kl-tau_phi/(kl*l)+tau_theta/(kl*l)+tau_psi/kd); float omega_3_squared = (1.0f/4.0f)*(f_t/kl+tau_phi/(kl*l)+tau_theta/(kl*l)-tau_psi/kd); float omega_4_squared = (1.0f/4.0f)*(f_t/kl+tau_phi/(kl*l)-tau_theta/(kl*l)+tau_psi/kd); if(omega_1_squared>=0) { omega_1 = sqrt(omega_1_squared); } else { omega_1 = 0.0f; } if(omega_2_squared>=0) { omega_2 = sqrt(omega_2_squared); } else { omega_2 = 0.0f; } if(omega_3_squared>=0) { omega_3 = sqrt(omega_3_squared); } else { omega_3 = 0.0f; } if(omega_4_squared>=0) { omega_4 = sqrt(omega_4_squared); } else { omega_4 = 0.0f; } } // Converts desired angular velocity (rad/s) to PWM signal (%) float Mixer::angular_velocity_to_pwm(float omega) { float pwm = alpha*pow(omega,2)+beta*omega; return pwm; }