1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
| scoreLeft: 左侧队伍的当前得分。 scoreRight: 右侧队伍的当前得分。 time: 当前的时间戳。 gameTime: 当前比赛的总时间。 playMode: 当前游戏模式(例如,进攻模式、防守模式等)。 lastPlayMode: 上一个游戏模式。 lastDifferentPlayMode: 上一个与当前不同的游戏模式。 uNum: 当前玩家的编号。 side: 当前玩家所在的队伍,SIDE_LEFT 或 SIDE_RIGHT。 uNumSet: 玩家编号是否已设置。 sideSet: 队伍(左或右)是否已设置。 worldObjects[NUM_WORLD_OBJS]: 存储世界中所有对象的位置(例如,队员、球、门柱等)。 myPosition: 当前玩家的位置。 myAngDegrees: 当前玩家的朝向(角度表示)。 confident: 玩家对自己的定位是否有信心。 myLastPosition: 上一个周期内玩家的位置。 myLastAngDegrees: 上一个周期内玩家的朝向。 rvsend: 发送用于调试或数据传输的 RVSender 对象。 fUseGroundTruthDataForLocalization: 是否使用地面真值数据进行定位(用于调试)。 myPositionGroundTruth: 地面真值下的玩家位置(用于调试)。 myAngGroundTruth: 地面真值下的玩家朝向(用于调试)。 ballGroundTruth: 地面真值下的球的位置(用于调试)。 lastBallSightingTime: 上一次看到球的时间。 lastLineSightingTime: 上一次看到线(场地边界)的时间。 lastBallSeenPosition: 上一次看到球的位置。 lastBallSeenTime: 上一次看到球的时间戳。 lastSkills: 存储最近的两个技能(例如,传球、射门等)。 executedSkillsForOdometry: 存储执行过的技能,用于计算里程计。 lastOdometryPos: 上一次的里程计位置。 lastOdometryAngDeg: 上一次的里程计朝向角度。 fLocalized: 当前玩家是否已经定位(在场地上)。 fFallen: 玩家是否已经倒地。 localToGlobal: 本地坐标系到全局坐标系的转换矩阵。 globalToLocal: 全局坐标系到本地坐标系的转换矩阵。 fallenTeammate: 记录队友是否倒地的状态。 fallenOpponent: 记录对手是否倒地的状态。 opponentTeamName: 对手队伍的名称。 ballKalmanFilter: 用于估计球位置的卡尔曼滤波器。 opponentKalmanFilters: 用于估计对手玩家位置的卡尔曼滤波器。 teammateLastHeardTime[NUM_AGENTS]: 存储每个队友最后一次听到的时间。 2. 成员函数 构造与析构 WorldModel(): 构造函数,初始化 WorldModel 类实例。 ~WorldModel(): 析构函数,释放 WorldModel 类实例占用的资源。 基本设置与获取 setMyConfidence(bool confidence): 设置玩家是否有信心进行定位(用于控制是否依赖定位信息)。 getMyConfidence() const: 获取玩家的定位信心。 getWorldObject(int index): 获取指定位置的世界对象(例如,队友、对手、球等)。 updateGoalPostsAndFlags(): 更新球场上的球门位置和旗帜位置。 updateMatricesAndMovingObjs(VecPosition& fieldXPlusYPlus, VecPosition& fieldXPlusYMinus, VecPosition& fieldXMinusYPlus, VecPosition& fieldXMinusYMinus): 更新移动物体和矩阵信息(用于球场上物体的坐标转换)。 setMyPosition(const VecPosition& newPos): 设置玩家的新位置。 setMyPosition(const SIM::Point2D& newPos): 设置玩家的新位置(使用 2D 点)。 getMyPosition() const: 获取玩家的位置。 setMyAngDeg(SIM::AngDeg newAng): 设置玩家的新朝向(角度)。 setMyAngRad(SIM::AngRad newAng): 设置玩家的新朝向(弧度)。 getMyAngDeg() const: 获取玩家当前的朝向角度。 getMyAngRad() const: 获取玩家当前的朝向弧度。 setMyLastPosition(const VecPosition& newPos): 设置玩家上一次的位置。 getMyLastPosition() const: 获取玩家上一次的位置。 setMyLastAngDeg(SIM::AngDeg newAng): 设置玩家上一次的朝向角度。 setMyLastAngRad(SIM::AngRad newAng): 设置玩家上一次的朝向弧度。 getMyLastAngDeg() const: 获取玩家上一次的朝向角度。 getMyLastAngRad() const: 获取玩家上一次的朝向弧度。 getRVSender() const: 获取 RVSender 对象(用于调试)。 setUseGroundTruthDataForLocalization(bool fUseGroundTruthDataForLocalization): 设置是否使用地面真值数据进行定位。 useGroundTruthDataForLocalization(): 获取是否使用地面真值数据进行定位。 setMyPositionGroundTruth(const VecPosition& newPos): 设置地面真值下的玩家位置(用于调试)。 getMyPositionGroundTruth() const: 获取地面真值下的玩家位置。 setMyAngDegGroundTruth(double angDeg): 设置地面真值下的玩家朝向角度。 getMyAngDegGroundTruth() const: 获取地面真值下的玩家朝向角度。 setBallGroundTruth(VecPosition newBall): 设置地面真值下的球的位置。 getBallGroundTruth() const: 获取地面真值下的球的位置。 setLastBallSightingTime(double lastTime): 设置最后一次看到球的时间。 getLastBallSightingTime() const: 获取最后一次看到球的时间。 setLastLineSightingTime(double lastTime): 设置最后一次看到线的时间。 getLastLineSightingTime() const: 获取最后一次看到线的时间。 setLastBallSeenPosition(VecPosition position): 设置最后一次看到球的位置。 getLastBallSeenPosition() const: 获取最后一次看到球的位置。 setLastBallSeenTime(double time): 设置最后一次看到球的时间戳。 getLastBallSeenTime() const: 获取最后一次看到球的时间戳。 getCycle() const: 获取当前周期数。 incrementCycle(): 增加周期数。 setCycle(const unsigned long& cycle): 设置当前周期数。 getScoreLeft() const: 获取左队得分。 setScoreLeft(const int& scoreLeft): 设置左队得分。 getScoreRight() const: 获取右队得分。 setScoreRight(const int& scoreRight): 设置右队得分。 getTime() const: 获取当前时间戳。 setTime(const double& time): 设置当前时间戳。 getGameTime() const: 获取比赛的总时间。 setGameTime(const double& gameTime): 设置比赛的总时间。 getPlayMode() const: 获取当前的游戏模式。 setPlayMode(const int& playMode): 设置当前的游戏模式。 getLastPlayMode() const: 获取上一个游戏模式。 setLastPlayMode(const int& lastPlayMode): 设置上一个游戏模式。 getLastDifferentPlayMode() const: 获取上一个不同的游戏模式。 setLastDifferentPlayMode(const int& lastDifferentPlayMode): 设置上一个不同的游戏模式。 getUNum() const: 获取玩家的编号。 setUNum(const int& uNum): 设置玩家的编号。 getUNumSet() const: 获取玩家编号是否已设置。 setUNumSet(const bool& uNumSet): 设置玩家编号是否已设置。 getLastSkill() const: 获取最近执行的技能。 getPreviousLastSkill() const: 获取前一个执行的技能。 setLastSkill(const SkillType& lastSkill): 设置最近执行的技能。 addExecutedSkill(const SkillType& skill): 添加执行过的技能,用于计算里程计,根据nanbehaviors.h中可用的方法 // 构造函数 NaoBehavior(const std::string teamName, int uNum, const map<string, string>& namedParams_, const string& rsg_); // 析构函数 virtual ~NaoBehavior(); // 初始化方法 std::string Init() // 思考方法,根据传入的消息做出决策 std::string Think(const std::string& message); // 设置监控消息 void setMonMessage(const std::string& msg); // 获取监控消息 std::string getMonMessage(); // 获取运动核心 MotionCore* getCore() // 重置技能 void resetSkills(); // 重置比例 void resetScales(); // 刷新 void refresh(); // 执行动作 void act(); // 选择技能(由子类实现) SkillType selectSkill(); // 设置上场位置(由子类实现) void beam(double& beamX, double& beamY, double& beamAngle); // 更新适应度(可以为空的虚函数) void updateFitness(); // 检查是否跌倒 bool checkingFall(); // 将值限制在[min, max]范围内 double trim(const double& value, const double& min, const double& max); // 返回能够最好地近似所需行走方向和旋转的技能 SkillType getWalk(const double& direction, const double& rotation, double speed = 1.0, bool fAllowOver180Turn=false); // 通过指定的行走参数集和方向返回合适的行走技能 SkillType getWalk(WalkRequestBlock::ParamSet paramSet, const double& direction, double rotation, double speed, bool fAllowOver180Turn=false); // 返回到达目标位置并面向目标旋转的技能 SkillType goToTargetRelative(const VecPosition& targetLoc, const double& targetRot, double speed=1, bool fAllowOver180Turn=false, WalkRequestBlock::ParamSet paramSet=WalkRequestBlock::PARAMS_DEFAULT); // 走向指定目标 SkillType goToTarget(const VecPosition &target); // 碰撞避免 VecPosition collisionAvoidance(bool avoidTeammate, bool avoidOpponent, bool avoidBall, double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, bool fKeepDistance=true); // 碰撞避免修正 VecPosition collisionAvoidanceCorrection(VecPosition start, double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, VecPosition obstacle); // 碰撞避免接近 VecPosition collisionAvoidanceApproach(double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, VecPosition obstacle); // 带起点的碰撞避免接近 VecPosition collisionAvoidanceApproach(VecPosition start, double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, VecPosition obstacle); // 绕球导航 VecPosition navigateAroundBall(VecPosition target, double PROXIMITY_THRESH, double COLLISION_THRESH); // 重置踢球状态 void resetKickState(); // 计算踢球成本 double computeKickCost(VecPosition target, SkillType kickType); // 踢球 SkillType kickBall(const int kickTypeToUse, const VecPosition &target, const double kickVerticalAngle=0.0); // 向预设目标踢球 SkillType kickBallAtPresetTarget(); // 获取目标的距离和角度 void getTargetDistanceAndAngle(const VecPosition &target, double &distance, double &angle); // 简单定位踢球 SkillType kickBallAtTargetSimplePositioning(const VecPosition &targetToKickAt, SkillType kick_skill, int kickType); // 返回最大前进速度下可以行走的最大方向角度 double getLimitingAngleForward(); // 是否可以上场 bool beamablePlayMode(); // 是否是不合适的比赛模式 bool improperPlayMode(); // 是否是不合适的比赛模式(指定模式) bool improperPlayMode(int pm); // 是否是踢球模式 bool kickPlayMode(); // 是否是踢球模式(指定模式) bool kickPlayMode(int pm, bool eitherTeam=false); // 是否是间接任意球 bool isIndirectKick(); // 是否是间接任意球(指定模式) bool isIndirectKick(int pm); // 从文件读取技能 void readSkillsFromFile(const std::string& filename); // 是否是右技能 bool isRightSkill(SkillType skill); // 是否是左技能 bool isLeftSkill(SkillType skill); // 获取参数 double getParameter(const std::string& name); // 获取标准名称参数 double getStdNameParameter(const SkillType kick_skill, const std::string& parameter); // 获取踢球类型对应的技能 void getSkillsForKickType(int kickType, SkillType skillsForType[]);
// 测试示例行为 SkillType test();
// 强力策略 SkillType strongStrategy();
// 传球给队友 SkillType passToTeammate();及kick.cc文件// 获取指定参数的值 double NaoBehavior::getParameter(const string& name);
// 获取标准名称参数 double NaoBehavior::getStdNameParameter(const SkillType kick_skill, const string& parameter);
// 获取踢球类型对应的技能 void NaoBehavior::getSkillsForKickType(int kickType, SkillType skills[]);
// 避免与球发生碰撞并调整路径 VecPosition NaoBehavior::navigateAroundBall(VecPosition target, double PROXIMITY_THRESH, double COLLISION_THRESHOLD);
// 获取碰撞避免的目标位置修正 VecPosition NaoBehavior::collisionAvoidanceCorrection(VecPosition start, double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, VecPosition obstacle);
// 获取可行的行走路径,避免碰撞 VecPosition NaoBehavior::collisionAvoidance(bool avoidTeammate, bool avoidOpponent, bool avoidBall, double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, bool fKeepDistance);
// 获取接近目标的路径 VecPosition NaoBehavior::collisionAvoidanceApproach(double PROXIMITY_THRESH, double COLLISION_THRESH, VecPosition target, VecPosition obstacle);
// 获取目标距离和角度 void NaoBehavior::getTargetDistanceAndAngle(const VecPosition &target, double &distance, double &angle); 和#ifndef HEADERS_H #define HEADERS_H using std::map; using std::string; using std::stringstream;
// TODO: 是否有更好的方法将字符串映射到枚举类型??? // 该类的作用是:将字符串和枚举类型之间进行映射 template<typename T> class EnumParser { map<string, T> string2enum; // 存储字符串到枚举的映射 map<T, string> enum2String; // 存储枚举到字符串的映射
EnumParser(); // 私有构造函数 EnumParser(const EnumParser& that); // 禁用复制构造函数
// 根据字符串值获取枚举类型 T _getEnumFromString(const string &value) const { if( string2enum.find( value ) != string2enum.end() ) { return string2enum.find( value )->second; } else { throw "string->enum mapping doesn't exist for " + value; // 如果映射不存在,抛出异常 } }
// 根据枚举值获取字符串 string _getStringFromEnum(const T &value) const { if( enum2String.find( value ) != enum2String.end() ) { return enum2String.find( value )->second; } else { stringstream ss; ss << "enum->string mapping doesn't exist. "; ss << value; throw ss.str(); // 如果映射不存在,抛出异常 } }
|
评论区
欢迎你留下宝贵的意见,昵称输入QQ号会显示QQ头像哦~