Source code for udaan.control.quadrotor.position_pd
"""Position PD controller for quadrotor."""
import numpy as np
from ...control import PDController
from ...core.defaults import DEFAULT_POS_KD, DEFAULT_POS_KP
[docs]
class PositionPDController(PDController):
"""Implements a PD controller for position control of a quadrotor."""
[docs]
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.mass = 1.0 if "mass" not in kwargs else kwargs["mass"]
self._gains.kp = DEFAULT_POS_KP.copy()
self._gains.kd = DEFAULT_POS_KD.copy()
self.pos_setpoint = np.array([0.0, 0.0, 0.0])
[docs]
def compute(self, *args):
t = args[0]
s, ds = args[1][0], args[1][1]
sd, dsd, d2sd = self.setpoint(t)
e = s - sd
de = ds - dsd
u = -self._gains.kp * e - self._gains.kd * de + self.mass * (d2sd + self._ge3)
# store setpoint for visualization
self.pos_setpoint = sd
return u