⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soccerbase.cpp

📁 linux 下的机器人足球仿真平台
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*-   this file is part of rcssserver3D   Fri May 9 2003   Copyright (C) 2002,2003 Koblenz University   Copyright (C) 2003 RoboCup Soccer Server 3D Maintenance Group   $Id: soccerbase.cpp,v 1.21 2007/06/17 10:48:49 jboedeck Exp $   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; version 2 of the License.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.*/#include "soccerbase.h"#include <oxygen/physicsserver/body.h>#include <oxygen/physicsserver/spherecollider.h>#include <oxygen/agentaspect/perceptor.h>#include <oxygen/agentaspect/agentaspect.h>#include <oxygen/sceneserver/sceneserver.h>#include <oxygen/sceneserver/scene.h>#include <oxygen/sceneserver/transform.h>#include <oxygen/controlaspect/controlaspect.h>#include <oxygen/gamecontrolserver/gamecontrolserver.h>#include <soccer/gamestateaspect/gamestateaspect.h>#include <soccer/soccerruleaspect/soccerruleaspect.h>#include <soccer/agentstate/agentstate.h>#include <soccer/ball/ball.h>#include <oxygen/physicsserver/space.h>#include <zeitgeist/leaf.h>using namespace boost;using namespace zeitgeist;using namespace oxygen;using namespace std;using namespace salt;boolSoccerBase::GetSceneServer(const Leaf& base,                           shared_ptr<SceneServer>& scene_server){    scene_server = shared_static_cast<SceneServer>        (base.GetCore()->Get("/sys/server/scene"));    if (scene_server.get() == 0)    {        base.GetLog()->Error()            << "Error: (SoccerBase: " << base.GetName()            << ") scene server not found.\n";        return false;    }    return true;}boolSoccerBase::GetTransformParent(const Leaf& base,                               shared_ptr<Transform>& transform_parent){    transform_parent = shared_dynamic_cast<Transform>        ((base.FindParentSupportingClass<Transform>()).lock());    if (transform_parent.get() == 0)    {        base.GetLog()->Error()            << "Error: (SoccerBase: " << base.GetName()            << ") parent node is not derived from TransformNode\n";        return false;    }    return true;}boolSoccerBase::GetAgentState(const shared_ptr<Transform> transform,                          shared_ptr<AgentState>& agent_state){    agent_state =        shared_dynamic_cast<AgentState>(transform->GetChild("AgentState", true));    if (agent_state.get() == 0)    {        return false;    }    return true;}boolSoccerBase::GetAgentBody(const shared_ptr<Transform> transform,                          shared_ptr<Body>& agent_body){    agent_body = transform->FindChildSupportingClass<Body>(true);    if (agent_body.get() == 0)    {        transform->GetLog()->Error()            << "(SoccerBase) ERROR: " << transform->GetName()            << " node has no Body child\n";        return false;    }    return true;}boolSoccerBase::GetAgentBody(const Leaf& base, TTeamIndex idx,                         int unum, shared_ptr<Body>& agent_body){    shared_ptr<AgentState> agentState;    shared_ptr<Transform>  parent;    // get matching AgentState    if (!GetAgentState(base, idx, unum, agentState))        return false;    // get AgentAspect    if (!GetTransformParent(*agentState, parent))        return false;    // call GetAgentBody with matching AgentAspect    return GetAgentBody(parent, agent_body);}boolSoccerBase::GetAgentState(const Leaf& base,                          shared_ptr<AgentState>& agent_state){    shared_ptr<Transform> parent;    if (! GetTransformParent(base,parent))    {        return false;    }    return GetAgentState(parent,agent_state);}boolSoccerBase::GetAgentState(const Leaf& base, TTeamIndex idx,                          int unum, shared_ptr<AgentState>& agentState){       static TAgentStateMap mAgentStateMapLeft;    static TAgentStateMap mAgentStateMapRight;         if (idx == TI_NONE)        return false;        // do we have a cached reference?    if (        idx == TI_LEFT &&        !mAgentStateMapLeft.empty()        )        {            TAgentStateMap::iterator iter = mAgentStateMapLeft.find(unum);            if (iter != mAgentStateMapLeft.end())                {                    // is the pointer to the parent (AgentAspect) still valid                     // (maybe the agent disconnected)?                    if (!(iter->second)->GetParent().lock().get())                        {                            base.GetLog()->Error() << "(SoccerBase) WARNING: "                                                   << "AgentState has invalid parent! "                                                   << "The agent probably disconnected, removing from map."                                                   << "\n";                            mAgentStateMapLeft.erase(iter);                        }                    else                        {                            agentState = (*iter).second;                            return true;                        }                }        }    else if (             idx == TI_RIGHT &&             !mAgentStateMapRight.empty()               )        {            TAgentStateMap::iterator iter = mAgentStateMapRight.find(unum);            if (iter != mAgentStateMapRight.end())                {                    // is the pointer to the parent (AgentAspect) still valid                     // (maybe the agent disconnected)?                    if ((iter->second)->GetParent().lock().get() == 0)                        {                            base.GetLog()->Error() << "(SoccerBase) WARNING: "                                                   << "AgentState has invalid parent! "                                                   << "The agent probably disconnected, removing from map."                                                   << "\n";                            mAgentStateMapRight.erase(iter);                        }                    else                        {                            agentState = (*iter).second;                            return true;                        }                }        }    // we have to get all agent states for this team    TAgentStateList agentStates;    GetAgentStates(base, agentStates, idx);    for (TAgentStateList::iterator iter = agentStates.begin();         iter != agentStates.end();         ++iter)        {            if ((*iter)->GetUniformNumber() == unum)            {                agentState = *iter;                if (idx == TI_LEFT)                    {                        mAgentStateMapLeft[unum] = agentState;                    }                else                    {                        mAgentStateMapRight[unum] = agentState;                    }                return true;            }        }       return false;}boolSoccerBase::GetAgentStates(const zeitgeist::Leaf& base,                           TAgentStateList& agentStates,                           TTeamIndex idx){    static shared_ptr<GameControlServer> gameCtrl;        if (gameCtrl.get() == 0)    {        GetGameControlServer(base, gameCtrl);            if (gameCtrl.get() == 0)        {            base.GetLog()->Error() << "(SoccerBase) ERROR: can't get "                                   << "GameControlServer\n";            return false;        }    }    GameControlServer::TAgentAspectList aspectList;    gameCtrl->GetAgentAspectList(aspectList);    GameControlServer::TAgentAspectList::iterator iter;    shared_ptr<AgentState> agentState;            for (         iter = aspectList.begin();         iter != aspectList.end();         ++iter         )        {            agentState = shared_dynamic_cast<AgentState>((*iter)->GetChild("AgentState", true));                        if (                                agentState.get() != 0 &&                                (                 agentState->GetTeamIndex() == idx ||                 idx == TI_NONE                 )                )                {                    agentStates.push_back(agentState);                }               }        return true;}boolSoccerBase::GetGameState(const Leaf& base,                         shared_ptr<GameStateAspect>& game_state){    game_state = shared_dynamic_cast<GameStateAspect>        (base.GetCore()->Get("/sys/server/gamecontrol/GameStateAspect"));    if (game_state.get() == 0)    {        base.GetLog()->Error()            << "Error: (SoccerBase: " << base.GetName()            << ") found no GameStateAspect\n";        return false;    }    return true;}boolSoccerBase::GetSoccerRuleAspect(const Leaf& base,                                shared_ptr<SoccerRuleAspect> & soccer_rule_aspect){    soccer_rule_aspect = shared_dynamic_cast<SoccerRuleAspect>        (base.GetCore()->Get("/sys/server/gamecontrol/SoccerRuleAspect"));    if (soccer_rule_aspect.get() == 0)    {        base.GetLog()->Error()            << "Error: (SoccerBase: " << base.GetName()            << " found no SoccerRuleAspect\n";        return false;    }    return true;}boolSoccerBase::GetGameControlServer(const Leaf& base,                                shared_ptr<GameControlServer> & game_control_server){    static shared_ptr<GameControlServer> gameControlServer;    if (gameControlServer.get() == 0)    {        gameControlServer = shared_dynamic_cast<GameControlServer>            (base.GetCore()->Get("/sys/server/gamecontrol"));        if (gameControlServer.get() == 0)        {            base.GetLog()->Error()                << "Error: (SoccerBase: " << base.GetName()                << " found no GameControlServer\n";            return false;        }    }    game_control_server = gameControlServer;    return true;}boolSoccerBase::GetActiveScene(const Leaf& base,                           shared_ptr<Scene>& active_scene){    static shared_ptr<SceneServer> sceneServer;        if (sceneServer.get() == 0)    {        if (! GetSceneServer(base,sceneServer))        {            base.GetLog()->Error()                << "(SoccerBase) ERROR: " << base.GetName()                << ", could not get SceneServer\n";                        return false;        }    }    active_scene = sceneServer->GetActiveScene();        if (active_scene.get() == 0)    {        base.GetLog()->Error()            << "ERROR: (SoccerBase: " << base.GetName()            << ", SceneServer reports no active scene\n";                return false;    }        return true;}boolSoccerBase::GetBody(const Leaf& base, shared_ptr<Body>& body){    shared_ptr<Transform> parent;    if (! GetTransformParent(base,parent))

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -