Example #1
0
class ObstacleDetector(Node):
    _node_config_section = "OBSTACLE_DETECTOR"

    def __init__(self):
        super().__init__(self._node_config_section)

    # Node method implementations
    def _start_up(self):
        self._obstacle_distance_estimator = ObstacleDistanceEstimator()
        self._obstacle_detector_sender = Sender(self._node_config_section)
        self._sensor_input_camera = ReadCamera()
        self._darknet_wrapper = DarknetWrapper()

    def _progress(self):
        frame_read = self._sensor_input_camera.get_frame()
        detected_obstacles: List[
            DetectedObject] = self._darknet_wrapper.detect_obstacles(
                frame_read)
        for detected_obstacle in detected_obstacles:
            detected_obstacle.distance = self._obstacle_distance_estimator.estimate(
                detected_obstacle.bounding_box.height)

        obstacle_detector_result = ObstacleDetectorResult(detected_obstacles)
        self._obstacle_detector_sender.send(obstacle_detector_result)

    def _shut_down(self):
        self._obstacle_detector_sender.close()
Example #2
0
class PylonDetector(Node):
    _node_config_section = "PYLON_DETECTOR"

    def __init__(self):
        super().__init__(self._node_config_section)
        self._pylon_distance_estimator = PylonDistanceEstimator()
        self._sensor_input_camera = ReadCamera()
        self._darknet_wrapper = DarknetWrapper()

    # Node method implementations
    def _start_up(self):
        self._pylon_detector_sender = Sender(self._node_config_section)

    def _progress(self):
        frame_read = self._sensor_input_camera.get_frame()
        detected_pylons: List[
            DetectedObject] = self._darknet_wrapper.detect_pylons(frame_read)
        for detected_pylon in detected_pylons:
            detected_pylon.bounding_box = PylonBoundingBoxAdjuster(
                frame_read).adjust(detected_pylon.bounding_box)
            detected_pylon.distance = self._pylon_distance_estimator.estimate(
                detected_pylon.bounding_box.width)
        self._pylon_detector_sender.send(PylonDetectorResult(detected_pylons))

    def _shut_down(self):
        self._pylon_detector_sender.close()
class SteeringCommandGenerator(Node):
    _node_config_name = "STEERING_COMMAND_GENERATOR"
    _logger = logging.getLogger("SteeringCommandGenerator")
    _imu_data_reader = ReadIMU()

    def __init__(self):
        super().__init__(self._node_config_name)

        self._nomad = Nomad()

        # https://github.com/pytransitions/transitions#automatic-transitions-for-all-states
        self._state_machine = Machine(
            model=self._nomad,
            states=StatesNomad().states,
            transitions=TransitionsNomad().transitions,
            initial="Start",
            auto_transitions=False,
            model_attribute='_state',
            queued=True)

    # Node method implementations
    def _start_up(self):
        self._object_detector_receiver = Receiver("OBJECT_DETECTOR")
        self._uart_output_sender = Sender(self._node_config_name)
        self._nomad.set_sender(self._uart_output_sender)

    def _progress(self):

        self._nomad.data = self._object_detector_receiver.receive()
        self._nomad.imu_data = self._imu_data_reader.get_Data()
        # test data
        # self._nomad.data = self._create_fake_data()

        current_state_name = self._nomad.state
        trigger_for_next_state = self._state_machine.get_triggers(
            current_state_name)
        internal_trigger_for_current_state = [
            trigger for trigger in trigger_for_next_state
            if "internal_" in trigger
        ]
        self._nomad.trigger(internal_trigger_for_current_state[0])

    def _shut_down(self):
        self._object_detector_receiver.close()
        self._uart_output_sender.close()
Example #4
0
class FakeObjectDetector(Node):
    _node_config_section = "OBJECT_DETECTOR"

    def __init__(self):
        super().__init__(self._node_config_section)
        self.fake_data_reader: FakeDataReader = FakeDataReader("objectresult")

    # Node method implementations
    def _start_up(self):
        self._object_detector_sender = Sender(self._node_config_section)

    def _progress(self):
        pickle_in = open(self.fake_data_reader.getNextFilePath(), "rb")
        object_detector_result: ObjectDetectorResult = pickle.load(pickle_in)
        self._object_detector_sender.send(object_detector_result)

    def _shut_down(self):
        self._object_detector_sender.close()
Example #5
0
 def _start_up(self):
     self._obstacle_distance_estimator = ObstacleDistanceEstimator()
     self._obstacle_detector_sender = Sender(self._node_config_section)
     self._sensor_input_camera = ReadCamera()
     self._darknet_wrapper = DarknetWrapper()
Example #6
0
 def _start_up(self):
     self._pylon_detector_receiver = Receiver("PYLON_DETECTOR")
     self._obstacle_detector_receiver = Receiver("OBSTACLE_DETECTOR")
     self._object_detector_sender = Sender(self._node_config_section)
     self._fake_sonar = ReadSonar()
Example #7
0
class ObjectDetector(Node):
    _node_config_section = "OBJECT_DETECTOR"

    def __init__(self):
        super().__init__(self._node_config_section)
        self._camera_center_range = ObjectDetector.load_camera_center_range()

    # Node method implementations
    def _start_up(self):
        self._pylon_detector_receiver = Receiver("PYLON_DETECTOR")
        self._obstacle_detector_receiver = Receiver("OBSTACLE_DETECTOR")
        self._object_detector_sender = Sender(self._node_config_section)
        self._fake_sonar = ReadSonar()

    def _progress(self):
        pylon_detector_result = self._pylon_detector_receiver.receive()
        obstacle_detector_result = self._obstacle_detector_receiver.receive()
        self._set_measured_distance(obstacle_detector_result, pylon_detector_result)
        self._object_detector_sender.send(ObjectDetectorResult(pylon_detector_result.pylons +
                                                               obstacle_detector_result.obstacles))

    def _set_measured_distance(self, obstacle_detector_result: ObstacleDetectorResult,
                               pylon_detector_result: PylonDetectorResult):
        sonar_data: SonarData = self._fake_sonar.get_Data()

        if not sonar_data.contact_top and sonar_data.contact_bottom:  # square timber
            centred_obstacle = obstacle_detector_result.get_nearest_obstacle_which_intersects(self._camera_center_range)
            if centred_obstacle is not None:
                centred_obstacle.distance = Distance(sonar_data.distance_bottom, True)
            else:
                obstacle_detector_result.obstacles.append(self.generateAdditionalObstacle(sonar_data.distance_bottom))

        elif sonar_data.contact_top and sonar_data.contact_bottom:  # pylon or pylon and square timber
            if sonar_data.distance_top + 5 >= sonar_data.distance_bottom >= sonar_data.distance_top - 15:  # pylon
                centred_pylon = pylon_detector_result.get_nearest_pylon_which_intersects(self._camera_center_range)
                if centred_pylon is not None:
                    centred_pylon.distance = Distance(sonar_data.distance_top, True)
            else:  # pylon behind square_timber
                centred_pylon = pylon_detector_result.get_nearest_pylon_which_intersects(self._camera_center_range)
                if centred_pylon is not None:
                    centred_pylon.distance = Distance(sonar_data.distance_top, True)
                centred_obstacle = obstacle_detector_result.get_nearest_obstacle_which_intersects(
                    self._camera_center_range)
                if centred_obstacle is not None:
                    centred_obstacle.distance = Distance(sonar_data.distance_bottom, True)
                else:
                    obstacle_detector_result.obstacles.append(self.generateAdditionalObstacle(sonar_data.distance_bottom))

    def generateAdditionalObstacle(self, distance_buttom: float) -> DetectedObject:
        min_y = int(832 - 1.22 * distance_buttom)
        max_y = int(832 - 1.22 * distance_buttom+ 40)
        bounding_box: BoundingBox = BoundingBox.of_rectangle(int(0), min_y, int(832), max_y)
        distance: Distance = Distance(distance_buttom, True)
        return DetectedObject(DetectedObjectType.SquareTimber, bounding_box, distance, 100, [])

    def _shut_down(self):
        self._pylon_detector_receiver.close()
        self._obstacle_detector_receiver.close()
        self._object_detector_sender.close()

    @staticmethod
    def load_camera_center_range():
        config = configparser.ConfigParser()
        config.read('config.ini')
        min_x = config.getint('CAMERA_CENTER_RANGE', 'MIN_X')
        min_y = config.getint('CAMERA_CENTER_RANGE', 'MIN_Y')
        max_x = config.getint('CAMERA_CENTER_RANGE', 'MAX_X')
        max_y = config.getint('CAMERA_CENTER_RANGE', 'MAX_Y')
        return BoundingBox.of_rectangle(min_x, min_y, max_x, max_y)
Example #8
0
 def _start_up(self):
     self._object_detector_sender = Sender(self._node_config_section)
 def _start_up(self):
     self._object_detector_receiver = Receiver("OBJECT_DETECTOR")
     self._uart_output_sender = Sender(self._node_config_name)
     self._nomad.set_sender(self._uart_output_sender)