Example #1
0
    public GridNavigationTask(State t_startState, State t_goalState, float t_inflationFactor, ref List <State> t_path,
                              float t_tunnelDistanceThreshold, float t_tunnelTimeThreshold, ref List <State> t_spaceTimePath, GridTimeDomain t_gridTimeDomain,
                              TaskPriority t_taskPriority, TaskManager taskManager)
        : base(taskManager, t_taskPriority)          // defaults to a real-time task -- now what happens when both this and Global are first put in queue ??
    {
        taskType = TaskType.GridNavigationTask;

        startState = t_startState;
        goalState  = t_goalState;

        // EVENT : startState will trigger GridNavigationTask that STATE_CHANGED
        startState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // EVENT : goalState will trigger GridNavigationTask that STATE_CHANGED
        goalState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // EVENT : goalState will trigger GridNavigationTask that it is GOAL_INVALID or VALID
        goalState.registerObserver(Event.GOAL_INVALID, this);
        goalState.registerObserver(Event.GOAL_VALID, this);


        inflationFactor = t_inflationFactor;

        //planner = t_planner;
        outputPlan = new Dictionary <DefaultState, ARAstarNode>();
        path       = t_path;


        // TODO : deprecate these lists
        List <PlanningDomainBase> domainList    = new List <PlanningDomainBase>();
        ARAstarDomain             araStarDomain = new ARAstarDomain();

        araStarDomain.setPlanningTask(this);
        domainList.Add(araStarDomain);

        gridPlanner = new ARAstarPlanner();
        gridPlanner.init(ref domainList, 100);

        initialized = true;

        obstacleChanged     = false;
        obstacleChangedData = new List <object> ();


        // tunnel planner variables
        tunnelDistanceThreshold = t_tunnelDistanceThreshold;
        tunnelTimeThreshold     = t_tunnelTimeThreshold;
        gridTimeDomain          = t_gridTimeDomain;
        spaceTimePath           = t_spaceTimePath;

        spaceTimePathStatus = false;

        dynamicChange = false;

        currentlyExecutingTask = false;

        gridPathStatus = PathStatus.NoPath;
    }
Example #2
0
    // defaults to a real-time task -- now what happens when both this and Global are first put in queue ??
    public GridNavigationTask(State t_startState, State t_goalState, float t_inflationFactor, ref List<State> t_path,
		float t_tunnelDistanceThreshold, float t_tunnelTimeThreshold, ref List<State> t_spaceTimePath, GridTimeDomain t_gridTimeDomain,
		TaskPriority t_taskPriority, TaskManager taskManager)
        : base(taskManager, t_taskPriority)
    {
        taskType = TaskType.GridNavigationTask;

        startState = t_startState;
        goalState = t_goalState;

        // EVENT : startState will trigger GridNavigationTask that STATE_CHANGED
        startState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // EVENT : goalState will trigger GridNavigationTask that STATE_CHANGED
        goalState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // EVENT : goalState will trigger GridNavigationTask that it is GOAL_INVALID or VALID
        goalState.registerObserver(Event.GOAL_INVALID, this);
        goalState.registerObserver(Event.GOAL_VALID, this);

        inflationFactor = t_inflationFactor;

        //planner = t_planner;
        outputPlan = new Dictionary<DefaultState, ARAstarNode>();
        path = t_path;

        // TODO : deprecate these lists
        List<PlanningDomainBase> domainList = new List<PlanningDomainBase>();
        ARAstarDomain araStarDomain = new ARAstarDomain ();
        araStarDomain.setPlanningTask(this);
        domainList.Add(araStarDomain);

        gridPlanner = new ARAstarPlanner();
        gridPlanner.init(ref domainList, 100);

        initialized = true;

        obstacleChanged = false;
        obstacleChangedData = new List<object> ();

        // tunnel planner variables
        tunnelDistanceThreshold = t_tunnelDistanceThreshold;
        tunnelTimeThreshold = t_tunnelTimeThreshold;
        gridTimeDomain = t_gridTimeDomain;
        spaceTimePath = t_spaceTimePath;

        spaceTimePathStatus = false;

        dynamicChange = false;

        currentlyExecutingTask = false;

        gridPathStatus = PathStatus.NoPath;
    }
Example #3
0
    public GlobalNavigationtask(State t_startState, State t_goalState, int t_passableMask,
                                TaskPriority t_taskPriority, TaskManager taskManager)
        : base(taskManager, t_taskPriority)          // defaults to a real-time task unless the priority is explicitly set
    {
        taskType = TaskType.GlobalNavigationTask;

        startState = t_startState;
        goalState  = t_goalState;

        // EVENT: globalNavigationTask is triggered by the goalState when STATE_CHANGED
        goalState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // NOTE: this does not replan when the start state changes

        passableMask = t_passableMask;
    }
Example #4
0
    // defaults to a real-time task unless the priority is explicitly set
    public GlobalNavigationtask(State t_startState, State t_goalState, int t_passableMask, 
		TaskPriority t_taskPriority, TaskManager taskManager)
        : base(taskManager, t_taskPriority)
    {
        taskType = TaskType.GlobalNavigationTask;

        startState = t_startState;
        goalState = t_goalState;

        // EVENT: globalNavigationTask is triggered by the goalState when STATE_CHANGED
        goalState.registerObserver(Event.STATE_POSITION_CHANGED, this);

        // NOTE: this does not replan when the start state changes

        passableMask = t_passableMask;
    }
Example #5
0
    private void _MoveToNextTaskForExecution()
    {
        // we  finished executing current plan
        currentPlanExecutionIndex = currentPlanExecutionIndex + 1;

        globalPath.RemoveAt(0);
        // we can remove the grid task, the local path and the space time path

        numGlobalPathWaypoints--;

        if (numGlobalPathWaypoints == 0)
        {
            Debug.LogWarning("REACHED GOAL or reached end of all calculated space time paths -- cannot execute any more");
            goalReached = true;
            return;
        }

        gridNavigationTasks[currentPlanExecutionIndex - 1].currentlyExecutingTask = false;
        gridNavigationTasks[currentPlanExecutionIndex].currentlyExecutingTask     = true;

        // WE UNREGISTER THE PREVIOUS TASK FROM THE NEIGHBOR AGENTS AND REGISTER THE CURRENT ONE
        neighborAgents.observable.unregisterObserver(Event.NEIGBHOR_AGENTS_CHANGED, gridNavigationTasks[currentPlanExecutionIndex - 1]);
        neighborObstacles.observable.unregisterObserver(Event.NEIGBHOR_DYNAMIC_OBSTACLES_CHANGED, gridNavigationTasks[currentPlanExecutionIndex - 1]);
        // WE REGISTER THE CURRENT ONE
        neighborAgents.observable.registerObserver(Event.NEIGBHOR_AGENTS_CHANGED, gridNavigationTasks[currentPlanExecutionIndex]);
        neighborObstacles.observable.registerObserver(Event.NEIGBHOR_DYNAMIC_OBSTACLES_CHANGED, gridNavigationTasks[currentPlanExecutionIndex]);

        // TODo: NOT SURE IF THIS IS CORREECT unregister with its old goal  for previous task
        globalPath[0].unregisterObserver(Event.STATE_POSITION_CHANGED, gridNavigationTasks[currentPlanExecutionIndex - 1]);

        // JUST MANUALLY SENDING IT A START STATE CHANGED EVENT
        Vector3[] data = new Vector3[2];
        data[0] = gridNavigationTasks[currentPlanExecutionIndex].startState.getPosition();
        data[1] = currentState.getPosition();
        gridNavigationTasks[currentPlanExecutionIndex].notifyEvent(Event.STATE_POSITION_CHANGED, data);

        // IMP :: we need to make the next task monitor the current start state now + unregister to previous start state
        gridNavigationTasks[currentPlanExecutionIndex].startState = currentState;

        currentState.registerObserver(Event.STATE_POSITION_CHANGED, gridNavigationTasks[currentPlanExecutionIndex]);

        gridNavigationTasks[currentPlanExecutionIndex].notifyEvent(Event.CURRENT_EXECUTING_TASK, null);
    }