82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
|
#!/usr/bin/env python
|
||
|
|
||
|
'''
|
||
|
work out total flight time for a mavlink log
|
||
|
'''
|
||
|
from __future__ import print_function
|
||
|
|
||
|
import time
|
||
|
import glob
|
||
|
|
||
|
from argparse import ArgumentParser
|
||
|
parser = ArgumentParser(description=__doc__)
|
||
|
parser.add_argument("--condition", default=None, help="condition for packets")
|
||
|
parser.add_argument("--groundspeed", type=float, default=3.0, help="groundspeed threshold")
|
||
|
parser.add_argument("logs", metavar="LOG", nargs="+")
|
||
|
|
||
|
args = parser.parse_args()
|
||
|
|
||
|
from pymavlink import mavutil
|
||
|
from pymavlink.mavextra import distance_two
|
||
|
|
||
|
|
||
|
def flight_time(logfile):
|
||
|
'''work out flight time for a log file'''
|
||
|
print("Processing log %s" % filename)
|
||
|
mlog = mavutil.mavlink_connection(filename)
|
||
|
|
||
|
in_air = False
|
||
|
start_time = 0.0
|
||
|
total_time = 0.0
|
||
|
total_dist = 0.0
|
||
|
t = None
|
||
|
last_msg = None
|
||
|
last_time_usec = None
|
||
|
|
||
|
while True:
|
||
|
m = mlog.recv_match(type=['GPS','GPS_RAW_INT'], condition=args.condition)
|
||
|
if m is None:
|
||
|
if in_air:
|
||
|
total_time += time.mktime(t) - start_time
|
||
|
if total_time > 0:
|
||
|
print("Flight time : %u:%02u" % (int(total_time)/60, int(total_time)%60))
|
||
|
return (total_time, total_dist)
|
||
|
if m.get_type() == 'GPS_RAW_INT':
|
||
|
groundspeed = m.vel*0.01
|
||
|
status = m.fix_type
|
||
|
time_usec = m.time_usec
|
||
|
else:
|
||
|
groundspeed = m.Spd
|
||
|
status = m.Status
|
||
|
time_usec = m.TimeUS
|
||
|
if status < 3:
|
||
|
continue
|
||
|
t = time.localtime(m._timestamp)
|
||
|
if groundspeed > args.groundspeed and not in_air:
|
||
|
print("In air at %s (percent %.0f%% groundspeed %.1f)" % (time.asctime(t), mlog.percent, groundspeed))
|
||
|
in_air = True
|
||
|
start_time = time.mktime(t)
|
||
|
elif groundspeed < args.groundspeed and in_air:
|
||
|
print("On ground at %s (percent %.1f%% groundspeed %.1f time=%.1f seconds)" % (
|
||
|
time.asctime(t), mlog.percent, groundspeed, time.mktime(t) - start_time))
|
||
|
in_air = False
|
||
|
total_time += time.mktime(t) - start_time
|
||
|
|
||
|
if last_msg is None or time_usec > last_time_usec or time_usec+30e6 < last_time_usec:
|
||
|
if last_msg is not None:
|
||
|
total_dist += distance_two(last_msg, m)
|
||
|
last_msg = m
|
||
|
last_time_usec = time_usec
|
||
|
return (total_time, total_dist)
|
||
|
|
||
|
total_time = 0.0
|
||
|
total_dist = 0.0
|
||
|
for filename in args.logs:
|
||
|
for f in glob.glob(filename):
|
||
|
(ftime, fdist) = flight_time(f)
|
||
|
total_time += ftime
|
||
|
total_dist += fdist
|
||
|
|
||
|
print("Total time in air: %u:%02u" % (int(total_time)//60, int(total_time)%60))
|
||
|
print("Total distance travelled: %.1f meters" % total_dist)
|