text: """ 
  CAR CONFIG 
  
  This file is read by your car application's manage.py script to change the car
  performance. 
  
  EXAMPLE
  -----------
  import dk
  cfg = dk.load_config(config_path='~/mycar/config.py')
  print(cfg.CAMERA_RESOLUTION)
  
  """
  
  
  import os
  
  #PATHS
  CAR_PATH = PACKAGE_PATH = os.path.dirname(os.path.realpath(__file__))
  DATA_PATH = os.path.join(CAR_PATH, 'data')
  MODELS_PATH = os.path.join(CAR_PATH, 'models')
  
  #VEHICLE
  DRIVE_LOOP_HZ = 20
  MAX_LOOPS = 100000
  
  #CAMERA
  CAMERA_TYPE = "PICAM"   # (PICAM|WEBCAM|CVCAM|CSIC|V4L|D435|MOCK|IMAGE_LIST)
  IMAGE_W = 160
  IMAGE_H = 120
  IMAGE_DEPTH = 3         # default RGB=3, make 1 for mono
  CAMERA_FRAMERATE = DRIVE_LOOP_HZ
  CAMERA_VFLIP = False
  CAMERA_HFLIP = False
  # For CSIC camera - If the camera is mounted in a rotated position, changing the below parameter will correct the output frame orientation
  CSIC_CAM_GSTREAMER_FLIP_PARM = 0 # (0 => none , 4 => Flip horizontally, 6 => Flip vertically)
  
  #9865, over rides only if needed, ie. TX2..
  PCA9685_I2C_ADDR = 0x40
  PCA9685_I2C_BUSNUM = None
  
  #STEERING
  STEERING_CHANNEL = 1
  STEERING_LEFT_PWM = 460
  STEERING_RIGHT_PWM = 290
  
  #THROTTLE
  THROTTLE_CHANNEL = 0
  THROTTLE_FORWARD_PWM = 500
  THROTTLE_STOPPED_PWM = 370
  THROTTLE_REVERSE_PWM = 220
  
  
  #ODOMETRY
  HAVE_ODOM = True                   # Do you have an odometer/encoder 
  ENCODER_TYPE = 'GPIO'            # What kind of encoder? GPIO|Arduino|Astar 
  MM_PER_TICK = 12.7625               # How much travel with a single tick, in mm. Roll you car a meter and divide total ticks measured by 1,000
  ODOM_PIN = 13                        # if using GPIO, which GPIO board mode pin to use as input
  ODOM_DEBUG = False                  # Write out values on vel and distance as it runs
  
  #TRAINING
  # The default AI framework to use. Choose from (tensorflow|pytorch)
  DEFAULT_AI_FRAMEWORK='tensorflow'
  DRIVE_TRAIN_TYPE = "SERVO_ESC" # SERVO_ESC|DC_STEER_THROTTLE|DC_TWO_WHEEL|SERVO_HBRIDGE_PWM|PIGPIO_PWM|MM1|MOCK
  
  # #LIDAR
  USE_LIDAR = False
  LIDAR_TYPE = 'RP' #(RP|YD)
  LIDAR_LOWER_LIMIT = 44 # angles that will be recorded. Use this to block out obstructed areas on your car, or looking backwards. Note that for the RP A1M8 Lidar, "0" is in the direction of the motor
  LIDAR_UPPER_LIMIT = 136
  
  # #RC CONTROL
  USE_RC = False
  STEERING_RC_GPIO = 26
  THROTTLE_RC_GPIO = 20
  DATA_WIPER_RC_GPIO = 19
  
  
  #LOGGING
  HAVE_CONSOLE_LOGGING = True
  LOGGING_LEVEL = 'INFO'          # (Python logging level) 'NOTSET' / 'DEBUG' / 'INFO' / 'WARNING' / 'ERROR' / 'FATAL' / 'CRITICAL'
  LOGGING_FORMAT = '%(message)s'  # (Python logging format - https://docs.python.org/3/library/logging.html#formatter-objects
  
  
  #TRAINING
  DEFAULT_AI_FRAMEWORK = 'tensorflow'
  DEFAULT_MODEL_TYPE = 'linear' #(linear|categorical|rnn|imu|behavior|3d|localizer|latent)
  BATCH_SIZE = 128
  TRAIN_TEST_SPLIT = 0.8
  MAX_EPOCHS = 100
  SHOW_PLOT = True
  VERBOSE_TRAIN = True
  USE_EARLY_STOP = True
  EARLY_STOP_PATIENCE = 5
  MIN_DELTA = .0005
  PRINT_MODEL_SUMMARY = True      #print layers and weights to stdout
  OPTIMIZER = None                #adam, sgd, rmsprop, etc.. None accepts default
  LEARNING_RATE = 0.001           #only used when OPTIMIZER specified
  LEARNING_RATE_DECAY = 0.0       #only used when OPTIMIZER specified
  CACHE_IMAGES = True             #keep images in memory. will speed succesive epochs, but crater if not enough mem.
  PRUNE_CNN = False
  PRUNE_PERCENT_TARGET = 75 # The desired percentage of pruning.
  PRUNE_PERCENT_PER_ITERATION = 20 # Percenge of pruning that is perform per iteration.
  PRUNE_VAL_LOSS_DEGRADATION_LIMIT = 0.2 # The max amout of validation loss that is permitted during pruning.
  PRUNE_EVAL_PERCENT_OF_DATASET = .05  # percent of dataset used to perform evaluation of model.
  
  #model transfer options
  FREEZE_LAYERS = False
  NUM_LAST_LAYERS_TO_TRAIN = 7
  
  #For the categorical model, this limits the upper bound of the learned throttle
  #it's very IMPORTANT that this value is matched from the training PC config.py and the robot.py
  #and ideally wouldn't change once set.
  MODEL_CATEGORICAL_MAX_THROTTLE_RANGE = 0.5
  
  #RNN or 3D
  SEQUENCE_LENGTH = 3
  
  #SOMBRERO
  HAVE_SOMBRERO = False
  
  #RECORD OPTIONS
  RECORD_DURING_AI = False
  AUTO_CREATE_NEW_TUB = False     #create a new tub (tub_YY_MM_DD) directory when recording or append records to data directory directly
  
  #JOYSTICK
  USE_JOYSTICK_AS_DEFAULT = False     #when starting the manage.py, when True, will not require a --js option to use the joystick
  JOYSTICK_MAX_THROTTLE = 0.5         #this scalar is multiplied with the -1 to 1 throttle value to limit the maximum throttle. This can help if you drop the controller or just don't need the full speed available.
  JOYSTICK_STEERING_SCALE = 1.0       #some people want a steering that is less sensitve. This scalar is multiplied with the steering -1 to 1. It can be negative to reverse dir.
  AUTO_RECORD_ON_THROTTLE = True      #if true, we will record whenever throttle is not zero. if false, you must manually toggle recording with some other trigger. Usually circle button on joystick.
  CONTROLLER_TYPE='ps3'               #(ps3|ps4|xbox|nimbus|wiiu|F710|rc3|MM1|custom) custom will run the my_joystick.py controller written by the `donkey createjs` command
  USE_NETWORKED_JS = False            #should we listen for remote joystick control over the network?
  NETWORK_JS_SERVER_IP = "192.168.0.1"#when listening for network joystick control, which ip is serving this information
  JOYSTICK_DEADZONE = 0.0             # when non zero, this is the smallest throttle before recording triggered.
  JOYSTICK_THROTTLE_DIR = -1.0        # use -1.0 to flip forward/backward, use 1.0 to use joystick's natural forward/backward
  USE_FPV = False                     # send camera data to FPV webserver
  JOYSTICK_DEVICE_FILE = "/dev/input/js0" # this is the unix file use to access the joystick.
  
  #WEB CONTROL
  WEB_CONTROL_PORT = int(os.getenv("WEB_CONTROL_PORT", 8887))  # which port to listen on when making a web controller
  WEB_INIT_MODE = "user"              # which control mode to start in. one of user|local_angle|local. Setting local will start in ai mode.
  
  
  #DonkeyGym
  #Only on Ubuntu linux, you can use the simulator as a virtual donkey and
  #issue the same python manage.py drive command as usual, but have them control a virtual car.
  #This enables that, and sets the path to the simualator and the environment.
  #You will want to download the simulator binary from: https://github.com/tawnkramer/donkey_gym/releases/download/v18.9/DonkeySimLinux.zip
  #then extract that and modify DONKEY_SIM_PATH.
  DONKEY_GYM = False
  DONKEY_SIM_PATH = "path to sim" #"/home/tkramer/projects/sdsandbox/sdsim/build/DonkeySimLinux/donkey_sim.x86_64" when racing on virtual-race-league use "remote", or user "remote" when you want to start the sim manually first.
  DONKEY_GYM_ENV_NAME = "donkey-generated-track-v0" # ("donkey-generated-track-v0"|"donkey-generated-roads-v0"|"donkey-warehouse-v0"|"donkey-avc-sparkfun-v0")
  GYM_CONF = { "body_style" : "donkey", "body_rgb" : (128, 128, 128), "car_name" : "car", "font_size" : 100} # body style(donkey|bare|car01) body rgb 0-255
  GYM_CONF["racer_name"] = "Your Name"
  GYM_CONF["country"] = "Place"
  GYM_CONF["bio"] = "I race robots."
  
  SIM_HOST = "127.0.0.1"              # when racing on virtual-race-league use host "trainmydonkey.com"
  SIM_ARTIFICIAL_LATENCY = 0          # this is the millisecond latency in controls. Can use useful in emulating the delay when useing a remote server. values of 100 to 400 probably reasonable.
  