Skip to content

Commit 22ce148

Browse files
committed
Updated nodes for better time calculations
1 parent 8eb9f4d commit 22ce148

File tree

3 files changed

+115
-37
lines changed

3 files changed

+115
-37
lines changed

helpers/measurement.py

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,11 @@
11
class Measurement:
2-
def __init__(self, node1, node2, dist, err=0):
2+
def __init__(self, node1, node2, dist, std=0):
33
self.node1 = node1
44
self.node2 = node2
55
self.dist = dist
6-
self.err = err
6+
self.std = std
77
self.cleared = False
8-
self.confidence = 1.0
98
self.opinions = 1
10-
if self.err == 0 and dist is not None:
11-
self.calc_error()
12-
13-
def calc_error(self):
14-
self.err = self.dist * 0.01
159

1610
def get_resolved_node(self):
1711
if self.is_resolved():
@@ -44,18 +38,21 @@ def get_node_pair(self):
4438
def is_resolved(self):
4539
return self.node1.is_resolved() and self.node2.is_resolved()
4640

47-
def avg_with_history(self, history):
48-
m = [self.dist]
49-
for measurements in history:
50-
for measurement in measurements:
51-
if self == measurement:
52-
m.append(measurement.dist)
53-
nm = Measurement(self.node1, self.node2, sum(m) / len(m))
54-
nm.opinions = self.opinions
55-
return nm
41+
# def avg_with_history(self, history):
42+
# m = [self.dist]
43+
# for measurements in history:
44+
# for measurement in measurements:
45+
# if self == measurement:
46+
# m.append(measurement.dist)
47+
# nm = Measurement(self.node1, self.node2, sum(m) / len(m))
48+
# nm.opinions = self.opinions
49+
# return nm
50+
51+
def get_std(self):
52+
return self.std
5653

5754
def __str__(self):
58-
return '{:12s} -> {:12s}: {:.3f} . {:.3f}'.format(str(self.node1), str(self.node2), self.dist, self.confidence)
55+
return '{:12s} -> {:12s}: {:.3f} . {:.3f}'.format(str(self.node1), str(self.node2), self.dist, self.std)
5956

6057
def __eq__(self, other):
6158
return self.node1 == other.node1 and self.node2 == other.node2

helpers/node.py

Lines changed: 90 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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'])

multi_tri/multi_tri.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@ def __init__(self, nodes):
1616
self.resolved_nodes = [nodes['0'], nodes['1']] # Known
1717

1818
self.config = {
19-
'max_cluster_radius': 50,
20-
'min_guess_isolation': 250,
21-
'min_cluster_difference': 10
19+
'max_cluster_radius': 25000, #50,
20+
'min_guess_isolation': 72600,
21+
'min_cluster_difference': 3000
2222
}
2323

2424
def process(self, callback, multi_pipe=None):
@@ -72,7 +72,7 @@ def process(self, callback, multi_pipe=None):
7272
self.resolved_nodes = [self.backup_nodes['0'], self.backup_nodes['1']] # Known
7373

7474
self.reduce_measure_list() # Step 1 / Step 3?
75-
self.apply_raw_confidence() # Step2
75+
# self.apply_raw_confidence() # Step2
7676
self.print_list(self.measure_list, title='Current Meas')
7777

7878
self.piping = False
@@ -83,7 +83,7 @@ def process(self, callback, multi_pipe=None):
8383
# "cmd": "clear_screen",
8484
# "args": None
8585
# })
86-
# time.sleep(0.01)
86+
8787

8888
# Loop coordination for step 4
8989
guessing = True
@@ -393,11 +393,11 @@ def reduce_measure_list(self):
393393

394394
# Apply basic confidences based on the distance between nodes and the
395395
# number of original measurements used
396-
def apply_raw_confidence(self):
397-
for m in self.measure_list:
398-
m.confidence = 0.5
399-
for x in range(m.opinions - 1):
400-
m.confidence *= 1.1
396+
# def apply_raw_confidence(self):
397+
# for m in self.measure_list:
398+
# m.confidence = 0.5
399+
# for x in range(m.opinions - 1):
400+
# m.confidence *= 1.1
401401

402402
############################### Helpers ###############################
403403

0 commit comments

Comments
 (0)