Decision Module  1.0
ICRA2020 AI Challenge Northwestern Polytechnical University Aoxiang Team Strategy Code
blackboard.h
Go to the documentation of this file.
1 //
2 // Created by kehan on 2020/3/1.
3 //
4 
5 #ifndef ROBORTS_ROBORTS_DECISION_BLACKBOARD_BLACKBOARD_H_
6 #define ROBORTS_ROBORTS_DECISION_BLACKBOARD_BLACKBOARD_H_
7 
8 #include <roborts_msgs/RobotStatus.h>
9 #include <ros/ros.h>
10 #include <geometry_msgs/PoseStamped.h>
11 #include <geometry_msgs/Point32.h>
12 
13 #include <std_msgs/Int32.h>
14 #include "roborts_msgs/BuffZoneStatus.h"
15 #include "roborts_msgs/GameSurvivor.h"
16 #include "roborts_msgs/OutpostDetected.h"
17 
18 #include "../../roborts_common/math/math.h"
19 
20 #include "blackboard_common.h"
21 #include "enemy_robot.h"
22 #include "my_robot.h"
23 #include "prediction_system.h"
24 #include "field.h"
25 
26 namespace roborts_decision {
27 
28 struct PointValue {
29  roborts_common::Point2D point;
30  double value = 0;
31 };
32 
35 class Blackboard {
36 public:
37  typedef std::shared_ptr<Blackboard> Ptr;
39  explicit Blackboard(std::shared_ptr<MyRobot> &p_myrobot1,
40  std::shared_ptr<MyRobot> &p_myrobot2,
41  const ros::NodeHandle &nh = ros::NodeHandle("~"));
42  virtual ~Blackboard();
43 
44  Blackboard(const Blackboard&) = delete;
45  Blackboard(Blackboard&&) = delete;
46 
48  static std::shared_ptr<Blackboard> GetBlackboard();
49 
50 
52  const std::shared_ptr<MyRobot> &GetMyRobot1();
54  const std::shared_ptr<MyRobot> &GetMyRobot2();
55 
60 
62  const EnemyRobot &GetAnotherRobot(const EnemyRobot &enemy_robot);
64  const std::shared_ptr<MyRobot> &GetAnotherRobot(const std::shared_ptr<MyRobot>& p_my_robot) const;
65 
66 
68  void Update();
69 
71  MyColor GetMyColor() const;
72 
75  RobotBehavior GetCommonMoveType(const std::shared_ptr<MyRobot> &my_robot);
76 
79  std::vector<EnemyRobot> GetDangerousOpp(const std::shared_ptr<MyRobot> &p_my_robot);
80 
84  roborts_common::Point2D GetAttackRunningPoint(const std::shared_ptr<MyRobot> &p_my_robot,
85  const roborts_common::Point2D &another_partner_point);
86 
92  roborts_common::Point2D GetSpecificRunPoint(const std::vector<PointValue> &running_interval,
93  std::shared_ptr<MyRobot> p_my_robot, const roborts_common::Point2D &another_point);
94 
96  const EnemyRobot &GetEnemyRobotToAttack(const std::shared_ptr<MyRobot> &p_my_robot);
97 
99  const EnemyRobot &GetCloserEnemyRobot(const std::shared_ptr<MyRobot> &p_my_robot);
100 
102  double GetKeepDirectionSafeDistance() const;
106  double GetKeepDirectionEffectWithDistance(double distance, double angle = 45) const;
107  // 获取射击速度
108  double GetShootSpeed(const std::shared_ptr<MyRobot>&p_my_robot, const roborts_common::Point2D &enemy_pose);
109 
110  // 获得准备射击时的敌方目标机器人
111  const EnemyRobot &GetPrepareShootOpp(const std::shared_ptr<MyRobot> &my_robot);
112 
113  // 计算防御下我方某机器人的跑位点(若给第二个参数,会考虑另一机器人的跑点)
114  roborts_common::Point2D GetDefenseRunningPoint(const std::shared_ptr<MyRobot> &p_my_robot,
115  roborts_common::Point2D another_point = roborts_common::Point2D(0,
116  0));
117 
118  // 更新防御势场全部影响因素
119  void UpdateDefenseAllPotentialField(std::vector<std::vector<PointValue>> &security_matrix);
120 
121  // 对矩形范围内的点统一用value更新
122  void UpdateAreaOfPotentialField(std::vector<std::vector<PointValue>> &security_matrix,
123  const roborts_common::Polygon2D &area, double value) const;
124 
125  // 获得防御势场判断安全的阈值
126  double GetDefensePotentialFieldSafeValue() const;
127 
128  // 考虑同伴的情况后判断该点是否合适
129  bool CanCooperatePartner(const roborts_common::Point2D &tar_point,
130  const roborts_common::Point2D &partner_tar_point,
131  const std::shared_ptr<MyRobot> &me,
132  const std::shared_ptr<MyRobot> &partner) const;
133 
134  void FindSafePoint(PointValue &safe_point,
135  const std::shared_ptr<MyRobot> &p_my_robot,
136  const std::vector<std::vector<PointValue>> &security_matrix,
137  roborts_common::Point2D another_point);
138 
139  // 炮台势场(direction:相对炮台方向位置偏角(0-180))
140  double GetFortPotentialField(double distance, double direction);
141 
142  // 敌方位置势场
143  double GetPlacePotentialField(double distance);
144 
145  // 墙体势场(包括障碍物)
146  double GetWallPotentialField(double distance);
147 
148  // 计算跑位点中的更新势场函数
149  void UpdatePotentialField(std::vector<std::vector<PointValue>> &potential_field,
150  const roborts_common::Polygon2D &object,
151  const std::function<double(const roborts_common::Point2D &,
152  const roborts_common::Polygon2D &)>& fun);
153 
154  // 根据离散单位生成地图
155  std::vector<std::vector<PointValue>> DiscretizeMap(double discrete_unit) const;
156 
157  // 是否相撞(撞墙、撞车
158  bool IsCollide(std::shared_ptr<MyRobot> p_my_robot) const;
159 
160  // 计算进攻跑位点函数更新势场
161  std::vector<std::vector<PointValue>> UpdatePotentialFieldInAttack(const std::shared_ptr<MyRobot> &p_my_robot, const EnemyRobot &enemy_to_attack);
162 
163  // 敌方机器人更新势场的策略,具体由updatePotentialField中的函数指针调用
164  // 计算所攻击敌方机器人的势场
165  double CalculateEnemyToAttackPotentialField(const roborts_common::Point2D &pose_point,
166  const roborts_common::Polygon2D &pose_polygon);
167 
168  // 计算另一个敌方机器人的势场
169  double CalculateEnemyAnotherPotentialField(const roborts_common::Point2D &pose_point,
170  const roborts_common::Polygon2D &pose_polygon);
171 
172  // 选取合适的跑位点
173  std::vector<PointValue> CalculateSuitRunPoint(const std::vector<std::vector<PointValue>> &potential_field);
174 
175  // 计算点到多边形间的距离(若两者间有障碍物,距离无穷大)
176  double GetDistanceWithObstacles(const roborts_common::Point2D &pose,
177  const roborts_common::Polygon2D &polygon_2_d);
178 
179  // 计算点到实体矩形的距离(若在实体中间,返回0)
180  double GetPointToEntityDistance(const roborts_common::Point2D &point_2_d,
181  const roborts_common::Polygon2D &polygon_2_d) const;
182 
183  // 获取我方所有机器人的矩形
184  std::vector<roborts_common::Polygon2D> GetHomePolygon();
185 
186  // 预测距离
187  double PredictedDistance(const roborts_common::Point2D &_point, const std::shared_ptr<MyRobot>& p_my_robot);
188 
189  // 获取我方某个机器人的矩形
190  roborts_common::Polygon2D GetHomePolygon(const std::shared_ptr<MyRobot> &p_my_robot) const;
191 
192  // 获取敌方所有机器人的矩形
193  std::vector<roborts_common::Polygon2D> GetEnemyPolygon() const;
194 
195  // 获取敌方某个机器人的矩形
196  roborts_common::Polygon2D GetEnemyPolygon(const EnemyRobot &enemy_robot) const;
197 
198  void WriteFile(std::string file_name, std::vector<std::vector<PointValue>> &map, roborts_common::Point2D &most_suitable_point);
199 private:
200  void OutpostDetectedCallback(const roborts_msgs::OutpostDetected::ConstPtr &msg);
201  void MyColorCallback(const roborts_msgs::RobotStatus::ConstPtr &msg);
202  void GameSurvivorCallback(const roborts_msgs::GameSurvivor::ConstPtr &msg);
203 
204  [[deprecated]]
205  void NextDecisionCallBackDeprecated(const std_msgs::Int32::ConstPtr &msg);
206 
207 
208  ros::NodeHandle nh_;
209  ros::Subscriber outpose_camera_sub_;
210  ros::Subscriber color_sub_;
211  ros::Subscriber game_survivor_sub_;
212  ros::Publisher is_collide_pub_;
213 
215 
218  std::shared_ptr<Field> field_;
219 
220  std::shared_ptr<MyRobot> p_my_robot1_;
221  std::shared_ptr<MyRobot> p_my_robot2_;
222 
224 
225  static std::shared_ptr<Blackboard> p_blackboard_;
226 
227  // strategy
228  std::string LoadValue(const std::string& value_name, const std::string& target_name);
229  std::string FindValueInFile(const std::string& value_name, const std::string& file_name);
230  bool UpdataValue(const std::string &value_name, const std::string &file_name, const std::string &value);
231  bool AddValueInFile(const std::string &value_name, const std::string &value, const std::string &file_path);
232  bool ChangeValueInFile(const std::string& value_name, const std::string& value, const std::string& file_path);
233  double defense_safe_value_ = 100.0;
234 
235 };
236 } // namespace roborts_decision
237 
238 #endif // ROBORTS_ROBORTS_DECISION_BLACKBOARD_BLACKBOARD_H_
roborts_decision::PointValue::value
double value
Definition: blackboard.h:30
roborts_decision::Blackboard::GetFortPotentialField
double GetFortPotentialField(double distance, double direction)
Definition: blackboard.cpp:749
roborts_decision::Blackboard::p_my_robot2_
std::shared_ptr< MyRobot > p_my_robot2_
Definition: blackboard.h:221
enemy_robot.h
roborts_decision::Blackboard::GetAnotherRobot
const EnemyRobot & GetAnotherRobot(const EnemyRobot &enemy_robot)
Given an EnemyRobot, returns its companion.
Definition: blackboard.cpp:132
roborts_decision::Blackboard::UpdateDefenseAllPotentialField
void UpdateDefenseAllPotentialField(std::vector< std::vector< PointValue >> &security_matrix)
Definition: blackboard.cpp:688
roborts_decision::Blackboard::FindValueInFile
std::string FindValueInFile(const std::string &value_name, const std::string &file_name)
Definition: blackboard.cpp:1071
roborts_decision::Blackboard::Ptr
std::shared_ptr< Blackboard > Ptr
Definition: blackboard.h:37
prediction_system.h
roborts_decision::Blackboard::DiscretizeMap
std::vector< std::vector< PointValue > > DiscretizeMap(double discrete_unit) const
Definition: blackboard.cpp:621
roborts_decision::Blackboard::FindSafePoint
void FindSafePoint(PointValue &safe_point, const std::shared_ptr< MyRobot > &p_my_robot, const std::vector< std::vector< PointValue >> &security_matrix, roborts_common::Point2D another_point)
Definition: blackboard.cpp:639
roborts_decision::Blackboard
Definition: blackboard.h:35
roborts_decision::Blackboard::WriteFile
void WriteFile(std::string file_name, std::vector< std::vector< PointValue >> &map, roborts_common::Point2D &most_suitable_point)
Definition: blackboard.cpp:1142
roborts_decision::Blackboard::GetEnemyPolygon
std::vector< roborts_common::Polygon2D > GetEnemyPolygon() const
Definition: blackboard.cpp:848
roborts_decision::Blackboard::PredictedDistance
double PredictedDistance(const roborts_common::Point2D &_point, const std::shared_ptr< MyRobot > &p_my_robot)
Definition: blackboard.cpp:484
roborts_decision::Blackboard::nh_
ros::NodeHandle nh_
Definition: blackboard.h:208
roborts_decision::Blackboard::CalculateEnemyToAttackPotentialField
double CalculateEnemyToAttackPotentialField(const roborts_common::Point2D &pose_point, const roborts_common::Polygon2D &pose_polygon)
Definition: blackboard.cpp:428
roborts_decision::Blackboard::Blackboard
Blackboard(std::shared_ptr< MyRobot > &p_myrobot1, std::shared_ptr< MyRobot > &p_myrobot2, const ros::NodeHandle &nh=ros::NodeHandle("~"))
Construct Blackboard using two MyRobot.
Definition: blackboard.cpp:19
roborts_decision::Blackboard::GetKeepDirectionSafeDistance
double GetKeepDirectionSafeDistance() const
Get max safe distance.
Definition: blackboard.cpp:769
roborts_decision::Blackboard::GetMyRobot2
const std::shared_ptr< MyRobot > & GetMyRobot2()
Get number 2 of MyRobot.
Definition: blackboard.cpp:113
roborts_decision::PointValue::point
roborts_common::Point2D point
Definition: blackboard.h:29
roborts_decision::Blackboard::IsCollide
bool IsCollide(std::shared_ptr< MyRobot > p_my_robot) const
Definition: blackboard.cpp:1184
roborts_decision::Blackboard::GetHomePolygon
std::vector< roborts_common::Polygon2D > GetHomePolygon()
Definition: blackboard.cpp:814
roborts_decision::Blackboard::Blackboard
Blackboard(Blackboard &&)=delete
roborts_decision::Blackboard::p_my_robot1_
std::shared_ptr< MyRobot > p_my_robot1_
Definition: blackboard.h:220
roborts_decision::Blackboard::GetDistanceWithObstacles
double GetDistanceWithObstacles(const roborts_common::Point2D &pose, const roborts_common::Polygon2D &polygon_2_d)
Definition: blackboard.cpp:882
roborts_decision::MyColor
MyColor
Definition: blackboard_common.h:96
roborts_decision::PredictionSystem
Definition: prediction_system.h:16
roborts_decision::Blackboard::UpdateAreaOfPotentialField
void UpdateAreaOfPotentialField(std::vector< std::vector< PointValue >> &security_matrix, const roborts_common::Polygon2D &area, double value) const
Definition: blackboard.cpp:1172
my_robot.h
roborts_decision::Blackboard::defense_safe_value_
double defense_safe_value_
Definition: blackboard.h:233
blackboard_common.h
roborts_decision::Blackboard::GetCloserEnemyRobot
const EnemyRobot & GetCloserEnemyRobot(const std::shared_ptr< MyRobot > &p_my_robot)
Get the EnemyRobot that closest to our robots.
Definition: blackboard.cpp:576
roborts_decision::Blackboard::CalculateSuitRunPoint
std::vector< PointValue > CalculateSuitRunPoint(const std::vector< std::vector< PointValue >> &potential_field)
Definition: blackboard.cpp:367
roborts_decision::Blackboard::Blackboard
Blackboard(const Blackboard &)=delete
roborts_decision::Blackboard::CanCooperatePartner
bool CanCooperatePartner(const roborts_common::Point2D &tar_point, const roborts_common::Point2D &partner_tar_point, const std::shared_ptr< MyRobot > &me, const std::shared_ptr< MyRobot > &partner) const
Definition: blackboard.cpp:913
roborts_decision::Blackboard::GetEnemyRobot1
EnemyRobot & GetEnemyRobot1()
Get number 1 of EnemyRobot.
Definition: blackboard.cpp:117
roborts_decision::RobotBehavior
RobotBehavior
Basic action of robot.
Definition: blackboard_common.h:107
roborts_decision::Blackboard::UpdatePotentialField
void UpdatePotentialField(std::vector< std::vector< PointValue >> &potential_field, const roborts_common::Polygon2D &object, const std::function< double(const roborts_common::Point2D &, const roborts_common::Polygon2D &)> &fun)
Definition: blackboard.cpp:736
roborts_decision::Blackboard::color_sub_
ros::Subscriber color_sub_
Definition: blackboard.h:210
roborts_decision::Blackboard::OutpostDetectedCallback
void OutpostDetectedCallback(const roborts_msgs::OutpostDetected::ConstPtr &msg)
Definition: blackboard.cpp:144
roborts_decision::Blackboard::is_collide_pub_
ros::Publisher is_collide_pub_
Definition: blackboard.h:212
roborts_decision::Blackboard::field_
std::shared_ptr< Field > field_
Definition: blackboard.h:218
roborts_decision::Blackboard::GameSurvivorCallback
void GameSurvivorCallback(const roborts_msgs::GameSurvivor::ConstPtr &msg)
Definition: blackboard.cpp:168
roborts_decision::Blackboard::my_color_
MyColor my_color_
Definition: blackboard.h:214
roborts_decision::Blackboard::GetEnemyRobot2
EnemyRobot & GetEnemyRobot2()
Get number 2 of EnemyRobot.
Definition: blackboard.cpp:121
roborts_decision::Blackboard::GetSpecificRunPoint
roborts_common::Point2D GetSpecificRunPoint(const std::vector< PointValue > &running_interval, std::shared_ptr< MyRobot > p_my_robot, const roborts_common::Point2D &another_point)
Get the point to run to, used by GetAttackRunningPoint.
Definition: blackboard.cpp:465
roborts_decision::Blackboard::enemy_robot_1_
EnemyRobot enemy_robot_1_
Definition: blackboard.h:216
roborts_decision::Blackboard::LoadValue
std::string LoadValue(const std::string &value_name, const std::string &target_name)
Definition: blackboard.cpp:1019
roborts_decision::Blackboard::p_blackboard_
static std::shared_ptr< Blackboard > p_blackboard_
Definition: blackboard.h:225
field.h
roborts_decision::Blackboard::UpdataValue
bool UpdataValue(const std::string &value_name, const std::string &file_name, const std::string &value)
Definition: blackboard.cpp:1044
roborts_decision::Blackboard::outpose_camera_sub_
ros::Subscriber outpose_camera_sub_
Definition: blackboard.h:209
roborts_decision::Blackboard::UpdatePotentialFieldInAttack
std::vector< std::vector< PointValue > > UpdatePotentialFieldInAttack(const std::shared_ptr< MyRobot > &p_my_robot, const EnemyRobot &enemy_to_attack)
Definition: blackboard.cpp:399
roborts_decision::Blackboard::MyColorCallback
void MyColorCallback(const roborts_msgs::RobotStatus::ConstPtr &msg)
Definition: blackboard.cpp:163
roborts_decision
Definition: behavior_test_node.h:14
roborts_decision::Blackboard::GetPlacePotentialField
double GetPlacePotentialField(double distance)
Definition: blackboard.cpp:777
roborts_decision::Blackboard::enemy_robot_2_
EnemyRobot enemy_robot_2_
Definition: blackboard.h:217
roborts_decision::PointValue
Definition: blackboard.h:28
roborts_decision::Blackboard::GetBlackboard
static std::shared_ptr< Blackboard > GetBlackboard()
Create or get the single instance of Blackboard.
Definition: blackboard.cpp:79
roborts_decision::Blackboard::GetMyRobot1
const std::shared_ptr< MyRobot > & GetMyRobot1()
Get number 1 of MyRobot.
Definition: blackboard.cpp:109
roborts_decision::Blackboard::GetDefenseRunningPoint
roborts_common::Point2D GetDefenseRunningPoint(const std::shared_ptr< MyRobot > &p_my_robot, roborts_common::Point2D another_point=roborts_common::Point2D(0, 0))
Definition: blackboard.cpp:605
roborts_decision::Blackboard::GetWallPotentialField
double GetWallPotentialField(double distance)
Definition: blackboard.cpp:793
roborts_decision::Blackboard::GetMyColor
MyColor GetMyColor() const
Get the color of MyRobot.
Definition: blackboard.cpp:140
roborts_decision::Blackboard::Update
void Update()
Update all the information. Need to be called on every frame.
Definition: blackboard.cpp:955
roborts_decision::Blackboard::CalculateEnemyAnotherPotentialField
double CalculateEnemyAnotherPotentialField(const roborts_common::Point2D &pose_point, const roborts_common::Polygon2D &pose_polygon)
Definition: blackboard.cpp:448
roborts_decision::Blackboard::GetAttackRunningPoint
roborts_common::Point2D GetAttackRunningPoint(const std::shared_ptr< MyRobot > &p_my_robot, const roborts_common::Point2D &another_partner_point)
Get the point to run when attacking.
Definition: blackboard.cpp:333
roborts_decision::Blackboard::GetDangerousOpp
std::vector< EnemyRobot > GetDangerousOpp(const std::shared_ptr< MyRobot > &p_my_robot)
Get EnemyRobots that can attack us directly.
Definition: blackboard.cpp:252
roborts_decision::Blackboard::GetPointToEntityDistance
double GetPointToEntityDistance(const roborts_common::Point2D &point_2_d, const roborts_common::Polygon2D &polygon_2_d) const
Definition: blackboard.cpp:999
roborts_decision::Blackboard::~Blackboard
virtual ~Blackboard()
roborts_decision::Blackboard::GetDefensePotentialFieldSafeValue
double GetDefensePotentialFieldSafeValue() const
Definition: blackboard.cpp:900
roborts_decision::Blackboard::GetPrepareShootOpp
const EnemyRobot & GetPrepareShootOpp(const std::shared_ptr< MyRobot > &my_robot)
Definition: blackboard.cpp:268
roborts_decision::Blackboard::GetEnemyRobotToAttack
const EnemyRobot & GetEnemyRobotToAttack(const std::shared_ptr< MyRobot > &p_my_robot)
Use analytic hierarchy process to obtain robots that need to attack.
Definition: blackboard.cpp:497
roborts_decision::Blackboard::ChangeValueInFile
bool ChangeValueInFile(const std::string &value_name, const std::string &value, const std::string &file_path)
Definition: blackboard.cpp:1116
roborts_decision::Blackboard::prediction_system_
PredictionSystem prediction_system_
Definition: blackboard.h:223
roborts_decision::Blackboard::AddValueInFile
bool AddValueInFile(const std::string &value_name, const std::string &value, const std::string &file_path)
Definition: blackboard.cpp:1099
roborts_decision::Blackboard::GetCommonMoveType
RobotBehavior GetCommonMoveType(const std::shared_ptr< MyRobot > &my_robot)
Whether the non-defensive run (spinning run) is obstacle avoidance run or run at a certain angle.
Definition: blackboard.cpp:242
roborts_decision::Blackboard::GetKeepDirectionEffectWithDistance
double GetKeepDirectionEffectWithDistance(double distance, double angle=45) const
Obtain the damage percentage of a certain distance from the enemy and a certain deflection angle rela...
Definition: blackboard.cpp:981
roborts_decision::Blackboard::game_survivor_sub_
ros::Subscriber game_survivor_sub_
Definition: blackboard.h:211
roborts_decision::Blackboard::GetShootSpeed
double GetShootSpeed(const std::shared_ptr< MyRobot > &p_my_robot, const roborts_common::Point2D &enemy_pose)
Definition: blackboard.cpp:990
roborts_decision::EnemyRobot
Definition: enemy_robot.h:16
roborts_decision::Blackboard::NextDecisionCallBackDeprecated
void NextDecisionCallBackDeprecated(const std_msgs::Int32::ConstPtr &msg)
Definition: blackboard.cpp:183