コード例 #1
0
    def scan_complete(self):


        self._logger.debug("Scan complete writing pointcloud files with %i points." % (self.point_cloud.get_size(),))
        self.point_cloud.saveAsFile(self._prefix)
        self.settings.saveAsFile(self._prefix)
        message = FSUtil.new_message()
        message['type'] = FSEvents.ON_INFO_MESSAGE
        message['data']['message'] = "SAVING_POINT_CLOUD"
        message['data']['scan_id'] = self._prefix
        message['data']['level'] = "info"
        self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST,message)


        FSUtil.delete_image_folders(self._prefix)
        self.reset_scanner_state()

        event = FSEvent()
        event.command = '_COMPLETE'
        #TODO: generate MESH Here if option is selected in scan settings!
        #self.create_mesh(self._prefix)
        self.eventManager.publish(FSEvents.COMMAND,event)

        message = FSUtil.new_message()
        message['type'] = FSEvents.ON_INFO_MESSAGE
        message['data']['message'] = "SCAN_COMPLETE"
        message['data']['scan_id'] = self._prefix
        message['data']['level'] = "success"

        self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST,message)
コード例 #2
0
    def notify_if_is_not_calibrated(self):
        try:
            self._logger.debug(self.config.file.calibration.camera_matrix)

            is_calibrated = self.scanner_is_calibrated()
            self._logger.debug(
                "FabScan is calibrated: {0}".format(is_calibrated))

            if not is_calibrated:
                message = {
                    "message": "SCANNER_NOT_CALIBRATED",
                    "level": "warn"
                }

                self._logger.debug("Clients informaed")

                event = FSEvent()
                event.command = "STOP"
                self.eventmanager.publish(FSEvents.COMMAND, event)
                self.eventmanager.broadcast_client_message(
                    FSEvents.ON_INFO_MESSAGE, message)

            return

        except Exception as e:
            self._logger.exception(e)
コード例 #3
0
    def scan_complete(self):

        self._logger.debug(
            "Scan complete writing pointcloud files with %i points." %
            (self.point_cloud.get_size(), ))
        self.point_cloud.saveAsFile(self._prefix)
        self.settings.saveAsFile(self._prefix)
        message = FSUtil.new_message()
        message['type'] = FSEvents.ON_INFO_MESSAGE
        message['data']['message'] = "SAVING_POINT_CLOUD"
        message['data']['scan_id'] = self._prefix
        message['data']['level'] = "info"
        self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST, message)

        FSUtil.delete_image_folders(self._prefix)
        self.reset_scanner_state()

        event = FSEvent()
        event.command = '_COMPLETE'
        #TODO: generate MESH Here if option is selected in scan settings!
        #self.create_mesh(self._prefix)
        self.eventManager.publish(FSEvents.COMMAND, event)

        message = FSUtil.new_message()
        message['type'] = FSEvents.ON_INFO_MESSAGE
        message['data']['message'] = "SCAN_COMPLETE"
        message['data']['scan_id'] = self._prefix
        message['data']['level'] = "success"

        self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST, message)
コード例 #4
0
    def scan_complete(self):

        self._logger.debug("Scan complete writing pointcloud files with %i points." % (self.point_cloud.get_size(),))
        self.point_cloud.saveAsFile(self._prefix)
        self.settings.saveAsFile(self._prefix)

        message = {
            "message": "SAVING_POINT_CLOUD",
            "scan_id": self._prefix,
            "level": "info"
        }

        self.eventManager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)

        FSUtil.delete_image_folders(self._prefix)
        self.reset_scanner_state()

        event = FSEvent()
        event.command = 'COMPLETE'
        self.eventManager.publish(FSEvents.COMMAND,event)

        message = {
            "message": "SCAN_COMPLETE",
            "scan_id": self._prefix,
            "level": "success"
        }

        self.eventManager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)
        self.hardwareController.camera.device.stopStream()
コード例 #5
0
    def start_scan(self):
        self.settings_mode_off()
        self._logger.info("Scan started")
        self._stop_scan = False

        if self._worker_pool is None or not self._worker_pool.is_alive():
            self._worker_pool = FSImageWorkerPool.start(scanprocessor=self.actor_ref)

            self._worker_pool.tell(
                {FSEvents.COMMAND: FSSWorkerPoolCommand.CREATE, 'NUMBER_OF_WORKERS': self.config.file.process_numbers}
            )

        self.hardwareController.turntable.enable_motors()
        for i in range(int(self.config.file.laser.numbers)):
            self.hardwareController.laser.off(0)
            self.hardwareController.laser.off(1)


        self._resolution = int(self.settings.file.resolution)
        self._is_color_scan = bool(self.settings.file.color)

        self._number_of_pictures = int(self.config.file.turntable.steps // self.settings.file.resolution)
        self.current_position = 0
        self._starttime = self.get_time_stamp()


        # TODO: rename prefix to scan_id
        self._prefix = datetime.fromtimestamp(time.time()).strftime('%Y%m%d-%H%M%S')

        # initialize pointcloud actors...
        self.point_clouds = []
        #self.point_clouds = [FSPointCloud(config=self.config, color=self._is_color_scan) for _ in range(self.config.file.laser.numbers)]

        for laser_index in range(self.config.file.laser.numbers):
            self.point_clouds.append(FSPointCloud(config=self.config, color=self._is_color_scan, filename=self._prefix, postfix=laser_index, binary=False))

        if self.config.file.laser.numbers > 1:
            self.both_cloud = FSPointCloud(config=self.config, color=self._is_color_scan, filename=self._prefix, postfix='both', binary=False)

        if not (self.config.file.calibration.laser_planes[0]['normal'] == []) and self.actor_ref.is_alive():
            if self._is_color_scan:
                self._total = (self._number_of_pictures * self.config.file.laser.numbers) + self._number_of_pictures
                self.actor_ref.tell({FSEvents.COMMAND: FSScanProcessorCommand._SCAN_NEXT_TEXTURE_POSITION})
            else:
                self._total = self._number_of_pictures * self.config.file.laser.numbers
                self.actor_ref.tell({FSEvents.COMMAND: FSScanProcessorCommand._SCAN_NEXT_OBJECT_POSITION})
        else:
            self._logger.debug("FabScan is not calibrated scan canceled")

            message = {
                "message": "SCANNER_NOT_CALIBRATED",
                "level": "warn"
            }

            self.eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)

            event = FSEvent()
            event.command = 'STOP'
            self.eventmanager.publish(FSEvents.COMMAND, event)
コード例 #6
0
    def start(self):
        tools = FSSystem()
        tools.delete_folder(self.config.folders.scans + 'calibration')
        self._hardwarecontroller.turntable.enable_motors()
        self._hardwarecontroller.led.on(self.calibration_brightness[0],
                                        self.calibration_brightness[1],
                                        self.calibration_brightness[2])
        #self.settings.camera.contrast = 30
        #self.settings.camera.saturation = 20
        #self.settings.camera.brightness = 50
        self.reset_calibration_values()
        self.settings.threshold = 25
        self._starttime = self.get_time_stamp()

        message = {"message": "START_CALIBRATION", "level": "info"}
        self._eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE,
                                                    message)

        try:

            self._hardwarecontroller.start_camera_stream(mode="calibration")

            self._do_calibration(self._capture_camera_calibration,
                                 self._calculate_camera_calibration)
            self._do_calibration(self._capture_scanner_calibration,
                                 self._calculate_scanner_calibration)

            self._hardwarecontroller.led.off()
            self._hardwarecontroller.turntable.disable_motors()

            if self._stop:
                self._logger.debug("Calibration canceled...")

                # send information to client that calibration is finished
                message = {"message": "STOPPED_CALIBRATION", "level": "info"}
                self._eventmanager.broadcast_client_message(
                    FSEvents.ON_INFO_MESSAGE, message)
                self._hardwarecontroller.stop_camera_stream()

                self._stop = False
            else:

                event = FSEvent()
                event.command = 'CALIBRATION_COMPLETE'
                self._eventmanager.publish(FSEvents.COMMAND, event)

                # send information to client that calibration is finished
                message = {"message": "FINISHED_CALIBRATION", "level": "info"}
                self.config.save()

                self._eventmanager.broadcast_client_message(
                    FSEvents.ON_INFO_MESSAGE, message)
                self._hardwarecontroller.stop_camera_stream()

            self.reset_calibration_values()
            return
        except StandardError as e:
            self._logger.error(e)
コード例 #7
0
    def start_scan(self):
        self.settings_mode_off()
        self._logger.info("Scan started")
        self._stop_scan = False

        if self._worker_pool is None:
            self._worker_pool = FSImageWorkerPool(self.image_task_q,
                                                  self.event_q)

        self.hardwareController.turntable.enable_motors()
        self.hardwareController.start_camera_stream(mode="default")
        time.sleep(1.5)
        self._resolution = int(self.settings.resolution)
        self._laser_positions = int(self.settings.laser_positions)
        self._is_color_scan = bool(self.settings.color)

        self._number_of_pictures = old_div(self.config.turntable.steps,
                                           int(self.settings.resolution))
        self.current_position = 0
        self._starttime = self.get_time_stamp()

        # TODO: rename prefix to scan_id
        self._prefix = datetime.fromtimestamp(
            time.time()).strftime('%Y%m%d-%H%M%S')
        self.point_cloud = FSPointCloud(color=self._is_color_scan)

        if not (self.config.calibration.laser_planes[0]['normal']
                == []) and self.actor_ref.is_alive():
            if self._is_color_scan:
                self._total = self._number_of_pictures * 2 * self.config.laser.numbers
                self.actor_ref.tell({
                    FSEvents.COMMAND:
                    FSScanProcessorCommand._SCAN_NEXT_TEXTURE_POSITION
                })
            else:
                self._total = self._number_of_pictures * self.config.laser.numbers
                self.actor_ref.tell({
                    FSEvents.COMMAND:
                    FSScanProcessorCommand._SCAN_NEXT_OBJECT_POSITION
                })
        else:
            self._logger.debug("FabScan is not calibrated scan canceled")

            message = {"message": "SCANNER_NOT_CALIBRATED", "level": "warn"}

            self.eventmanager.broadcast_client_message(
                FSEvents.ON_INFO_MESSAGE, message)

            event = FSEvent()
            event.command = 'STOP'
            self.eventmanager.publish(FSEvents.COMMAND, event)
コード例 #8
0
    def start(self):
        self._hardwarecontroller.turntable.enable_motors()
        self._hardwarecontroller.led.on(self.calibration_brightness[0], self.calibration_brightness[1], self.calibration_brightness[2])
        self.settings.camera.contrast = 30
        #self.settings.camera.saturation = 20
        self.settings.camera.brightness = 50
        self.reset_calibration_values()
        self.settings.threshold = 25

        message = {
            "message": "START_CALIBRATION",
            "level": "info"
        }
        self._eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)

        self._hardwarecontroller.camera.device.startStream()

        self._do_calibration(self._capture_camera_calibration, self._calculate_camera_calibration)
        self._do_calibration(self._capture_scanner_calibration, self._calculate_scanner_calibration)
        self._hardwarecontroller.led.off()
        self._hardwarecontroller.turntable.disable_motors()

        if self._stop:
            self._logger.debug("Calibration canceled...")
            # send information to client that calibration is finished
            message = {
                "message": "STOPPED_CALIBRATION",
                "level": "info"
            }
            self._eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)
            self._stop = False
        else:

            event = FSEvent()
            event.command = 'CALIBRATION_COMPLETE'
            self._eventmanager.publish(FSEvents.COMMAND, event)

            # send information to client that calibration is finished
            message = {
                "message": "FINISHED_CALIBRATION",
                "level": "info"
            }
            self.config.save()

            self._eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)

        self.current_position = 0
コード例 #9
0
    def init_object_scan(self):
        self._logger.debug("Started object scan initialisation")

        self.current_position = 0

        self._laser_positions = self.settings.laser_positions
        self.hardwareController.led.on(self.settings.led.red,
                                       self.settings.led.green,
                                       self.settings.led.blue)

        self.hardwareController.laser.on()

        self.settings.camera.brightness = self._scan_brightness
        self.settings.camera.contrast = self._scan_contrast
        self.settings.camera.saturation = self._scan_saturation

        # TODO: solve this timing issue!
        # Workaround for Logitech webcam. We have to wait a loooong time until the logitech cam is ready...
        #time.sleep(3)

        self.hardwareController.camera.device.objectExposure()
        self.hardwareController.camera.device.flushStream()
        time.sleep(2)

        self._laser_angle = self.image_processor.calculate_laser_angle(
            self.hardwareController.camera.device.getFrame())

        if self._laser_angle == None:
            event = FSEvent()
            event.command = '_LASER_DETECTION_FAILED'
            self.eventManager.publish(FSEvents.COMMAND, event)
            self.on_laser_detection_failed()
            self._logger.debug("Send laser detection failure event")
        else:
            message = FSUtil.new_message()
            message['type'] = FSEvents.ON_INFO_MESSAGE
            message['data']['message'] = "SCANNING_OBJECT"
            message['data']['level'] = "info"
            self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST, message)

            self._logger.debug("Detected Laser Angle at: %f deg" %
                               (self._laser_angle, ))
            self._worker_pool.create(self.config.process_numbers)
コード例 #10
0
    def scan_complete(self):

        self._worker_pool.tell(
            {FSEvents.COMMAND: FSSWorkerPoolCommand.KILL}
        )

        end_time = self.get_time_stamp()
        duration = int((end_time - self._starttime)//1000)
        self._logger.debug("Time Total: %i sec." % (duration,))

        if len(self.point_clouds) == self.config.file.laser.numbers:

            self._logger.info("Scan complete writing pointcloud.")
            self._logger.debug('Number of PointClouds (for each laser one) : ' +str(len(self.point_clouds)))

            self.finishFiles()

            settings_filename = self.config.file.folders.scans+self._prefix+"/"+self._prefix+".fab"
            self.settings.save_json(settings_filename)


        #if bool(self.config.file.keep_raw_images):
        #    self.utils.zipdir(str(self._prefix))

        self.utils.delete_image_folders(self._prefix)


        self.reset_scanner_state()

        event = FSEvent()
        event.command = 'COMPLETE'
        self.eventmanager.publish(FSEvents.COMMAND, event)

        message = {
            "message": "SCAN_COMPLETE",
            "scan_id": self._prefix,
            "level": "success"
        }


        self.eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE, message)
        self.hardwareController.stop_camera_stream()
コード例 #11
0
    def scan_complete(self):

        end_time = self.get_time_stamp()
        duration = old_div(int(end_time - self._starttime), 1000)
        self._logger.debug("Time Total: %i sec." % (duration, ))

        self._starttime = 0
        self._logger.info(
            "Scan complete writing pointcloud files with %i points." %
            (self.point_cloud.get_size(), ))
        self.point_cloud.saveAsFile(self._prefix)
        settings_filename = self.config.folders.scans + self._prefix + "/" + self._prefix + ".fab"
        self.settings.saveAsFile(settings_filename)

        message = {
            "message": "SAVING_POINT_CLOUD",
            "scan_id": self._prefix,
            "level": "info"
        }

        self.eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE,
                                                   message)

        self.utils.delete_image_folders(self._prefix)

        self.reset_scanner_state()

        event = FSEvent()
        event.command = 'COMPLETE'
        self.eventmanager.publish(FSEvents.COMMAND, event)

        message = {
            "message": "SCAN_COMPLETE",
            "scan_id": self._prefix,
            "level": "success"
        }

        self.eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE,
                                                   message)
        self.hardwareController.stop_camera_stream()
コード例 #12
0
    def init_object_scan(self):
        self._logger.debug("Started object scan initialisation")

        self.current_position = 0

        self._laser_positions = self.settings.laser_positions
        self.hardwareController.led.on(self.settings.led.red,self.settings.led.green,self.settings.led.blue)

        self.hardwareController.laser.on()

        self.settings.camera.brightness = self._scan_brightness
        self.settings.camera.contrast = self._scan_contrast
        self.settings.camera.saturation = self._scan_saturation

        # TODO: solve this timing issue!
        # Workaround for Logitech webcam. We have to wait a loooong time until the logitech cam is ready...
        #time.sleep(3)


        self.hardwareController.camera.device.objectExposure()
        self.hardwareController.camera.device.flushStream()
        time.sleep(2)

        self._laser_angle = self.image_processor.calculate_laser_angle(self.hardwareController.camera.device.getFrame())

        if self._laser_angle == None:
            event = FSEvent()
            event.command = '_LASER_DETECTION_FAILED'
            self.eventManager.publish(FSEvents.COMMAND,event)
            self.on_laser_detection_failed()
            self._logger.debug("Send laser detection failure event")
        else:
            message = FSUtil.new_message()
            message['type'] = FSEvents.ON_INFO_MESSAGE
            message['data']['message'] = "SCANNING_OBJECT"
            message['data']['level'] = "info"
            self.eventManager.publish(FSEvents.ON_SOCKET_BROADCAST,message)

            self._logger.debug("Detected Laser Angle at: %f deg" %(self._laser_angle, ))
            self._worker_pool.create(self.config.process_numbers)
コード例 #13
0
    def start(self):
        #self._hardwarecontroller.stop_camera_stream()
        tools = FSSystem()
        #self._hardwarecontroller.stop_camera_stream()
        tools.delete_folder(self.config.file.folders.scans + 'calibration')
        self._hardwarecontroller.turntable.enable_motors()
        time.sleep(0.2)

        if self.config.file.laser.interleaved == "False":
            self._logger.debug("Turning Leds on in non interleaved mode.")
            self._hardwarecontroller.led.on(self.calibration_brightness[0],
                                            self.calibration_brightness[1],
                                            self.calibration_brightness[2])

        self.reset_calibration_values()
        self.settings.threshold = 25
        self._starttime = self.get_time_stamp()

        message = {"message": "START_CALIBRATION", "level": "info"}
        self._eventmanager.broadcast_client_message(FSEvents.ON_INFO_MESSAGE,
                                                    message)

        try:

            self._hardwarecontroller.start_camera_stream(mode="calibration")

            self._do_calibration(self._capture_camera_calibration,
                                 self._calculate_camera_calibration)
            self._do_calibration(self._capture_scanner_calibration,
                                 self._calculate_scanner_calibration)

            if self.config.file.laser.interleaved == "False":
                self._hardwarecontroller.led.off()

            self._hardwarecontroller.turntable.disable_motors()

            if self._stop:
                self._logger.debug("Calibration canceled...")

                # send information to client that calibration is finished
                message = {"message": "STOPPED_CALIBRATION", "level": "info"}
                self._eventmanager.broadcast_client_message(
                    FSEvents.ON_INFO_MESSAGE, message)
                self._stop = False
            else:

                event = FSEvent()
                event.command = 'CALIBRATION_COMPLETE'
                self._eventmanager.publish(FSEvents.COMMAND, event)

                # send information to client that calibration is finished
                message = {"message": "FINISHED_CALIBRATION", "level": "info"}
                self.config.save_json()

                self._eventmanager.broadcast_client_message(
                    FSEvents.ON_INFO_MESSAGE, message)

            self._hardwarecontroller.stop_camera_stream()

            self._hardwarecontroller.led.off()
            self._hardwarecontroller.turntable.disable_motors()

            self.reset_calibration_values()
            return
        except Exception as e:
            self._logger.exception(e)
            message = {
                "message": "SCANNER_CALIBRATION_FAILED",
                "level": "warn"
            }

            self._eventmanager.broadcast_client_message(
                FSEvents.ON_INFO_MESSAGE, message)