2014-02-26 9 views
1

我正在写一些软件来控制四轴飞行器,并完全停留在RtosTimers上。我得到错误“错误:没有构造函数的实例”rtos :: RtosTimer :: RtosTimer“匹配”flightController.h“中的参数列表,行:13,Col:29”mBed C++在RtosThread中使用RtosTimer

我看过例子手册中的代码和我的代码似乎相匹配。我也google了,但我找不到在RtosThreads里面使用RtosTimers的任何东西。

也许我正在做这个错误的方式,所以如果任何人有任何建议,将不胜感激。

这是导致我的问题

//Rtos Timers 
RtosTimer UpdateFlightTimer(Task500Hz, osTimerPeriodic, (void *)0); 
RtosTimer UpdateCommandTimer(Task50Hz, osTimerPeriodic, (void *)0); 

// A thread to monitor the serial ports 
void FlightControllerThread(void const *args) 
{ 
UpdateFlightTimer.start(2); 
UpdateCommandTimer.start(20); 

// Wait here forever 
Thread::wait(osWaitForever); 
} 

void Task500Hz(void const *n) 
{ 
//Get IMU data and convert to yaw, pitch, roll 
_freeIMU.getQ(_rawQuaternion); 
_freeIMU.getRate(_gyroRate); 
GetAttitude(); 

//Rate mode 
if(_rate == true && _stab == false) 
{ 
    //Update rate PID process value with gyro rate 
    _yawRatePIDController->setProcessValue(_gyroRate[0]); 
    _pitchRatePIDController->setProcessValue(_gyroRate[2]); 
    _rollRatePIDController->setProcessValue(_gyroRate[1]); 

    //Update rate PID set point with desired rate from RC 
    _yawRatePIDController->setSetPoint(_rcConstrainedCommands[0]); 
    _pitchRatePIDController->setSetPoint(_rcConstrainedCommands[1]); 
    _rollRatePIDController->setSetPoint(_rcConstrainedCommands[2]); 

    //Compute rate PID outputs 
    _ratePIDControllerOutputs[0] = _yawRatePIDController->compute(); 
    _ratePIDControllerOutputs[1] = _pitchRatePIDController->compute(); 
    _ratePIDControllerOutputs[2] = _rollRatePIDController->compute(); 
} 
//Stability mode 
else 
{ 
    //Update stab PID process value with ypr 
    _yawStabPIDController->setProcessValue(_yrp[0]); 
    _pitchStabPIDController->setProcessValue(_yrp[2]); 
    _rollStabPIDController->setProcessValue(_yrp[1]); 

    //Update stab PID set point with desired angle from RC 
    _yawStabPIDController->setSetPoint(_yawTarget); 
    _pitchStabPIDController->setSetPoint(_rcConstrainedCommands[1]); 
    _rollStabPIDController->setSetPoint(_rcConstrainedCommands[2]); 

    //Compute stab PID outputs 
    _stabPIDControllerOutputs[0] = _yawStabPIDController->compute(); 
    _stabPIDControllerOutputs[1] = _pitchStabPIDController->compute(); 
    _stabPIDControllerOutputs[2] = _rollStabPIDController->compute(); 

    //if pilot commanding yaw 
    if(abs(_rcConstrainedCommands[0]) > 5) 
    { 
     _stabPIDControllerOutputs[0] = _rcConstrainedCommands[0]; //Feed to rate PID  (overwriting stab PID output) 
     _yawTarget = _yrp[0]; 
    } 

    //Update rate PID process value with gyro rate 
    _yawRatePIDController->setProcessValue(_gyroRate[0]); 
    _pitchRatePIDController->setProcessValue(_gyroRate[2]); 
    _rollRatePIDController->setProcessValue(_gyroRate[1]); 

    //Update rate PID set point with desired rate from stab PID 
    _yawRatePIDController->setSetPoint(_stabPIDControllerOutputs[0]); 
    _pitchRatePIDController->setSetPoint(_stabPIDControllerOutputs[1]); 
    _rollRatePIDController->setSetPoint(_stabPIDControllerOutputs[2]); 

    //Compute rate PID outputs 
    _ratePIDControllerOutputs[0] = _yawRatePIDController->compute(); 
    _ratePIDControllerOutputs[1] = _pitchRatePIDController->compute(); 
    _ratePIDControllerOutputs[2] = _rollRatePIDController->compute(); 
} 


//Calculate motor power if flying 
if(_rcCommands[3] > 0 && _armed == true) 
{ 
    _motorPower[0] = Constrain(_rcConstrainedCommands[3] + _ratePIDControllerOutputs[1] + _ratePIDControllerOutputs[2] + _ratePIDControllerOutputs[0], MOTORS_MIN, MOTORS_MAX); 
    _motorPower[1] = Constrain(_rcConstrainedCommands[3] + _ratePIDControllerOutputs[1] - _ratePIDControllerOutputs[2] - _ratePIDControllerOutputs[0], MOTORS_MIN, MOTORS_MAX); 
    _motorPower[2] = Constrain(_rcConstrainedCommands[3] - _ratePIDControllerOutputs[1] - _ratePIDControllerOutputs[2] + _ratePIDControllerOutputs[0], MOTORS_MIN, MOTORS_MAX); 
    _motorPower[3] = Constrain(_rcConstrainedCommands[3] - _ratePIDControllerOutputs[1] + _ratePIDControllerOutputs[2] - _ratePIDControllerOutputs[0], MOTORS_MIN, MOTORS_MAX); 
} 
//Not flying 
else 
{ 
    //Disable motors 
    _motorPower[0] = MOTORS_OFF; 
    _motorPower[1] = MOTORS_OFF; 
    _motorPower[2] = MOTORS_OFF; 
    _motorPower[3] = MOTORS_OFF; 

    _notFlying ++; 
    if(_notFlying > 200) //Not flying for 1 second 
    { 
     //Reset iteratior 
     _notFlying = 0; 

     //Zero gyro 
     _freeIMU.zeroGyro(); 

     //Reset I 
     _yawRatePIDController->reset(); 
     _pitchRatePIDController->reset(); 
     _rollRatePIDController->reset(); 
     _yawStabPIDController->reset(); 
     _pitchStabPIDController->reset(); 
     _rollStabPIDController->reset(); 
    } 
} 

//Set motor power 
_motor1.write(_motorPower[0]); 
_motor2.write(_motorPower[1]); 
_motor3.write(_motorPower[2]); 
_motor4.write(_motorPower[3]); 

}代码

void Task50Hz(void const *n) 
{ 
//Get RC control values 

//Constrain 
//Rate mode 
if(_rate == true && _stab == false) 
{ 
    _rcConstrainedCommands[0] = Constrain(_rcCommands[0], RC_YAW_RATE_MIN, RC_YAW_RATE_MAX); 
    _rcConstrainedCommands[1] = Constrain(_rcCommands[1], RC_PITCH_RATE_MIN, RC_PITCH_RATE_MAX); 
    _rcConstrainedCommands[2] = Constrain(_rcCommands[2], RC_ROLL_RATE_MIN, RC_ROLL_RATE_MAX); 
    _rcConstrainedCommands[3] = Constrain(_rcCommands[3], RC_THRUST_MIN, RC_THRUST_MAX); 
} 
else 
{ 
    _rcConstrainedCommands[0] = Constrain(_rcCommands[0], RC_YAW_RATE_MIN, RC_YAW_RATE_MAX); 
    _rcConstrainedCommands[1] = Constrain(_rcCommands[1], RC_PITCH_ANGLE_MIN, RC_PITCH_ANGLE_MAX); 
    _rcConstrainedCommands[2] = Constrain(_rcCommands[2], RC_ROLL_ANGLE_MIN, RC_ROLL_ANGLE_MAX); 
    _rcConstrainedCommands[3] = Constrain(_rcCommands[3], RC_THRUST_MIN, RC_THRUST_MAX); 
} 
} 

我的程序可以在http://mbed.org/users/joe4465/code/QuadMK5/

被发现,问题出在flightController.h我认为这应该清楚我想要做什么,但如果有人不确定让我知道。

我也有另一个完全无关的问题。我可以通过串行设置我的PID变量,然后将它们保存到一个配置文件中,但是如果在它将数据保存到文件之后会挂起,那么它会保存在配置文件中,但我不知道为什么。有没有人有任何想法可能会导致这种情况?

感谢乔

回答

0

我忘了把无效常量* N在那里他们在顶部

定义的函数的参数