Browse Source

clustering using yaw data

Xi Ruoyao 4 years ago
parent
commit
96b1df970c
1 changed files with 37 additions and 2 deletions
  1. 37 2
      main.py

+ 37 - 2
main.py

@@ -4,13 +4,14 @@ from collections import namedtuple
 import numpy as np
 import matplotlib.pyplot as plt
 from itertools import groupby
+from math import pi, sin, cos
 
 import csv_parser
 import recog
 import metric
 
 if __name__ == '__main__':
-    data = csv_parser.parse_data_from_csv('test0714.csv')
+    data = csv_parser.parse_data_from_csv('pitchtest0730.csv')
     groups = groupby(data, key = lambda x: x.hwid)
     entries = []
     for k, grp in groups:
@@ -21,9 +22,13 @@ if __name__ == '__main__':
     for ent in entries:
         print(ent)
     x = []
+    yaws = []
     for e in entries:
         x.append([e.lon, e.lat])
+        yaws.append(e.yaw / 180 * pi)
+    print(yaws)
     x = np.array(x)
+    yaws = np.array(yaws)
     db = DBSCAN(eps = 10/6400000, min_samples = 10,
             metric = metric.spherical_distance).fit(x)
     labels = db.labels_
@@ -60,8 +65,8 @@ if __name__ == '__main__':
         plt.plot(xy[:, 0], xy[:, 1], 'o', markerfacecolor=tuple(col),
                          markeredgecolor='k', markersize=6)
 
+        xy = x[class_member_mask]
         if k != -1:
-            xy = x[class_member_mask]
             print("cluster %d:" % k)
             center = np.array([np.average(xy[:, 0]), np.average(xy[:, 1])])
             print("center = %f, %f" % (center[0], center[1]))
@@ -72,4 +77,34 @@ if __name__ == '__main__':
                 rad = max(rad, metric.spherical_distance(center_p, p))
             rad *= 6400 * 1000
             print("radius = %f m" % rad)
+
+        yaw = yaws[class_member_mask]
+        db_yaw = DBSCAN(eps = 0.05, min_samples=100,
+                metric = metric.ang_distance).fit(yaw.reshape(-1, 1))
+        lbs = set(db_yaw.labels_)
+        arrow_colors = [plt.cm.Spectral(each)
+                          for each in np.linspace(0, 1, len(lbs))]
+        for l in lbs:
+            if l != -1:
+                print("  sub-cluster %d: avg yaw = %f" %
+                        (l, 180 / pi * np.average(yaw[(db_yaw.labels_ == l)])))
+
+        kwargs = {'width': 1e-5}
+        for i in range(len(xy)):
+            col = arrow_colors[db_yaw.labels_[i]]
+            if db_yaw.labels_[i] == -1:
+                continue
+                col = [0, 0, 0, 1]
+            '''
+            plt.arrow(xy[i, 0], xy[i, 1],
+                    5e-5 * cos(pi/2 - yaw[i]),
+                    5e-5 * sin(pi/2 - yaw[i]),
+                    **dict(width=1e-7, color=col))
+            '''
+            plt.annotate("", xytext=(xy[i, 0], xy[i, 1]), 
+                    xy=(xy[i, 0] + 2e-5 * sin(pi/2 - yaw[i]),
+                        xy[i, 1] + 2e-5 * cos(pi/2 - yaw[i])),
+                    arrowprops=dict(arrowstyle="->",
+                        color=col))
+
     plt.show()