Source code for pitop.robotics.pincer_controller

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


[docs] class PincerController(Stateful, Recreatable): """Represents a pincer that uses two servo motors connected parallel to each other.""" CALIBRATION_FILE_NAME = "pincers.conf" _left_pincer = None _right_pincer = None def __init__(self, left_pincer_port="S3", right_pincer_port="S0", name="pincers"): self.name = name self._left_pincer = ServoMotor(left_pincer_port) self._right_pincer = ServoMotor(right_pincer_port) self.__left_pincer_setting = ServoMotorSetting() self.__right_pincer_setting = ServoMotorSetting() Stateful.__init__(self, children=["_left_pincer", "_right_pincer"]) Recreatable.__init__( self, config_dict={ "left_pincer_port": left_pincer_port, "right_pincer_port": right_pincer_port, "name": self.name, }, )
[docs] def close(self, speed: int = 100, angle: int = 0): self.__left_pincer_setting.speed = speed self.__left_pincer_setting.angle = angle self.__right_pincer_setting.speed = speed self.__right_pincer_setting.angle = -angle self.pincer_move( left_servo_setting=self.__left_pincer_setting, right_servo_setting=self.__right_pincer_setting, )
[docs] def open(self, speed: int = 50, angle: int = 45): self.__left_pincer_setting.speed = speed self.__left_pincer_setting.angle = -angle self.__right_pincer_setting.speed = speed self.__right_pincer_setting.angle = angle self.pincer_move( left_servo_setting=self.__left_pincer_setting, right_servo_setting=self.__right_pincer_setting, )
[docs] def pincer_move(self, left_servo_setting, right_servo_setting): self._left_pincer.setting = left_servo_setting self._right_pincer.setting = right_servo_setting
[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="PINCERS", servo_lookup_dict={ "left_pincer_zero_point": self._left_pincer, "right_pincer_zero_point": self._right_pincer, }, ) calibration_object.calibrate(save, reset)