in resources/drone_orbit.py [0:0]
def track_orbits(self, angle):
# tracking # of completed orbits is surprisingly tricky to get right in order to handle random wobbles
# about the starting point. So we watch for complete 1/2 orbits to avoid that problem.
if angle < 0:
angle += 360
if self.start_angle is None:
self.start_angle = angle
if self.snapshot_delta:
self.next_snapshot = angle + self.snapshot_delta
self.previous_angle = angle
self.shifted = False
self.previous_sign = None
self.previous_diff = None
self.quarter = False
return False
# now we just have to watch for a smooth crossing from negative diff to positive diff
if self.previous_angle is None:
self.previous_angle = angle
return False
# ignore the click over from 360 back to 0
if self.previous_angle > 350 and angle < 20:
if self.snapshot_delta and self.next_snapshot >= 360:
self.next_snapshot -= 360
return False
diff = self.previous_angle - angle
crossing = False
self.previous_angle = angle
if self.snapshot_delta and angle > self.next_snapshot:
print("Taking snapshot at angle {}".format(angle))
self.take_snapshot()
self.next_snapshot += self.snapshot_delta
diff = abs(angle - self.start_angle)
if diff > 45:
self.quarter = True
if self.quarter and self.previous_diff is not None and diff != self.previous_diff:
# watch direction this diff is moving if it switches from shrinking to growing
# then we passed the starting point.
direction = self.sign(self.previous_diff - diff)
if self.previous_sign is None:
self.previous_sign = direction
elif self.previous_sign > 0 and direction < 0:
if diff < 45:
self.quarter = False
if self.snapshots <= self.snapshot_index + 1:
crossing = True
self.previous_sign = direction
self.previous_diff = diff
return crossing