예제 #1
0
def plot_value(tc, field="acc_z", scale=1):
    """
    Draw Random Data
    """
    im = tc['image']
    margin = tc['margin']
    (first, last, pixel_per_mile) = tc['mileposts']
    draw = ImageDraw.Draw(im)

    yz = int((im.size[1]-margin)*0.26)
    data = [None] * im.size[0]
    draw.text((margin, yz), field.upper(), fill=COLORS['black'])

    # Read from file
    data_sum = data_count = 0
    for line_no, obj in pirail.read(tc['data_file'], classes=["ATT"]):
        data_sum += obj[field]
        data_count += 1
    # Normalize data by subtracting the average
    data_avg = data_sum / data_count

    speed = eps = 0
    # Read from file again
    for line_no, obj in pirail.read(tc['data_file'], classes=["TPV", "ATT"], args={
            'start-mileage': first,
            'end-mileage': last,
        }):
        mileage = obj['mileage']
        x = mile_to_pixel(tc, mileage-first)
        if obj['class'] == "TPV":
            speed = obj['speed']
            eps = obj['eps']
        elif obj['class'] == "ATT":
            if speed < eps:
                pass
            else:
                data_point = obj[field] - data_avg
                # Look for maximum magnitude
                if data[x] is None or abs(data_point) > abs(data[x]):
                    data[x] = data_point

    # Plot the data
    last_x = None
    for x in range(margin, im.size[0]-2*margin):
        draw.point((x,yz), fill=COLORS['black'])
        if data[x] is None:
            continue
        y = yz-scale*data[x]
        if last_x is None:
            draw.point((x,y), fill=COLORS['red'])
        else:
            draw.line((x,y,last_x,last_y), fill=COLORS['red'])
        last_x = x
        last_y = y

    del draw
예제 #2
0
def write_average_json_file(path_to_read_file):

    average_acc_x = 0.0
    average_acc_y = 0.0
    average_acc_z = 0.0
    average_roll = 0.0
    average_pitch = 0.0
    average_yaw = 0.0

    N = 0.0
    for line_no, obj in pirail.read('../web_server_flask/' +
                                    path_to_read_file):

        N += 1
        average_acc_x += obj["acc_x"]
        average_acc_y += obj["acc_y"]
        average_acc_z += obj["acc_z"]
        average_roll += obj["roll"]
        average_pitch += obj["pitch"]
        average_yaw += obj["yaw"]

    loc_average_acc_x = average_acc_x / N
    loc_average_acc_y = average_acc_y / N
    average_acc_z = average_acc_z / N
    average_roll = average_roll / N
    average_pitch = average_pitch / N
    average_yaw = average_yaw / N

    return loc_average_acc_x, loc_average_acc_y, average_acc_z, average_roll, average_pitch, average_yaw
예제 #3
0
def write_sd(read_file, json_name):
    list = []

    for num, obj in pirail.read('../web_server_flask/' + read_file):
        list.append(obj[json_name])

    sd = statistics.stdev(list)
    return sd
예제 #4
0
def write_max(read_file, json_name):
    list = []

    for num, obj in pirail.read('../web_server_flask/' + read_file):
        list.append(obj[json_name])
    #print(list)

    maxList = max(list)
    return maxList
예제 #5
0
def main(filename):
    last_lat = last_lon = speed = 0
    slice_count = 0
    data = [0] * 360
    output = filename.replace("json", "kml")
    with open(output, "w") as k:
        k.write('<?xml version="1.0" encoding="UTF-8"?>\n')
        k.write('<kml xmlns="http://www.opengis.net/kml/2.2">\n')
        k.write('<Document>\n')
        for line_no, obj in pirail.read(filename, classes=['TPV', 'LIDAR']):
            count = 0
            if obj['class'] == "TPV" and 'speed' in obj:
                speed = obj['speed']
            elif obj['class'] == "LIDAR" and speed >= MIN_SPEED:
                data = [0] * 360
                for angle, distance in obj['scan']:
                    distance = lidar_util.estimate_from_lidar(float(distance))
                    i = round(float(angle)) % 360
                    data[i] = distance

                    report = plot(data, obj['time'], obj['lat'], obj['lon'],
                                  obj['mileage'], speed, slice_count)

                if report['gauge_error'] or report['plate_error']:
                    count += 1
                    if OUTPUT:
                        if (last_lat != obj['lat']
                                or last_lon != obj['lon']) and count > 10:
                            print("%d %0.6f %0.6f %0.6f %0.2f %d" %
                                  (slice_count, obj['lat'], obj['lon'],
                                   obj['mileage'], report['gauge'],
                                   report['plate_score']))
                            k.write('<Placemark>\n')
                            k.write('<name>Point %d</name>\n' % slice_count)
                            k.write('<description>\n')
                            k.write('Mileage = %0.2f\n' % obj['mileage'])
                            if report['gauge_error']:
                                k.write('Gage = %0.f in\n' % report['gauge'])
                            if report['plate_error']:
                                k.write(aar_plate.full_name + ' obstruction')
                            k.write('</description>\n')
                            k.write('<Point>\n')
                            k.write(
                                '<coordinates>%0.6f,%0.6f,%0.6f</coordinates>\n'
                                % (obj['lon'], obj['lat'], obj['alt']))
                            k.write('</Point>\n')
                            k.write('</Placemark>\n')
                        last_lat = obj['lat']
                        last_lon = obj['lon']
                else:
                    count = 0
                slice_count += 1

        k.write('</Document>\n')
        k.write('</kml>\n')
예제 #6
0
def write_json_data_to_range(pathToRange, locationPath, minRange, maxRange):
    data = []
    for line_no, obj in pirail.read('../web_server_flask/' + locationPath):
        if obj["mileage"] >= minRange and obj["mileage"] <= maxRange:
            data.append(obj)

    data = sorted(data, key=lambda k: k["mileage"], reverse=False)
    #print(os.path.isfile(pathToRange))
    f = open(pathToRange, 'x')
    for obj in data:
        j = re.sub(r"'", '"', str(obj))
        f.write(j + '\n')
    f.close()
예제 #7
0
def main(filename):
    x = 0
    data = [0]*360
    for line_no,obj in pirail.read(filename, classes=['TPV', 'LIDAR']):
        count = 0
        if obj['class'] == "TPV" and 'speed' in obj:
            speed = obj['speed']
        elif obj['class'] == "LIDAR" and speed >= MIN_SPEED:
            for angle, distance in obj['scan']:
                distance = lidar_util.estimate_from_lidar(float(distance))
                i = round(float(angle)) % 360
                data[i] = distance

            plot(x, data)
            x += 1
            if x == WIDTH:
                break
예제 #8
0
def clearance(filename):
    data = [99999] * 360
    print(data)
    latitude = longitude = mileage = speed = 0
    for line_no, obj in pirail.read(filename, classes=['TPV', 'LIDAR']):
        if obj['class'] == "LIDAR":
            timestamp = obj['time']
            for angle, distance in obj['scan']:
                distance = lidar_util.estimate_from_lidar(float(distance))
                if distance > 1000 and speed > .5:
                    i = round(float(angle)) % 360
                    data[i] = min(data[i], float(distance))
        elif obj['class'] == "TPV":
            if 'speed' in obj:
                speed = to_mph(obj['speed'])

    report = plot(data, timestamp, latitude, longitude, mileage, speed, 0)
    print(report)
예제 #9
0
def gage(tc):
    """
    Draw Gage
    """
    im = tc['image']
    margin = tc['margin']
    (first, last, pixel_per_mile) = tc['mileposts']
    draw = ImageDraw.Draw(im)

    y = int((im.size[1]-margin)*0.34)
    draw.text((margin, y), aar.full_name, fill=COLORS['black'])

    data = [0] * 360
    ghost = [0] * 360
    total_slope = total_slope_count = 0
    # Read from file
    for line_no, obj in pirail.read(tc['data_file']):
        if obj['class'] not in ["LIDAR", "L"]:
            continue
        mileage = obj['mileage']
        if not(first <= mileage <= last):
            continue
        x = mile_to_pixel(tc, mileage-first)

        lidar_util.process_scan(obj['lidar'], data, ghost)

        new_data = lidar_util.convert_to_xy(data, offset=2.1528056371157285)

        gage,slope,p1,p2 = lidar_util.calc_gage(new_data)

        if not(aar.min_gauge <= gage <= aar.max_gauge):
            #print(mileage, gage)
            draw.point((x,y+(gage-aar.standard_gauge)*2),fill=COLORS['red'])
        else:
            #draw.point((x,y), fill=COLORS['black'])
            pass
        total_slope += slope
        total_slope_count += 1

    if total_slope_count > 0:
        #print(total_slope/total_slope_count)
        pass

    del draw
예제 #10
0
def main(filename):
    used=count=0

    print("Time Latitude Longitude Used Count")
    for line_no, obj in pirail.read(filename, classes=['SKY', 'TPV']):
        if obj['class'] == "SKY":
            used=count=0
            for s in obj['satellites']:
                count += 1
                if s['used']:
                    used += 1
        elif obj['class'] == "TPV":
            if 'num_sat' in obj:
                count = obj['num_sat']
            if 'num_used' in obj:
                used = obj['num_used']
            if 'lat' in obj and 'lon' in obj:
                if used >= pirail.GPS_THRESHOLD:
                    print("%s %f %f %d %d" % (obj['time'], obj['lat'], obj['lon'], used, count))
예제 #11
0
def main():
    try:
        filename = sys.argv[-1]
    except:
        print("USAGE: %s [args] data_file.json" % sys.argv[0])
        sys.exit(1)

    data = []
    for line_no, obj in pirail.read(filename, classes=['LIDAR']):
        data.append(obj)

    x_data = []
    y_data = []
    z_data = []
    count = 1
    base_mileage = data[0]['mileage']
    for scan in data:
        count += 1
        if count % 10 == 0:
            for angle, distance in scan['scan']:
                distance = lidar_util.estimate_from_lidar(float(distance))
                if distance > 0.0:
                    x, y = pirail.vector_to_coordinates(
                        angle + OFFSET, distance)
                    x_data.append(x)
                    y_data.append(y)
                    z_data.append(scan['mileage'] - base_mileage)

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')

    ax.scatter(x_data, z_data, y_data, s=1, c='black', marker='o')

    ax.set_xlabel('X Label')
    ax.set_ylabel('Z Label')
    ax.set_zlabel('Y Label')

    plt.show()
예제 #12
0
def main(filename):
    sums = {
        'acc_x': 0,
        'acc_y': 0,
        'acc_z': 0,
        'gyro_x': 0,
        'gyro_y': 0,
        'gyro_z': 0,
    }
    cnt = 0
    print("Time ax ay az gx gy gz")
    for line_no, obj in pirail.read(filename, classes=['ATT']):
        print("%s %f %f %f %f %f %f" % (
            obj['time'],
            obj['acc_x'] - aax,
            obj['acc_y'] - aay,
            obj['acc_z'] - aaz,
            obj['gyro_x'] - agx,
            obj['gyro_y'] - agy,
            obj['gyro_z'] - agz,
        ))
        sums['acc_x'] += obj['acc_x']
        sums['acc_y'] += obj['acc_y']
        sums['acc_z'] += obj['acc_z']
        sums['gyro_x'] += obj['gyro_x']
        sums['gyro_y'] += obj['gyro_y']
        sums['gyro_z'] += obj['gyro_z']
        cnt += 1
    print("Average %f %f %f %f %f %f" % (
        sums['acc_x'] / cnt,
        sums['acc_y'] / cnt,
        sums['acc_z'] / cnt,
        sums['gyro_x'] / cnt,
        sums['gyro_y'] / cnt,
        sums['gyro_z'] / cnt,
    ))
예제 #13
0
"""
Slice a datafile based on line number
"""
import sys
import json

import pirail

try:
    filename = sys.argv[-1]
    split_line_no = int(sys.argv[-2])
except IndexError:
    print("USAGE: %s [args] line_no data_file.json" % sys.argv[0])
    sys.exit(1)

outfile_name = filename.replace(".json", "_%d.json")

outfile = None

for line_no, obj in pirail.read(filename):

    if outfile is None or line_no == split_line_no:
        if outfile is not None:
            outfile.close()
        outfile = open(outfile_name % line_no, "w")
        print("Writing %s" % (outfile_name % line_no))

    outfile.write(json.dumps(obj) + "\n")

outfile.close()
예제 #14
0
def main(filename):
    s = [0] * RANGE
    data = []
    for a in range(RANGE):
        data.append([])

    with open("clearance.csv", "w") as clearances:
        clearances.write("Date Time Mileage Clearance\n")

        for line_no, obj in pirail.read(filename, classes=['LIDAR']):
            for angle, distance in obj['scan']:
                distance = lidar_util.estimate_from_lidar(distance)
                a = round(angle + OFFSET) % RANGE
                d = float(distance)
                if d > 0:
                    (x, y) = pirail.vector_to_coordinates(a, d)
                    s[a] = y
                    data[a].append(d)

            # Calculate ground clearance
            sample = s[150:210]
            clearance = -sum(sample) / len(sample)
            if (0 < clearance < 625):
                clearances.write("%s %f %f\n" % (
                    obj['time'].replace('T', ' ').replace('Z', ''),
                    obj['mileage'],
                    clearance * MM_TO_INCH,
                ))

    avgd = [0] * RANGE
    with open("average_lidar.csv", "w") as f:
        f.write("Angle Distance Trend X Y\n")
        for a in range(RANGE):
            if len(data[a]) > 0:
                d = statistics.mean(data[a])
                avgd[a] = d
            else:
                d = 0
            (x, y) = pirail.vector_to_coordinates(a, d)
            if a == 0:
                trend = 0
            elif d > avgd[a - 1]:
                trend = 1
            elif d < avgd[a - 1]:
                trend = -1
            else:
                trend = 0
            f.write("%d %f %d %f %f\n" % (a, d, trend, x, y))

    # find right rail
    a = 180 - 60
    while avgd[a] > avgd[a + 1]:
        a += 1
    print("Right: %d" % a)

    # find left rail
    a = 180 + 60
    while avgd[a] > avgd[a - 1]:
        a -= 1
    print("Left: %d" % a)

    with open("min_lidar.csv", "w") as f:
        f.write("Angle Distance X Y\n")
        for a in range(RANGE):
            if len(data[a]) > 0:
                d = my_min(data[a], THRESHOLD)
            else:
                d = 0
            (x, y) = pirail.vector_to_coordinates(a, d)
            f.write("%d %f %f %f\n" % (a, d, x, y))
예제 #15
0
min_lat = 90
max_lat = -90
min_lon = 180
max_lon = -180

# Average Errors
aax = -0.76994928407068
aay = -0.12089123215864023
agz = -0.5585602094240765

data=[]
bad_data=[]
acc_count = 0

for line_no, obj in pirail.read(filename, classes=['ATT', 'TPV']):
    if obj['class'] == 'ATT':
        # Error compensation
        obj['acc_x'] -= aax
        obj['acc_y'] -= aay
        obj['gyro_z'] -= agz
        data.append(obj)
        acc_count += 1
    elif obj['class'] == 'TPV':
        if obj['num_used'] >= pirail.GPS_THRESHOLD:
            min_lat = min(min_lat, obj['lat'])
            max_lat = max(max_lat, obj['lat'])
            min_lon = min(min_lon, obj['lon'])
            max_lon = max(max_lon, obj['lon'])
            data.append(obj)
        else:
예제 #16
0
def get_file(self, groups, qsdict):
    """
    Data Fetching API
    GET pirail_data_fetch.php
    """

    # Parse the query string and
    # Build the Args Dictionary
    args = {}
    try:
        if self.headers['accept'] == "application/json":
            stream = False
        elif self.headers['accept'] == "text/event-stream":
            stream = True
        else:
            stream = qsdict.get("stream", ["true"])[0].lower() == "true"

        filename = qsdict.get("file", [None])[0]
        if filename is None:
            self.send_error(HTTPStatus.NOT_FOUND,
                            HTTPStatus.NOT_FOUND.description)
            return
        else:
            pathname = os.path.normpath(DATAROOT + "/" + filename)
            if not os.path.isfile(pathname):
                self.send_error(HTTPStatus.NOT_FOUND,
                                HTTPStatus.NOT_FOUND.description)
                return

        xform = qsdict.get("xform", ["default"])[0].lower()
        if xform in DATA_XFORM:
            xform_function = DATA_XFORM[xform]
        else:
            xform_function = DATA_XFORM['default']

        value = qsdict.get("start-mileage", [None])[0]
        if value is not None:
            args['start-mileage'] = float(value)

        value = qsdict.get("end-mileage", [None])[0]
        if value is not None:
            args['end-mileage'] = float(value)

        value = qsdict.get("start-time", [None])[0]
        if value is not None:
            args['start-time'] = value

        value = qsdict.get("end-time", [None])[0]
        if value is not None:
            args['end-time'] = float(value)

        value = qsdict.get("start-latitude", [None])[0]
        if value is not None:
            args['start-latitude'] = float(value)

        value = qsdict.get("end-latitude", [None])[0]
        if value is not None:
            args['end-latitude'] = float(value)

        value = qsdict.get("start-longitude", [None])[0]
        if value is not None:
            args['start-longitude'] = float(value)

        value = qsdict.get("end-longitude", [None])[0]
        if value is not None:
            args['end-longitude'] = float(value)

        classes = qsdict.get("classes", None)
    except ValueError as ex:
        self.send_error(HTTPStatus.BAD_REQUEST, str(ex))
        return

    data = []
    self.send_response(HTTPStatus.OK)
    if stream:
        self.send_header("Content-type", "text/event-stream")
        self.end_headers()
    else:
        self.send_header("Content-type", "application/json")

    for line_no, obj in pirail.read(pathname, classes=classes, args=args):
        if stream:
            output = "event: pirail\ndata: %s\n\n" % json.dumps(
                xform_function(obj, qsdict))
            self.wfile.write(output.encode('utf-8'))
        else:
            data.append(xform_function(obj, qsdict))

    if not stream:
        # Sort the data
        if SORTBY is not None:
            data = sorted(data, key=lambda k: k[SORTBY], reverse=False)

        output = json.dumps(data, indent=4) + "\n"

        self.send_header("Content-length", str(len(output)))
        self.end_headers()
        self.wfile.write(output.encode('utf-8'))
    else:
        output = "event: pirail\ndata: %s\n\n" % json.dumps({"done": True})
        self.wfile.write(output.encode('utf-8'))
예제 #17
0
#!/usr/bin/env python3
"""
GPS Smoothing
"""
import sys
import json
import math

import pirail

data = []
for line_no, obj in pirail.read(sys.argv[-1], classes=['SKY', 'TPV']):
    if obj['class'] == "TPV":
        if obj['num_used'] >= pirail.GPS_THRESHOLD and 'lon' in obj and 'lat' in obj:
            data.append(obj)
    elif obj['class'] == "SKY":
        used = count = 0
        count = len(obj['satellites'])
        for i in range(0, count):
            if obj['satellites'][i]['used']:
                used += 1

print("Longitude Latitude dx epx dy epy used count")
for i in range(1, len(data)):
    if 'exp' not in data[i] or 'epy' not in data[i]:
        continue

    dx = abs((data[i]['lon'] - data[i - 1]['lon']) * 111120 *
             math.cos(math.radians(data[i]['lat'])))
    dy = abs(
        (data[i]['lat'] - data[i - 1]['lat']) * 111128)  # degrees to meters
예제 #18
0
def accel(tc, scale=1):
    """
    Draw Acceleration Data
    """
    im = tc['image']
    margin = tc['margin']
    (first, last, pixel_per_mile) = tc['mileposts']
    draw = ImageDraw.Draw(im)

    yx = int((im.size[1]-margin)*0.10)
    yy = int((im.size[1]-margin)*0.18)
    yz = int((im.size[1]-margin)*0.26)
    ygx = int((im.size[1]-margin)*0.34)
    ygy = int((im.size[1]-margin)*0.42)
    ygz = int((im.size[1]-margin)*0.50)
    ys = int((im.size[1]-margin)*0.58)

    ACCxp = [0] * im.size[0]
    ACCyp = [0] * im.size[0]
    ACCzp = [0] * im.size[0]
    GYRxp = [0] * im.size[0]
    GYRyp = [0] * im.size[0]
    GYRzp = [0] * im.size[0]

    draw.text((margin, yx), "AX", fill=COLORS['red'])
    draw.text((margin, yy), "AY", fill=COLORS['blue'])
    draw.text((margin, yz), "AZ", fill=COLORS['green'])
    draw.text((margin, ygx), "GX", fill=COLORS['red'])
    draw.text((margin, ygy), "GY", fill=COLORS['blue'])
    draw.text((margin, ygz), "GZ", fill=COLORS['green'])
    #draw.text((margin, ys), "S", fill=COLORS['black'])

    accel_threshold = 0.00

    mileage = None

    speed = 0

    last_x = None

    accel_file = open("accel.csv", "w")
    accel_file.write("mileage acc_x acc_y acc_z gyro_x gyro_y gyro_z\n")

    # Read from file
    for line_no, obj in pirail.read(tc['data_file'], args={
            'start-mileage': first,
            'end-mileage': last,
        }):
        #print(obj)
        mileage = obj['mileage']

        x = mile_to_pixel(tc, mileage-first)

        if obj['class'] == "G" or obj['class'] == "TPV":
            # Speed
            speed = obj['speed']
            #draw.point((x, ys-speed), fill=COLORS['black'])
        elif obj['class'] in ["A", "ATT"]:
            if speed == 100:
                #draw.point((x, yx), fill=COLORS['black'])
                #draw.point((x, yy), fill=COLORS['black'])
                #draw.point((x, yz), fill=COLORS['black'])
                pass
            else:
                ACCx = (obj['acc_x'])
                if abs(ACCx) > ACCxp[x]:
                    ACCxp[x] = ACCx
                ACCy = (obj['acc_y'])
                if abs(ACCy) > ACCyp[x]:
                    ACCyp[x] = ACCy
                ACCz = (obj['acc_z'] - 9.80665)
                if abs(ACCz) > ACCzp[x]:
                    ACCzp[x] = ACCz
                GYRx = (obj['gyro_x'])
                if abs(GYRx) > GYRxp[x]:
                    GYRxp[x] = GYRx
                GYRy = (obj['gyro_y'])
                if abs(GYRy) > GYRyp[x]:
                    GYRyp[x] = GYRy
                GYRz = (obj['gyro_z'])
                if abs(GYRz) > GYRzp[x]:
                    GYRzp[x] = GYRz
                accel_file.write("%f %f %f %f %f %f %f %f %f\n" %( obj['mileage'], obj['lat'], obj['lon'], obj['acc_x'], obj['acc_y'], obj['acc_z'], obj['gyro_x'], obj['gyro_y'], obj['gyro_z']))

    for x in range(margin, len(ACCxp)-2*margin):
        draw.line((x,yx-scale*ACCxp[x],x-1,yx-scale*ACCxp[x-1]),fill=COLORS['red'])
        draw.line((x,yy-scale*ACCyp[x],x-1,yy-scale*ACCyp[x-1]),fill=COLORS['blue'])
        draw.line((x,yz-scale*ACCzp[x],x-1,yz-scale*ACCzp[x-1]),fill=COLORS['green'])
        draw.line((x,ygx-scale*GYRxp[x],x-1,ygx-scale*GYRxp[x-1]),fill=COLORS['red'])
        draw.line((x,ygy-scale*GYRyp[x],x-1,ygy-scale*GYRyp[x-1]),fill=COLORS['blue'])
        draw.line((x,ygz-scale*GYRzp[x],x-1,ygz-scale*GYRzp[x-1]),fill=COLORS['green'])

    accel_file.close()
    del draw
예제 #19
0
#!/usr/bin/env python3

import sys
import json

import pirail

print("Time Latitude Longitude Yaw Pitch Roll")
for line_no, obj in pirail.read(sys.argv[-1], classes=['ATT']):
    if 'roll' in obj:
        print("%s %f %f %f %f %f" % (
            obj['time'],
            obj['lat'],
            obj['lon'],
            obj['yaw'],
            obj['pitch'],
            obj['roll'],
            )
        )
예제 #20
0
def string_chart_by_time(tc):
    """
    Draw a string chart
    x = mileage
    y = time
    """
    im = tc['image']
    margin = tc['margin']
    (first, last, pixel_per_mile) = tc['mileposts']
    draw = ImageDraw.Draw(im)

    mintime = None
    maxtime = None
    timedata = []
    skip = False
    lastm = None
    speed = 0
    for line_no, obj in pirail.read(tc['data_file'], classes=['TPV'], args={
            'start-mileage': first,
            'end-mileage': last,
        }):

        if obj['num_used'] < pirail.GPS_THRESHOLD:
            continue
        #if obj['speed'] < obj['eps']:
        #    if skip:
        #        continue
        #    skip = True
        #else:
        #    skip = False
        mileage = obj['mileage']
        objtime = pirail.parse_time(obj['time'])
        speed = obj['speed']
        if mintime is None or objtime < mintime:
            mintime = objtime
        if maxtime is None or objtime > maxtime:
            maxtime = objtime
        if lastm is None or abs(mileage - lastm) >= MILEAGE_THRESHOLD:
            timedata.append({
                'time': objtime,
                'mileage': mileage,
                'speed': speed,
            })
            lastm = mileage

    timedata = sorted(timedata, key=lambda k: k['time'], reverse=False)

    lastx = lasty = lasttime = None
    for obj in timedata:
        mileage = obj['mileage']
        objtime = obj['time']
        speed = obj['speed'] * MS_TO_MPH
        x = mile_to_pixel(tc, mileage-first)
        y = (im.size[1]-2*margin) * (objtime - mintime).total_seconds() / (maxtime-mintime).total_seconds() + margin

        if lasttime is None:
            timediff = 0
        else:
            timediff = (objtime - lasttime).total_seconds()

        if speed > 25:
            color=COLORS['red']
        elif speed > 15:
            color=COLORS['orange']
        elif speed > 5:
            color=COLORS['green']
        else:
            color=COLORS['blue']

        if lastx is None or timediff > TIME_THRESHOLD:
            draw.point((x, y), fill=color)
        else:
            draw.line((lastx, lasty, x, y), fill=color, width=STRING_WIDTH)

        lastx = x
        lasty = y
        lasttime = objtime
        lastm = mileage

    if mintime is not None:
        for hour in range(mintime.hour, maxtime.hour+1):
            objtime = datetime.datetime(mintime.year, mintime.month, mintime.day, hour, 0, 0)
            x = 10
            y = (im.size[1]-2*margin) * (objtime - mintime).total_seconds() / (maxtime-mintime).total_seconds() + margin
            draw.text((x, y), "%d:00Z" % hour, fill=COLORS['blue'])

    del draw
예제 #21
0
def smooth_data(tc, input_data=None, mileage_threshold=0.01, track_threshold=45, write_file=True):
    (first, last, pixel_per_mile) = tc['mileposts']

    data = []
    used = 0
    for line_no, obj in pirail.read(tc['data_file'], classes=['TPV'], args={
            'start-mileage': first,
            'end-mileage': last,
        }):

        if obj['num_used'] < pirail.GPS_THRESHOLD:
            continue

        try:
            data.append(obj)
        except KeyError as ex:
            print("skipped", ex, obj)

    # Ensure the list is sorted by mileage
    data = sorted(data, key=lambda k: k['mileage'], reverse=False)

    # smooth, looking at all measurements +/-
    smooth_data = []
    for i in range(0, len(data)):
        lat = [data[i]['lat']]
        lon = [data[i]['lon']]
        alt = [data[i]['alt']]
        mileage = data[i]['mileage']
        # work backwards
        j = i-1
        while j >= 0 and data[j]['mileage'] >= mileage-mileage_threshold/2:
            lat.append(data[j]['lat'])
            lon.append(data[j]['lon'])
            alt.append(data[j]['alt'])
            j -= 1
        # work forwards
        j = i + 1
        while j < len(data) and data[j]['mileage'] <= mileage+mileage_threshold/2:
            lat.append(data[j]['lat'])
            lon.append(data[j]['lon'])
            alt.append(data[j]['alt'])
            j += 1
        # Average
        new_lat = avg_3_of_5(lat)
        new_lon = avg_3_of_5(lon)
        new_alt = avg_3_of_5(alt)
        mileage, certainty = tc['G'].find_mileage(new_lat, new_lon)
        obj = {
            'class': data[i]['class'],
            'speed': data[i]['speed'],
            'eps': data[i]['eps'],
            'lat': new_lat,
            'lon': new_lon,
            'alt': new_alt,
            'mileage': mileage,
            'certainty': certainty,
            'track': data[i]['track']
        }

        if i == 0:
            smooth_data.append(obj)
            last_obj = obj
        else:
            d = geo.great_circle(last_obj['lat'], last_obj['lon'],
                                 obj['lat'], obj['lon'])
            b = geo.bearing(last_obj['lat'], last_obj['lon'],
                            obj['lat'], obj['lon'])

            if d > mileage_threshold:
                #print("Inserted: %f @ %d" % (d,b))
                smooth_data.append(obj)
                last_obj = obj

    # Ensure we're still sorted
    smooth_data = sorted(smooth_data, key=lambda k: k['mileage'], reverse=False)

    for i in range(1,len(smooth_data)):
        b = geo.bearing(smooth_data[i-1]['lat'], smooth_data[i-1]['lon'],
                        smooth_data[i]['lat'], smooth_data[i]['lon'])
        smooth_data[i]['track'] = b
    if len(smooth_data) > 2:
        smooth_data[0]['track'] = smooth_data[1]['track']

    # save result
    if write_file:
        with open("smoothdata_tmp.csv", "w") as f:
            f.write("Mileage,Latitude,Longitude,Altitude,Track\n")
            for obj in smooth_data:
                f.write("%f %f %f %f %f\n" % (
                        obj['mileage'],
                        obj['lat'],
                        obj['lon'],
                        obj['alt'],
                        obj['track'],
                        ))

    #print("Smooth=%d" % len(smooth_data))
    return smooth_data
예제 #22
0
if len(sys.argv) < 3:
    print("USAGE: %s [args] json_file known_file" % sys.argv[0])
    sys.exit(1)

json_file = os.path.abspath(sys.argv[-2])
known_file = sys.argv[-1]

GPS_MIN_MODE = 3

GPS = gps_to_mileage.Gps2Miles(known_file)

acclist = []
data = []
last_tpv = None

for line_no, obj in pirail.read(json_file):
    if obj['class'] in ["SKY", "ATT", "LIDAR", "LPCM"]:
        acclist.append(obj)
    elif obj['class'] == "TPV":
        if obj['num_used'] < pirail.GPS_THRESHOLD or obj['mode'] < GPS_MIN_MODE:
            continue
        if last_tpv is not None:
            if len(acclist) > 0:
                time_start = pirail.parse_time(obj['time'])
                time_delta = time_start - pirail.parse_time(last_tpv['time'])
                delta_lat = (obj['lat'] - last_tpv['lat'])
                delta_lon = (obj['lon'] - last_tpv['lon'])
                delta_alt = (obj['alt'] - last_tpv['alt'])
                #print ("delta_lat", delta_lat)
                #print ("delta_lon", delta_lon)
                #print ("time_delta", time_delta.total_seconds())