HolyC0w

lab5_pt3_testControlAlgo_usingPID

Apr 12th, 2023
998
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.86 KB | None | 0 0
  1. ##########  Program to test the control algorithm using PID algorithm:
  2.  
  3. from dronekit import connect, VehicleMode, LocationGlobalRelative
  4. import time
  5.  
  6. # Connect to the vehicle
  7. vehicle = connect('udp:127.0.0.1:14550')
  8.  
  9. # Arm and take off
  10. vehicle.mode = VehicleMode("GUIDED")
  11. vehicle.armed = True
  12. vehicle.simple_takeoff(10)
  13.  
  14. # Wait for the drone to reach a certain altitude
  15. while True:
  16.     altitude = vehicle.location.global_relative_frame.alt
  17.     if altitude >= 9.5:  # target altitude - 0.5 meters
  18.         break
  19.     time.sleep(1)
  20.  
  21. # Define the PID controller
  22. class PIDController:
  23.     def __init__(self, kp, ki, kd, setpoint):
  24.         self.kp = kp
  25.         self.ki = ki
  26.         self.kd = kd
  27.         self.setpoint = setpoint
  28.         self.error = 0
  29.         self.error_integral = 0
  30.         self.error_derivative = 0
  31.         self.last_error = 0
  32.         self.last_time = time.time()
  33.  
  34.     def update(self, measured_value):
  35.         current_time = time.time()
  36.         elapsed_time = current_time - self.last_time
  37.  
  38.         self.error = self.setpoint - measured_value
  39.         self.error_integral += self.error * elapsed_time
  40.         self.error_derivative = (self.error - self.last_error) / elapsed_time
  41.  
  42.         output = self.kp * self.error + self.ki * self.error_integral + self.kd * self.error_derivative
  43.  
  44.         self.last_error = self.error
  45.         self.last_time = current_time
  46.  
  47.         return output
  48.  
  49. # Define the control algorithm
  50. def control_algorithm(wp):
  51.     pid = PIDController(0.1, 0.05, 0.01, wp.alt)
  52.  
  53.     while True:
  54.         altitude = vehicle.location.global_relative_frame.alt
  55.         output = pid.update(altitude)
  56.  
  57.         vehicle.simple_goto(LocationGlobalRelative(wp.lat, wp.lon, output))
  58.         time.sleep(1)
  59.  
  60.         if abs(altitude - wp.alt) <= 0.5:  # target altitude - 0.5 meters
  61.             break
  62.  
  63. # Test PID control
  64. waypoints = [
  65.     LocationGlobalRelative(37.793105, -122.398768, 20),
  66.     LocationGlobalRelative(37.793109, -122.398824, 30),
  67.     LocationGlobalRelative(37.793095, -122.398857, 25),
  68.     LocationGlobalRelative(37.793057, -122.398843, 35),
  69.     LocationGlobalRelative(37.793042, -122.398797, 30),
  70.     LocationGlobalRelative(37.793050, -122.398751, 25),
  71.     LocationGlobalRelative(37.793084, -122.398722, 35),
  72.     LocationGlobalRelative(37.793119, -122.398724, 30)
  73. ]
  74.  
  75. for wp in waypoints:
  76.     control_algorithm(wp)
  77.  
  78. # Land the drone
  79. vehicle.mode = VehicleMode("LAND")
  80.  
  81. # Close the connection
  82. vehicle.close()
  83.  
  84. #####################################################################
  85. #####################################################################
  86. from dronekit import connect, VehicleMode, LocationGlobalRelative
  87. import time
  88.  
  89. vehicle = connect('udp:127.0.0.1:14550')
  90.  
  91. vehicle.mode = VehicleMode("GUIDED")
  92. vehicle.armed = True
  93. vehicle.simple_takeoff(10)
  94.  
  95. while True:
  96.     altitude = vehicle.location.global_relative_frame.alt
  97.     if altitude >= 9.5:  # target altitude - 0.5 meters
  98.         break
  99.     time.sleep(1)
  100.  
  101. # so apparently, this keeps updating the mission in accordance to the controller.
  102. class PIDController:
  103.     def __init__(self, kp, ki, kd, setpoint):
  104.         self.kp = kp
  105.         self.ki = ki
  106.         self.kd = kd
  107.         self.setpoint = setpoint
  108.         self.error = 0
  109.         self.error_integral = 0
  110.         self.error_derivative = 0
  111.         self.last_error = 0
  112.         self.last_time = time.time()
  113.  
  114.     def update(self, measured_value):
  115.         current_time = time.time()
  116.         elapsed_time = current_time - self.last_time
  117.  
  118.         self.error = self.setpoint - measured_value
  119.         self.error_integral += self.error * elapsed_time
  120.         self.error_derivative = (self.error - self.last_error) / elapsed_time
  121.  
  122.         output = self.kp * self.error + self.ki * self.error_integral + self.kd * self.error_derivative
  123.  
  124.         self.last_error = self.error
  125.         self.last_time = current_time
  126.  
  127.         return output
  128.  
  129. def control_algorithm(wp):
  130.     pid = PIDController(0.1, 0.05, 0.01, wp.alt)
  131.  
  132.     while True:
  133.         altitude = vehicle.location.global_relative_frame.alt
  134.         output = pid.update(altitude)
  135.  
  136.         vehicle.simple_goto(LocationGlobalRelative(wp.lat, wp.lon, output))
  137.         time.sleep(1)
  138.  
  139.         if abs(altitude - wp.alt) <= 0.5:  # target altitude - 0.5 meters
  140.             break
  141.  
  142. waypoints = [
  143.     LocationGlobalRelative(37.793105, -122.398768, 20),
  144.     LocationGlobalRelative(37.793109, -122.398824, 30),
  145.     LocationGlobalRelative(37.793095, -122.398857, 25),
  146.     LocationGlobalRelative(37.793057, -122.398843, 35),
  147.     LocationGlobalRelative(37.793042, -122.398797, 30),
  148.     LocationGlobalRelative(37.793050, -122.398751, 25),
  149.     LocationGlobalRelative(37.793084, -122.398722, 35),
  150.     LocationGlobalRelative(37.793119, -122.398724, 30)
  151. ]
  152.  
  153. for wp in waypoints:
  154.     control_algorithm(wp)
  155.  
  156. vehicle.mode = VehicleMode("LAND")
  157.  
  158. vehicle.close()
  159.  
  160.  
Advertisement
Add Comment
Please, Sign In to add comment