@@ -11,6 +11,7 @@ class Node:
1111 max_dist = 1000000 # mm
1212 max_history = 10
1313 max_move_per_cycle = 5000
14+ use_s_last = True
1415
1516 def __init__ (self , node_id = None , name = None , is_base = False , x = None , y = None , multi_pipe = None ):
1617 if node_id is None :
@@ -62,22 +63,11 @@ def start_new_cycle(self):
6263 self .position_history .pop (0 )
6364
6465 self .added_position = False
65- # if self.measurements:
66- # self.measurement_history.append(self.measurements)
67- # if len(self.measurement_history) > config.MAX_HISTORY:
68- # self.measurement_history.pop(0)
69- # self.measurements = []
7066
7167 def add_measurement (self , node_b , dist , std = None ):
7268 if dist > Node .min_dist and dist < Node .max_dist :
73- # print(key)
74- # print(self.measurement_history)
75- # print(self.measurement_history[key])
7669 self .measurements .append (Measurement (self , node_b , dist , std = std ))
77- # self.add_to_communicate_list(node_b)
7870 else :
79- # self.measurements.append(Measurement(self, node_b, None))
80- # self.add_to_communicate_list(node_b)
8171 print (f"Discarded meas with { dist } distance to node { node_b .id } due to bounding error." )
8272
8373 def is_resolved (self ):
@@ -88,6 +78,11 @@ def get_last_position(self):
8878 if len (self .position_history ) == 0 :
8979 return None
9080 return self .position_history [len (self .position_history )- 1 ]
81+
82+ def get_second_last_position (self ):
83+ if len (self .position_history ) < 2 :
84+ return None
85+ return self .position_history [len (self .position_history )- 2 ]
9186
9287 def get_avg_position (self ):
9388 x_sum = 0
@@ -119,26 +114,8 @@ def display_triangulations(self):
119114 dt .display_triangulation ((self .x , self .y ))
120115
121116 def set_position_vec (self , pos ):
122- # last = self.get_last_position()
123- # if last is None:
124- # last_pos = pos
125- # else:
126- # last_pos = Vector2(last[0], last[1])
127- # offset = last_pos - pos
128- # d = offset.magnitude()
129-
130- # print(d)
131-
132- # if d <= Node.max_move_per_cycle:
133117 self .x = pos .x
134118 self .y = pos .y
135- # else:
136- # vel = self.get_avg_velocity()
137- # pos = Vector2(last[0], last[1])
138- # new_pos = pos + vel
139- # self.x = new_pos.x
140- # self.y = new_pos.y
141- # self.extrapolate = True
142119
143120 self .position_history .append ((pos .x , pos .y ))
144121 self .added_position = True
@@ -149,10 +126,15 @@ def set_position_vec(self, pos):
149126
150127 def consider_last_location (self ):
151128 last = self .get_last_position ()
129+ slast = self .get_second_last_position ()
152130 if last is not None :
153131 dt = DirectTriangulation (None , None , None , None , empty = True )
154132 dt .directly_add_guess (Vector2 (last [0 ], last [1 ]))
155133 self .add_triangulation (dt )
134+ if Node .use_s_last and slast is not None :
135+ dt = DirectTriangulation (None , None , None , None , empty = True )
136+ dt .directly_add_guess (Vector2 (slast [0 ], slast [1 ]))
137+ self .add_triangulation (dt )
156138
157139 def get_position (self ):
158140 return self .x , self .y
@@ -166,58 +148,10 @@ def get_real_position(self):
166148 def get_real_position_vec (self ):
167149 return Vector2 (self .real_x , self .real_y )
168150
169- # def error_to_str(self):
170- # if self.x is not None and self.y is not None:
171- # offset = self.get_position_vec() - self.get_real_position_vec()
172- # d = offset.magnitude()
173- # return "{:.3f}ft".format(d)
174- # else:
175- # return "Unresolved"
176-
177- # def print_report(self):
178- # if self.x is not None and self.y is not None:
179- # print(str(self), " : ", self.error_to_str() + ' error')
180-
181151 def get_measurement (self , node_id , history_avg = True ):
182- # if history_avg:
183- # dist = 0
184- # counter = 0
185- # node2 = None
186- # for meas in self.measurement_history[node_id]:
187- # if meas.dist == None or meas.dist == 0:
188- # continue
189- # node2 = meas.node2
190- # dist = dist + meas.dist
191- # counter = counter + 1
192- # if counter > 0:
193- # dist = dist / counter
194- # else:
195- # return None
196- # return Measurement(self, node2, dist)
197- # else:
198152 return next (filter (lambda m : m .node2 .id == node_id , self .measurements ))
199153
200154 def get_measurements (self , history_avg = True ):
201- # if history_avg:
202- # m = []
203- # for node in self.communicate_list:
204- # key = node.id
205- # dist = 0
206- # counter = 0
207- # for meas in self.measurement_history[key]:
208- # if meas.dist == None or meas.dist == 0:
209- # continue
210- # dist = dist + meas.dist
211- # counter = counter + 1
212- # if counter > 0:
213- # dist = dist / counter
214- # else:
215- # print("NONE MEAS")
216- # m.append(Measurement(self, node, dist))
217- # # for measurement in self.measurements:
218- # # m.append(measurement.avg_with_history(self.measurement_history))
219- # return m
220- # else:
221155 return self .measurements
222156
223157 def clear_measurements (self ):
@@ -226,10 +160,6 @@ def clear_measurements(self):
226160 def show (self ):
227161 if self .x is None or self .y is None or self .multi_pipe is None :
228162 return
229- # fill = "white"
230- # if Distance(self.get_real_position_vec(), self.get_position_vec()) < 20:
231- # fill = "green"
232- # size = 10
233163 cmd_obj = {
234164 "cmd" : "draw_circle" ,
235165 "args" : {
@@ -239,30 +169,33 @@ def show(self):
239169 "outline" : "" ,
240170 "x" : self .x ,
241171 "y" : self .y ,
242- "convert_to_m" : True
172+ "convert_to_m" : True ,
173+ "text" :self .id
243174 }
244175 }
245176 if self .is_base :
246177 cmd_obj ['args' ]['fill' ] = "yellow"
178+ else :
179+ for hist in self .position_history :
180+ h = {
181+ "cmd" : "draw_circle" ,
182+ "args" : {
183+ "fill" : "grey" ,
184+ "r" : 100 ,
185+ "tags" : ['node' ],
186+ "outline" : "" ,
187+ "x" : hist [0 ],
188+ "y" : hist [1 ],
189+ "convert_to_m" : True
190+ }
191+ }
192+ self .multi_pipe .send (h )
247193
248194 if self .extrapolate :
249195 cmd_obj ['args' ]['fill' ] = "purple"
250196
251197 self .multi_pipe .send (cmd_obj )
252- # obj = canvas.create_circle(
253- # self.x, self.y, size, fill=fill, outline="", tags=['node'])
254- # if self.real_obj is not None:
255- # coords = canvas.coords(self.real_obj)
256- # x = (coords[0] + coords[2])/2
257- # y = (coords[1] + coords[3])/2
258- # canvas.create_line(self.x, self.y, x, y,
259- # fill="#3c4048", dash=(3, 5))
260- # canvas.tag_raise(obj)
261- # canvas.tag_raise(self.real_obj)
262- # self.guess_obj = obj
263- # self.__class__.node_arr[obj] = "#" + str(self.resolution_order) + " | " + str(self) + ' | ' + self.errorToStr()
264- # canvas.tag_bind(obj, '<Enter>', self.__class__.nodeEnter)
265- # canvas.tag_bind(obj, '<Leave>', self.__class__.nodeLeave)
198+
266199
267200 def to_string (self ):
268201 if self .x is not None and self .y is not None :
0 commit comments