Commit 1b3d7b4a authored by DURGESH P SAMANT's avatar DURGESH P SAMANT

Teammate and Opponent high level features ordered by proximity to agent

parent fe899441
...@@ -30,8 +30,8 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -30,8 +30,8 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
const SelfObject& self = wm.self(); const SelfObject& self = wm.self();
const Vector2D& self_pos = self.pos(); const Vector2D& self_pos = self.pos();
const float self_ang = self.body().radian(); const float self_ang = self.body().radian();
const PlayerCont& teammates = wm.teammates(); const PlayerPtrCont& teammates = wm.teammatesFromSelf();
const PlayerCont& opponents = wm.opponents(); const PlayerPtrCont& opponents = wm.opponentsFromSelf();
float maxR = sqrtf(SP.pitchHalfLength() * SP.pitchHalfLength() float maxR = sqrtf(SP.pitchHalfLength() * SP.pitchHalfLength()
+ SP.pitchHalfWidth() * SP.pitchHalfWidth()); + SP.pitchHalfWidth() * SP.pitchHalfWidth());
// features about self pos // features about self pos
...@@ -89,10 +89,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -89,10 +89,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// Features[9 - 9+T]: teammate's open angle to goal // Features[9 - 9+T]: teammate's open angle to goal
int detected_teammates = 0; int detected_teammates = 0;
for (PlayerCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) { for (PlayerPtrCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) {
const PlayerObject& teammate = *it; const PlayerObject* teammate = *it;
if (valid(teammate) && detected_teammates < numTeammates) { if (valid(teammate) && detected_teammates < numTeammates) {
addNormFeature(calcLargestGoalAngle(wm, teammate.pos()), 0, M_PI); addNormFeature(calcLargestGoalAngle(wm, teammate->pos()), 0, M_PI);
detected_teammates++; detected_teammates++;
} }
} }
...@@ -104,10 +104,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -104,10 +104,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// Features[9+T - 9+2T]: teammates' dists to closest opps // Features[9+T - 9+2T]: teammates' dists to closest opps
if (numOpponents > 0) { if (numOpponents > 0) {
detected_teammates = 0; detected_teammates = 0;
for (PlayerCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) { for (PlayerPtrCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) {
const PlayerObject& teammate = *it; const PlayerObject* teammate = *it;
if (valid(teammate) && detected_teammates < numTeammates) { if (valid(teammate) && detected_teammates < numTeammates) {
calcClosestOpp(wm, teammate.pos(), th, r); calcClosestOpp(wm, teammate->pos(), th, r);
addNormFeature(r, 0, maxR); addNormFeature(r, 0, maxR);
detected_teammates++; detected_teammates++;
} }
...@@ -124,10 +124,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -124,10 +124,10 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// Features [9+2T - 9+3T]: open angle to teammates // Features [9+2T - 9+3T]: open angle to teammates
detected_teammates = 0; detected_teammates = 0;
for (PlayerCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) { for (PlayerPtrCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) {
const PlayerObject& teammate = *it; const PlayerObject* teammate = *it;
if (valid(teammate) && detected_teammates < numTeammates) { if (valid(teammate) && detected_teammates < numTeammates) {
addNormFeature(calcLargestTeammateAngle(wm, self_pos, teammate.pos()),0,M_PI); addNormFeature(calcLargestTeammateAngle(wm, self_pos, teammate->pos()),0,M_PI);
detected_teammates++; detected_teammates++;
} }
} }
...@@ -138,16 +138,16 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -138,16 +138,16 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// Features [9+3T - 9+6T]: x, y, unum of teammates // Features [9+3T - 9+6T]: x, y, unum of teammates
detected_teammates = 0; detected_teammates = 0;
for (PlayerCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) { for (PlayerPtrCont::const_iterator it=teammates.begin(); it != teammates.end(); ++it) {
const PlayerObject& teammate = *it; const PlayerObject* teammate = *it;
if (valid(teammate) && detected_teammates < numTeammates) { if (valid(teammate) && detected_teammates < numTeammates) {
if (playingOffense) { if (playingOffense) {
addNormFeature(teammate.pos().x, -tolerance_x, SP.pitchHalfLength() + tolerance_x); addNormFeature(teammate->pos().x, -tolerance_x, SP.pitchHalfLength() + tolerance_x);
} else { } else {
addNormFeature(teammate.pos().x, -SP.pitchHalfLength()-tolerance_x, tolerance_x); addNormFeature(teammate->pos().x, -SP.pitchHalfLength()-tolerance_x, tolerance_x);
} }
addNormFeature(teammate.pos().y, -tolerance_y - SP.pitchHalfWidth(), SP.pitchHalfWidth() + tolerance_y); addNormFeature(teammate->pos().y, -tolerance_y - SP.pitchHalfWidth(), SP.pitchHalfWidth() + tolerance_y);
addFeature(teammate.unum()); addFeature(teammate->unum());
detected_teammates++; detected_teammates++;
} }
} }
...@@ -160,16 +160,16 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -160,16 +160,16 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// Features [9+6T - 9+6T+3O]: x, y, unum of opponents // Features [9+6T - 9+6T+3O]: x, y, unum of opponents
int detected_opponents = 0; int detected_opponents = 0;
for (PlayerCont::const_iterator it = opponents.begin(); it != opponents.end(); ++it) { for (PlayerPtrCont::const_iterator it = opponents.begin(); it != opponents.end(); ++it) {
const PlayerObject& opponent = *it; const PlayerObject* opponent = *it;
if (valid(opponent) && detected_opponents < numOpponents) { if (valid(opponent) && detected_opponents < numOpponents) {
if (playingOffense) { if (playingOffense) {
addNormFeature(opponent.pos().x, -tolerance_x, SP.pitchHalfLength() + tolerance_x); addNormFeature(opponent->pos().x, -tolerance_x, SP.pitchHalfLength() + tolerance_x);
} else { } else {
addNormFeature(opponent.pos().x, -SP.pitchHalfLength()-tolerance_x, tolerance_x); addNormFeature(opponent->pos().x, -SP.pitchHalfLength()-tolerance_x, tolerance_x);
} }
addNormFeature(opponent.pos().y, -tolerance_y - SP.pitchHalfWidth(), SP.pitchHalfWidth() + tolerance_y); addNormFeature(opponent->pos().y, -tolerance_y - SP.pitchHalfWidth(), SP.pitchHalfWidth() + tolerance_y);
addFeature(opponent.unum()); addFeature(opponent->unum());
detected_opponents++; detected_opponents++;
} }
} }
...@@ -190,3 +190,13 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm, ...@@ -190,3 +190,13 @@ HighLevelFeatureExtractor::ExtractFeatures(const rcsc::WorldModel& wm,
// checkFeatures(); // checkFeatures();
return feature_vec; return feature_vec;
} }
bool HighLevelFeatureExtractor::valid(const rcsc::PlayerObject* player) {
if (!player) {return false;} //avoid segfaults
const rcsc::Vector2D& pos = player->pos();
if (!player->posValid()) {
return false;
}
return pos.isValid();
}
...@@ -23,6 +23,10 @@ public: ...@@ -23,6 +23,10 @@ public:
virtual const std::vector<float>& ExtractFeatures(const rcsc::WorldModel& wm, virtual const std::vector<float>& ExtractFeatures(const rcsc::WorldModel& wm,
bool last_action_status); bool last_action_status);
//override FeatureExtractor::valid
//this method takes a pointer instead of a reference
static bool valid(const rcsc::PlayerObject* player);
protected: protected:
// Number of features for non-player objects. // Number of features for non-player objects.
const static int num_basic_features = 10; const static int num_basic_features = 10;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment