Last active
July 30, 2017 09:12
-
-
Save nickoala/0818146d24374c06b0a3dcd7f8a01ba7 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" Raspberry Pi + GPS Car Camera | |
Achieved with three threads: | |
1. Main thread - | |
Start preview and recording. | |
2. GPS thread - | |
Read GPS location. | |
3. Annotate thread - | |
Put GPS location and datetime on image. | |
Refresh every one second to simulate a running clock. | |
Should be coupled with a cron job which deletes old video clips, | |
to prevent disk from filling up. | |
**Customize video size, preview dimension, and clip directory before trying.** | |
""" | |
import picamera | |
from datetime import datetime | |
import threading | |
import time | |
import os.path | |
import gps | |
video_size = (640, 480) | |
preview_dimension = (160, 0, 640, 480) # x, y, w, h | |
clip_directory = Full path to your clip directory, e.g. /home/pi/gpscam/clips | |
def record(camera): | |
def datetime_filename(): | |
while 1: | |
yield ( | |
os.path.join( | |
clip_directory, | |
datetime.now().strftime('%Y%m%d-%H%M') + '.h264')) | |
def seconds_to_cutoff(): | |
cutoffs = [15, 30, 45, 60] | |
now = datetime.now() | |
for c in cutoffs: | |
if c <= now.minute: | |
continue | |
return c*60 - now.minute*60 - now.second | |
for filename in camera.record_sequence(datetime_filename()): | |
camera.wait_recording(seconds_to_cutoff()) | |
latest_location = None | |
def gpsread(): | |
global latest_location | |
session = gps.gps(mode=gps.WATCH_ENABLE | gps.WATCH_NEWSTYLE) | |
for report in session: | |
if report['class'] == 'TPV': | |
if report['mode'] in [2,3]: | |
latest_location = (report['lat'], report['lon']) | |
else: | |
latest_location = None | |
# Separate annotation from GPS because I want to refresh the text | |
# once per second to give an illusion of a running clock. | |
def annotate(camera): | |
def compose_text(dt, location): | |
if location: | |
lat, lon = location | |
loctext = '%.4f%s %.4f%s' % (lat, | |
'N' if lat >= 0 else 'S', | |
lon, | |
'E' if lon >= 0 else 'W') | |
else: | |
loctext = '--lat-- --lon--' | |
return dt.strftime('%Y-%m-%d %H:%M:%S ') + loctext | |
global latest_location | |
camera.annotate_text_size = 24 | |
while 1: | |
camera.annotate_text = compose_text(datetime.now(), | |
latest_location) | |
time.sleep(1) | |
camera = picamera.PiCamera(resolution=video_size, framerate=30) | |
gps_thread = threading.Thread(target=gpsread) | |
gps_thread.daemon = True | |
gps_thread.start() | |
annotate_thread = threading.Thread(target=annotate, args=[camera]) | |
annotate_thread.daemon = True | |
annotate_thread.start() | |
camera.start_preview(fullscreen=False, window=preview_dimension) | |
record(camera) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment