00001 #include "Aria.h"
00002 #include "ArNetworking.h"
00003 #include "Arnl.h"
00004
00021 int
00022 main(int argc, char *argv[])
00023 {
00024
00025 Aria::init();
00026 Arnl::init();
00027
00028
00029
00030
00031
00032
00033 ArRobot robot;
00034
00035
00036 ArServerBase server;
00037
00038
00039 ArArgumentParser parser(&argc, argv);
00040
00041
00042 ArSimpleConnector simpleConnector(&parser);
00043
00044
00045 ArServerSimpleOpener simpleOpener(&parser);
00046
00047
00048 ArClientSwitchManager clientSwitch(&server, &parser);
00049
00050
00051
00052 parser.loadDefaultArguments();
00053
00054
00055 ArAnalogGyro gyro(&robot);
00056
00057
00058 if (!Aria::parseArgs() || !parser.checkHelpAndWarnUnparsed())
00059 {
00060 ArLog::log(ArLog::Normal, "\nUsage: %s -map mapfilename\n", argv[0]);
00061 Aria::logOptions();
00062 Aria::exit(1);
00063 }
00064
00065
00066
00067 ArSick sick;
00068
00069
00070 robot.addRangeDevice(&sick);
00071
00072
00073
00074 ArSonarDevice sonarDev;
00075
00076
00077 robot.addRangeDevice(&sonarDev);
00078
00079
00080 char fileDir[1024];
00081 ArUtil::addDirectories(fileDir, sizeof(fileDir), Aria::getDirectory(),
00082 "examples");
00083 ArLog::log(ArLog::Normal, "Installation directory is: %s\nMaps directory is: %s\n", Aria::getDirectory(), fileDir);
00084
00085
00086
00087
00088
00089 ArMap arMap(fileDir);
00090
00091
00092 arMap.setIgnoreEmptyFileName(true);
00093
00094
00095 ArPathPlanningTask pathTask(&robot, &sick, &sonarDev, &arMap);
00096
00097
00098
00099
00100 ArDataLogger dataLogger(&robot);
00101 dataLogger.addToConfig(Aria::getConfig());
00102
00103
00104 ArLog::addToConfig(Aria::getConfig());
00105
00106
00107 if (!simpleOpener.open(&server, fileDir, 240))
00108 {
00109 if (simpleOpener.wasUserFileBad())
00110 ArLog::log(ArLog::Normal, "Bad user file");
00111 else
00112 ArLog::log(ArLog::Normal, "Could not open server port");
00113 exit(2);
00114 }
00115
00116
00117 if (!simpleConnector.connectRobot(&robot))
00118 {
00119 ArLog::log(ArLog::Normal, "Could not connect to robot... exiting");
00120 Aria::exit(3);
00121 }
00122
00123
00124 ArRobotConfig robotConfig(&robot);
00125 robotConfig.addAnalogGyro(&gyro);
00126
00127 robot.enableMotors();
00128 robot.clearDirectMotion();
00129
00130
00131 robot.comInt(ArCommands::RESETSIMTOORIGIN, 1);
00132 robot.moveTo(ArPose(0,0,0));
00133
00134
00135
00136 simpleConnector.setupLaser(&sick);
00137
00138
00139 robot.runAsync(true);
00140
00141
00142 sick.runAsync();
00143
00144
00145 if (!sick.blockingConnect())
00146 ArLog::log(ArLog::Normal, "Warning: Couldn't connect to SICK laser, it won't be used");
00147 else
00148 ArLog::log(ArLog::Normal, "Connected to laser.");
00149
00150
00151
00152
00153 robot.lock();
00154 ArIRs irs;
00155 robot.addRangeDevice(&irs);
00156 pathTask.addRangeDevice(&irs, ArPathPlanningTask::CURRENT);
00157
00158
00159 ArBumpers bumpers;
00160 robot.addRangeDevice(&bumpers);
00161 pathTask.addRangeDevice(&bumpers, ArPathPlanningTask::CURRENT);
00162
00163
00164 ArForbiddenRangeDevice forbidden(&arMap);
00165 robot.addRangeDevice(&forbidden);
00166 pathTask.addRangeDevice(&forbidden, ArPathPlanningTask::CURRENT);
00167
00168
00169
00170 ArGlobalReplanningRangeDevice replanDev(&pathTask);
00171
00172
00173
00174
00175 ArServerInfoDrawings drawings(&server);
00176 drawings.addRobotsRangeDevices(&robot);
00177 drawings.addRangeDevice(&replanDev);
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207 ArServerHandlerCommands commands(&server);
00208
00209
00210
00211 ArServerInfoRobot serverInfoRobot(&server, &robot);
00212 ArServerInfoSensor serverInfoSensor(&server, &robot);
00213 ArServerInfoPath serverInfoPath(&server, &robot, &pathTask);
00214 serverInfoPath.addSearchRectangleDrawing(&drawings);
00215 serverInfoPath.addControlCommands(&commands);
00216
00217
00218
00219
00220 ArServerHandlerMap serverMap(&server, &arMap);
00221
00222
00223
00224
00225 ArServerSimpleComUC uCCommands(&commands, &robot);
00226 ArServerSimpleComMovementLogging loggingCommands(&commands, &robot);
00227 ArServerSimpleComGyro gyroCommands(&commands, &robot, &gyro);
00228 ArServerSimpleComLogRobotConfig configCommands(&commands, &robot);
00229 ArServerSimpleServerCommands serverCommands(&commands, &server);
00230
00231
00232
00233
00234
00235
00236
00237 ArServerModeGoto modeGoto(&server, &robot, &pathTask, &arMap, ArPose(0,0,0));
00238
00239
00240
00241 modeGoto.addTourGoalsInListSimpleCommand(&commands);
00242
00243
00244 ArServerModeStop modeStop(&server, &robot);
00245
00246
00247
00248
00249
00250 ArSonarAutoDisabler sonarAutoDisabler(&robot);
00251
00252
00253 ArServerModeRatioDrive modeRatioDrive(&server, &robot);
00254 ArServerModeDrive modeDrive(&server, &robot);
00255
00256
00257 modeRatioDrive.addToConfig(Aria::getConfig(), "Teleop settings");
00258 modeDrive.addControlCommands(&commands);
00259 modeRatioDrive.addControlCommands(&commands);
00260
00261
00262 ArServerModeWander modeWander(&server, &robot);
00263
00264
00265
00266
00267 ArServerInfoStrings stringInfo(&server);
00268 Aria::getInfoGroup()->addAddStringCallback(stringInfo.getAddStringFunctor());
00269
00270 Aria::getInfoGroup()->addStringInt(
00271 "Motor Packet Count", 10,
00272 new ArConstRetFunctorC<int, ArRobot>(&robot,
00273 &ArRobot::getMotorPacCount));
00274
00275
00276
00277
00278 modeStop.addAsDefaultMode();
00279
00280
00281
00282
00283
00284
00285 #ifdef WIN32
00286
00287 ArLog::log(ArLog::Normal, "Note, file upload/download services are not implemented for Windows; not enabling them.");
00288 #else
00289
00290
00291
00292 ArServerFileLister fileLister(&server, fileDir);
00293 ArServerFileToClient fileToClient(&server, fileDir);
00294 ArServerFileFromClient fileFromClient(&server, fileDir, "/tmp");
00295 ArServerDeleteFileOnServer deleteFileOnServer(&server, fileDir);
00296
00297 #endif
00298
00299
00300
00301
00302 ArServerHandlerCommMonitor handlerCommMonitor(&server);
00303
00304
00305 ArServerHandlerConfig handlerConfig(&server, Aria::getConfig(),
00306 Arnl::getTypicalDefaultParamFileName(),
00307 Aria::getDirectory());
00308
00309
00310
00311
00312 Aria::getConfig()->useArgumentParser(&parser);
00313 if (!Aria::getConfig()->parseFile(Arnl::getTypicalParamFileName()))
00314 {
00315 ArLog::log(ArLog::Normal, "Trouble loading configuration file, exiting");
00316 Aria::exit(5);
00317 }
00318
00319
00320 if (!simpleOpener.checkAndLog() || !parser.checkHelpAndWarnUnparsed())
00321 {
00322 ArLog::log(ArLog::Normal, "\nUsage: %s -map mapfilename\n", argv[0]);
00323 simpleConnector.logOptions();
00324 simpleOpener.logOptions();
00325 Aria::exit(6);
00326 }
00327
00328
00329 if (arMap.getFileName() == NULL || strlen(arMap.getFileName()) <= 0)
00330 {
00331 ArLog::log(ArLog::Normal, "");
00332 ArLog::log(ArLog::Normal, "### Warning, No map file is set up, you can make a map with sickLogger or arnlServer, and Mapper3; More info in docs/Mapping.txt and README.txt. Set the map with the -map command line option, or by changing the config with MobileEyes or by editing the config file.");
00333 ArLog::log(ArLog::Normal, "");
00334 }
00335
00336
00337 ArLog::log(ArLog::Normal, "");
00338 ArLog::log(ArLog::Normal,
00339 "Directory for maps and file serving: %s", fileDir);
00340
00341 ArLog::log(ArLog::Normal, "See the ARNL README.txt for more information");
00342 ArLog::log(ArLog::Normal, "");
00343
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357 robot.unlock();
00358
00359 server.runAsync();
00360
00361
00362
00363
00364
00365
00366 ArKeyHandler *keyHandler;
00367 if ((keyHandler = Aria::getKeyHandler()) == NULL)
00368 {
00369 keyHandler = new ArKeyHandler;
00370 Aria::setKeyHandler(keyHandler);
00371 robot.lock();
00372 robot.attachKeyHandler(keyHandler);
00373 robot.unlock();
00374 printf("To exit, press escape.\n");
00375 }
00376
00377 robot.waitForRunExit();
00378 Aria::exit(0);
00379 }