@@ -8,6 +8,8 @@ class Node:
88 node_arr = {}
99 min_dist = 500 # mm
1010 max_dist = 1000000 # mm
11+ max_history = 10
12+ max_move_per_cycle = 5000
1113
1214 def __init__ (self , node_id = None , name = None , is_base = False , x = None , y = None , multi_pipe = None ):
1315 if node_id is None :
@@ -20,9 +22,12 @@ def __init__(self, node_id=None, name=None, is_base=False, x=None, y=None, multi
2022 self .real_x = x # random.randint(25, 600)
2123 self .real_y = y # random.randint(25, 600)
2224 self .resolved = False
25+ self .extrapolate = False
2326 self .triangulate_list = []
2427 self .multi_pipe = multi_pipe
2528 self .communicate_list = []
29+ self .position_history = []
30+ self .added_position = False
2631 if self .multi_pipe is not None :
2732 self .piping = True
2833 else :
@@ -60,18 +65,25 @@ def start_new_cycle(self):
6065 self .x = None
6166 self .y = None
6267 self .resolved = False
68+ self .extrapolate = False
69+
70+ if self .added_position is False :
71+ if len (self .position_history ) > 0 :
72+ self .position_history .pop (0 )
73+
74+ self .added_position = False
6375 # if self.measurements:
6476 # self.measurement_history.append(self.measurements)
6577 # if len(self.measurement_history) > config.MAX_HISTORY:
6678 # self.measurement_history.pop(0)
6779 # self.measurements = []
6880
69- def add_measurement (self , node_b , dist ):
81+ def add_measurement (self , node_b , dist , std = None ):
7082 if dist > Node .min_dist and dist < Node .max_dist :
7183 # print(key)
7284 # print(self.measurement_history)
7385 # print(self.measurement_history[key])
74- self .measurements .append (Measurement (self , node_b , dist ))
86+ self .measurements .append (Measurement (self , node_b , dist , std = std ))
7587 # self.add_to_communicate_list(node_b)
7688 else :
7789 # self.measurements.append(Measurement(self, node_b, None))
@@ -89,10 +101,50 @@ def add_measurement(self, node_b, dist):
89101 def is_resolved (self ):
90102 return self .resolved
91103
92- def set_position (self , x , y ):
93- self .x = x
94- self .y = y
95- self .resolved = True
104+ # def set_position(self, x, y):
105+ # avg = self.get_avg_position()
106+ # cur_pos = Vector2(avg[0], avg[1])
107+ # new_pos = Vector2(x, y)
108+ # offset = cur_pos - new_pos
109+ # d = offset.magnitude()
110+ # if d <= Node.max_move_per_cycle:
111+ # self.x = x
112+ # self.y = y
113+ # else:
114+
115+ # self.x = avg[0]
116+ # self.y = avg[1]
117+ # self.extrapolate = True
118+
119+ # self.resolved = True
120+
121+ # self.position_history.append((x, y))
122+ # if len(self.position_history) > Node.max_history:
123+ # self.position_history.pop(0)
124+
125+ def get_last_position (self ):
126+ if len (self .position_history ) == 0 :
127+ return None
128+ return self .position_history [len (self .position_history )- 1 ]
129+
130+ def get_avg_position (self ):
131+ x_sum = 0
132+ y_sum = 0
133+ counter = 0
134+ for pos in self .position_history :
135+ x_sum += pos [0 ]
136+ y_sum += pos [1 ]
137+ counter += 1
138+ return (x_sum / counter , y_sum / counter )
139+
140+ def get_avg_velocity (self ):
141+ hist_vec = []
142+ for pos in self .position_history :
143+ hist_vec .append (Vector2 (pos [0 ], pos [1 ]))
144+ vec_sum = Vector2 (0 , 0 )
145+ for pos in hist_vec :
146+ vec_sum = vec_sum + pos
147+ return vec_sum / len (hist_vec )
96148
97149 def add_triangulation (self , tri ):
98150 self .triangulate_list .append (tri )
@@ -105,8 +157,33 @@ def display_triangulations(self):
105157 dt .displayTriangulation ((self .x , self .y ))
106158
107159 def set_position_vec (self , pos ):
108- self .x = pos .x
109- self .y = pos .y
160+ last = self .get_last_position ()
161+ if last is None :
162+ last_pos = pos
163+ else :
164+ last_pos = Vector2 (last [0 ], last [1 ])
165+ offset = last_pos - pos
166+ d = offset .magnitude ()
167+
168+ # print(d)
169+
170+ self .position_history .append ((pos .x , pos .y ))
171+ self .added_position = True
172+ if len (self .position_history ) > Node .max_history :
173+ self .position_history .pop (0 )
174+
175+ if d <= Node .max_move_per_cycle :
176+ self .x = pos .x
177+ self .y = pos .y
178+ else :
179+ # avg = self.get_avg_position()
180+ vel = self .get_avg_velocity ()
181+ pos = Vector2 (last [0 ], last [1 ])
182+ new_pos = pos + vel
183+ self .x = new_pos .x
184+ self .y = new_pos .y
185+ self .extrapolate = True
186+
110187 self .resolved = True
111188
112189 def get_position (self ):
@@ -189,7 +266,7 @@ def show(self):
189266 "cmd" : "draw_circle" ,
190267 "args" : {
191268 "fill" : "white" ,
192- "r" : 1 ,
269+ "r" : 0.5 ,
193270 "tags" : ['node' ],
194271 "outline" : "" ,
195272 "x" : self .x ,
@@ -199,6 +276,10 @@ def show(self):
199276 }
200277 if self .is_base :
201278 cmd_obj ['args' ]['fill' ] = "yellow"
279+
280+ if self .extrapolate :
281+ cmd_obj ['args' ]['fill' ] = "purple"
282+
202283 self .multi_pipe .send (cmd_obj )
203284 # obj = canvas.create_circle(
204285 # self.x, self.y, size, fill=fill, outline="", tags=['node'])
0 commit comments