changeset 1265:1ddd1f057749

some old Measurement and Locator edits Ignore-this: 188ecdf63f49b7a58f99a5961c6c23a6 darcs-hash:53fc6d5070d1ac0ad286c9c4d59a85dc134f3f02
author drewp <drewp@bigasterisk.com>
date Sat, 20 Apr 2019 23:35:46 -0700
parents c5b13d630d90
children ee5698ef64dd
files service/beacon/locator.py service/beacon/makefile service/beacon/rssiscan.py
diffstat 3 files changed, 82 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/beacon/locator.py	Sat Apr 20 23:35:46 2019 -0700
@@ -0,0 +1,59 @@
+from __future__ import division
+import ast, math
+
+class Measurement(object):
+    def __init__(self, d):
+        self.d = d
+
+    def distanceTo(self, other):
+        sharedKeys = set(self.d).intersection(other.d)
+        return math.sqrt(sum((other.d[f] - self.d[f])**2 for f in sharedKeys))
+        
+class Locator(object):
+    def __init__(self):
+        self.points = {} # num : (meas, coord)
+        for lineLev, lineCoord in zip(open('saved_points'), open('saved_points_coords')):
+            n, d = lineLev.split(None, 1)
+            c = ast.literal_eval(lineCoord)
+            if c['num'] != int(n):
+                raise ValueError("%r vs %r" % (lineLev, lineCoord))
+            self.points[c['num']] = (Measurement(ast.literal_eval(d)),
+                                     (round(c['x'], 3), round(c['y'], 3), round(c['z'], 3)))
+        for junk in [1, 2, 28, 29]:
+            del self.points[junk]
+
+    def nearestPoints(self, meas):
+        out = []  # (dist, coord)
+        for num, (knownMeas, coord) in self.points.iteritems():
+            out.append((round(knownMeas.distanceTo(meas), 2), coord))
+        out.sort()
+        return out
+
+    def estimatePosition(self, nearest):
+        """list of (dist, coord) -> weighted coord"""
+        floors = [row[1][2] for row in nearest]
+        freqs = [(floors.count(z), z) for z in floors]
+        freqs.sort()
+        bestFloor = freqs[-1][1]
+        sameFloorMatches = [(dist, coord) for dist, coord in nearest
+                            if coord[2] == bestFloor]
+        sameFloorMatches.sort()
+        sameFloorMatches = sameFloorMatches[:3]
+
+        weightedCoord = [0, 0, 0]
+        totalWeight = 0
+        for dist, coord in sameFloorMatches:
+            weight = (1 / (dist - sameFloorMatches[0][0] + .2))
+            totalWeight += weight
+            for i in range(3):
+                weightedCoord[i] += weight * coord[i]
+        for i in range(3):
+            weightedCoord[i] /= totalWeight
+        return weightedCoord
+        
+if __name__ == '__main__':
+    loc = Locator()
+    for row in loc.nearestPoints(Measurement({"bed":-78.2,"changing":-90.2,"living":-68})):
+        print row
+    
+    
--- a/service/beacon/makefile	Sat Apr 20 23:33:39 2019 -0700
+++ b/service/beacon/makefile	Sat Apr 20 23:35:46 2019 -0700
@@ -1,4 +1,4 @@
-build_image:
+build_image_x86:
 	docker build --network=host -t bang6:5000/beacon_x86:latest .
 	docker push bang6:5000/beacon_x86:latest
 
@@ -11,3 +11,9 @@
 
 local_run:
 	docker run --rm -it -p 10004:10004 --net=host bang6:5000/beacon_x86:latest
+
+fresh_sudo:
+	sudo -v
+redeploy_x86: fresh_sudo build_image_x86
+	sudo /my/proj/ansible/playbook -l dash,bang  -t rfid
+	supervisorctl -s http://$(RUNHOST):9001/ restart $(JOB)_$(PORT)
--- a/service/beacon/rssiscan.py	Sat Apr 20 23:33:39 2019 -0700
+++ b/service/beacon/rssiscan.py	Sat Apr 20 23:35:46 2019 -0700
@@ -176,21 +176,22 @@
                 rows = list(evt_le_advertising_report_dump(pkt))
                 for row in sorted(rows):
                     rssi = row.pop('rssi')
-                    points.append(dict(
-                        measurement='rssi',
-                        tags={'from': source, 'toAddr': row['addr']},
-                        fields={'value': rssi},
-                        time=nowMs,
-                        ))
-                    key = (row['addr'], row['evt_type'])
-                    if lastDoc.get(key) != row:
-                        # should check mongodb here- maybe another
-                        # node already wrote this row
-                        lastDoc.put(key, row)
-                        row = row.copy()
-                        row['t'] = now
-                        coll.insert(row)
-                    
+                    if row['addr_type'] == 'Public': # or, someday, if it's a device we know
+                        points.append(dict(
+                            measurement='rssi',
+                            tags={'from': source, 'toAddr': row['addr']},
+                            fields={'value': rssi},
+                            time=nowMs,
+                            ))
+                        key = (row['addr'], row['evt_type'])
+                        if lastDoc.get(key) != row:
+                            # should check mongodb here- maybe another
+                            # node already wrote this row
+                            lastDoc.put(key, row)
+                            row = row.copy()
+                            row['t'] = now
+                            coll.insert(row)
+
     influx.write_points(points, time_precision='ms')
     sock.setsockopt( bluez.SOL_HCI, bluez.HCI_FILTER, old_filter )