mirror of https://github.com/ArduPilot/ardupilot
geotag.sh - an advanced geotagging tool.
It can do all, tag by time, with offset, by CAM messages, detect and help correct problems, and process multiple logs(flights) at once.
This commit is contained in:
parent
436f514142
commit
63c1439c39
|
@ -0,0 +1,779 @@
|
|||
#!/bin/bash
|
||||
|
||||
# Advanced geotagging tool by André Kjellstrup
|
||||
###################################################################### VARIABLES ########################
|
||||
|
||||
version="v1.1"
|
||||
mode=1 # 0=geotag, 1=jpg distance(s) , 2=CAM distance in sec
|
||||
loglinenum=1 # last read log line number
|
||||
loglinenummatched=0 # last read log line number used - reverting to this +1 when looking back
|
||||
logline="start" #current line, placeholder for start
|
||||
logtimemsprev=0
|
||||
logended=0 #true if log ended.
|
||||
logtarget=0 #true if we got log type we wanted
|
||||
logmatch=1 # true if we accepted lo line as matching
|
||||
loggotpos=0 #true if log contains pos messages (enables fallback)
|
||||
typical_offset="notset" #contains time offset of first picture vs log.
|
||||
jpgtot=0 #number of jpg files in folder
|
||||
jpgtagged=0 #number of correctly tagged photos
|
||||
jpgmiss=0 #number of missing photos
|
||||
jpgnotinlog=0 #counting jpg's with timestamp outside log
|
||||
camindex=0 #number of last CAM message used.
|
||||
camtot=0 #number of CAM lines found
|
||||
trigtot=0 #number of TRIG lines found
|
||||
logmiss=0 #missed CAM messages
|
||||
revjumps=0 #count how many time we have backed up
|
||||
difflimit=10 # POS message difflimit 10 gives 0.06sec , 20 has proved useful
|
||||
running=1
|
||||
cmdarg=$* #save command line parameters
|
||||
FILE=jpglist
|
||||
ML="false"
|
||||
logsdone=0 #counts processed logs
|
||||
SKIPIMG=0
|
||||
|
||||
|
||||
|
||||
###########################
|
||||
|
||||
while [[ $# > 0 ]]
|
||||
do
|
||||
key="$1"
|
||||
|
||||
case $key in
|
||||
-w|--write)
|
||||
WRITE="true"
|
||||
;;
|
||||
-r|--readonly)
|
||||
WRITE="false"
|
||||
;;
|
||||
-f|--find)
|
||||
WRITE="false"
|
||||
FIND="true"
|
||||
;;
|
||||
-p|--pos)
|
||||
MODE="POS"
|
||||
typical_offset="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
-dl|--difflimit)
|
||||
difflimit="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
-c|--cam)
|
||||
MODE="CAM"
|
||||
;;
|
||||
-t|--trig)
|
||||
MODE="TRIG"
|
||||
;;
|
||||
-ns|--nosubsec)
|
||||
NS="true"
|
||||
;;
|
||||
-ml|--multilog)
|
||||
ML="true"
|
||||
;;
|
||||
-del|--delorg)
|
||||
DELORG="true"
|
||||
;;
|
||||
-sp|--skipphoto)
|
||||
SKIPIMG="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
-sc|--skipcam)
|
||||
SKIPCAM="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
-st|--skiptrig)
|
||||
SKIPTRIG="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
-sl|--skiplog)
|
||||
SKIPLOG="$2"
|
||||
shift # get past argument
|
||||
;;
|
||||
|
||||
-h|--help)
|
||||
HELP="true"
|
||||
;;
|
||||
*)
|
||||
# unknown option
|
||||
;;
|
||||
esac
|
||||
shift # past argument or value
|
||||
done
|
||||
|
||||
#echo FILE EXTENSION = "${EXTENSION}"
|
||||
#echo SEARCH PATH = "${SEARCHPATH}"
|
||||
#echo LIBRARY PATH = "${LIBPATH}"
|
||||
|
||||
if [[ "$HELP" == "true" ]] || [[ "$WRITE" == "" ]] #|| [[ "$MODE" == "" ]]
|
||||
then
|
||||
echo "Geotagging script by André Kjellstrup. $version"
|
||||
echo "execute inside a folder containing .JPG and .BIN"
|
||||
echo "example: geotag.sh -c -sp 2 -r"
|
||||
echo ""
|
||||
echo "-w or --write Enables photo processing"
|
||||
echo "-r or --readonly Enables photo processing"
|
||||
echo "-f or --readonly, finds CAM to exif spacing for +/- 10 skipped photos, and +/- 10 skipped CAM messages"
|
||||
echo "-sp x or --skipphoto x Skips x photos counting from the start"
|
||||
echo "-sc x or --skipcam x Skips x CAM entrys from the start"
|
||||
echo "-sl x or --skiplog x Skips x POS entrys from the start"
|
||||
echo "-st x or --skiptrig x Skips x TRIG entrys from the start"
|
||||
echo "-p x or --pos x Use POS log only (if camera was independendly trigged) x=offset in seconds"
|
||||
echo "-dl x or --difflimit x Acceptable limit in 10ms steps for POS-log vs photo differance 10=0.1s (default)"
|
||||
echo "-c or --cam Use CAM log only (do not fall back to POS pessages)"
|
||||
echo "-t or --trig Use TRIG log only (if camera shutter is sensed)"
|
||||
echo "-ns or --nosubsec Do not look for subsecond EXIF tag."
|
||||
echo "-ml or --multilog Grab and combine all .BIN files (for processing photos from more then one flight."
|
||||
echo "-del or --delorg : Delete JPG_original (backups)."
|
||||
echo "EXAMPLE:"
|
||||
echo "Multiple flights dataset from S100; geotag.sh -p 0 -ns -dl 30 -w -ml -del"
|
||||
echo "simgle CAM flight; geotag.sh -c -w -del"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
##ADD DEPENDENCIES HERE
|
||||
command -v mavlogdump.py >/dev/null 2>&1 || { echo >&2 "I require mavlogdump.py but it's not installed. Aborting."; exit 1; }
|
||||
command -v exiftool >/dev/null 2>&1 || { echo >&2 "I require exiftool but it's not installed. Aborting."; exit 1; }
|
||||
##command -v foo >/dev/null 2>&1 || { echo >&2 "I require foo but it's not installed. Aborting."; exit 1; }
|
||||
|
||||
if [[ "$WRITE" == "true" ]]
|
||||
then
|
||||
echo "INFO: will backup and modify photos" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$WRITE" == "false" ]]
|
||||
then
|
||||
echo "INFO: dry run only, no photos will be modified" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$MODE" == "POS" ]]
|
||||
then
|
||||
echo "INFO: use POS records only, expected offset of $typical_offset , poslimit (time of photo vs log is $poslimit)" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$MODE" == "CAM" ]]
|
||||
then
|
||||
echo "INFO: use CAM records only" | tee geotag.log
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$MODE" == "TRIG" ]]
|
||||
then
|
||||
echo "INFO: use TRIG records only" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$NS" == "true" ]]
|
||||
then
|
||||
echo "INFO: Do not look for subsecond-time in EXIF" | tee geotag.log
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$SKIPIMG" -gt "0" ]]
|
||||
then
|
||||
echo "INFO: will skip first $SKIPIMG photos" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$SKIPCAM" -gt "0" ]]
|
||||
then
|
||||
echo "INFO: will skip first $SKIPCAM CAM logs" | tee geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$SKIPTRIG" -gt "0" ]]
|
||||
then
|
||||
echo "INFO: will skip first $SKIPTRIG TRIG logs" | tee geotag.log
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$SKIPLOG" -gt "0" ]]
|
||||
then
|
||||
echo "INFO: will skip first $SKIPLOG POS logs" | tee geotag.log
|
||||
loglinenum=$SKIPLOG
|
||||
fi
|
||||
|
||||
if [ "$difflimit" != 10 ]
|
||||
then
|
||||
echo "INFO: Difflimit is changed to $difflimit (10=0.1s)" | tee geotag.log
|
||||
fi
|
||||
|
||||
|
||||
echo "INFO: using arguments $cmdarg " | tee geotag.log
|
||||
|
||||
jpglistindex=$(( 1 + $SKIPIMG)) #which file to read from jpg list
|
||||
|
||||
|
||||
#========================= FUNCTION readexif ======================================================
|
||||
# get exif data for filename in $jpgname,
|
||||
# return: $jpgdate 20-12-2010 ,$jpgtime 14:10:20.22 ,$jpgtimems 0.22 (220ms)
|
||||
function readexif
|
||||
{
|
||||
if [[ "$NS" == "true" ]]
|
||||
then
|
||||
jpgdatetime=$(exiftool -ee -p '$datetimeoriginal' "$jpgname" -n)
|
||||
jpgdatetime="$jpgdatetime.50"
|
||||
else
|
||||
jpgdatetime=$(exiftool -ee -p '$subsecdatetimeoriginal' "$jpgname" -n)
|
||||
fi
|
||||
|
||||
|
||||
jpgdate=$(echo -n "$jpgdatetime" | head -c10)
|
||||
jpgdate=$(echo "$jpgdate" | tr : -) #replace : with -
|
||||
jpgtime=$(echo -n "$jpgdatetime" | tail -c-11)
|
||||
jpgtimems=$(echo -n "$jpgtime" | tail -c-2)
|
||||
jpgtimems=$(echo "scale=2; ($jpgtimems /100)" | bc -l)
|
||||
#echo "DEBUG $jpgname date $jpgdate time $jpgtime "
|
||||
##read -p "Press any key to continue... " -n1 -s
|
||||
######browse log until we find CAM message
|
||||
}
|
||||
|
||||
#========================= FUNCTION readlog ======================================================
|
||||
# extract needed date from logline string $logline
|
||||
# return: $logdate 20-12-2010 ,$logtime 14:10:20.22 ,$logtimems 0.22 (220ms)
|
||||
# return: $lat $lon $alt(m AMSL)
|
||||
#
|
||||
###### We Prefer TRIG , then CAM, then fallback to POS
|
||||
# in log they look alike:
|
||||
#1970-01-01 01:01:12.55: CAM {TimeUS : 72553489, GPSTime : 0, GPSWeek : 0, Lat : 0.0, Lng : 0.0, Alt : -0.01, RelAlt : -0.01, GPSAlt : 0.0, Roll : 1.4, Pitch : 0.41, Yaw : 82.49}
|
||||
#1970-01-01 01:01:15.80: TRIG {TimeUS : 75803571, GPSTime : 0, GPSWeek : 0, Lat : 0.0, Lng : 0.0, Alt : -0.01, RelAlt : -0.01, GPSAlt : 0.0, Roll : 1.43, Pitch : 0.43, Yaw : 82.62}
|
||||
|
||||
function readlog
|
||||
{
|
||||
logdate=$(echo "$logline"| grep -o '^\S*') #till first space
|
||||
logtime=$(echo "$logline"| awk -F" " '{print $2}')
|
||||
logtime=$(echo -n "$logtime" | head -c-1) #remove trailing :
|
||||
logtimems=$(echo -n "$logtime" | tail -c-2)
|
||||
logtimems=$(echo "scale=2; ($logtimems /100)" | bc -l)
|
||||
|
||||
if [[ "$logline" == *POS* ]]
|
||||
then
|
||||
lat=$(echo "$logline"| grep -o -P '(?<=Lat : ).*(?=, Lng)')
|
||||
lon=$(echo "$logline"| grep -o -P '(?<=Lng : ).*(?=, Alt)')
|
||||
alt=$(echo "$logline"| grep -o -P '(?<= Alt : ).*(?=, RelHomeAlt)')
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$logline" == *CAM* ]]
|
||||
then
|
||||
lat=$(echo "$logline"| grep -o -P '(?<=Lat : ).*(?=, Lng)')
|
||||
lon=$(echo "$logline"| grep -o -P '(?<=Lng : ).*(?=, Alt)')
|
||||
alt=$(echo "$logline"| grep -o -P '(?<=Alt : ).*(?=, RelAlt)')
|
||||
fi
|
||||
|
||||
|
||||
#rol=$(echo "$logline"| grep -o -P '(?<=Roll : ).*(?=, Pitch)')
|
||||
#pit=$(echo "$logline"| grep -o -P '(?<=Pitch : ).*(?=, Yaw)')
|
||||
#yaw=$(echo "$logline"| grep -o -P '(?<=Yaw : ).*(?=})')
|
||||
#echo "$logdate $logtime CAM=$cam Lat=$lat Lng=$lng Alt= $alt"
|
||||
|
||||
}
|
||||
|
||||
#========================= FUNCTION geotag ======================================================
|
||||
# converts to WGS84 and tags photos with data found in lat,lon,alt.
|
||||
function geotag
|
||||
|
||||
{
|
||||
#jpgname="test.JPG"
|
||||
#lat=69.6041115
|
||||
#lon=23.2757452
|
||||
#alt=122.8374
|
||||
|
||||
posWGS84=( $(echo "$lon $lat $alt" | cs2cs +proj=latlong +datum=WGS84)) # returns position as 22d16'32.683"E 69d36'14.801"N 123.837 in {posWGS84[0...2]}
|
||||
lonWGS84ref=$(echo -n "${posWGS84[0]}" | tail -c-1)
|
||||
lonWGS84pos=$(echo -n "${posWGS84[0]}" | head -c-1)
|
||||
latWGS84ref=$(echo -n "${posWGS84[1]}" | tail -c-1)
|
||||
latWGS84pos=$(echo -n "${posWGS84[1]}" | head -c-1)
|
||||
|
||||
#echo $lonWGS84pos
|
||||
#echo $lonWGS84ref
|
||||
#echo $latWGS84pos
|
||||
#echo $latWGS84ref
|
||||
#echo "original:"
|
||||
#echo ${posWGS84[0]}
|
||||
#echo ${posWGS84[1]}
|
||||
#echo ${posWGS84[2]}
|
||||
|
||||
if [[ "$WRITE" == "true" ]]
|
||||
then
|
||||
exiftool -exif:gpsmapdatum="WGS-84" -exif:gpsaltitude="$alt" -exif:gpsaltituderef="Above Sea Level" -exif:gpslongitude="$lonWGS84pos" -exif:gpslongituderef="$lonWGS84ref" -exif:gpslatitude="$latWGS84pos" -exif:gpslatituderef="$latWGS84ref" "$jpgname" >/dev/null &
|
||||
fi
|
||||
let "jpgtagged++"
|
||||
echo "ALT= "$alt" LON= "$lonWGS84pos" LATref= "$lonWGS84ref" LAT= "$latWGS84pos" LATref= "$latWGS84ref""
|
||||
}
|
||||
|
||||
|
||||
#========================= FUNCTION report ======================================================
|
||||
function report
|
||||
{
|
||||
echo "Report:" | tee -a geotag.log
|
||||
echo "Found $jpgtot photos" | tee -a geotag.log
|
||||
echo "Found $camtot CAM log lines" | tee -a geotag.log
|
||||
echo "Found $trigtot TRIG log lines" | tee -a geotag.log
|
||||
echo "Time between first photo and log was ""$typical_offset""s" | tee -a geotag.log
|
||||
|
||||
if [[ "$WRITE" == "true" ]]
|
||||
then
|
||||
echo "Tagged $jpgtagged photos" | tee -a geotag.log
|
||||
else
|
||||
echo "Could have tagged $jpgtagged photos" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
if [[ "$MODE" != "POS" ]]
|
||||
then
|
||||
echo "Detected $jpgmiss missing photos" | tee -a geotag.log
|
||||
echo "Detected $logmiss missing $MODE messages" | tee -a geotag.log
|
||||
else
|
||||
echo "(Unable to detect and report missing pictures and CAM messages in POS mode)" | tee -a geotag.log
|
||||
fi
|
||||
if [[ "$jpgnotinlog" -gt 0 ]]
|
||||
then
|
||||
echo "FAILED: to tag $jpgnotinlog jpg file(s) where no POS log matched (maybe increase difflimit?)" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
|
||||
if [[ "$DELORG" == "true" ]]
|
||||
then
|
||||
echo "INFO: Deleting original .JPG that were cloned by EXIF" | tee -a geotag.log
|
||||
sleep 1s
|
||||
rm *.JPG_original
|
||||
fi
|
||||
|
||||
if [[ "$WRITE" == "true" ]]
|
||||
then
|
||||
mv geotag.log geotagwrite.log
|
||||
fi
|
||||
|
||||
}
|
||||
|
||||
|
||||
#========================= FUNCTION load log to memory ======================================================
|
||||
function loadlogdump
|
||||
{
|
||||
echo "INFO: Loading logdump into memory..." | tee -a geotag.log
|
||||
OLDIFS=$IFS
|
||||
IFS=$'\012' # \012 is a linefeed
|
||||
logarray=( $(<logdump) )
|
||||
IFS=$OLDIFS
|
||||
logarraysize=${#logarray[@]}
|
||||
echo "INFO: done, loaded $logarraysize lines." | tee -a geotag.log
|
||||
}
|
||||
|
||||
#========================= FUNCTION load camdump to memory ======================================================
|
||||
function loadcamdump
|
||||
{
|
||||
echo "INFO: Loading camdump into memory..." | tee -a geotag.log
|
||||
OLDIFS=$IFS
|
||||
IFS=$'\012' # \012 is a linefeed
|
||||
logarray=( $(<camdump) )
|
||||
IFS=$OLDIFS
|
||||
logarraysize=${#logarray[@]}
|
||||
echo "INFO: done, loaded $logarraysize lines." | tee -a geotag.log
|
||||
}
|
||||
|
||||
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
#========================= FUNCTION CAM only loop ======================================================
|
||||
function posloop
|
||||
{
|
||||
echo "INFO: Searching within POS log..." | tee -a geotag.log
|
||||
loggotpos=0
|
||||
|
||||
|
||||
###############get JPG file#########
|
||||
while [[ "$running" == 1 ]]
|
||||
do
|
||||
|
||||
if [ "$logmatch" == 1 ]
|
||||
then #read next picture only if log line accepted
|
||||
jpgname=$(awk 'NR=="'"$jpglistindex"'"{print;exit}' jpglist)
|
||||
|
||||
if [ "$jpgname" == "" ]
|
||||
then
|
||||
echo "END: Last photo processed" | tee -a geotag.log
|
||||
running=0
|
||||
report
|
||||
exit 1
|
||||
fi
|
||||
readexif
|
||||
fi
|
||||
|
||||
###############lookup LOG#########
|
||||
logtarget=0 #reset, for new search
|
||||
if [[ "$loglinereverse" -eq 1 || "$camindex" -eq "$camtot" || "$MODE" == "POS" ]]
|
||||
then
|
||||
POSONLY="true"
|
||||
else
|
||||
POSONLY="false"
|
||||
fi
|
||||
|
||||
while [ "$logtarget" -eq 0 ]
|
||||
do
|
||||
let "loglinenum++"
|
||||
|
||||
#### check if we are out of log messages.
|
||||
if [[ "$loglinenum" -gt "$logarraysize" ]]
|
||||
then
|
||||
echo "ERROR: Log ended at $loglinenum of $logarraysize while looking for $MODE message for filename $jpgname , maybe this photo is not a part of dataset, or in log, ignoring." | tee -a geotag.log
|
||||
|
||||
#read next picture only if log line accepted
|
||||
jpgname=$(awk 'NR=="'"$jpglistindex"'"{print;exit}' jpglist)
|
||||
let "loglinenum = loglinenummatched" # revert to last known good position in log - or to START, to mach photos in random order..
|
||||
let "jpglistindex++" #move on to next
|
||||
if [ "$jpgname" == "" ]
|
||||
then
|
||||
echo "END: Last photo processed" | tee -a geotag.log
|
||||
running=0
|
||||
report
|
||||
exit 1
|
||||
fi
|
||||
readexif
|
||||
fi
|
||||
|
||||
logline=${logarray["$loglinenum"]}
|
||||
|
||||
|
||||
if [[ "$logline" == *CAM* ]]
|
||||
then
|
||||
logtype="CAM"
|
||||
let "camindex++"
|
||||
logtarget=1
|
||||
readlog
|
||||
# echo "DEBUG: at $loglinenum $logline"
|
||||
fi
|
||||
if [[ "$logline" == *POS* ]] && [[ "$POSONLY" == "true" || "$loglinereverse" -eq 1 ]]
|
||||
then
|
||||
loggotpos=1
|
||||
logtype="POS"
|
||||
logtarget=1
|
||||
readlog
|
||||
#echo "DEBUG: at $loglinenum $logline"
|
||||
fi
|
||||
|
||||
if [[ "$SKIPCAM" -gt 0 ]] && [[ "$logtarget" -eq 1 ]]
|
||||
then
|
||||
let "SKIPCAM--"
|
||||
logtarget=0
|
||||
fi
|
||||
|
||||
|
||||
|
||||
done
|
||||
|
||||
#### check if we are out of suitable log messages.
|
||||
if [[ "$loglinenum" -gt "$logarraysize" ]]
|
||||
then
|
||||
echo "ERROR: Log ended at $loglinenum of $logarraysize while looking for CAM message for filename $jpgname maybe there are too many photos" | tee -a geotag.log
|
||||
running=0
|
||||
report
|
||||
exit 1
|
||||
fi
|
||||
|
||||
#echo "DEBUG relevant logline found loglinenumber=$loglinenum logline=$logline "
|
||||
######process log line
|
||||
|
||||
######## Calculate offset
|
||||
diff=$(( ( $(date -ud "$jpgdate $jpgtime" +'%s') - $(date -ud "$logdate $logtime" +'%s') ) )) #get differance in seconds (integer)
|
||||
difftot=$(echo "scale=2; ($diff+($jpgtimems - $logtimems))" | bc -l) # return floting point
|
||||
######## Calculate time since last trigger command
|
||||
differr=$(( ( $(date -ud "$logdate $logtime" +'%s') - $(date -ud "$logdateprev $logtimeprev" +'%s') ) )) #get differance in seconds (integer)
|
||||
difftoterr=$(echo "scale=2; ($differr+($logtimems - $logtimemsprev))" | bc -l) # return floting point
|
||||
difftotoff=$(echo "scale=2; ($difftot - $typical_offset)" | bc -l)
|
||||
difftoterroff=$(echo "scale=2; ($differr - $typical_offset)" | bc -l) # return floting point
|
||||
if [ "$typical_offset" == "notset" ]
|
||||
then
|
||||
typical_offset=$difftot
|
||||
echo "INFO: Expected time offset between camera and log is ""$typical_offset""s (positive = camera is ahead)" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
|
||||
|
||||
###############compare offset to previous offset to detect skipped photos
|
||||
|
||||
diffeee=$(echo "(($difftot - $typical_offset)*100)" | bc -l | cut -f1 -d"." ) #keep integer
|
||||
if [[ "$diffeee" -gt "$difflimit" ]] || [[ "$diffeee" -lt -"$difflimit" ]]
|
||||
|
||||
then
|
||||
if [[ "$MODE" == "POS" ]] #Do fail analysis ONLY in CAM mode
|
||||
then ##Speed up POS mode
|
||||
logmatch=0
|
||||
if [[ "$diffeee" -gt 50 ]] # are we more than 1 sec behind ?
|
||||
then
|
||||
let "loglinenum=loglinenum+25"
|
||||
#echo "DEBUG: > 1 sec behind, jumping ahead"
|
||||
fi
|
||||
if [[ "$diffeee" -lt -25 ]] # are we more than 0.5 sec ahead ?
|
||||
then
|
||||
let "loglinenum=loglinenum-30"
|
||||
let "revjumps++"
|
||||
#echo "DEBUG: > 0.5 sec ahead, jumping back"
|
||||
|
||||
if [[ "$revjumps" -gt 30 ]] ## we have backed up too many times, the image must be invalid for this log !
|
||||
then
|
||||
echo "ERROR: Failed to find log time for image $jpgname, it's not in log or does not belong to this dataset.( maybe try higher difflimit ?)" | tee -a geotag.log
|
||||
let "jpgnotinlog++"
|
||||
let "jpglistindex++" #move on to next
|
||||
let "revjumps=0"
|
||||
logmatch=1 #trigger lookup of next picture
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
##do CAM mode analysis
|
||||
|
||||
fi
|
||||
#logmatch=1 ###############################################################ACCEPT ANYTHING
|
||||
#let "jpglistindex=jpglistindex+1" ###############################################################ACCEPT ANYTHING
|
||||
|
||||
else ## PHOTO AND LOG MATCHING
|
||||
|
||||
percent=$(echo "scale=2; (($jpglistindex/$jpgtot)*100)" | bc -l | cut -f1 -d".")
|
||||
echo "MATCHED: ""$percent""% Done, time diff.: ""$difftotoff""s between $jpgname $jpgdate $jpgtime & $logtype log $loglinenum $logdate $logtime" | tee -a geotag.log
|
||||
let "revjumps=0"
|
||||
geotag
|
||||
logmatch=1
|
||||
#logmatcgfailinrow=0
|
||||
let "jpglistindex++"
|
||||
let "loglinenummatched = loglinenum + 1" # if we need to go back for POS message, go here
|
||||
#loglinereverse=0
|
||||
fi #save first image camera vs log offset
|
||||
|
||||
logdateprev=$logdate #for calculation of picture spacing
|
||||
logtimeprev=$logtime #for calculation of picture spacing
|
||||
logtimemsprev=$logtimems #for calculation of picture spacing
|
||||
logtarget=0 #reset so we are looking for next logline next time
|
||||
|
||||
done #running
|
||||
}
|
||||
|
||||
##### END POS loop ###########################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
#========================= FUNCTION CAM only loop ======================================================
|
||||
# In case of missing photo: try next log entry
|
||||
# in case of missing log entry: do not tag photo
|
||||
function camloop
|
||||
{
|
||||
echo "INFO: Searching for CAM only..." | tee -a geotag.log
|
||||
loggotpos=0
|
||||
|
||||
|
||||
###############get JPG file#########
|
||||
while [[ "$running" == 1 ]] ; do
|
||||
if [ "$logmatch" == 1 ]
|
||||
then #read next picture only if log line accepted
|
||||
jpgname=$(awk 'NR=="'"$jpglistindex"'"{print;exit}' jpglist)
|
||||
if [ "$jpgname" == "" ] ; then
|
||||
echo "END: Last photo processed" | tee -a geotag.log
|
||||
running=0
|
||||
report
|
||||
exit 1
|
||||
fi
|
||||
readexif
|
||||
fi
|
||||
|
||||
###############lookup LOG#########
|
||||
logtarget=0 #reset, for new search
|
||||
|
||||
while [ "$logtarget" -eq 0 ] ; do
|
||||
let "loglinenum++"
|
||||
logline=${logarray["$loglinenum"]}
|
||||
|
||||
if [[ "$logline" == *"$MODE"* ]] ; then
|
||||
logtype="$MODE"
|
||||
logtarget=1
|
||||
readlog
|
||||
#echo "DEBUG: at $loglinenum $logline"
|
||||
fi
|
||||
|
||||
#skip CAM lines if needded
|
||||
if [[ "$MODE" == "CAM" && "$SKIPCAM" -gt 0 ]] && [[ "$logtarget" -eq 1 ]] ; then
|
||||
let "SKIPCAM--"
|
||||
echo "INFO: Skipped a CAM log line." | tee -a geotag.log
|
||||
logtarget=0
|
||||
fi
|
||||
|
||||
#skip TRIG lines if needded
|
||||
if [[ "$MODE" == "TRIG" && "$SKIPTRIG" -gt 0 ]] && [[ "$logtarget" -eq 1 ]] ; then
|
||||
let "SKIPTRIG--"
|
||||
logtarget=0
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
#### check if we are out of suitable log messages.
|
||||
if [[ "$loglinenum" -gt "$logarraysize" ]] ; then
|
||||
echo "ERROR: Log ended at $loglinenum of $logarraysize while looking for $MODE message for filename $jpgname maybe there are too many photos" | tee -a geotag.log
|
||||
running=0
|
||||
report
|
||||
exit 1
|
||||
fi
|
||||
|
||||
######## Calculate offset
|
||||
diff=$(( ( $(date -ud "$jpgdate $jpgtime" +'%s') - $(date -ud "$logdate $logtime" +'%s') ) )) #get differance in seconds (integer)
|
||||
difftot=$(echo "scale=2; ($diff+($jpgtimems - $logtimems))" | bc -l) # return floting point
|
||||
######## Calculate time since last trigger command
|
||||
differr=$(( ( $(date -ud "$logdate $logtime" +'%s') - $(date -ud "$logdateprev $logtimeprev" +'%s') ) )) #get differance in seconds (integer)
|
||||
difftoterr=$(echo "scale=2; ($differr+($logtimems - $logtimemsprev))" | bc -l) # return floting point
|
||||
difftotoff=$(echo "scale=2; ($difftot - $typical_offset)" | bc -l)
|
||||
difftoterroff=$(echo "scale=2; ($differr - $typical_offset)" | bc -l) # return floting point
|
||||
if [ "$typical_offset" == "notset" ] ; then
|
||||
typical_offset=$difftot
|
||||
echo "INFO: Expected time offset between camera and log is ""$typical_offset""s (positive = camera is ahead)" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
difflimit=100 # CAM difflimit 1sec variation between command and exif
|
||||
|
||||
|
||||
###############compare offset to previous offset to detect skipped photos
|
||||
diffeee=$(echo "(($difftot - $typical_offset)*100)" | bc -l | cut -f1 -d"." ) #keep integer
|
||||
if [[ "$diffeee" -gt "$difflimit" ]] || [[ "$diffeee" -lt -"$difflimit" ]]
|
||||
then ##TOO MUCH DIFFERENCE
|
||||
logmatch=0
|
||||
if [[ "$diffeee" -lt -100 ]] ; then # are we more than 1 sec ahead ?
|
||||
#let "loglinenum=loglinenum-10"
|
||||
echo "WARNING: Found extra photo for which there is no $MODE event. I am at logline $loglinenum (Details below)"
|
||||
echo "WARNING: Big Time diff.: ""$difftotoff""s between $jpgname date $jpgtime and $logtype logline $loglinenum $logdate $logtime Time since last $MODE event was ""$difftoterr""s" | tee -a geotag.log
|
||||
logmatch=1 #make the log-fetcher get next picture
|
||||
let "loglinenum=loglinenummatched" #make log-fetcher keep the log line for next picture
|
||||
let "jpglistindex++" #move on to next picture
|
||||
let "logmiss++" #count missing log items
|
||||
|
||||
fi
|
||||
|
||||
|
||||
else ## PHOTO AND LOG MATCHING
|
||||
|
||||
if [[ $logmatch -eq 0 ]] && [[ "$logmatcgfailinrow" -lt 5 ]] ; then
|
||||
let "jpgmiss++"
|
||||
echo "ERROR: MISSING PHOTO #$jpgmiss detected, matched current photo with next logged $logtype logline" | tee -a geotag.log
|
||||
fi
|
||||
if [[ $logmatch -eq 0 ]] && [[ "$logmatcgfailinrow" -gt 4 ]] ; then
|
||||
let "logmiss++"
|
||||
echo "ERROR: MISSING $MODE log entry detected, matched current photo with logged $logtype logline" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
percent=$(echo "scale=2; (($jpglistindex/$jpgtot)*100)" | bc -l | cut -f1 -d".")
|
||||
echo "MATCHED: ""$percent""% Done, time diff.: ""$difftotoff""s between $jpgname $jpgdate $jpgtime & $logtype log $loglinenum $logdate $logtime Time since last $MODE command ""$difftoterr""s" | tee -a geotag.log
|
||||
geotag
|
||||
logmatch=1
|
||||
logmatcgfailinrow=0
|
||||
let "jpglistindex++"
|
||||
let "loglinenummatched = loglinenum + 1" # if we need to go back for POS message, go here
|
||||
loglinereverse=0
|
||||
fi #save first image camera vs log offset
|
||||
|
||||
logdateprev=$logdate #for calculation of picture spacing
|
||||
logtimeprev=$logtime #for calculation of picture spacing
|
||||
logtimemsprev=$logtimems #for calculation of picture spacing
|
||||
logtarget=0 #reset so we are looking for next logline next time
|
||||
|
||||
done #running
|
||||
}
|
||||
|
||||
##### END CAM only loop ######################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
##############################################################################################################
|
||||
|
||||
|
||||
###################################################################### List JPG's
|
||||
find . -maxdepth 1 -name "*.[Jj][Pp][Gg]" | sort >jpglist
|
||||
jpgtot=$(wc -l < jpglist)
|
||||
echo "INFO: Found $jpgtot photos" | tee -a geotag.log
|
||||
|
||||
|
||||
|
||||
###################################################################### look for logdump, create if needed
|
||||
if [ -f ./logdump ]; then
|
||||
echo "INFO: found logdump"
|
||||
else
|
||||
binname=$(find . -maxdepth 1 -name "*.[Bb][Ii][Nn]")
|
||||
if [[ "$binname" == "" ]]; then
|
||||
echo "ERROR: .BIN log not found, make sure directory contain a .BIN or .bin log or logdump file." | tee -a geotag.log
|
||||
exit 1
|
||||
fi
|
||||
for binname in $(find . -maxdepth 1 -name "*.[Bb][Ii][Nn]"); do
|
||||
if [[ "$ML" == "true" ]]; then
|
||||
echo "INFO: adding $binname to logdump..." | tee -a geotag.log
|
||||
mavlogdump.py --types POS,CAM,TRIG --format standard "$binname" >> logdump
|
||||
else
|
||||
if [[ "$logsdone" < 1 ]]; then
|
||||
echo "INFO: dumping $binname to logdump..." | tee -a geotag.log
|
||||
mavlogdump.py --types POS,CAM,TRIG --format standard "$binname" > logdump
|
||||
fi
|
||||
fi
|
||||
let "logsdone ++"
|
||||
done
|
||||
fi
|
||||
echo "INFO: done" | tee -a geotag.log
|
||||
|
||||
###################################################################### DUMP camdump
|
||||
if [ ! -f ./camdump ] && [[ "$MODE" != "POS" ]]; then
|
||||
echo "INFO: no camdump found, exporting loglines from .bin to camdump..." | tee -a geotag.log
|
||||
mavlogdump.py --types CAM,TRIG --format standard "$binname" > camdump
|
||||
echo "INFO: done" | tee -a geotag.log
|
||||
else
|
||||
echo "INFO: camdump found" | tee -a geotag.log
|
||||
fi
|
||||
|
||||
|
||||
###################################################################### DUMP exiflog
|
||||
#if [ ! -f ./exifdump ]; then
|
||||
# echo "INFO: no exifdump found, exporting exif names and timestamps exifdump..." | tee -a geotag.log
|
||||
# #mavlogdump.py --types POS,CAM,TRIG --format standard "$binname" > logdump
|
||||
# echo "INFO: done" | tee -a geotag.log
|
||||
#else
|
||||
# echo "INFO: exifdump found" | tee -a geotag.log
|
||||
#fi
|
||||
|
||||
|
||||
###################################################################### Count CAM events
|
||||
camtot=$(grep CAM logdump | wc -l)
|
||||
echo "INFO: Found $camtot CAM log lines (camera shutter sensed)" | tee -a geotag.log
|
||||
|
||||
###################################################################### Count TRIG events
|
||||
trigtot=$(grep TRIG logdump | wc -l)
|
||||
echo "INFO: Found $trigtot TRIG log lines (commands to shoot)" | tee -a geotag.log
|
||||
|
||||
|
||||
|
||||
###################################################################### LOAD exifs to memory
|
||||
#echo "INFO: Loading Photo data into memory..." | tee -a geotag.log
|
||||
#OLDIFS=$IFS
|
||||
#IFS=$'\012' # \012 is a linefeed
|
||||
#logarray=( $(<exifdump) )
|
||||
#IFS=$OLDIFS
|
||||
#logarraysize=${#exifarray[@]}
|
||||
#echo "INFO: done, loaded $exifarraysize lines." | tee -a geotag.log
|
||||
|
||||
|
||||
|
||||
###################################################################### Are we searching or processing ?
|
||||
#if [ "$FIND" == "true" ]
|
||||
#then
|
||||
# loadcamdump
|
||||
# camloop
|
||||
#else
|
||||
loadlogdump
|
||||
if [[ "$MODE" == "POS" ]]; then
|
||||
posloop
|
||||
else
|
||||
camloop
|
||||
fi
|
||||
#fi
|
||||
|
Loading…
Reference in New Issue