def _rotate(self): """Control yaw Reaction control system based on angle, angular velocity and target angle """ #TODO deltat self._angle += self._angular_velocity * seconds(1) self.yaw_rcs_status = '' signed_delta = float(self._target_angle - self._angle) # signed_delta is defined between -180 and 180 if signed_delta > 180: signed_delta -= 360 if abs(signed_delta) < .1: # rotation completed self._angular_velocity = degrees_per_sec(0) self._angle = self._target_angle return av = self._angular_velocity # momentum should be degrees per (sec ** 2) momentum = degrees_per_sec(math.copysign(.1, signed_delta)) if av != 0 and math.sqrt(2 * abs(signed_delta) / .1) > \ 1.05 * abs(signed_delta / av): # closing too fast - better slow down self._angular_velocity -= momentum cw = momentum < 0 elif av == 0 or math.sqrt(2 * abs(signed_delta) / .1) < \ 0.95 * abs(signed_delta / av): # increase speed self._angular_velocity += momentum cw = momentum > 0 else: return self.yaw_rcs_status = 'YAW CW' if cw else 'YAW CCW' t = RCSThruster(self, cw=cw) game._particles.append(t)
def __init__(self, gcenter): gloss.Sprite.__init__(self, gloss.Texture('art/shuttle.png')) self._angle = degrees(0) self._target_angle = degrees(0) self._angular_velocity = degrees_per_sec(0) self._orbit_prediction_thread = None self._orbit_prediction_running = False self._raw_scale = .025 self._raw_scale = .015 # fixme self._tp = None self.gcenter = gcenter self.gspeed = GVector(0, -0.3) self.mass = 4 self.orbit = () self.propellent = 1500 self.hull_temperature = 0 self.landing_gears_deployed = False self._start_orbit_prediction()