|
|
|
#include <iostream> |
|
#include "controller_interfaces.hpp" |
|
using namespace std; |
|
|
|
|
|
/**************************************** |
|
* Cascade Implementation |
|
****************************************/ |
|
|
|
|
|
template<class TVel> |
|
class Position_controller : public IPos, public TVel |
|
{ |
|
public: |
|
Position_controller() {}; |
|
|
|
bool set_pos_command(const pos_command_t& pos_command){ |
|
pos_command_ = pos_command; |
|
TVel::command_ = &pos_command_; |
|
return true; |
|
}; |
|
|
|
virtual void update(){ |
|
if(TVel::command_ == &pos_command_) |
|
{ |
|
IVel::vel_command_t vel_command = calc_vel_command(pos_command_); |
|
TVel::update_cascade(vel_command); |
|
}else |
|
{ |
|
cout << "Position_controller: pass through " << endl; |
|
TVel::update(); |
|
} |
|
}; |
|
|
|
protected: |
|
void update_cascade(const pos_command_t &pos_command) |
|
{ |
|
pos_command_ = pos_command; |
|
IVel::vel_command_t vel_command = calc_vel_command(pos_command_); |
|
TVel::update_cascade(vel_command); |
|
} |
|
|
|
IVel::vel_command_t calc_vel_command(const pos_command_t& pos_command) |
|
{ |
|
IVel::vel_command_t vel_command; |
|
/*calc velocity command */ |
|
cout << "Position_controller: calculating velocity command " << endl; |
|
} |
|
|
|
private: |
|
pos_command_t pos_command_; |
|
|
|
}; |
|
|
|
|
|
template<class TAtt> |
|
class Velocity_controller : public IVel, public TAtt |
|
{ |
|
public: |
|
Velocity_controller() {}; |
|
|
|
bool set_vel_command(const vel_command_t& vel_command){ |
|
vel_command_ = vel_command; |
|
TAtt::command_ = &vel_command_; |
|
return true; |
|
}; |
|
|
|
virtual void update(){ |
|
if(TAtt::command_ == &vel_command_) |
|
{ |
|
IAtt::att_command_t att_command = calc_att_command(vel_command_); |
|
TAtt::update_cascade(att_command); |
|
}else |
|
{ |
|
cout << "Velocity_controller: pass through " << endl; |
|
TAtt::update(); |
|
} |
|
}; |
|
|
|
protected: |
|
void update_cascade(const vel_command_t &vel_command) |
|
{ |
|
vel_command_ = vel_command; |
|
IAtt::att_command_t att_command = calc_att_command(vel_command_); |
|
TAtt::update_cascade(att_command); |
|
} |
|
|
|
IAtt::att_command_t calc_att_command(const vel_command_t& vel_command) |
|
{ |
|
IAtt::att_command_t att_command; |
|
/*calc attitude command */ |
|
cout << "Velocity_controller: calculating attitude command " << endl; |
|
return att_command; |
|
} |
|
|
|
private: |
|
vel_command_t vel_command_; |
|
}; |
|
|
|
|
|
template<class TRate> |
|
class Attitude_controller : public IAtt, public TRate |
|
{ |
|
public: |
|
Attitude_controller() {}; |
|
|
|
bool set_att_command(const att_command_t& att_command){ |
|
att_command_ = att_command; |
|
TRate::command_ = &att_command_; |
|
return true; |
|
}; |
|
|
|
virtual void update(){ |
|
if(TRate::command_ == &att_command_) |
|
{ |
|
IRate::rate_command_t rate_command = calc_rate_command(att_command_); |
|
TRate::update_cascade(rate_command); |
|
}else |
|
{ |
|
cout << "Attitude_controller: pass through " << endl; |
|
TRate::update(); |
|
} |
|
}; |
|
|
|
protected: |
|
void update_cascade(const att_command_t &att_command) |
|
{ |
|
att_command_ = att_command; |
|
IRate::rate_command_t rate_command = calc_rate_command(att_command_); |
|
TRate::update_cascade(rate_command); |
|
} |
|
|
|
IRate::rate_command_t calc_rate_command(const att_command_t& att_command) |
|
{ |
|
IRate::rate_command_t rate_command; |
|
/*calc rate command */ |
|
cout << "Attitude_controller: calculating rate command " << endl; |
|
return rate_command; |
|
} |
|
|
|
private: |
|
att_command_t att_command_; |
|
}; |
|
|
|
|
|
template<class TTorque> |
|
class Rate_controller : public IRate, public TTorque |
|
{ |
|
public: |
|
Rate_controller(){}; |
|
|
|
bool set_rate_command(const rate_command_t& rate_command){ |
|
rate_command_ = rate_command_; |
|
TTorque::command_ = &rate_command_; |
|
return true; |
|
}; |
|
|
|
virtual void update(){ |
|
if(TTorque::command_ == &rate_command_) |
|
{ |
|
ITorque::torq_command_t torq_command = calc_torq_command(rate_command_); |
|
TTorque::update_cascade(torq_command); |
|
}else |
|
{ |
|
cout << "Rate_controller: pass through " << endl; |
|
TTorque::update(); |
|
} |
|
}; |
|
|
|
protected: |
|
void update_cascade(const rate_command_t& rate_command) |
|
{ |
|
rate_command_ = rate_command; |
|
ITorque::torq_command_t torq_command = calc_torq_command(rate_command_); |
|
TTorque::update_cascade(torq_command); |
|
} |
|
|
|
ITorque::torq_command_t calc_torq_command(const rate_command_t& rate_command) |
|
{ |
|
ITorque::torq_command_t torq_command; |
|
/*calc rate command */ |
|
cout << "Rate_controller: calculating torque command " << endl; |
|
return torq_command; |
|
} |
|
|
|
private: |
|
rate_command_t rate_command_; |
|
}; |
|
|
|
|
|
class Torque_copter_diag : public ITorque, public IController |
|
{ |
|
public: |
|
Torque_copter_diag(){}; |
|
|
|
bool set_torq_command(const torq_command_t& torq_command){ |
|
torq_command_ = torq_command; |
|
command_ = &torq_command_; |
|
return true; |
|
}; |
|
|
|
virtual void update(){ |
|
cout << "Torque_controller: setting motors " << endl; |
|
}; |
|
|
|
protected: |
|
void update_cascade(const torq_command_t& torq_command) |
|
{ |
|
Torque_copter_diag::update(); |
|
} |
|
|
|
private: |
|
torq_command_t torq_command_; |
|
}; |