Пример #1
0
class Degasser(MachineVisionManager, ExecuteMixin):
    _period = 0.05
    crop_width = Int(5)
    crop_height = Int(5)

    _test_lumens = Float(100)
    _test_duration = Int(10)
    _test_graph = Instance(StackedGraph)
    _test_image = Instance(TestImage)
    _testing = False

    pid = Instance(PID, ())

    def degas(self, lumens, duration):
        '''
            degas for duration trying to maintain
            lumens
        '''
        if self.laser_manager:

            self.laser_manager.fiber_light.power_off()

        g = self._make_graph(lumens, duration)
        if self._testing:
            self._test_graph = g
        else:
            self.laser_manager.auxilary_graph = g.plotcontainer

        cw, ch = 2 * self.crop_width * self.pxpermm, 2 * self.crop_height * self.pxpermm
#         print cw, ch
        if not cw % 5 == 0:
            cw += cw % 5
        if not ch % 5 == 0:
            ch += ch % 5

        cw, ch = 200, 200
#         im = self.new_image(
# #                             frame=zeros((ch, cw)),
#                             title='Luminosity', view_id='lumens')
        im = TestImage()
        im.setup_images(1, (cw, ch))
        if self._testing:
            self._test_image = im
        else:
            self.view_image(im)

        self._detector = LumenDetector()
        dt = self._period

        pid = self.pid
        st = time.time()
        i = 0
        while 1:
            ct = time.time()
            tt = ct - st
            if not self.isAlive():
                break

            cl = self._get_current_lumens(im, cw, ch)

            err = lumens - cl
            out = pid.get_value(err, dt)
#             err = random.random()
            g.add_data(((tt, out), (tt, err), (tt, cl)))
#             g.redraw()
#             if i % 5 == 0:
            self._set_power(out, i)

            if tt > duration:
                break
            et = time.time() - ct
            time.sleep(max(0, dt - et))

            i += 1
            if i > 1e6:
                i = 0

        if self.laser_manager:
            self.laser_manager.fiber_light.power_on()

        self.executing = False

    def _set_power(self, pwr, cnt):
        if self.laser_manager:
            self.laser_manager.set_laser_power(pwr, verbose=cnt == 0)

    def _get_current_lumens(self, im, cw, ch):
        src = self.new_image_frame()
        if src:
            src = self._crop_image(src, cw, ch)
        else:
            src = random.random((ch, cw)) * 255
            src = src.astype('uint8')
#         return random.random()
        src, v = self._detector.get_value(src)
        im.set_image(src)
        return v

    def _make_graph(self, lumens, duration):
        g = StackedGraph(container_dict=dict(stack_order='top_to_bottom'))
        g.new_plot(
                   ytitle='Output (W)'
                   )
        g.new_series()
        g.new_plot(
                   ytitle='Residual'
                   )
        g.new_series(plotid=1)
        g.new_plot(
                   ytitle='Lumens',
                   xtitle='time (s)')
        g.new_series(plotid=2)

        g.add_horizontal_rule(lumens, plotid=2)
        g.set_x_limits(0, duration * 1.1)
        return g

    def _do_execute(self):

        self.debug('starting test degas {} {}'.format(self._test_lumens, self._test_duration))
        self._testing = True
        self.degas(self._test_lumens, self._test_duration)

    def traits_view(self):
        v = View(
                 UItem('execute', editor=ButtonEditor(label_value='execute_label')),
                 HGroup(Item('_test_lumens'), Item('_test_duration')),
                 UItem('pid', style='custom'),
                 HGroup(UItem('_test_graph',
                              height=400,
                              style='custom'),
                        UItem('_test_image', style='custom')
                        ),

                 resizable=True
                 )
        return v
Пример #2
0
class Degasser(MachineVisionManager, ExecuteMixin):
    _period = 0.05
    crop_width = Int(5)
    crop_height = Int(5)

    _test_lumens = Float(100)
    _test_duration = Int(10)
    _test_graph = Instance(StackedGraph)
    _test_image = Instance(TestImage)
    _testing = False

    pid = Instance(PID, ())

    def degas(self, lumens, duration):
        '''
            degas for duration trying to maintain
            lumens
        '''
        if self.laser_manager:

            self.laser_manager.fiber_light.power_off()

        g = self._make_graph(lumens, duration)
        if self._testing:
            self._test_graph = g
        else:
            self.laser_manager.auxilary_graph = g.plotcontainer

        cw, ch = 2 * self.crop_width * self.pxpermm, 2 * self.crop_height * self.pxpermm
        #         print cw, ch
        if not cw % 5 == 0:
            cw += cw % 5
        if not ch % 5 == 0:
            ch += ch % 5

        cw, ch = 200, 200
        #         im = self.new_image(
        # #                             frame=zeros((ch, cw)),
        #                             title='Luminosity', view_id='lumens')
        im = TestImage()
        im.setup_images(1, (cw, ch))
        if self._testing:
            self._test_image = im
        else:
            self.view_image(im)

        self._detector = LumenDetector()
        dt = self._period

        pid = self.pid
        st = time.time()
        i = 0
        while 1:
            ct = time.time()
            tt = ct - st
            if not self.isAlive():
                break

            cl = self._get_current_lumens(im, cw, ch)

            err = lumens - cl
            out = pid.get_value(err, dt)
            #             err = random.random()
            g.add_data(((tt, out), (tt, err), (tt, cl)))
            #             g.redraw()
            #             if i % 5 == 0:
            self._set_power(out, i)

            if tt > duration:
                break
            et = time.time() - ct
            time.sleep(max(0, dt - et))

            i += 1
            if i > 1e6:
                i = 0

        if self.laser_manager:
            self.laser_manager.fiber_light.power_on()

        self.executing = False

    def _set_power(self, pwr, cnt):
        if self.laser_manager:
            self.laser_manager.set_laser_power(pwr, verbose=cnt == 0)

    def _get_current_lumens(self, im, cw, ch):
        src = self.new_image_frame()
        if src:
            src = self._crop_image(src, cw, ch)
        else:
            src = random.random((ch, cw)) * 255
            src = src.astype('uint8')


#         return random.random()
        src, v = self._detector.get_value(src)
        im.set_image(src)
        return v

    def _make_graph(self, lumens, duration):
        g = StackedGraph(container_dict=dict(stack_order='top_to_bottom'))
        g.new_plot(ytitle='Output (W)')
        g.new_series()
        g.new_plot(ytitle='Residual')
        g.new_series(plotid=1)
        g.new_plot(ytitle='Lumens', xtitle='time (s)')
        g.new_series(plotid=2)

        g.add_horizontal_rule(lumens, plotid=2)
        g.set_x_limits(0, duration * 1.1)
        return g

    def _do_execute(self):

        self.debug('starting test degas {} {}'.format(self._test_lumens,
                                                      self._test_duration))
        self._testing = True
        self.degas(self._test_lumens, self._test_duration)

    def traits_view(self):
        v = View(UItem('execute',
                       editor=ButtonEditor(label_value='execute_label')),
                 HGroup(Item('_test_lumens'), Item('_test_duration')),
                 UItem('pid', style='custom'),
                 HGroup(UItem('_test_graph', height=400, style='custom'),
                        UItem('_test_image', style='custom')),
                 resizable=True)
        return v
Пример #3
0
class Degasser(MachineVisionManager, ExecuteMixin):
    _period = 0.05
    crop_width = Int(5)
    crop_height = Int(5)

    _test_lumens = Float(100)
    _test_duration = Int(10)
    _test_graph = Instance(StackedGraph)
    _test_image = Instance(MVImage)
    _testing = False

    pid = Instance(PID, ())
    _detector = Instance(LumenDetector)

    def degas(self, lumens, duration):
        """
            degas for duration trying to maintain
            lumens
        """
        if self.laser_manager:
            self.laser_manager.fiber_light.power_off()

        g = self._make_graph(lumens, duration)
        if self._testing:
            self._test_graph = g
        else:
            self.laser_manager.auxilary_graph = g.plotcontainer

        cw, ch = 2 * self.crop_width * self.pxpermm, 2 * self.crop_height * self.pxpermm

        # if not cw % 5 == 0:
        #     cw += cw % 5
        # if not ch % 5 == 0:
        #     ch += ch % 5
        #
        # cw, ch = 200, 200

        im = MVImage()
        im.setup_images(1, (cw, ch))
        if self._testing:
            self._test_image = im
        else:
            self.view_image(im)

        self._detector = LumenDetector()
        dt = self._period

        pid = self.pid
        st = time.time()
        i = 0
        while 1:
            ct = time.time()
            tt = ct - st
            if not self.isAlive():
                break

            cl = self._get_current_lumens(im, cw, ch)

            err = lumens - cl
            out = pid.get_value(err, dt)
            g.add_data(((tt, out), (tt, err), (tt, cl)))

            self._set_power(out, i)

            if tt > duration:
                break
            et = time.time() - ct
            time.sleep(max(0, dt - et))

            i += 1
            if i > 1e6:
                i = 0

        if self.laser_manager:
            self.laser_manager.fiber_light.power_on()

        self.executing = False

    def _set_power(self, pwr, cnt):
        if self.laser_manager:
            self.laser_manager.set_laser_power(pwr, verbose=cnt == 0)

    def _get_current_lumens(self, im, cw, ch):
        src = self.new_image_frame()
        if src:
            src = self._crop_image(src, cw, ch)
        else:
            src = random.random((ch, cw)) * 255
            src = src.astype("uint8")
        src, v = self._detector.get_value(src)
        im.set_image(src)
        return v

    def _make_graph(self, lumens, duration):
        g = StackedGraph(container_dict=dict(stack_order="top_to_bottom"))
        g.new_plot(ytitle="Output (W)")
        g.new_series()
        g.new_plot(ytitle="Residual")
        g.new_series(plotid=1)
        g.new_plot(ytitle="Lumens", xtitle="time (s)")
        g.new_series(plotid=2)

        g.add_horizontal_rule(lumens, plotid=2)
        g.set_x_limits(0, duration * 1.1)
        return g

    def _do_execute(self):

        self.debug("starting test degas {} {}".format(self._test_lumens, self._test_duration))
        self._testing = True
        self.degas(self._test_lumens, self._test_duration)

    def traits_view(self):
        v = View(
            UItem("execute", editor=ButtonEditor(label_value="execute_label")),
            HGroup(Item("_test_lumens"), Item("_test_duration")),
            UItem("pid", style="custom"),
            HGroup(UItem("_test_graph", height=400, style="custom"), UItem("_test_image", style="custom")),
            resizable=True,
        )
        return v