5
5
from commons .math import angular_speed , rotate_via_numpy
6
6
from commons .math import speed as avg_speed
7
7
8
+
8
9
class Robot (object ):
9
10
10
11
def __init__ (self , game , robot_id , team_color ):
@@ -50,7 +51,7 @@ def __init__(self, game, robot_id, team_color):
50
51
51
52
def start (self ):
52
53
self .strategy .start (self )
53
-
54
+
54
55
def get_name (self ):
55
56
return 'ROBOT_{}_{}' .format (self .robot_id , self .team_color )
56
57
@@ -75,14 +76,13 @@ def update(self, frame):
75
76
self .update_stuckness ()
76
77
77
78
def get_speed (self ):
78
- return (self .vx ** 2 + self .vy ** 2 ) ** .5
79
+ return (self .vx ** 2 + self .vy ** 2 ) ** .5
79
80
80
81
def _update_speeds (self ):
81
82
self ._frames ['x' ].append (self .current_data ['x' ])
82
83
self ._frames ['y' ].append (self .current_data ['y' ])
83
84
self ._frames ['theta' ].append (self .current_data ['orientation' ])
84
85
85
-
86
86
self .theta = self .current_data ['orientation' ]
87
87
88
88
self .x = self .current_data ['x' ]
@@ -92,34 +92,33 @@ def _update_speeds(self):
92
92
self .vy = avg_speed (self ._frames ['y' ], self .game .vision ._fps )
93
93
self .vtheta = angular_speed (self ._frames ['theta' ], self .game .vision ._fps )
94
94
95
- self .speed = math .sqrt (self .vx ** 2 + self .vy ** 2 )
95
+ self .speed = math .sqrt (self .vx ** 2 + self .vy ** 2 )
96
96
97
97
def update_stuckness (self ):
98
98
MIN_STUCK_SPEED = 0.005
99
99
100
100
if self .game .use_referee and not self .game .referee .can_play :
101
101
self .stuck_time = 0
102
102
103
- if (self .speed <= MIN_STUCK_SPEED ):
103
+ if (self .speed <= MIN_STUCK_SPEED ):
104
104
self .stuck_time += 1
105
105
else :
106
106
self .stuck_time = 0
107
-
107
+
108
108
def is_stuck (self ):
109
- MIN_STUCK_TIME = 1 # in seconds
109
+ MIN_STUCK_TIME = 1 # in seconds
110
110
if self .game .vision ._fps > 0 :
111
- time_in_seconds = self .stuck_time / self .game .vision ._fps
111
+ time_in_seconds = self .stuck_time / self .game .vision ._fps
112
112
if time_in_seconds > MIN_STUCK_TIME :
113
113
return True
114
114
return False
115
115
116
-
117
116
def _get_desired_differential_robot_speeds (self , vx , vy , theta ):
118
117
'''
119
118
Entradas: velocidades no eixo X, Y
120
119
Saidas: velocidades linear, angular
121
120
'''
122
-
121
+
123
122
speed_vector = np .array ([vx , vy ])
124
123
speed_norm = np .linalg .norm (speed_vector )
125
124
robot_world_speed = list (rotate_via_numpy (speed_vector , theta ))
@@ -129,14 +128,13 @@ def _get_desired_differential_robot_speeds(self, vx, vy, theta):
129
128
if robot_world_speed [0 ] > 0.0 :
130
129
robot_world_speed [1 ] = - robot_world_speed [1 ]
131
130
robot_world_speed [0 ] = - robot_world_speed [0 ]
132
-
131
+
133
132
robot_angle_speed = - math .atan2 (robot_world_speed [1 ], robot_world_speed [0 ])
134
133
135
134
# va = signal of robot_angle_speed {-1, 1} * robot_world_speed.y [0, 1] * math.pi (max_speed = PI rad/s )
136
- va = (robot_angle_speed / abs (robot_angle_speed )) * robot_world_speed [1 ] * math .pi
135
+ va = (robot_angle_speed / abs (robot_angle_speed )) * robot_world_speed [1 ] * math .pi
137
136
return vl , va
138
137
139
-
140
138
def _get_differential_robot_speeds (self , vx , vy , theta ):
141
139
'''
142
140
Entradas: velocidades no eixo X, Y
@@ -149,9 +147,8 @@ def _get_differential_robot_speeds(self, vx, vy, theta):
149
147
vl = robot_world_speed [0 ] * speed_norm
150
148
151
149
va = self .vtheta
152
-
150
+
153
151
return vl , va
154
-
155
152
156
153
def decide (self ):
157
154
desired = self .strategy .decide ()
@@ -160,11 +157,22 @@ def decide(self):
160
157
161
158
return self ._get_command (self .power_left , self .power_right )
162
159
163
-
164
160
def _get_command (self , power_left , power_right ):
165
161
return {
166
162
'robot_id' : self .robot_id ,
167
163
'wheel_left' : power_left ,
168
164
'wheel_right' : power_right ,
169
165
'color' : self .team_color
170
166
}
167
+
168
+ def __getitem__ (self , item ):
169
+ if item == 0 :
170
+ return self .x
171
+
172
+ if item == 1 :
173
+ return self .y
174
+
175
+ if item == 2 :
176
+ return self .theta
177
+
178
+ raise IndexError ("Robot only has 3 coordinates" )
0 commit comments