def __init__(self, vehicle, parser): self.parser = parser self.gui = DebugGui() self._idleRpm = self.parser.getEngineRpmIdle() self._maxRpm = self.parser.getEngineRpmMax() self._torqueFuncs = self.parser.getTorqueFuncs() self._curRpm = self._idleRpm self._curTorque = 0. self._gasPedal = 0.0 # Range: 0.0 - 1.0 self._brakePedal = 0.0 self._vehicle = vehicle self._gearbox = AutomaticGearbox(self.parser.getGearRatios(), self.parser.getPoweredAxleRatio())
def start_debug(thermostat): chatbot = DebugBot(access_codes.jid, access_codes.password, thermostat) chatbot.register_plugin('xep_0030') # Service Discovery chatbot.register_plugin('xep_0004') # Data Forms chatbot.register_plugin('xep_0060') # PubSub chatbot.register_plugin('xep_0199', { 'keepalive': True, 'interval': 60, 'timeout': 15 }) # XMPP Ping if chatbot.connect(('talk.google.com', 5222)): logging.info("logged in to talk.google.com") chatbot.process(block=False) else: logging.warning("login to talk.google.com failed") sys.exit(0) app = QApplication(sys.argv) debugUi = DebugGui("Temp sensor disconnected") sys.exit(app.exec_())
class Drivetrain: def __init__(self, vehicle, parser): self.parser = parser self.gui = DebugGui() self._idleRpm = self.parser.getEngineRpmIdle() self._maxRpm = self.parser.getEngineRpmMax() self._torqueFuncs = self.parser.getTorqueFuncs() self._curRpm = self._idleRpm self._curTorque = 0. self._gasPedal = 0.0 # Range: 0.0 - 1.0 self._brakePedal = 0.0 self._vehicle = vehicle self._gearbox = AutomaticGearbox(self.parser.getGearRatios(), self.parser.getPoweredAxleRatio()) # === Engine Stuff === def __getTorque(self, gas): for func in self._torqueFuncs: if self._curRpm >= func["lo"] and self._curRpm < func["hi"]: # Take internal resistance (motor brake effect) into account resistance = 0.5 * self._curRpm# * (1. - gas) rpm = self._curRpm # Used by "function" return eval(func["function"]) * gas - resistance # This really should never happen! print "[wrn] Drivetrain:Engine:_getTorque(): no matching torque curve for %s rpm!" % (self._curRpm) return 0. def __calcOutputTorque(self, dt, outputRpm, inputRpm, inputTorque): factor = 0 if inputRpm > 0.: factor = 1 - (outputRpm / inputRpm) #print "f", factor if factor < 0: factor = 0 if factor > 1: factor = 1 if inputRpm > outputRpm: if not outputRpm == 0: factor = inputRpm / outputRpm * -1. else: factor = 1 else: if not inputRpm == 0: factor = outputRpm / inputRpm else: factor = 1 return inputTorque * factor def __updateEngine(self, dt, inputRpm): if self._gearbox.getGbState() == "d" and self._curRpm > self._idleRpm: self._curRpm = inputRpm virtualGas = self._gasPedal # Keep ourselves alive if self._curRpm < (self._idleRpm): virtualGas = min(self._gasPedal + 0.6, 1.0) #self._curRpm = self._idleRpm elif self._curRpm >= (self._maxRpm * 0.9): print "Engine.update: overrevving, setting gas = 0.!" virtualGas = 0. # Apply torque as functions in vehicle.xml specify self._curTorque = self.__getTorque(virtualGas) # Do some work! # TODO: this is bullshit - really? self._curRpm += self._curTorque * dt self.gui.update("rpm: " + repr(int(self._curRpm)) + "\ntrq: " + repr(int(self._curTorque))) # === Drivetrain Stuff === def _calcWheelRpm(self, dt): # Average the delta rotation value for all powered wheels drot = 0. poweredAxleCount = 0 for axIndex in range(0, self.parser.getAxleCount()): if self.parser.axleIsPowered(axIndex): # TODO only consider wheels that have ground contact drot += self._vehicle.getWheel(2 * axIndex).getDeltaRotation() drot += self._vehicle.getWheel(2 * axIndex + 1).getDeltaRotation() poweredAxleCount += 1 drot = abs(drot) / (2 * poweredAxleCount) wheelRpm = drot * (1./dt) # Average of the rear wheels' rotation speed (revs per second) wheelRpm *= 60 # convert to revs per minute return wheelRpm def update(self, dt): # input: wheels -> engine inputRpm = self._calcWheelRpm(dt) # effectively is inputRpm approx. the postGearRpm from the last frame preGearRpm = self._gearbox.getPreRpm(inputRpm) self.__updateEngine(dt, preGearRpm) # output: engine -> wheels postGearRpm = self._gearbox.getPostRpm(self._curRpm) postGearTorque = self._gearbox.getPostTorque(self._curTorque) outputTorque = self.__calcOutputTorque(dt, postGearRpm, inputRpm, postGearTorque) #print "wheel torque: ", outputTorque if self._gearbox.getGbState() == "p": for axIndex in range(0, self.parser.getAxleCount()): self._vehicle.setBrake(self.parser.getParkingBrakeForce() * self._brakePedal, 2 * axIndex) self._vehicle.setBrake(self.parser.getParkingBrakeForce() * self._brakePedal, 2 * axIndex + 1) else: # Use the force! for axIndex in range(0, self.parser.getAxleCount()): if self.parser.axleIsPowered(axIndex): self._vehicle.applyEngineForce(outputTorque, 2 * axIndex) self._vehicle.applyEngineForce(outputTorque, 2 * axIndex + 1) # Strong the dark side is in you for axIndex in range(0, self.parser.getAxleCount()): self._vehicle.setBrake(self.parser.getBrakingForce() * self._brakePedal, 2 * axIndex) self._vehicle.setBrake(self.parser.getBrakingForce() * self._brakePedal, 2 * axIndex + 1) def setGas(self, gas): if gas <= 1. and gas >= 0.: self._gasPedal = gas else: print "Drivetrain:setGas(gas) out of range! (0 < x < 1)" def setBrake(self, brake): if brake <= 1. and brake >= 0.: self._brakePedal = brake else: print "Drivetrain:setBrake(brake) out of range! (0 < x < 1)" def getRpm(self): return self._curRpm def getGasPedal(self): return self._gasPedal def getGbState(self): return self._gearbox.getGbState() def getGear(self): return self._gearbox.getGear() def shiftDrive(self): self._gearbox.shiftDrive() def shiftNeutral(self): self._gearbox.shiftNeutral() def shiftReverse(self): self._gearbox.shiftReverse() def shiftPark(self): self._gearbox.shiftPark()