00001 #ifndef __MOVEMENT_AGENT_C__
00002 #define __MOVEMENT_AGENT_C__
00003
00004 #include "Movement.H"
00005
00006
00007
00008 MovementAgent::MovementAgent(OptionManager& mgr,
00009 nub::soft_ref<AgentManager> ama,
00010 nub::soft_ref<SubController> subController,
00011 const std::string& name) :
00012 SubmarineAgent(mgr, ama, name),
00013 itsDepthErrThresh("setDepthErrThresh", this, 0, ALLOW_ONLINE_CHANGES),
00014 itsHeadingErrThresh("setHeadingErrThresh", this, 0, ALLOW_ONLINE_CHANGES),
00015 pipeP("pipeP", this, 0, ALLOW_ONLINE_CHANGES),
00016 pipeI("pipeI", this, 0, ALLOW_ONLINE_CHANGES),
00017 pipeD("pipeD", this, 0, ALLOW_ONLINE_CHANGES),
00018 itsPipePID(pipeP.getVal(), pipeI.getVal(), pipeD.getVal(), -20, 20, 5, 0, 0, 100, -100, 150, true, 1, 25, -25),
00019 setDiveValue("setDiveValue", this, 0, ALLOW_ONLINE_CHANGES),
00020 setGoStraightTimeValue("setGoStraightTimeValue", this, 0, ALLOW_ONLINE_CHANGES),
00021 setSpeedValue("setSpeedValue", this, 20, ALLOW_ONLINE_CHANGES),
00022 setHeadingValue("setHeadingValue", this, 0, ALLOW_ONLINE_CHANGES),
00023 setRelative("setRelative", this, false, ALLOW_ONLINE_CHANGES),
00024 setTimeout("setTimeout", this, 100, ALLOW_ONLINE_CHANGES),
00025 itsSubController(subController),
00026 {
00027 itsFrameNumber = 0;
00028 itsTimer.reset(new Timer(1000000));
00029 }
00030
00031
00032
00033 MovementAgent::~MovementAgent()
00034 {
00035
00036 }
00037
00038
00039
00040 bool MovementAgent::pickAndExecuteAnAction()
00041 {
00042 return true;
00043 }
00044
00045
00046 bool MovementAgent::dive(int depth, bool relative, int timeout)
00047 {
00048 if(relative)
00049 {
00050 itsSubController->setDepth(depth + itsSubController->getDepth());
00051 }
00052 else
00053 {
00054 itsSubController->setDepth(depth);
00055 }
00056
00057 int time = 0;
00058
00059 while(itsSubController->getDepthErr() > itsDepthErrThresh.getVal())
00060 {
00061 usleep(10000);
00062 if(time++ > timeout) return false;
00063
00064 }
00065
00066 return true;
00067 }
00068
00069
00070 bool MovementAgent::goStraight(int speed, int time)
00071 {
00072 itsSubController->setSpeed(speed);
00073 sleep(time);
00074 itsSubController->setSpeed(0);
00075 return true;
00076 }
00077
00078
00079 bool MovementAgent::setHeading(int heading, bool relative, int timeout)
00080 {
00081 if(relative)
00082 {
00083 itsSubController->setHeading(heading + itsSubController->getHeading());
00084 }
00085 else
00086 {
00087 itsSubController->setHeading(heading);
00088 }
00089
00090 int time = 0;
00091
00092 while(itsSubController->getHeadingErr() > itsHeadingErrThresh.getVal())
00093 {
00094 usleep(10000);
00095 if(time++ > timeout) return false;
00096
00097 }
00098
00099 return true;
00100 }
00101
00102
00103 int MovementAgent::trackPipe(const Point2D<int>& pointToTrack,
00104 const Point2D<int>& desiredPoint)
00105 {
00106 float pipeCorrection = (float)itsPipePID.update(pointToTrack.i, desiredPoint.i);
00107
00108
00109
00110
00111 itsSubController->setTurningSpeed(pipeCorrection);
00112
00113 return abs(pointToTrack.i - desiredPoint.i);
00114 }
00115
00116
00117 void MovementAgent::paramChanged(ModelParamBase* const param,
00118 const bool valueChanged,
00119 ParamClient::ChangeStatus* status)
00120 {
00121 if (param == &setDiveValue && valueChanged)
00122 {
00123 if(dive(setDiveValue.getVal(), setRelative.getVal(), setTimeout.getVal()))
00124 LINFO("Dive completed successfully");
00125 else
00126 LINFO("Dive failed");
00127 }
00128 else if(param == &setGoStraightTimeValue && valueChanged)
00129 {
00130 if(goStraight(setSpeedValue.getVal(), setGoStraightTimeValue.getVal()))
00131 LINFO("Go straight completed successfully");
00132 else
00133 LINFO("Go straight failed");
00134 }
00135 else if(param == &setHeadingValue && valueChanged)
00136 {
00137 if(setHeading(setHeadingValue.getVal(), setRelative.getVal(), setTimeout.getVal()))
00138 LINFO("Turn completed successfully");
00139 else
00140 LINFO("Turn failed");
00141 }
00142
00143 else if (param == &pipeP && valueChanged)
00144 itsPipePID.setPIDPgain(pipeP.getVal());
00145 else if(param == &pipeI && valueChanged)
00146 itsPipePID.setPIDIgain(pipeI.getVal());
00147 else if(param == &pipeD && valueChanged)
00148 itsPipePID.setPIDDgain(pipeD.getVal());
00149
00150 }
00151
00152
00153
00154
00155
00156
00157
00158 #endif