WaypointControllerI.C
00001 #include "Robots/SeaBeeIII/WaypointControllerI.H"
00002 #include "Robots/RobotBrain/RobotBrainComponent.H"
00003 #include "Component/ModelParam.H"
00004 #include "Component/ModelOptionDef.H"
00005 #include "Image/MathOps.H"
00006
00007 #ifndef WAYPOINTCONTROLLERI_C
00008 #define WAYPOINTCONTROLLERI_C
00009
00010 #define IMG_WIDTH 320
00011 #define IMG_HEIGHT 240
00012
00013 #define MAX_TURN_ANGLE 35
00014 #define MAX_TURN_SPEED 100
00015 #define MAX_SPEED 70
00016
00017
00018 WaypointControllerI::WaypointControllerI(OptionManager& mgr,
00019 const std::string& descrName, const std::string& tagName) :
00020 RobotBrainComponent(mgr, descrName, tagName),
00021 itsCurrentHeading(0),
00022 itsCurrentDepth(0),
00023 itsImgWidth(IMG_WIDTH),
00024 itsImgHeight(IMG_HEIGHT)
00025 {
00026 itsNavigationWaypoint.heading = 0;
00027 itsNavigationWaypoint.depth = 0;
00028 itsNavigationWaypoint.speed = 0;
00029
00030 itsTrackingWaypoint.heading = 0;
00031 itsTrackingWaypoint.depth = 0;
00032 itsTrackingWaypoint.speed = 0;
00033
00034 itsWaypointSource = BUOY;
00035 itsBuoyTimer.reset();
00036 }
00037
00038
00039 void WaypointControllerI::registerTopics()
00040 {
00041 LINFO("Registering Waypoint Controller Message");
00042
00043 registerSubscription("BeeStemMessageTopic");
00044 registerSubscription("BuoyColorSegmentMessageTopic");
00045
00046 registerPublisher("BeeStemConfigTopic");
00047 registerPublisher("XBox360RemoteControlMessageTopic");
00048
00049 }
00050
00051
00052 void WaypointControllerI::evolve()
00053 {
00054 if(itsWaypointSource == NAV)
00055 {
00056 LINFO("Nav");
00057 }
00058 else
00059 {
00060 if(itsBuoyTimer.getSecs() > .5)
00061 {
00062 itsTrackingWaypoint.speed = 0;
00063 itsTrackingWaypoint.heading = 0;
00064 }
00065
00066 LINFO("Heading: %d",itsTrackingWaypoint.heading);
00067 LINFO("Depth: %d",itsTrackingWaypoint.depth);
00068 LINFO("Speed: %d",itsTrackingWaypoint.speed);
00069 LINFO("=========");
00070 sendThrusterUpdate("HEADING_AXIS",itsTrackingWaypoint.heading *-1);
00071 sendThrusterUpdate("SPEED_AXIS",itsTrackingWaypoint.speed * -1);
00072
00073
00074
00075 sendDepthUpdate(itsTrackingWaypoint.depth);
00076 }
00077 }
00078
00079
00080 void WaypointControllerI::updateMessage(const RobotSimEvents::EventMessagePtr& eMsg,
00081 const Ice::Current&)
00082 {
00083 if(eMsg->ice_isA("::RobotSimEvents::BeeStemMessage"))
00084 {
00085 RobotSimEvents::BeeStemMessagePtr msg = RobotSimEvents::BeeStemMessagePtr::dynamicCast(eMsg);
00086 itsCurrentHeading = msg->compassHeading;
00087 itsCurrentDepth = msg->externalPressure;
00088 }
00089 else if(eMsg->ice_isA("::RobotSimEvents::BuoyColorSegmentMessage") && itsWaypointSource == BUOY)
00090 {
00091 RobotSimEvents::BuoyColorSegmentMessagePtr msg = RobotSimEvents::BuoyColorSegmentMessagePtr::dynamicCast(eMsg);
00092
00093
00094 if(msg->size > 100.0)
00095
00096 {
00097
00098 float headingError = msg->x - 0.5;
00099 itsTrackingWaypoint.heading = (int)(headingError * MAX_TURN_SPEED);
00100
00101
00102
00103
00104
00105
00106 itsTrackingWaypoint.depth = 950;
00107 itsTrackingWaypoint.speed = MAX_SPEED*(1 - abs(headingError));
00108 itsBuoyTimer.reset();
00109 }
00110 else
00111 {
00112
00113
00114
00115
00116 }
00117 }
00118 }
00119
00120
00121 void WaypointControllerI::sendDepthUpdate(int depth)
00122 {
00123 RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00124
00125 msg->headingK = 0.0;
00126 msg->headingP = 0.0;
00127 msg->headingI = 0.0;
00128 msg->headingD = 0.0;
00129 msg->updateHeadingPID = false;
00130 msg->depthK = 0.0;
00131 msg->depthP = 0.0;
00132 msg->depthI = 0.0;
00133 msg->depthD = 0.0;
00134 msg->updateDepthPID = false;
00135 msg->enablePID = 0;
00136 msg->enableVal = 0;
00137
00138 msg->updateDesiredValue = 2;
00139 msg->desiredDepth = depth;
00140 this->publish("BeeStemConfigTopic", msg);
00141 }
00142
00143
00144 void WaypointControllerI::sendSpeedUpdate(int speed)
00145 {
00146 RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00147
00148 msg->headingK = 0.0;
00149 msg->headingP = 0.0;
00150 msg->headingI = 0.0;
00151 msg->headingD = 0.0;
00152 msg->updateHeadingPID = false;
00153 msg->depthK = 0.0;
00154 msg->depthP = 0.0;
00155 msg->depthI = 0.0;
00156 msg->depthD = 0.0;
00157 msg->updateDepthPID = false;
00158 msg->enablePID = 0;
00159 msg->enableVal = 0;
00160
00161 msg->updateDesiredValue = 3;
00162 msg->desiredSpeed = speed;
00163
00164 this->publish("BeeStemConfigTopic", msg);
00165 }
00166
00167
00168 void WaypointControllerI::sendHeadingUpdate(int heading)
00169 {
00170 RobotSimEvents::BeeStemConfigMessagePtr msg = new RobotSimEvents::BeeStemConfigMessage;
00171
00172 msg->headingK = 0.0;
00173 msg->headingP = 0.0;
00174 msg->headingI = 0.0;
00175 msg->headingD = 0.0;
00176 msg->updateHeadingPID = false;
00177 msg->depthK = 0.0;
00178 msg->depthP = 0.0;
00179 msg->depthI = 0.0;
00180 msg->depthD = 0.0;
00181 msg->updateDepthPID = false;
00182 msg->enablePID = 0;
00183 msg->enableVal = 0;
00184
00185 msg->updateDesiredValue = 1;
00186 msg->desiredHeading = heading;
00187 this->publish("BeeStemConfigTopic", msg);
00188 }
00189
00190
00191 void WaypointControllerI::sendThrusterUpdate(string thruster, int val)
00192 {
00193 RobotSimEvents::JoyStickControlMessagePtr msg = new RobotSimEvents::JoyStickControlMessage;
00194 msg->axisName = thruster;
00195 msg->axis = 0;
00196 msg->axisVal = val;
00197 msg->button = -1;
00198 msg->butVal = 0;
00199 this->publish("XBox360RemoteControlMessageTopic", msg);
00200 }
00201
00202 #endif
00203