/** @internal */
AREXPORT void ArServerHandlerMap::serverGetGoals(ArServerClient *client, 
						 ArNetPacket *packet)
{
  std::list<ArMapObject *>::iterator objIt;
  ArMapObject* obj;
  ArPose goal;  
  ArNetPacket sendPacket;

  for (objIt = myMap->getMapObjects()->begin(); 
       objIt != myMap->getMapObjects()->end(); 
       objIt++)
  {
    //
    // Get the forbidden lines and fill the occupancy grid there.
    //
    obj = (*objIt);
    if (obj == NULL)
      break;
    if (strcasecmp(obj->getType(), "GoalWithHeading") == 0 ||
	strcasecmp(obj->getType(), "Goal") == 0)
    {
      sendPacket.strToBuf(obj->getName());
    }
  }
  client->sendPacketTcp(&sendPacket);
}
Beispiel #2
0
/*!
 * Callback function for the r key. Gets the robot to pick the next
 * goal point and plan to it. and keep going around the list.
 */
void
rkeyCB(void)
{
  if(roundRobinFlag == false){
    roundRobinFlag = true;
  }else{
    roundRobinFlag = false;
    return;
  }

  if(advancedptr->myLocaTask->getInitializedFlag()){
    if(advancedptr->myGoalList.size()>0){
      ArMapObject* front = advancedptr->myGoalList.front();
      ArPose top = front->getPose();
      bool headingFlag = false;
      if(strcasecmp(front->getType(), "GoalWithHeading") == 0)
    headingFlag = true;
      else
    headingFlag = false;
      printf("Path planing to goal %s %5.2f %5.2f %5.2f: %d poses\n",
         front->getName(),
         top.getX(), top.getY(), top.getTh(),
         advancedptr->myGoalList.size());
      advancedptr->myGoalList.pop_front();
      advancedptr->myGoalList.push_back(front);
      //
      // Setup the pathplanning task to this destination.
      //
      advancedptr->pathPlanFromCurrentToDest(top, headingFlag);
    }
  }else{
    printf("Localize the robot first\n");
  }
}
Beispiel #3
0
/*!
 * This is the called when path to goal reached.
 *
 * @param goal: Goal it was assigned.
 */
void
Advanced::goalDone(ArPose goal)
{
  static int goalCount = 0;

  printf("goalDone:Main: %5.2f %5.2f %5.2f\07\n",
     goal.getX(), goal.getY(), goal.getTh());

  if(roundRobinFlag){
    if(myLocaTask->getInitializedFlag()){
      if(myGoalList.size()>0){
    ArMapObject* front = myGoalList.front();
    ArPose top = front->getPose();
    bool headingFlag = false;
    if(strcasecmp(front->getType(), "GoalWithHeading") == 0)
      headingFlag = true;
    else
      headingFlag = false;
    printf("Moving to next goal:%s %5.2f %5.2f %5.2f: %d poses %d Done\n",
           front->getName(),
           top.getX(), top.getY(), top.getTh(),
           myGoalList.size(), goalCount++);
    myGoalList.pop_front();
    myGoalList.push_back(front);

    myPathPlanningTask->pathPlanToPose(top, headingFlag);
      }
    }
  }else{
    printf("Localize the robot first\n");
  }
}
void GPSMapTools::addHomeHere(ArArgumentBuilder *args)
{
  if(!checkGPS("adding home")) return;
  if(!checkMap("adding home")) return;
  ArPose p = getCurrentPosFromGPS();
  ArLog::log(ArLog::Normal, "GPSMapTools: Adding home in map at GPS position (x=%.2f, y=%.2f)",  p.getX(), p.getY());
  myMap->lock();
  ArMapObject *newobj;
  myMap->getMapObjects()->push_back(newobj = new ArMapObject("Home", p, "Home", "ICON", args->getFullString(), false, ArPose(0, 0), ArPose(0, 0)));
  printf("\tnew map object is:\n\t%s\n", newobj->toString());
  newobj->log();
  myMap->writeFile(myMap->getFileName(), true);
  myMap->unlock();
  reloadMapFile();
}
Beispiel #5
0
/*!
 * Gets the list of home poses.
 *
 * @param mapdata: Pointer to the map class.
 *
 * @return list of home objects.
 *
 */
void
Advanced::getAllRobotHomes(ArMap* ariamap)
{
  myHomeList.clear();
  std::list<ArMapObject *>::iterator objIt;
  ArMapObject* obj;
  int i=0;
  for (objIt = ariamap->getMapObjects()->begin();
       objIt != ariamap->getMapObjects()->end();
       objIt++)
  {
    //
    // Get the forbidden lines and fill the occupancy grid there.
    //
    obj = (*objIt);
    if (strcasecmp(obj->getType(), "RobotHome") == 0)
    {
      myHomeList.push_back(obj);
      ArPose pose = obj->getPose();
      printf("RobotHome[%d] = %s : %5.2f %5.2f %5.2f\n", i++, obj->getName(),
         pose.getX(), pose.getY(), pose.getTh());
    }
    if (strcasecmp(obj->getType(), "Home") == 0)
    {
      myHomeList.push_back(obj);
      ArPose pose = obj->getPose();
      printf("Home[%d] = %s : %5.2f %5.2f %5.2f\n", i++, obj->getName(),
         pose.getX(), pose.getY(), pose.getTh());
    }
  }
}
Beispiel #6
0
/*!
 * Callback function for the h key. Gets the robot to home pose.
 */
void
hkeyCB(void)
{
  roundRobinFlag = false;

  if(advancedptr->myLocaTask->getInitializedFlag()){
    if(advancedptr->myHomeList.size()>0){
      ArMapObject* front = advancedptr->myHomeList.front();
      ArPose top = front->getPose();
      printf("Homing to %s %5.2f %5.2f %5.2f\n",
         front->getName(),
         top.getX(), top.getY(), top.getTh());
      bool headingFlag = true;
      advancedptr->pathPlanFromCurrentToDest(top, headingFlag);
    }
  }else{
    printf("Localize the robot first\n");
  }
}
AREXPORT void ArForbiddenRangeDevice::processMap(void)
{
  std::list<ArMapObject *>::const_iterator it;
  ArMapObject *obj;

  myDataMutex.lock();
  ArUtil::deleteSet(mySegments.begin(), mySegments.end());
  mySegments.clear();

  for (it = myMap->getMapObjects()->begin();
       it != myMap->getMapObjects()->end();
       it++)
  {
    obj = (*it);
    if (strcmp(obj->getType(), "ForbiddenLine") == 0 &&
	obj->hasFromTo())
    {
      mySegments.push_back(new ArLineSegment(obj->getFromPose(), 
					     obj->getToPose()));
    }
    if (strcmp(obj->getType(), "ForbiddenArea") == 0 &&
	obj->hasFromTo())
    {
      double angle = obj->getPose().getTh();
      double sa = ArMath::sin(angle);
      double ca = ArMath::cos(angle);
      double fx = obj->getFromPose().getX();
      double fy = obj->getFromPose().getY();
      double tx = obj->getToPose().getX();
      double ty = obj->getToPose().getY();
      ArPose P0((fx*ca - fy*sa), (fx*sa + fy*ca));
      ArPose P1((tx*ca - fy*sa), (tx*sa + fy*ca));
      ArPose P2((tx*ca - ty*sa), (tx*sa + ty*ca));
      ArPose P3((fx*ca - ty*sa), (fx*sa + ty*ca));
      mySegments.push_back(new ArLineSegment(P0, P1));
      mySegments.push_back(new ArLineSegment(P1, P2));
      mySegments.push_back(new ArLineSegment(P2, P3));
      mySegments.push_back(new ArLineSegment(P3, P0));
    }
  }
  myDataMutex.unlock();
}
Beispiel #8
0
int main(int argc, char **argv)
{

  Aria::init();
  ArLog::init(ArLog::StdOut, ArLog::Verbose);

  ArMap testMap;

  ArTime timer;

  ArGlobalFunctor mapChangedCB(&mapChanged);
  testMap.addMapChangedCB(&mapChangedCB);


  if (argc <= 1)
  {
    printf("mapTest: Usage %s <map> <map2:optional>\n", argv[0]);
    Aria::exit(1);
  }

  timer.setToNow();
  if (!testMap.readFile(argv[1]))
  {
    printf("mapTest: Could not read map '%s'\n", argv[1]);
    Aria::exit(2);
  }
  printf("mapTest: Took %ld ms to read file\n", timer.mSecSince());
/*
  printf("mapTest: ChangeTimes (in ms): mapObjects %ld points %ld mapInfo %ld\n",
	 testMap.getMapObjectsChanged().mSecSince(),
	 testMap.getPointsChanged().mSecSince(),
	 testMap.getMapInfoChanged().mSecSince());
*/
  timer.setToNow();
  if(!testMap.writeFile("mapTest.map"))
  {
    printf("mapTest: Error could not write new map to mapTest.map");
    Aria::exit(3);
  }
  printf("mapTest: Took %ld ms to write file mapTest.map\n", timer.mSecSince());

  std::list<ArMapObject *>::iterator objIt;
  ArMapObject *obj;
  for (objIt = testMap.getMapObjects()->begin(); 
       objIt != testMap.getMapObjects()->end(); 
       objIt++)
  {
    obj = (*objIt);
    printf("mapTest: Map object: %s named \"%s\". Pose: %0.2f,%0.2f,%0.2f. ", obj->getType(), obj->getName(), obj->getPose().getX(), obj->getPose().getY(), obj->getPose().getTh());
    if(obj->hasFromTo())
      printf("mapTest: Extents: From %0.2f,%0.2f to %0.2f,%0.2f.", obj->getFromPose().getX(), obj->getFromPose().getY(), obj->getToPose().getX(), obj->getToPose().getY());
    printf("mapTest: \n");

/*
    if (strcasecmp(obj->getType(), "Goal") == 0 ||
	strcasecmp(obj->getType(), "GoalWithHeading") == 0)
    {
      printf("mapTest: Map object: Goal %s\n", obj->getName());
    }
    else if (strcasecmp(obj->getType(), "ForbiddenLine") == 0 &&
	obj->hasFromTo())
    {
      printf("mapTest: Map object: Forbidden line from %.0f %.0f to %.0f %.0f\n",
	     obj->getFromPose().getX(), obj->getFromPose().getY(),
	     obj->getToPose().getX(), obj->getToPose().getY());
    }

*/

  }

  std::list<ArArgumentBuilder*>* objInfo = testMap.getMapInfo();
  for(std::list<ArArgumentBuilder*>::const_iterator i = objInfo->begin();
      i != objInfo->end();
      i++)
  {
    printf("mapTest: MapInfo object definition:\n----\n");
    (*i)->log();
    printf("mapTest: ----\n");
  }

  printf("mapTest: First 5 data points:\n");
  std::vector<ArPose>::iterator pIt;
  ArPose pose;
  int n = 0;
  for (pIt = testMap.getPoints()->begin(); 
       pIt != testMap.getPoints()->end(); 
       pIt++)
  {
    pose = (*pIt);
    if (n > 5)
      exit(0);
    printf("mapTest: \t%.0f %.0f\n", pose.getX(), pose.getY());
    n++;
    // the points are gone through
  }

  if (argc >= 3)
  {
    timer.setToNow();
    if (!testMap.readFile(argv[2]))
    {
      printf("mapTest: Could not read map '%s'\n", argv[2]);
    }
    printf("mapTest: Took %ld ms to read file2\n", timer.mSecSince());
/*
    ArUtil::sleep(30);
    printf("mapTest: ChangeTimes (in ms): mapObjects %ld points %ld mapInfo %ld\n",
	   testMap.getMapObjectsChanged().mSecSince(),
	   testMap.getPointsChanged().mSecSince(),
	   testMap.getMapInfoChanged().mSecSince());
*/
    timer.setToNow();
    testMap.writeFile("mapTest2.map");
    printf("mapTest: Took %ld ms to write file2\n", timer.mSecSince());
  }  

  // now test it with the config stuff
  ArArgumentBuilder builder;
  builder.setExtraString("Map");
  builder.add(argv[1]);
  printf("mapTest: Trying config with map (%s)\n", argv[1]);
  Aria::getConfig()->parseArgument(&builder);
  Aria::getConfig()->callProcessFileCallBacks(true, NULL, 0);
  printf("mapTest: Trying config again with same map (%s)\n", argv[1]);
  Aria::getConfig()->parseArgument(&builder);
  Aria::getConfig()->callProcessFileCallBacks(true, NULL, 0);
  if (argc >= 3)
  {
    ArArgumentBuilder builder2;
    builder2.setExtraString("Map");
    builder2.add(argv[2]);
    printf("mapTest: Trying config with map2 (%s)\n", argv[2]);
    Aria::getConfig()->parseArgument(&builder2);
    Aria::getConfig()->callProcessFileCallBacks(true, NULL, 0);
  }
  
}
void PathUtil::init(ArMap *map, std::vector<WayPoint*> *all1d) {
    printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!AOSIDJHOAISDHJOIADHO\n\n\n");
    ArLog::log(ArLog::Normal, "Goals: %i", map->findMapObjectsOfType("goal").size());

    std::list<ArMapObject*> mapPoints = map->findMapObjectsOfType("goal");
    std::list<ArMapObject*>::const_iterator iterator;

    int distToField = 200;
    std::vector<std::vector<WayPoint> > tmpWayPoints;

    //init TTT field
    for (int x = 0; x < 3; x++) {
        std::vector<WayPoint> newVec;
        tmpWayPoints.push_back(newVec);
        for (int y = 0; y < 3; y++) {
            WayPoint emptyWP(0, 0, -1);
            emptyWP.blocked = true;
            tmpWayPoints[x].push_back(emptyWP);
        }
    }

    for (iterator = mapPoints.begin(); iterator != mapPoints.end(); iterator++) {
        ArMapObject *curObj = *iterator;
        //printf("Name: %i, %i, %i, %i\n", sizeof(curObj->getName()[0]), (int) sizeof(*(curObj->getName())), (int) (sizeof(*(curObj->getName())) / sizeof(curObj->getName()[0])), (int) ((sizeof(*(curObj->getName())) / sizeof(curObj->getName()[0])) > 1));
        //is a TTT field, 1 char, '0' - '8'
        if ((sizeof(*(curObj->getName())) / sizeof(curObj->getName()[0])) > 1 || curObj->getName()[0] < '0' || curObj->getName()[0] > '8') continue;
        WayPoint *tmpWP = new WayPoint(curObj->getPose().getX(), curObj->getPose().getY(), (int) curObj->getName()[0] - '0');
        tmpWP->blocked = true;
        int xPos = tmpWP->id % 3;
        int yPos = (int) floor(tmpWP->id / 3);
        if (xPos != 1 || yPos != 1) tmpWP->blocked = false;

        if (xPos == 0) tmpWP->y += distToField;
        if (xPos == 2) tmpWP->y -= distToField;
        if (yPos == 0) tmpWP->x -= distToField;
        if (yPos == 2) tmpWP->x += distToField;

        tmpWayPoints[xPos][yPos] = *tmpWP;
        printf("Goal %i: %ix%i\n", (int) curObj->getName()[0] - '0', (int) curObj->getPose().getX(), (int) curObj->getPose().getY());
    }

    //create edges
    for (int x = 0; x < (int) tmpWayPoints.size(); x++) {
        for (int y = 0; y < (int) tmpWayPoints[x].size(); y++) {
            if (x + 1 < (int) tmpWayPoints.size()       && !tmpWayPoints[x + 1][y].blocked)      tmpWayPoints[x][y].wayPoints.push_back(&tmpWayPoints[x + 1][y]);
            if (x - 1 > -1                              && !tmpWayPoints[x - 1][y].blocked)                             tmpWayPoints[x][y].wayPoints.push_back(&tmpWayPoints[x - 1][y]);
            if (y + 1 < (int) tmpWayPoints[x].size()    && !tmpWayPoints[x][y + 1].blocked)   tmpWayPoints[x][y].wayPoints.push_back(&tmpWayPoints[x][y + 1]);
            if (y - 1 > -1                              && !tmpWayPoints[x][y - 1].blocked)                             tmpWayPoints[x][y].wayPoints.push_back(&tmpWayPoints[x][y - 1]);
            //ArLog::log(ArLog::Normal, "%i: %ix%i", wayPoints[grid.X][grid.Y].id, grid.X, grid.Y);
            //wayPoints[grid.X][grid.Y].listConnections();
        }
    }

    //std::vector<WayPoint*> all1d;
    int index = 0;
    for (int x = 0; x < (int) tmpWayPoints.size(); x++) {
        //std::vector<WayPoint*> tmpVec;
        //wayPoints->push_back(&tmpVec);
        for (int y = 0; y < (int) tmpWayPoints[x].size(); y++) {
            //all1d->push_back(&tmpWayPoints[x][y]);
            all1d->at(index)->x = tmpWayPoints[x][y].x;
            all1d->at(index)->y = tmpWayPoints[x][y].y;
            all1d->at(index)->id = tmpWayPoints[x][y].id;
            all1d->at(index)->blocked = tmpWayPoints[x][y].blocked;
            index++;
            //tmpVec.push_back(&tmpWayPoints[x][y]);
            //printf("Cur: %i, %i, %i\n", x, y, tmpWayPoints[x][y].id);
            //ArLog::log(ArLog::Normal, "%i: %ix%i", (*(*wayPoints)[x])[y]->id, x, y);
            //(*(*wayPoints)[x])[y]->listConnections();
        }
    }

    //for(int i = 0; i < all1d->size(); i++) printf("%i/%i: %ix%i\n", i, all1d->at(i)->id, all1d->at(i)->x, all1d->at(i)->y);

    /*
    std::vector<WayPoint*> path;
    std::vector<WayPoint*> best;
    path.push_back(&tmpWayPoints[0][0]);
    bool foundPath = findPath(&tmpWayPoints[0][0], &tmpWayPoints[2][2], &path, &best);
    printf("Path found (%i): %i\n", (int) foundPath, (int) best.size());
    for (int i = 0; i < best.size(); i++) printf("%i wp: %i\n", i, best[i]->id);
    */
}