Теория микширования
Микширование моторов (motor mix) - алгоритм или правила задания управляющих сигналов к контроллерам моторов в зависимости от расположения моторов относительно центра конструкции и от радиоуправляющих сигналов.
Содержание |
Базовые понятия [править]
Расположение осей:
Всего для расчётов используются 3 оси:
- Pitch и Roll для стабилизации и управления по горизонту;
- Yaw для стабилизации и управления вокруг вертикальной оси, при этом:
- если мотор крутится по часовой стрелке (CW, ClockWise) - это отрицательное (-) направления вращения;
- если против (CCW, CounterClockWise) - положительное (+).
Примеры расчётов [править]
Квадрокоптер «+» [править]
Все моторы находятся на осях, максимальная длина 100% (=1) от центра на каждом.
Мотор | pitch | roll | yaw |
---|---|---|---|
0 правый (CCW) | 0% | -100% | + |
1 левый (CCW) | 0% | +100% | + |
2 передний (CW) | +100% | 0% | - |
3 задний (CW) | -100% | 0% | - |
Пример микширования для MultiWii из файла Output.pde (прошивка версии 1.9) PIDMIX (roll, pitch, yaw) (тут ось pitch инвертирована относительно картинки, поэтому значения не совпадают знаками)
#ifdef QUADP motor[0] = PIDMIX( 0,+1,-1); //REAR (задний) motor[1] = PIDMIX(-1, 0,+1); //RIGHT (правый) motor[2] = PIDMIX(+1, 0,+1); //LEFT (левый) motor[3] = PIDMIX( 0,-1,-1); //FRONT (передний) #endif
Пример кода из MegaPirateNG (ArduCopter)
roll_out = g.rc_1.pwm_out; pitch_out = g.rc_2.pwm_out; // left motor_out[CH_1] = g.rc_3.radio_out - roll_out; (левый) // right motor_out[CH_2] = g.rc_3.radio_out + roll_out; (правый) // front motor_out[CH_3] = g.rc_3.radio_out + pitch_out; (передний) // back motor_out[CH_4] = g.rc_3.radio_out - pitch_out; (задний)
Квадрокоптер «X» [править]
Моторы расположены на биссектрисах между осями (45°), но расстояние до мотора сохраняется, поэтому по законам тригонометрии (гипотенузу знаем (расстояние до мотора), прилежащий угол знаем => используем функцию sin или cos (в данном случае оба катета треугольника равны) для получения искомого значения) и получается ~71%.
Мотор | pitch | roll | yaw |
---|---|---|---|
0 передний правый (CCW) | +71% | -71% | + |
1 задний левый (CCW) | -71% | +71% | + |
2 передний левый (CW) | +71% | +71% | - |
3 задний правый (CW) | -71% | -71% | - |
Видим что везде 71%, а мы можем 100%, поэтому, чтобы моторы могли работать в полную силу, принимаем 71% за 100% и получаем:
Мотор | pitch | roll | yaw |
---|---|---|---|
0 передний правый (CCW) | +100% | -100% | + |
1 задний левый (CCW) | -100% | +100% | + |
2 передний левый (CW) | +100% | +100% | - |
3 задний правый (CW) | -100% | -100% | - |
Пример микширования для MultiWii из файла Output.pde (прошивка версии 1.9) PIDMIX (roll, pitch, yaw) (тут ось pitch инвертирована относительно картинки, поэтому значения не совпадают знаками)
#ifdef QUADX motor[0] = PIDMIX(-1,+1,-1); //REAR_R (задний правый) motor[1] = PIDMIX(-1,-1,+1); //FRONT_R (передний правый) motor[2] = PIDMIX(+1,+1,+1); //REAR_L (задний левый) motor[3] = PIDMIX(+1,-1,-1); //FRONT_L (передний левый) #endif
Пример кода из MegaPirateNG (ArduCopter)
roll_out = g.rc_1.pwm_out * .707; pitch_out = g.rc_2.pwm_out * .707; // left motor_out[CH_3] = g.rc_3.radio_out + roll_out + pitch_out; // FRONT (передний левый) motor_out[CH_2] = g.rc_3.radio_out + roll_out - pitch_out; // BACK (задний левый) // right motor_out[CH_1] = g.rc_3.radio_out - roll_out + pitch_out; // FRONT (передний правый) motor_out[CH_4] = g.rc_3.radio_out - roll_out - pitch_out; // BACK (задний правый)