New version of quadcopter software written to OO principles

Dependencies:   mbed MODSERIAL filter mbed-rtos ConfigFile PID PPM FreeIMU_external_magnetometer TinyGPS

FlightController/StabController/StabController.cpp

Committer:
joe4465
Date:
2015-04-01
Revision:
2:969dfa4f2436
Parent:
0:c6a85bb2a827

File content as of revision 2:969dfa4f2436:

#include "StabController.h"

StabController::StabController(Sensors& sensors, NavigationController& navigationController, ConfigFileWrapper& configFileWrapper) : _sensors(sensors), _navigationController(navigationController), _configFileWrapper(configFileWrapper)
{
    float updateTime = 1.0 / (float)FLIGHT_CONTROLLER_FREQUENCY;
    _yawRatePidController.initialise(_configFileWrapper.getYawRateParameters(), IMU_YAW_RATE_MIN, IMU_YAW_RATE_MAX, RATE_PID_CONTROLLER_OUTPUT_MIN, RATE_PID_CONTROLLER_OUTPUT_MAX, updateTime);
    _pitchRatePidController.initialise(_configFileWrapper.getPitchRateParameters(), IMU_PITCH_RATE_MIN, IMU_PITCH_RATE_MAX, RATE_PID_CONTROLLER_OUTPUT_MIN, RATE_PID_CONTROLLER_OUTPUT_MAX, updateTime);
    _rollRatePidController.initialise(_configFileWrapper.getRollRateParameters(), IMU_ROLL_RATE_MIN, IMU_ROLL_RATE_MAX, RATE_PID_CONTROLLER_OUTPUT_MIN, RATE_PID_CONTROLLER_OUTPUT_MAX, updateTime);
    _yawStabPidController.initialise(_configFileWrapper.getYawStabParameters(), IMU_YAW_ANGLE_MIN, IMU_YAW_ANGLE_MAX, IMU_YAW_RATE_MIN, IMU_YAW_RATE_MAX, updateTime);
    _pitchStabPidController.initialise(_configFileWrapper.getPitchStabParameters(), IMU_PITCH_ANGLE_MIN, IMU_PITCH_ANGLE_MAX, IMU_PITCH_RATE_MIN, IMU_PITCH_RATE_MAX, updateTime);
    _rollStabPidController.initialise(_configFileWrapper.getRollStabParameters(), IMU_ROLL_ANGLE_MIN, IMU_ROLL_ANGLE_MAX, IMU_ROLL_RATE_MIN, IMU_ROLL_RATE_MAX, updateTime);
    
    DEBUG("Stab controller initialised\r\n");
}

StabController::~StabController(){}

PidWrapper::PidOutput StabController::compute()
{   
    _setPoints = _navigationController.getSetPoint();
    _angle = _sensors.getAngle();
    _rate = _sensors.getRate();   
        
    //_stabPidOutputs.yaw = _yawStabPidController.compute(_setPoints.yawTarget, _angle.yaw);
    _stabPidOutputs.yaw = _yawStabPidController.compute(_setPoints.yawDifference, 0);
    _stabPidOutputs.pitch = _pitchStabPidController.compute(_setPoints.pitch, _angle.pitch);
    _stabPidOutputs.roll = _rollStabPidController.compute(_setPoints.roll, _angle.roll);

    //If pilot commanding yaw
    if(abs(_setPoints.yaw) >= 5) _stabPidOutputs.yaw = _setPoints.yaw;  //Feed to rate PID (overwriting stab PID output)
    
    _ratePidOutputs.yaw = _yawRatePidController.compute(_stabPidOutputs.yaw, _rate.yaw);
    _ratePidOutputs.pitch = _pitchRatePidController.compute(_stabPidOutputs.pitch, _rate.pitch);
    _ratePidOutputs.roll = _rollRatePidController.compute(_stabPidOutputs.roll, _rate.roll);
    
    return _ratePidOutputs;
}

PidWrapper::FlightControllerPidParameters StabController::getPidParameters()
{
    PidWrapper::FlightControllerPidParameters allPidParameters;
    allPidParameters.yawStab = _yawStabPidController.getPidParameters();
    allPidParameters.pitchStab = _pitchStabPidController.getPidParameters();
    allPidParameters.rollStab = _rollStabPidController.getPidParameters();
    allPidParameters.yawRate = _yawRatePidController.getPidParameters();
    allPidParameters.pitchRate = _pitchRatePidController.getPidParameters();
    allPidParameters.rollRate = _rollRatePidController.getPidParameters();
    return allPidParameters;
}

void StabController::reset()
{
    _yawRatePidController.reset();
    _pitchRatePidController.reset();
    _rollRatePidController.reset();
    _yawStabPidController.reset();
    _pitchStabPidController.reset();
    _rollStabPidController.reset();
}

void StabController::setYawStabPidParameters(PidWrapper::PidParameter pidParameters)
{
    _yawStabPidController.setPidParameters(pidParameters);
}

void StabController::setPitchStabPidParameters(PidWrapper::PidParameter pidParameters)
{
    _pitchStabPidController.setPidParameters(pidParameters);
}

void StabController::setRollStabPidParameters(PidWrapper::PidParameter pidParameters)
{
    _rollStabPidController.setPidParameters(pidParameters);
}

void StabController::setYawRatePidParameters(PidWrapper::PidParameter pidParameters)
{
    _yawRatePidController.setPidParameters(pidParameters);
}

void StabController::setPitchRatePidParameters(PidWrapper::PidParameter pidParameters)
{
    _pitchRatePidController.setPidParameters(pidParameters);
}

void StabController::setRollRatePidParameters(PidWrapper::PidParameter pidParameters)
{
    _rollRatePidController.setPidParameters(pidParameters);
}

PidWrapper::StabPidState StabController::getStabPidState()
{
    PidWrapper::StabPidState stabPidState;
    PidWrapper::PidState yawRatePidState;
    PidWrapper::PidState pitchRatePidState;
    PidWrapper::PidState rollRatePidState;
    PidWrapper::PidState yawStabPidState;
    PidWrapper::PidState pitchStabPidState;
    PidWrapper::PidState rollStabPidState;
    
    yawRatePidState.setPoint = _stabPidOutputs.yaw;
    yawRatePidState.processValue = _rate.yaw;
    yawRatePidState.output = _ratePidOutputs.yaw;
    
    pitchRatePidState.setPoint = _stabPidOutputs.pitch;
    pitchRatePidState.processValue = _rate.pitch;
    pitchRatePidState.output = _ratePidOutputs.pitch;
    
    rollRatePidState.setPoint = _stabPidOutputs.roll;
    rollRatePidState.processValue = _rate.roll;
    rollRatePidState.output = _ratePidOutputs.roll;
    
    yawStabPidState.setPoint = _setPoints.yawDifference;
    yawStabPidState.processValue = 0;
    yawStabPidState.output = _stabPidOutputs.yaw;
    
    pitchStabPidState.setPoint = _setPoints.pitch;
    pitchStabPidState.processValue = _angle.pitch;
    pitchStabPidState.output = _stabPidOutputs.pitch;
    
    rollStabPidState.setPoint = _setPoints.roll;
    rollStabPidState.processValue = _angle.roll;
    rollStabPidState.output = _stabPidOutputs.roll;
    
    stabPidState.yawRate = yawRatePidState;
    stabPidState.pitchRate = pitchRatePidState;
    stabPidState.rollRate = rollRatePidState;
    stabPidState.yawStab = yawStabPidState;
    stabPidState.pitchStab = pitchStabPidState;
    stabPidState.rollStab = rollStabPidState;
    
    return stabPidState;
}