Last active
August 29, 2015 14:19
-
-
Save dustinlbarnett/06713ddaa926eebb7f42 to your computer and use it in GitHub Desktop.
Raspberry Pi Dashcam
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
#!/bin/bash | |
# dashcam.sh collects image and location data from a Raspberry Pi and writes it to a file. | |
# More information can be found here: https://gist.github.com/dustinlbarnett/06713ddaa926eebb7f42 | |
# Copyright (C) 2015 Dustin Barnett | |
# | |
# This program is free software: you can redistribute it and/or modify | |
# it under the terms of the GNU General Public License as published by | |
# the Free Software Foundation, either version 3 of the License, or | |
# (at your option) any later version. | |
# | |
# This program is distributed in the hope that it will be useful, | |
# but WITHOUT ANY WARRANTY; without even the implied warranty of | |
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
# GNU General Public License for more details. | |
# | |
# You should have received a copy of the GNU General Public License | |
# along with this program. If not, see <http://www.gnu.org/licenses/>. | |
# Dependencies: | |
# gpsd | |
# gpsd-clients | |
# raspistill | |
# bc | |
# BU-353 GPS Adapter | |
# Instructions: | |
# Adjust DESTINATION and RASPISTILL variables below for you environment | |
# Place script at /home/pi/ | |
# Make sure it's executable using chmod +x dashcam.sh | |
# Edit crontab and add "@reboot /home/pi/dashcam.sh" | |
# | |
# Every time rasberry pi is started the script will: | |
# 1. Attempt to get current time from GPS and set local clock | |
# 2. Create dashcam directory and data directories under that based on date | |
# 3. Get gps data by running gpspipe and saving nmea data to file at gps_tracks directory | |
# 4. Starts loop that takes pictures using raspistill | |
# - Takes picture at 1080x1920 with 1 second delay using raspistill | |
# - Gets latest $GPRMC sentence from .nmea file @ gps_tracks | |
# - Converts nmea coordinates to lat/lng decimal | |
# - writes coordinates, filename, and time to imagedata.csv | |
# - Starts over with no sleep. Seems to be about 2 seconds probably due to how long it takes to write image file. | |
# - stops at 9999 pictures. To go higher must ajust printf command. | |
# Change this to where you want the dashcam directory | |
DESTINATION=/home/pi/ | |
# raspistill command. Adjust for quality settings or image rotation as needed. | |
RASPISTILL="raspistill -t 1000 -n -q 14 -vf -hf -h 1080 -w 1920 -o" | |
#Stop script if BU-353 GPS is not connected. | |
if ! lsusb | grep -wq "PL2303"; then | |
echo "$DATETIME GPS not detected, exiting..." | |
exit 1 | |
else | |
echo "$DATETIME GPS detected" | |
fi | |
# Get GPS Time | |
# Checks if GPS is fixed by getting mode from gpsd output sentences. Mode less than 2 is low quality fix. | |
ATTEMPT=0 | |
GPSFIX=0 | |
TIMESET=0 | |
MODE=0 | |
while [ $TIMESET -lt 1 ] | |
do | |
while [ $ATTEMPT -lt 12 ] | |
do | |
if [ $GPSFIX -lt 1 ] | |
then | |
while [ $MODE -lt 2 ] | |
do | |
MODE=`gpspipe -w | head -10 | grep TPV | sed -r 's/.*"mode":([0-9]).*/\1/' | head -1` | |
GPSFIX=$MODE | |
let "ATTEMPT=ATTEMPT+1" | |
TIMESET=10 | |
sleep 5 | |
done | |
else | |
echo "GPS fixed, getting time..." | |
GPSDATE=`gpspipe -w | head -10 | grep TPV | sed -r 's/.*"time":"([^"]*)".*/\1/' | head -1` | |
echo "date -s $GPSDATE" | |
date -s $GPSDATE | |
TIMESET=1 | |
ATTEMPT=100 | |
fi | |
done | |
done | |
if [ $ATTEMPT = 100 ] | |
then | |
echo "Success" | |
else | |
echo "Unable to get time from GPS device." | |
fi | |
#set date/time variables | |
TIMESTAMP=$(date +"%H-%M") | |
DATESTAMP=$(date +"%Y-%m-%d") | |
DATETIME="$DATESTAMP"_"$TIMESTAMP" | |
# Create base directories if they don't exist | |
mkdir -p "$DESTINATION"/dashcam | |
mkdir -p "$DESTINATION"/dashcam/images/"$DATETIME" | |
mkdir -p "$DESTINATION"/dashcam/gps_tracks | |
# collect gps stream. kill gpspipe if running | |
killall gpspipe | |
gpspipe -r -o "$DESTINATION"/dashcam/gps_tracks/"$DATETIME".nmea & | |
# Create gps trip directory base on date/time | |
mkdir -p "$DESTINATION"/dashcam/images/"$DATETIME" | |
# should be using GPRMC, not GPGGA | |
#2,4,5,6,7,8,10,11,12 | |
#$GPRMC,204725.000,A,3827.1349,N,12121.6288,W,13.38,189.08,260415,,*26 | |
#1 2 3 4 5 6 7 8 9 10 11 12 13 | |
#nmea,time,warn,lat,ldir,lng,lngdir,speed,cmg,date,direction,dirdir,checksum | |
echo "filename,time,date,latitude,longitude,speed" > "$DESTINATION"/dashcam/images/"$DATETIME"/imagedata.csv | |
#Starting raspistill loop. | |
j=0 | |
while [ $j -lt 9999 ]; do | |
let j=j+1 | |
FILENAME="`printf %04d $j`.jpg" | |
$RASPISTILL "$DESTINATION"/dashcam/images/"$DATETIME"/"$FILENAME" | |
GPSTIMESTAMP=$(sed -n '/^$GPRMC/p' "$DESTINATION"/dashcam/gps_tracks/"$DATETIME".nmea | tail -n 1) | |
GPSTIME=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $2}') | |
NMEALAT=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $4}') | |
NMEALATDIR=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $5}') | |
NMEALNG=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $6}') | |
NMEALNGDIR=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $7}') | |
NMEASPEED=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $8}') | |
NMEADATE=$(echo "$GPSTIMESTAMP" | awk -F ',' '{print $10}') | |
if [ ${#NMEALAT} -gt 9 ]; then | |
# echo "LAT Greater than 9" | |
LATTEMP=$(echo $NMEALAT | cut -b 1-3) | |
LATTEMP2=$(echo $NMEALAT | cut -b 4-) | |
LATRESULT=`echo "scale =6; $LATTEMP + ($LATTEMP2/60)" | bc -l` | |
else | |
# echo "LAT 9 or lower" | |
LATTEMP=$(echo $NMEALAT | cut -b 1-2) | |
LATTEMP2=$(echo $NMEALAT | cut -b 3-) | |
LATRESULT=`echo "scale =6; $LATTEMP + ($LATTEMP2/60)" | bc -l` | |
fi | |
if [ ${#NMEALNG} -gt 9 ]; then | |
# echo "LNG Greater than 9" | |
LNGTEMP=$(echo $NMEALNG | cut -b 1-3) | |
LNGTEMP2=$(echo $NMEALNG | cut -b 4-) | |
LNGRESULT=`echo "scale =6; $LNGTEMP + ($LNGTEMP2/60)" | bc -l` | |
else | |
# echo "LNG 9 or lower" | |
LNGTEMP=$(echo $NMEALNG | cut -b 1-2) | |
LNGTEMP2=$(echo $NMEALNG | cut -b 3-) | |
LNGRESULT=`echo "scale =6; $LNGTEMP + ($LNGTEMP2/60)" | bc -l` | |
fi | |
#Convert to decimal lat/lng | |
if [ "$NMEALATDIR" = "S" ] | |
then | |
NMEALATCONV="-$LATRESULT" | |
else | |
NMEALATCONV="$LATRESULT" | |
fi | |
if [ "$NMEALNGDIR" = "W" ] | |
then | |
NMEALNGCONV="-$LNGRESULT" | |
else | |
NMEALNGCONV="$LNGRESULT" | |
fi | |
echo "$DATETIME/$FILENAME,$GPSTIME,$NMEADATE,$NMEALATCONV,$NMEALNGCONV,$NMEASPEED" >> "$DESTINATION"/dashcam/images/"$DATETIME"/imagedata.csv | |
# sleep 1 | |
done |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment