Source code for pitop.robotics.pan_tilt_controller

from pitop.core.mixins import Recreatable, Stateful
from pitop.pma import ServoMotor
from pitop.robotics.two_servo_assembly_calibrator import TwoServoAssemblyCalibrator

from .pan_tilt_object_tracker import PanTiltObjectTracker


[docs] class PanTiltController(Stateful, Recreatable): """Represents a pan-tilt using two servo motors.""" CALIBRATION_FILE_NAME = "pan_tilt.conf" _pan_servo = None _tilt_servo = None def __init__(self, servo_pan_port="S0", servo_tilt_port="S3", name="pan_tilt"): self.name = name self._pan_servo = ServoMotor(servo_pan_port) self._tilt_servo = ServoMotor(servo_tilt_port) self._object_tracker = PanTiltObjectTracker( pan_servo=self._pan_servo, tilt_servo=self._tilt_servo ) Stateful.__init__(self, children=["_pan_servo", "_tilt_servo"]) Recreatable.__init__( self, config_dict={ "servo_pan_port": servo_pan_port, "servo_tilt_port": servo_tilt_port, "name": name, }, ) @property def pan_servo(self): return self._pan_servo @property def tilt_servo(self): return self._tilt_servo @property def track_object(self) -> PanTiltObjectTracker: return self._object_tracker
[docs] def calibrate(self, save=True, reset=False): """Calibrates the assembly to work in optimal conditions. Based on the provided arguments, it will either load the calibration values stored in the pi-top, or it will run the calibration process, requesting the user input in an interactive fashion. :param bool reset: If `true`, the existing calibration values will be reset, and the calibration process will be started. If set to `false`, the calibration values will be retrieved from the calibration file. :param bool save: If `reset` is `true`, this parameter will cause the calibration values to be stored to the calibration file if set to `true`. If `save=False`, the calibration values will only be used for the current session. """ calibration_object = TwoServoAssemblyCalibrator( filename=self.CALIBRATION_FILE_NAME, section_name="PAN_TILT", servo_lookup_dict={ "pan_zero_point": self.pan_servo, "tilt_zero_point": self.tilt_servo, }, ) calibration_object.calibrate(save, reset)