Skip to content

Instantly share code, notes, and snippets.

@arpruss
Last active January 3, 2023 15:46
Show Gist options
  • Select an option

  • Save arpruss/634e60978c1c9c16e3e981c1ba1d0bb0 to your computer and use it in GitHub Desktop.

Select an option

Save arpruss/634e60978c1c9c16e3e981c1ba1d0bb0 to your computer and use it in GitHub Desktop.

Revisions

  1. arpruss revised this gist Jan 3, 2023. 1 changed file with 21 additions and 5 deletions.
    26 changes: 21 additions & 5 deletions bikeforcecompute.py
    Original file line number Diff line number Diff line change
    @@ -2,6 +2,7 @@

    FPS = 59.97
    r = 0.145 # crank radius in meters
    baseForce = 0 # basic force
    currentSet = None

    def parseTime(d):
    @@ -48,11 +49,22 @@ def findAvailable(index, direction):
    i += 1
    return sum(data) / n

    def watts(rpm,k):
    distancePerSecond = 2 * math.pi * radius * (rpm / 60)
    force = k * (rpm / 60) + baseForce * 9.8
    return distancePerSecond * force

    with open("data.txt") as f:
    for line in f:
    data = line.strip().split()
    if len(data):
    if data[0] == "level":
    if data[0] == "FPS":
    FPS = float(data[1])
    elif data[0] == "radius":
    radius = float(data[1])
    elif data[0] == "baseforce":
    baseForce = float(data[1])
    elif data[0] == "level":
    print("level",data[1])
    elif data[0] == "start":
    startTime = parseTime(data[1])
    @@ -61,12 +73,16 @@ def findAvailable(index, direction):
    stopTime = parseTime(data[2])
    count = float(data[1])
    averageSpeed = count / (stopTime - startTime)
    averageForce = average(currentSet)
    averageForce = average(currentSet) - baseForce
    k = (averageForce*9.8)/(averageSpeed)
    print("rot/sec =",averageSpeed,"force =",averageForce*9.8,"k =",k)
    pr80 = (136+11.2*k*r)/6.35
    pr100 = (181+17.5*k*r)/8.8
    print("Peloton equivalent ",pr80,"-",pr100)
    print("watts at 60RPM:",watts(60,k),"65RPM:",watts(65,k),"70RPM:",watts(70,k))
    #pr80 = (136+watts(80,k))/6.35
    #pr100 = (181+watts(100,k))/8.8
    pr60 = (86.6+watts(60,k))/3.98
    pr80 = (183.1+watts(80,k))/7.78
    pr100 = (279.1+watts(100,k))/11.73
    print("Peloton equivalent",(pr60+pr80+pr100)/3)
    currentSet = None
    else:
    if currentSet is not None:
  2. arpruss revised this gist Jan 3, 2023. 1 changed file with 6 additions and 1 deletion.
    7 changes: 6 additions & 1 deletion bikeforcecompute.py
    Original file line number Diff line number Diff line change
    @@ -1,6 +1,7 @@
    import math

    FPS = 59.97
    r = 0.145 # crank radius in meters
    currentSet = None

    def parseTime(d):
    @@ -61,7 +62,11 @@ def findAvailable(index, direction):
    count = float(data[1])
    averageSpeed = count / (stopTime - startTime)
    averageForce = average(currentSet)
    print("rpm:",60*averageSpeed,"force:",averageForce,"ratio:",averageForce/(60*averageSpeed))
    k = (averageForce*9.8)/(averageSpeed)
    print("rot/sec =",averageSpeed,"force =",averageForce*9.8,"k =",k)
    pr80 = (136+11.2*k*r)/6.35
    pr100 = (181+17.5*k*r)/8.8
    print("Peloton equivalent ",pr80,"-",pr100)
    currentSet = None
    else:
    if currentSet is not None:
  3. arpruss created this gist Jan 3, 2023.
    72 changes: 72 additions & 0 deletions bikeforcecompute.py
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,72 @@
    import math

    FPS = 59.97
    currentSet = None

    def parseTime(d):
    parts = d.split(":")
    frames = int(parts[-1])
    sec = float(parts[-2])
    mins = 0
    hrs = 0
    if len(parts) >= 3:
    mins = float(parts[-3])
    if len(parts) >= 4:
    hrs = float(parts[-4])
    return frames/FPS + sec + mins * 60 + hrs * 3600

    def average(data):
    n = len(data)
    def findAvailable(index, direction):
    while index != -1 and index != n:
    if data[index] is not None:
    return data[index]
    index += direction
    raise BaseException("too much missing")
    firstAvailable = findAvailable(0,1)
    lastAvailable = findAvailable(n-1,-1)
    for i in range(0,n):
    if data[i] is None:
    data[i] = firstAvailable
    else:
    break
    for i in range(n-1,-1,-1):
    if data[i] is None:
    data[i] = lastAvailable
    else:
    break
    i = 0
    while i < n:
    if data[i] == None:
    v = (findAvailable(i,-1)+findAvailable(i,1))/2.
    data[i] = v
    i = i + 1
    while data[i] == None and i < n:
    data[i] = v
    i += 1
    i += 1
    return sum(data) / n

    with open("data.txt") as f:
    for line in f:
    data = line.strip().split()
    if len(data):
    if data[0] == "level":
    print("level",data[1])
    elif data[0] == "start":
    startTime = parseTime(data[1])
    currentSet = []
    elif data[0] == "end":
    stopTime = parseTime(data[2])
    count = float(data[1])
    averageSpeed = count / (stopTime - startTime)
    averageForce = average(currentSet)
    print("rpm:",60*averageSpeed,"force:",averageForce,"ratio:",averageForce/(60*averageSpeed))
    currentSet = None
    else:
    if currentSet is not None:
    if data[0] == "x":
    currentSet.append(None)
    else:
    currentSet.append(float(data[0]))