00001
00002
00021 #include "Aria.h"
00022 #include "ArNetworking.h"
00023 #include "Arnl.h"
00024
00025 #include "ArLocalizationTask.h"
00026
00027
00028
00029 int main(int argc, char *argv[])
00030 {
00031 Aria::init();
00032 Arnl::init();
00033
00034 ArRobot robot;
00035 ArServerBase server;
00036 ArArgumentParser parser(&argc, argv);
00037 parser.loadDefaultArguments();
00038 ArSimpleConnector simpleConnector(&parser);
00039 ArServerSimpleOpener simpleOpener (&parser);
00040 ArAnalogGyro gyro (&robot);
00041
00042 parser.loadDefaultArguments();
00043 if (!Aria::parseArgs () || !parser.checkHelpAndWarnUnparsed())
00044 {
00045 Aria::logOptions ();
00046 Aria::exit (1);
00047 }
00048
00049 ArSick sick;
00050 robot.addRangeDevice (&sick);
00051
00052 ArSonarDevice sonarDev;
00053 robot.addRangeDevice (&sonarDev);
00054
00055 ArBumpers bumpers;
00056 robot.addRangeDevice (&bumpers);
00057
00058
00059 char fileDir[1024];
00060 ArUtil::addDirectories (fileDir, sizeof (fileDir), Aria::getDirectory (),
00061 "examples");
00062
00063
00064
00065
00066 ArMap arMap (fileDir);
00067
00068
00069 arMap.setIgnoreEmptyFileName (true);
00070
00071
00072 ArLocalizationManager locManager(&robot, &arMap);
00073 ArLocalizationTask locTask (&robot, &sick, &arMap);
00074 locManager.addLocalizationTask(&locTask);
00075
00076
00077
00078
00079 ArLog::addToConfig (Aria::getConfig ());
00080
00081
00082 if (!simpleOpener.open (&server, fileDir, 240))
00083 {
00084 ArLog::log (ArLog::Normal, "Could not open server port");
00085 exit (2);
00086 }
00087
00088
00089 if (!simpleConnector.connectRobot (&robot))
00090 {
00091 ArLog::log (ArLog::Normal, "Could not connect to robot... exiting");
00092 Aria::exit (3);
00093 }
00094
00095 robot.enableMotors ();
00096 robot.clearDirectMotion ();
00097
00098
00099 robot.com(ArCommands::SIM_RESET);
00100
00101 simpleConnector.setupLaser (&sick);
00102
00103
00104 robot.runAsync (true);
00105
00106
00107 sick.runAsync ();
00108 if (!sick.blockingConnect ())
00109 {
00110 ArLog::log (ArLog::Normal, "Couldn't connect to laser, exiting");
00111 Aria::exit (4);
00112 }
00113
00114 ArUtil::sleep (300);
00115
00116
00117 ArForbiddenRangeDevice forbidden (&arMap);
00118 robot.addRangeDevice (&forbidden);
00119
00120
00121 ArServerInfoRobot serverInfoRobot (&server, &robot);
00122 ArServerInfoSensor serverInfoSensor (&server, &robot);
00123 ArServerInfoLocalization serverInfoLocalization (&server, &robot, &locManager);
00124 ArServerHandlerLocalization serverLocHandler (&server, &robot, &locManager);
00125 ArServerHandlerMap serverMap (&server, &arMap);
00126
00127
00128 ArServerInfoDrawings drawings (&server);
00129 drawings.addRobotsRangeDevices (&robot);
00130
00131
00132 ArServerHandlerCommands commands (&server);
00133 ArServerSimpleComUC uCCommands (&commands, &robot);
00134 ArServerSimpleComMovementLogging loggingCommands (&commands, &robot);
00135 ArServerSimpleComGyro gyroCommands (&commands, &robot, &gyro);
00136 ArServerSimpleComLogRobotConfig configCommands (&commands, &robot);
00137
00138
00139
00140
00141
00142 ArServerModeStop modeStop (&server, &robot);
00143 modeStop.addAsDefaultMode ();
00144
00145
00146
00147 ArSonarAutoDisabler sonarAutoDisabler (&robot);
00148
00149
00150 ArServerModeRatioDrive modeRatioDrive (&server, &robot);
00151
00152
00153 modeRatioDrive.addControlCommands (&commands);
00154 modeRatioDrive.addToConfig (Aria::getConfig (), "Teleop settings");
00155
00156
00157 ArServerModeWander
00158 modeWander (&server, &robot);
00159
00160
00161 ArActionLost actionLostRatioDrive (&locManager, NULL, &modeRatioDrive);
00162 modeRatioDrive.getActionGroup ()->addAction (&actionLostRatioDrive, 110);
00163
00164
00165 ArActionLost
00166 actionLostWander (&locManager, NULL, &modeWander);
00167 modeWander.getActionGroup ()->addAction (&actionLostWander, 110);
00168
00169
00170
00171 ArServerInfoStrings
00172 stringInfo (&server);
00173 Aria::getInfoGroup ()->addAddStringCallback (stringInfo.
00174 getAddStringFunctor ());
00175
00176
00177 Aria::getInfoGroup ()->addStringDouble ("Localization Score", 8,
00178 new ArRetFunctorC < double,
00179 ArLocalizationTask > (&locTask,
00180 &ArLocalizationTask::
00181 getLocalizationScore),
00182 "%.03f");
00183 Aria::getInfoGroup ()->addStringInt ("Laser Packet Count", 10,
00184 new ArRetFunctorC < int, ArSick > (&sick,
00185 &ArSick::
00186 getSickPacCount));
00187
00188
00189 Aria::getInfoGroup ()->addStringInt ("Motor Packet Count", 10,
00190 new ArConstRetFunctorC < int,
00191 ArRobot > (&robot,
00192 &ArRobot::getMotorPacCount));
00193
00194
00195
00196 ArServerHandlerConfig handlerConfig (&server, Aria::getConfig (),
00197 Arnl::getTypicalDefaultParamFileName (),
00198 Aria::getDirectory ());
00199
00200
00201
00202
00203 Aria::getConfig ()->useArgumentParser (&parser);
00204 if (!Aria::getConfig ()->parseFile (Arnl::getTypicalParamFileName ()))
00205 {
00206 ArLog::log (ArLog::Normal, "Trouble loading configuration file, exiting");
00207 Aria::exit (5);
00208 }
00209
00210
00211 if (arMap.getFileName () == NULL || strlen (arMap.getFileName ()) <= 0)
00212 {
00213 ArLog::log(ArLog::Terse, "Warning, no map given. Use the -map command-line argument or modify the config using MobileEyes or by editing the parameter file.");
00214 ArLog::log(ArLog::Terse, "See the documentation, including MAPPING.txt or SONAR_MAPPING.txt.");
00215 }
00216
00217 ArLog::log (ArLog::Normal, "Directory for maps and file serving: %s", fileDir);
00218
00219 ArLog::log (ArLog::Normal, "See the README.txt for more information");
00220
00221
00222 robot.unlock();
00223
00224
00225
00226 locTask.localizeRobotAtHomeBlocking();
00227
00228 server.runAsync();
00229
00230 ArLog::log(ArLog::Normal, "Server now running on port %d. Press Control-C to exit.", server.getTcpPort());
00231
00232
00233 robot.waitForRunExit();
00234 Aria::exit(0);
00235
00236 }
00237