|
|
|
@ -32,60 +32,51 @@ public:
@@ -32,60 +32,51 @@ public:
|
|
|
|
|
new AP_RcChannel(k_chStr, PSTR("STR_"), board->radio, 3, 1100, 1500, |
|
|
|
|
1900, RC_MODE_INOUT, false)); |
|
|
|
|
_board->rc.push_back( |
|
|
|
|
new AP_RcChannel(k_chsail, PSTR("SAIL_"), board->radio, 2, 1100, 1500, |
|
|
|
|
new AP_RcChannel(k_chSail, PSTR("SAIL_"), board->radio, 2, 1100, 1500, |
|
|
|
|
1900, RC_MODE_INOUT, false)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private: |
|
|
|
|
// methods
|
|
|
|
|
void manualLoop(const float dt) { |
|
|
|
|
_strCmd = _hal->rc[ch_str]->getRadioPosition(); |
|
|
|
|
_sailCmd = _hal->rc[ch_sail]->getRadioPosition(); |
|
|
|
|
_hal->debug->printf_P(PSTR("sail: %f, steering: %f\n"),_sailCmd,_strCmd); |
|
|
|
|
_strCmd = -_board->rc[ch_str]->getRadioPosition(); |
|
|
|
|
_sailCmd = _board->rc[ch_sail]->getRadioPosition(); |
|
|
|
|
_board->debug->printf_P(PSTR("sail: %f, steering: %f\n"),_sailCmd,_strCmd); |
|
|
|
|
} |
|
|
|
|
void autoLoop(const float dt) { |
|
|
|
|
//_hal->debug->printf_P(PSTR("cont: ch1: %f\tch2: %f\n"),_hal->rc[ch_sail]->getRadioPosition(), _hal->rc[ch_str]->getRadioPosition());
|
|
|
|
|
//_board->debug->printf_P(PSTR("cont: ch1: %f\tch2: %f\n"),_board->rc[ch_sail]->getRadioPosition(), _board->rc[ch_str]->getRadioPosition());
|
|
|
|
|
float windDir = -.339373*analogRead(1)+175.999;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// neglects heading command derivative
|
|
|
|
|
float steering = pidStr.update(_guide->getHeadingError(), -_nav->getYawRate(), dt); |
|
|
|
|
float steering = -pidStr.update(_guide->getHeadingError(), -_nav->getYawRate(), dt); |
|
|
|
|
float sail = 0.00587302*fabs(windDir) - 0.05; |
|
|
|
|
if (sail < 0.0) sail = 0.0; |
|
|
|
|
_hal->debug->printf_P(PSTR("wind direction: %f, sail: %f, steering: %f\n"),windDir,sail,steering); |
|
|
|
|
/* float calibrate = 0.34; //Calibration Factor from analog reading
|
|
|
|
|
* float relwinddir = windDir*calibrate; //Wind Direction Relative to boat
|
|
|
|
|
float pathideal; //Path from boat to waypoint
|
|
|
|
|
float psi = relwinddir-pathideal; //Angle between relative wind direction and path from boat to waypoint
|
|
|
|
|
float alpha = relwinddir-heading; //Angle between relatvive wind direction and the heading
|
|
|
|
|
|
|
|
|
|
_hal->debug->printf_P(PSTR("heading: %f\n"),heading); //Print Heading
|
|
|
|
|
|
|
|
|
|
//_board->debug->printf_P(PSTR("heading: %f\n"),heading); //Print Heading
|
|
|
|
|
|
|
|
|
|
if(fabs(psi)<45) //Tacking Logic
|
|
|
|
|
{ |
|
|
|
|
if(psi<-10) |
|
|
|
|
alpha = -45; |
|
|
|
|
else if(psi>10) |
|
|
|
|
alpha = 45; |
|
|
|
|
else |
|
|
|
|
{ |
|
|
|
|
if(psi==10) |
|
|
|
|
alpha = 45; |
|
|
|
|
else if(psi==-10) |
|
|
|
|
alpha = -45; |
|
|
|
|
else
|
|
|
|
|
alpha = alpha; |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
//if(fabs(psi)<45) //Tacking Logic
|
|
|
|
|
//{
|
|
|
|
|
//if(psi<-10)
|
|
|
|
|
//alpha = -45;
|
|
|
|
|
//else if(psi>10)
|
|
|
|
|
//alpha = 45;
|
|
|
|
|
//else
|
|
|
|
|
//{
|
|
|
|
|
//if(psi==10)
|
|
|
|
|
//alpha = 45;
|
|
|
|
|
//else if(psi==-10)
|
|
|
|
|
//alpha = -45;
|
|
|
|
|
//else
|
|
|
|
|
//alpha = alpha;
|
|
|
|
|
//}
|
|
|
|
|
//}*/
|
|
|
|
|
_strCmd = steering; |
|
|
|
|
_sailCmd = sail; |
|
|
|
|
} |
|
|
|
|
void setMotors() { |
|
|
|
|
<<<<<<< HEAD |
|
|
|
|
_hal->rc[ch_str]->setPosition(_strCmd); |
|
|
|
|
_hal->rc[ch_sail]->setPosition(_sailCmd); |
|
|
|
|
======= |
|
|
|
|
_board->rc[ch_str]->setPosition(_strCmd); |
|
|
|
|
_board->rc[ch_sail]->setPosition(fabs(_sailCmd) < 0.1 ? 0 : _sailCmd); |
|
|
|
|
>>>>>>> 8265597d37c8ae9fb88f59dfe89b6077dc14c0d8 |
|
|
|
|
_board->rc[ch_sail]->setPosition(_sailCmd); |
|
|
|
|
} |
|
|
|
|
void handleFailsafe() { |
|
|
|
|
// turn off
|
|
|
|
|