Sha256: b1cfb1dfc72a881ce80ee459ac9071af57535917a8d723e88d957af703bfd313

Contents?: true

Size: 1.79 KB

Versions: 2

Compression:

Stored size: 1.79 KB

Contents

module DrivingPhysics
  #
  # Units: metric
  #
  # distance: meter
  # velocity: meter / sec
  # acceleration: meter / sec^2
  # volume: Liter
  # temperature: Celsius
  #

  #
  # environmental defaults
  #
  HZ = 1000
  TICK = Rational(1) / HZ
  G = 9.8               # m/s^2
  AIR_TEMP = 25         # deg c
  AIR_DENSITY = 1.29    # kg / m^3
  PETROL_DENSITY = 0.71 # kg / L   TODO: move to car.rb

  #
  # defaults for resistance forces
  #
  FRONTAL_AREA = 2.2  # m^2, based roughly on 2000s-era Chevrolet Corvette
  DRAG_COF = 0.3      # based roughly on 2000s-era Chevrolet Corvette
  DRAG = 0.4257       # air_resistance at 1 m/s given above numbers
  ROT_COF = 12.771    # if rotating resistance matches air resistance at 30 m/s
  ROT_CONST = 0.05    # N opposing drive force / torque
  ROLL_COF = 0.01     # roughly: street tires on concrete

  #
  # constants
  #
  SECS_PER_MIN = 60
  MINS_PER_HOUR = 60
  SECS_PER_HOUR = SECS_PER_MIN * MINS_PER_HOUR

  # HH::MM::SS.mmm
  def self.elapsed_display(elapsed_ms)
    elapsed_s, ms = elapsed_ms.divmod 1000

    h = elapsed_s / SECS_PER_HOUR
    elapsed_s -= h * SECS_PER_HOUR
    m, s = elapsed_s.divmod SECS_PER_MIN

    [[h, m, s].map { |i| i.to_s.rjust(2, '0') }.join(':'),
     ms.to_s.rjust(3, '0')].join('.')
  end

  def self.kph(meters_per_sec)
    meters_per_sec.to_f * SECS_PER_HOUR / 1000
  end

  # acceleration; F=ma
  # force can be a scalar or a Vector
  def self.acc(force, mass)
    force / mass.to_f
  end

  # init and rate can be scalar or Vector but must match
  # this provides the general form for determining velocity and position
  def self.accum(init, rate, dt: TICK)
    init + rate * dt
  end

  class << self
    alias_method(:vel, :accum)
    alias_method(:pos, :accum)
    alias_method(:omega, :accum)
    alias_method(:theta, :accum)
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
driving_physics-0.0.2.1 lib/driving_physics.rb
driving_physics-0.0.1.2 lib/driving_physics.rb