An Intelligent Action Algorithm for Virtual Human Agents. Undeger; Isler; Ipekkan (2001)

Type of Research: Academic probably funded by military.

Summary:
This article presents a method for moving intelligent agents across a 3D landscape towards a common goal.

Part of this problem, of course, includes determining Line of Sight (LOS) for the agents.

The algorithm for individual agent movement is:

Main loop
For each group
     For each agent

          If the agent is a red team member (intelligent agent)
               Construct the sensor detection list (perceptions) for the agent; > (A)
               Analyse the detected list and update the knowledgebase; > (B)
               Execute behavior module; > (C)

          Update the pysical appearance;

A
Backup the previous detected list and create a new list;

For each group
     For each agent (target) except himself
          Calculate the seeing and hearing statistics between the agent and the target; > (D)

B
For each member of detected list

If the detection exists in the previous list and unsensed because of the probability test and no probability change occurred after that time

     Mark the member of new detected list as “unsensed”;

For each sensed member of new detected list

Do a comparison to knowledgebase, find the similarities;

If similarity found

Update the knowledge and check the member of detected list as “similarity_found”;

For each member of new detected list which is not checked as “similarity_found”

Do a probability test and if it is passed
     Add the list member to the knowledgebase as a new perception;
Else
     Check the member of detected list as “unsensed”;

C
Find who the commander is;
Find the status of the mission plan;
If the agent is a commander
If there is no abnormal condition
Follow the path;
Else
Execute the reaction planning module;

Else

If there is no abnormal condition
If the commander position is known
Follow the commander;
Else
Stop and search for the commander;
Else
Execute the reaction planning module;
D
Compute the statistics between the agent and the target (line of sight, viewing angle, range, etc.);

If there is any possibility of detection, add the perception to the detected list;

Comments:
The authors are using a DTED map file and seem to have duplicated much of the work that my group and I completed in 1995 for The War College (below):

They also use an extremely simplified movement matrix (1 movement point when crossing an embedded graph cells vertically or horizontally and 1.4 movement points when crossing a cell diagonally). They do not factor in any terrain costs (woods versus grassland versus swamp, etc.). They do, however, calculate slope and adjust movement accordingly.

Their algorithm for coordinated agent movement follows:

Description
Peusedo Code
Create the world database. Create the DTED matrix
cPlatoon * plt; cAgent * agent; cGoalPoint * point; cGoalItem * item
world->Initialize();
world->Create_World(...);
world->Create_DTED(...);
Add a group and two agents to the environment
plt = world->Add_Group( GroupRed );
agent = plt->Add_Agent(...);
agent = plt->Add_Agent(...);
Set group position and formation of the agents
plt->SetGroupPosition( 9163.0, 10259.0 );
plt->Set_Agents_Group_Formation(8,true);
Get the starting control point. Add a goal item for the point. Move fast to the next point
point = plt->plt_goals->GetObjectFromIndex(0);
point->movingstate = MovingFast;
Goal item
1.1
Item=point->Add_GoalItem(giWaitUntilReceiveKeyword);
item->data.ReceiveFromID = 1;
item->SetKeyword("First Step Go...");
Add a control point
point = plt->Add_Plt_GoalPoint( gpPassThrough, 9345.0, 9742.0 );
point = plt->Add_Plt_GoalPoint( gpTactical , 9220.0, 9595.0 );
Add a tactical control point. Wait until the group 2 leaves from point 3
point = plt->Add_Plt_GoalPoint( gpTactical , 8945.0, 9270.0 );
Goal item
3.1
item= point ->Add_GoalItem(giWaitUntilContinueMission);
item->data.ReceiveFromID = 2;
item->data.GoalPointID = 3;
Add another tactical control point. Wait until group 1 arrives at point 5. When ready to continue, send a keyword to group 1. Wait for a response from group 1 to leave the point. Move slow to the next point
point = plt->Add_Plt_GoalPoint( gpTactical , 8945.0, 9270.0 );
point ->movingstate = MovingSlow;
Goal item
4.1
item = point ->Add_GoalItem(giWaitUntilArrival);
item->data.ReceiveFromID = 1;
item->data.GoalPointID = 5;
Goal item
4.2
item = point ->Add_GoalItem(giReadyToContinueDo);
item->data.doAction = doSendKeyword;
item->data.SendToID = 1;
item->SetKeyword("Group 3 Ready");
Goal item
4.3
item = point ->Add_GoalItem(giWaitUntilResponseKeyword);
item->data.ReceiveFromID = 1;
item->SetKeyword("Mission Start");
Add the target point. Put a bomb to the point and move fast after leaving. While leaving the point send the keyword “mission completed”
point = plt->Add_Plt_GoalPoint( gpTarget , 8935.0, 9130.0 );
point ->movingstate = MovingFast;
Goal item
5.1
item = point ->Add_GoalItem(giArrivalDo);
item->data.doAction = doPutBomb;
Goal item
5.2
item = point ->Add_GoalItem(giContinueMissionDo);
item->data.doAction = doSendKeyword;
item->data.SendToID = -1;
item->SetKeyword("Mission Complete");
Add another control point
point = plt->Add_Plt_GoalPoint( gpPassThrough, 9212.0, 9124.0 );
Home point
point = plt->Add_Plt_GoalPoint( gpHome , 9683.0, 8400.0 );



Copyright© 2007 — D. Ezra Sidran — Scarab Industries

HTML version by: Ralph the Wizard - Wizard Information Technology Services, LLC