コード例 #1
0
    def __init__(self, node):
        super(DetectCenterState, self).__init__(node)

        self._x = 0
        self._y = 0
        self._z = 0

        self._centered = False

        self.bt = BlockTracker()
コード例 #2
0
    def __init__(self, node):
        super(DetectEstimateState, self).__init__(node)

        self.bt = BlockTracker()

        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = None
コード例 #3
0
class DetectEstimateState(State):
    def __init__(self, node):
        super(DetectEstimateState, self).__init__(node)

        self.bt = BlockTracker()

        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = None

    ############################################################################

    def enter(self):
        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = RobotStateMachine.calibrate.table_z + \
            (RobotStateMachine.calibrate.block_height * 2)

        self._node.ik.set_right(0.5, 0.0, self._z, wait=True)
        self._ready = True

    def next(self):
        if not self._block_centered:
            return self
        else:
            return RobotStateMachine.detect_center

    ############################################################################

    def on_right_image_received(self, img):
        if self._got_image or not self._ready:
            return

        self.bt.on_image_received(img)
        self._got_image = True

        if not self.bt.display_img is None:
            self._node.display_image(self.bt.display_img)

        self._block = random.choice(self.bt.blocks)
        self._block_pos = RobotStateMachine.calibrate.calc_pos(
            self._block.rel_pos[0], self._block.rel_pos[1])

        self._node.ik.set_right(self._block_pos[0],
                                self._block_pos[1],
                                self._z,
                                wait=True)
        self._block_centered = True
コード例 #4
0
ファイル: block_stacker.py プロジェクト: Knifa/Glasgow-Baxter
class DetectEstimateState(State):
    def __init__(self, node):
        super(DetectEstimateState, self).__init__(node)

        self.bt = BlockTracker()

        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = None

    ############################################################################

    def enter(self):
        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = RobotStateMachine.calibrate.table_z + \
            (RobotStateMachine.calibrate.block_height * 2)

        self._node.ik.set_right(0.5, 0.0, self._z, wait=True)
        self._ready = True

    def next(self):
        if not self._block_centered:
            return self
        else:
            return RobotStateMachine.detect_center

    ############################################################################

    def on_right_image_received(self, img):
        if self._got_image or not self._ready:
            return

        self.bt.on_image_received(img)
        self._got_image = True

        if not self.bt.display_img is None:
            self._node.display_image(self.bt.display_img)

        self._block = random.choice(self.bt.blocks)
        self._block_pos = RobotStateMachine.calibrate.calc_pos(
            self._block.rel_pos[0], self._block.rel_pos[1])

        self._node.ik.set_right(self._block_pos[0], self._block_pos[1], self._z, wait=True)
        self._block_centered = True
コード例 #5
0
ファイル: block_stacker.py プロジェクト: Knifa/Glasgow-Baxter
    def __init__(self, node):
        super(DetectCenterState, self).__init__(node)

        self._x = 0
        self._y = 0
        self._z = 0

        self._centered = False

        self.bt = BlockTracker()
コード例 #6
0
ファイル: block_stacker.py プロジェクト: Knifa/Glasgow-Baxter
    def __init__(self, node):
        super(DetectEstimateState, self).__init__(node)

        self.bt = BlockTracker()

        self._ready = False
        self._block_centered = False
        self._got_image = False

        self._z = None
コード例 #7
0
    def __init__(self, node):
        super(CalibratePositionEstimationState, self).__init__(node)

        self.bt = BlockTracker()

        self._x = 0.5
        self._y = 0
        self._z = 0

        self._target_keys = self._TARGETS.keys()
        self._target = self._target_keys[0]  
        self._target_pos = dict([(x, None) for x in self._target_keys])

        self._target_pos_calibrated = False
        self._target_pos_computed = False

        self.x_dif = None
        self.y_dif = None        
コード例 #8
0
ファイル: block_stacker.py プロジェクト: Knifa/Glasgow-Baxter
class DetectCenterState(State):
    _MOVE_RATE = (1.0 / BlockStackerNode.RATE) * 0.1
    _THRESHOLD = 0.05

    ############################################################################

    def __init__(self, node):
        super(DetectCenterState, self).__init__(node)

        self._x = 0
        self._y = 0
        self._z = 0

        self._centered = False

        self.bt = BlockTracker()

    ############################################################################

    def enter(self):
        self._centered = False

        self._x = RobotStateMachine.detect_estimate._block_pos[0]
        self._y = RobotStateMachine.detect_estimate._block_pos[1]
        self._z = RobotStateMachine.calibrate.table_z + \
            (RobotStateMachine.calibrate.block_height * 2)

    def run_step(self):
        if not self._centered:
            self._do_centering()

    def next(self):
        if not self._centered:
            return self
        else:
            return RobotStateMachine.pick

    ############################################################################

    def _do_centering(self):
        if not len(self.bt.blocks) > 0:
            return

        target = (0.1, -0.5)
        b = self.bt.blocks[0]
        dif = (target[0] - b.rel_pos[0], target[1] - b.rel_pos[1])
        
        if abs(dif[0]) > self._THRESHOLD or abs(dif[1]) > self._THRESHOLD:
            if abs(dif[0]) > self._THRESHOLD:
                self._x += math.copysign(self._MOVE_RATE, -dif[0]) * np.clip(abs(dif[0]), 0.1, 1.0)
            if abs(dif[1]) > self._THRESHOLD:
                self._y += math.copysign(self._MOVE_RATE, dif[1]) * np.clip(abs(dif[1]), 0.1, 1.0)
        else:
            self._centered = True

        self._node.ik.set_right(self._x, self._y, self._z)

    ############################################################################

    def on_right_image_received(self, img):
        self.bt.on_image_received(img)

        if not self.bt.display_img is None:
            self._node.display_image(self.bt.display_img) 
コード例 #9
0
class CalibratePositionEstimationState(State):
    _MOVE_RATE = (1.0 / BlockStackerCalibrateNode.RATE) * 0.1
    _THRESHOLD = 0.05

    _TARGET_DISTANCE = 0.5
    _TARGETS = {
        'center': (0, 0),
        'left': (-_TARGET_DISTANCE, 0),
        'right': (_TARGET_DISTANCE, 0),
        'up': (0, -_TARGET_DISTANCE),
        'down': (0, _TARGET_DISTANCE),
    }

    ############################################################################

    def __init__(self, node):
        super(CalibratePositionEstimationState, self).__init__(node)

        self.bt = BlockTracker()

        self._x = 0.5
        self._y = 0
        self._z = 0

        self._target_keys = self._TARGETS.keys()
        self._target = self._target_keys[0]  
        self._target_pos = dict([(x, None) for x in self._target_keys])

        self._target_pos_calibrated = False
        self._target_pos_computed = False

        self.x_dif = None
        self.y_dif = None        

    ############################################################################

    def enter(self):
        self._z = RobotStateMachine.calibrate_table_height.table_z + \
            (RobotStateMachine.calibrate_block_height.block_height * 2)

        print('estimating screen/arm positions...')

    def run_step(self):
        if not self._target_pos_calibrated:
            self._do_target_pos_calibration()
        elif not self._target_pos_computed:
            self._do_target_pos_computation()

    def next(self):
        if not self._target_pos_calibrated:
            return self
        elif not self._target_pos_computed:
        	return self
        else:
            return RobotStateMachine.output_yaml

    ############################################################################

    def _do_target_pos_calibration(self):
        if not len(self.bt.blocks) > 0:
            return

        target = self._TARGETS[self._target]
        b = self.bt.blocks[0]
        dif = (target[0] - b.rel_pos[0], target[1] - b.rel_pos[1])
        
        if abs(dif[0]) > self._THRESHOLD or abs(dif[1]) > self._THRESHOLD:
            if abs(dif[0]) > self._THRESHOLD:
                self._x += math.copysign(self._MOVE_RATE, -dif[0]) * np.clip(abs(dif[0]), 0.1, 1.0)
            if abs(dif[1]) > self._THRESHOLD:
                self._y += math.copysign(self._MOVE_RATE, dif[1]) * np.clip(abs(dif[1]), 0.1, 1.0)
        else:
            self._target_pos[self._target] = [self._x, self._y]

            i = self._target_keys.index(self._target) + 1
            if not i >= len(self._target_keys):
                self._target = self._target_keys[i]
            else:
                self._target_pos_calibrated = True
                print('got all positions')

        self._node.ik.set_right(self._x, self._y, self._z)

    def _do_target_pos_computation(self):
    	print('combobulating...')

        l_dif = abs(self._target_pos['left'][0] - self._target_pos['center'][0])
        r_dif = abs(self._target_pos['right'][0] - self._target_pos['center'][0])
        u_dif = abs(self._target_pos['up'][1] - self._target_pos['center'][1])
        d_dif = abs(self._target_pos['down'][1] - self._target_pos['center'][1])

        self.x_dif = (l_dif + r_dif) / 2 / self._TARGET_DISTANCE
        self.y_dif = (u_dif + d_dif) / 2 / self._TARGET_DISTANCE

        self._target_pos_computed = True

    ############################################################################

    def on_right_image_received(self, img):
        self.bt.on_image_received(img)

        if not self.bt.display_img is None:
            self._node.display_image(self.bt.display_img) 
コード例 #10
0
class DetectCenterState(State):
    _MOVE_RATE = (1.0 / BlockStackerNode.RATE) * 0.1
    _THRESHOLD = 0.05

    ############################################################################

    def __init__(self, node):
        super(DetectCenterState, self).__init__(node)

        self._x = 0
        self._y = 0
        self._z = 0

        self._centered = False

        self.bt = BlockTracker()

    ############################################################################

    def enter(self):
        self._centered = False

        self._x = RobotStateMachine.detect_estimate._block_pos[0]
        self._y = RobotStateMachine.detect_estimate._block_pos[1]
        self._z = RobotStateMachine.calibrate.table_z + \
            (RobotStateMachine.calibrate.block_height * 2)

    def run_step(self):
        if not self._centered:
            self._do_centering()

    def next(self):
        if not self._centered:
            return self
        else:
            return RobotStateMachine.pick

    ############################################################################

    def _do_centering(self):
        if not len(self.bt.blocks) > 0:
            return

        target = (0.1, -0.5)
        b = self.bt.blocks[0]
        dif = (target[0] - b.rel_pos[0], target[1] - b.rel_pos[1])

        if abs(dif[0]) > self._THRESHOLD or abs(dif[1]) > self._THRESHOLD:
            if abs(dif[0]) > self._THRESHOLD:
                self._x += math.copysign(self._MOVE_RATE, -dif[0]) * np.clip(
                    abs(dif[0]), 0.1, 1.0)
            if abs(dif[1]) > self._THRESHOLD:
                self._y += math.copysign(self._MOVE_RATE, dif[1]) * np.clip(
                    abs(dif[1]), 0.1, 1.0)
        else:
            self._centered = True

        self._node.ik.set_right(self._x, self._y, self._z)

    ############################################################################

    def on_right_image_received(self, img):
        self.bt.on_image_received(img)

        if not self.bt.display_img is None:
            self._node.display_image(self.bt.display_img)