def main():
     elbowPid = PIDController(10., 1, 1)
     shoulderPid = PIDController(1., .001, .1)
     lastTime = time.time()
     print "actual, delinearizedSetPoint, afterPID, target"
     while True:
         reading = readAin(AIN3, ELBOW_RANGE)
         log.debug("Read: %s" % reading)
         pistonPressure = getElbowPressureFromGravity(reading)
         now = time.time()
         dt = now - lastTime
         elbowRate = 0
         # shoulderControl = 0
         if sinWave:
             elbowRate = elbowPid.update(
                 math.sin(now / 2.) / 2. + .5, reading, dt)
             # shoulderControl = shoulderPid.update(math.sin(now/3.)/8.+.85, reading, dt)
         else:
             elbowRate = elbowPid.update(elbowSetPoint, reading, dt)
             # shoulderControl = shoulderPid.update(shoulderSetPoint, reading, dt)
         relevantPressure = pistonPressure[1 if elbowRate > 0 else 0]
         kv = getValveCommandFromControlSignal(elbowRate, relevantPressure)
         print "%s, %s, %s, %s" % (reading, kv, elbowRate,
                                   math.sin(now / 2.) / 2.)
         elbowPair = mapControlToElbowPwmPair(kv)
         # shoulderPair = mapControlToShoulderPwmPair(shoulderControl)
         executeElbowPwmPair(elbowPair)
         # executeShoulderPwmPair(shoulderPair)
         lastTime = now
         time.sleep(.01)  # because the valve response rate is 10Hz
Exemple #2
0
    def __init__(
        self,
        dbw_parameters, # Set of base parameters
        ):

        self.is_initialized = False
        self.last_time = rospy.get_time()

        self.dbw_parameters = dbw_parameters
        self.steering_controller = YawController(
            wheel_base = self.dbw_parameters['wheel_base'],
            steer_ratio = self.dbw_parameters['steer_ratio'],
            min_speed = self.dbw_parameters['min_vehicle_speed'],
            max_lat_accel = self.dbw_parameters['max_lat_accel'],
            max_steer_angle = self.dbw_parameters['max_steer_angle'])
        self.low_pass_filter_vel = LowPassFilter(samples_num = LOW_PASS_FREQ_VEL * self.dbw_parameters['dbw_rate'])
        self.low_pass_filter_yaw = LowPassFilter(samples_num = LOW_PASS_FREQ_YAW * self.dbw_parameters['dbw_rate'])
        self.throttle_controller = PIDController(
            kp = 0.3,
            ki = 0.01,
            kd = 0.01,
            mn = self.dbw_parameters['vehicle_min_throttle_val'],
            mx = self.dbw_parameters['vehicle_max_throttle_val'],
            integral_period_sec = INTEGRAL_PERIOD_SEC)
        self.steering_controller2 = PIDController(
            kp = 3.0,
            ki = 0.0,
            kd = 1.0,
            mn = -self.dbw_parameters['max_steer_angle'],
            mx = self.dbw_parameters['max_steer_angle'],
            integral_period_sec = INTEGRAL_PERIOD_SEC)
Exemple #3
0
def pid_process(output, p, i, d, box_coord, origin_coord, action):
    signal.signal(signal.SIGINT, signal_handler)

    p = PIDController(p.value, i.value, d.value)
    p.reset()

    while True:
        error = origin_coord - box_coord.value
        output.value = p.update(error)
    def __init__(self):
        self.pids = {}

        # self.pids['aileron'] = PIDController(
        #     'aileron',  p=0.8, i=0.01, d=0.30, output_limits=(-1.0, 1.0), input_limits=(-1.0, 1.0))
        # self.pids['pitch'] = PIDController(
        #     'pitch',    p=0.6, i=0.01, d=0.40, output_limits=(-1.0, 1.0), input_limits=(-1.0, 1.0))
        # self.pids['throttle'] = PIDController(
        #     'throttle', p=1.6, i=0.30, d=0.80, output_limits=(-1.0, 1.0), input_limits=(-1.0, 1.0))
        # self.pids['yaw'] = PIDController(
        #     'yaw',      p=0.5, i=0.01, d=0.20, output_limits=(-1.0, 1.0), input_limits=(-1.0, 1.0))

        self.pids['aileron'] = PIDController('aileron',
                                             p=0.8,
                                             i=0.01,
                                             d=0.30,
                                             output_limits=(-1.0, 1.0),
                                             input_limits=(-1.0, 1.0))
        self.pids['pitch'] = PIDController('pitch',
                                           p=0.6,
                                           i=0.01,
                                           d=0.40,
                                           output_limits=(-1.0, 1.0),
                                           input_limits=(-1.0, 1.0))
        self.pids['throttle'] = PIDController('throttle',
                                              p=1.6,
                                              i=0.30,
                                              d=0.80,
                                              output_limits=(-1.0, 1.0),
                                              input_limits=(-1.0, 1.0))
        self.pids['yaw'] = PIDController('yaw',
                                         p=0.5,
                                         i=0.01,
                                         d=0.20,
                                         output_limits=(-1.0, 1.0),
                                         input_limits=(-1.0, 1.0))

        self.setpoints = {
            'aileron': 0.0,
            'pitch': 0.0,
            'throttle': 0.0,
            'yaw': 0.0
        }
Exemple #5
0
def pid_process(output, p, i, d, box_coord, origin_coord, action):
    # signal trap to handle keyboard interrupt
    signal.signal(signal.SIGINT, signal_handler)

    # create a PID and initialize it
    pid = PIDController(p.value, i.value, d.value)
    pid.reset()

    # loop indefinitely
    while True:
        error = origin_coord - box_coord.value
        output.value = pid.update(error)
        logging.info(f'{action} error {error} angle: {output.value}')
    def __init__(self):
        self.image_pub = rospy.Publisher("image_topic_2", Image)

        self.bridge = CvBridge()
        self.image_sub = rospy.Subscriber("/camera/rgb/image_color", Image,
                                          self.image_callback)
        self.depth_sub = rospy.Subscriber("/camera/depth/image", Image,
                                          self.depth_callback)
        self.cmd_vel = rospy.Publisher('cmd_vel_mux/input/navi',
                                       Twist,
                                       queue_size=1)
        self.app = App(0)
        self.image_updated = False
        self.depth_updated = False
        self.image = None
        self.depth = None
        self.control = PIDController(Kp=0.1, Ki=0, Kd=0)
def test_pid(kp, ki, kd, stime, use_pid=True):
    left_encoder = Encoder(motor_pin_a=cfg.LEFT_MOTOR_PIN_A,
                           motor_pin_b=cfg.LEFT_MOTOR_PIN_B,
                           sampling_time_s=stime)

    left_encoder_counter = EncoderCounter(encoder=left_encoder)
    left_encoder_counter.start()

    pid_controller = PIDController(proportional_coef=kp,
                                   integral_coef=ki,
                                   derivative_coef=kd,
                                   windup_guard=cfg.PID_WINDUP_GUARD,
                                   current_time=None)

    max_steps_velocity_sts = cfg.ENCODER_RESOLUTION * cfg.MAX_ANGULAR_VELOCITY_RPM / 60

    kit = MotorKit(0x40)
    left_motor = kit.motor1

    velocity_levels = [1000, 2000, 3000, 4000, 5000, 6000, 0]
    velocity_levels = [3000, 0]
    sleep_time = 5

    velocities_level_records = deque([])
    velocities_steps_records = deque([])
    pid_velocities_steps_records = deque([])
    timestamps_records = deque([])

    for v in velocity_levels:
        pid_controller.reset()
        pid_controller.set_set_point(v)
        left_motor.throttle = max(min(1, v / max_steps_velocity_sts), 0)

        start = time.time()
        current_time = time.time()
        while current_time - start < sleep_time:

            timestamp, measured_steps_velocity_sts = left_encoder_counter.get_velocity(
            )

            # PID control
            if use_pid:
                new_steps_velocity_sts = pid_controller.update(
                    -measured_steps_velocity_sts, current_time)
                left_motor.throttle = max(
                    min(1, new_steps_velocity_sts / max_steps_velocity_sts), 0)
            else:
                new_steps_velocity_sts = -1

            velocities_level_records.append(v)
            velocities_steps_records.append(-measured_steps_velocity_sts)
            pid_velocities_steps_records.append(new_steps_velocity_sts)
            timestamps_records.append(timestamp)

            current_time = time.time()

    left_motor.throttle = 0
    left_encoder_counter.finish()

    records_left = pd.DataFrame({
        'velocity_steps': velocities_steps_records,
        'velocity_levels': velocities_level_records,
        'pid_velocity_steps': pid_velocities_steps_records,
        'timestamp': timestamps_records
    })
    records_left['velocity_ms'] = records_left[
        'velocity_steps'] * cfg.WHEEL_DIAMETER_MM * np.pi / (
            1000 * cfg.ENCODER_RESOLUTION)
    records_left.set_index('timestamp', drop=True)
    return records_left
Exemple #8
0
import krpc
from pid import PIDController

throttle_controller = PIDController(0.2, 0.2, 0.3)
goal_speed = 200

conn = krpc.connect(name='Hello World')
vessel = conn.space_center.active_vessel
control = vessel.control
ref_frame = vessel.orbit.body.reference_frame
flight = vessel.flight(ref_frame)
while True:
    output_throttle = throttle_controller.trigger(goal_speed, flight.speed, 1)
    control.throttle = output_throttle

    if output_throttle < -0.1:
        control.brakes = True
    else:
        control.brakes = False
    print("Speed: {}, Throttle: {}".format(flight.speed, output_throttle))
from driver import RobotDriver

from encoders import EncoderController
from pid import PIDController

if __name__ == '__main__':
    encoder_controller = EncoderController(
        left_motor_pin_a=cfg.LEFT_MOTOR_PIN_A,
        left_motor_pin_b=cfg.LEFT_MOTOR_PIN_B,
        right_motor_pin_a=cfg.RIGHT_MOTOR_PIN_A,
        right_motor_pin_b=cfg.RIGHT_MOTOR_PIN_B,
        encoder_resolution=cfg.ENCODER_RESOLUTION)

    pid_controller = PIDController(proportional_coef=cfg.PID_KP,
                                   integral_coef=cfg.PID_KI,
                                   derivative_coef=cfg.PID_KD,
                                   windup_guard=cfg.PID_WINDUP_GUARD,
                                   current_time=None)

    rd = RobotDriver(wheel_diameter=cfg.WHEEL_DIAMETER_MM,
                     wheelbase=cfg.WHEELBASE_MM,
                     max_angular_velocity=cfg.MAX_ANGULAR_VELOCITY_RPM,
                     encoder_controller=encoder_controller,
                     pid_controller=pid_controller)

    rd.drive_forward(0.2, 0.5)
    left_velocities = rd.get_encoder_controller().get_left_encoder(
    ).get_velocity_records()
    right_velocities = rd.get_encoder_controller().get_right_encoder(
    ).get_velocity_records()
 def __init__(self, engine):
     super(ApogeeSimulator, self).__init__()
     self._eng = engine
     self.pid = PIDController(TARGET_APOGEE, KP, KI, KD)