Esempio n. 1
0
 def create_dropdown(self, options, selection):
     try:
         index = options.index(selection)
     except ValueError:
         rospy.loginfo('Selection %s not found in options %s.', str(selection), str(options))
         index = -1
     dropdown = QComboBox()
     for option in options:
         dropdown.addItem(option)
     dropdown.setCurrentIndex(index)
     return dropdown
Esempio n. 2
0
    def add_combobox(self, name, options, current, title="", on_change=None):
        if title:
            self.add_label(title)

        combo = QComboBox()
        combo.setObjectName(name)

        for op in options:
            combo.addItem(op)

        cur_ind = 0
        if current in options:
            cur_ind = options.index(current)
        combo.setCurrentIndex(cur_ind)

        if on_change is not None:
            combo.activated.connect(on_change)

        self.group_area.layout().addWidget(combo)
Esempio n. 3
0
class RqtHandeyeCalibration(Plugin):
    def __init__(self, context):
        super(RqtHandeyeCalibration, self).__init__(context)
        # Give QObjects reasonable names
        self.setObjectName('HandeyeCalibration')

        # Process standalone plugin command-line arguments
        from argparse import ArgumentParser
        parser = ArgumentParser()
        # Add argument(s) to the parser.
        parser.add_argument("-q",
                            "--quiet",
                            action="store_true",
                            dest="quiet",
                            help="Put plugin in silent mode")
        args, unknowns = parser.parse_known_args(context.argv())
        if not args.quiet:
            print('arguments: ', args)
            print('unknowns: ', unknowns)

        # Create QWidgets
        self._widget = QWidget()
        self._infoWidget = QWidget()
        # Get path to UI file which should be in the "resource" folder of this package
        ui_file = os.path.join(rospkg.RosPack().get_path('rqt_easy_handeye'),
                               'resource', 'rqt_handeye.ui')
        ui_info_file = os.path.join(
            rospkg.RosPack().get_path('rqt_easy_handeye'), 'resource',
            'rqt_handeye_info.ui')
        # Extend the widget with all attributes and children from UI file
        loadUi(ui_file, self._widget)
        loadUi(ui_info_file, self._infoWidget)
        self._widget.horizontalLayout_infoAndActions.insertWidget(
            0, self._infoWidget)

        self._calibration_algorithm_combobox = QComboBox()
        self._calibration_algorithm_layout = QHBoxLayout()
        self._calibration_algorithm_layout.insertWidget(
            0, QLabel('Calibration algorithm: '))
        self._calibration_algorithm_layout.insertWidget(
            1, self._calibration_algorithm_combobox)
        self._infoWidget.layout().insertLayout(
            -1, self._calibration_algorithm_layout)

        # Give QObjects reasonable names
        self._widget.setObjectName('RqtHandeyeCalibrationUI')
        # Show _widget.windowTitle on left-top of each plugin (when
        # it's set in _widget). This is useful when you open multiple
        # plugins at once. Also if you open multiple instances of your
        # plugin at once, these lines add number to make it easy to
        # tell from pane to pane.
        if context.serial_number() > 1:
            self._widget.setWindowTitle(self._widget.windowTitle() +
                                        (' (%d)' % context.serial_number()))
        # Add widget to the user interface
        context.add_widget(self._widget)

        self.client = HandeyeClient()

        resp = self.client.list_algorithms()
        for i, a in enumerate(resp.algorithms):
            self._calibration_algorithm_combobox.insertItem(i, a)
        index_of_curr_alg = resp.algorithms.index(resp.current_algorithm)
        self._calibration_algorithm_combobox.setCurrentIndex(index_of_curr_alg)
        self._calibration_algorithm_combobox.currentTextChanged.connect(
            self.client.set_algorithm)

        self._infoWidget.calibNameLineEdit.setText(rospy.get_namespace())
        self._infoWidget.trackingBaseFrameLineEdit.setText(
            self.client.parameters.tracking_base_frame)
        self._infoWidget.trackingMarkerFrameLineEdit.setText(
            self.client.parameters.tracking_marker_frame)
        self._infoWidget.robotBaseFrameLineEdit.setText(
            self.client.parameters.robot_base_frame)
        self._infoWidget.robotEffectorFrameLineEdit.setText(
            self.client.parameters.robot_effector_frame)
        if self.client.parameters.eye_on_hand:
            self._infoWidget.calibTypeLineEdit.setText("eye on hand")
        else:
            self._infoWidget.calibTypeLineEdit.setText("eye on base")

        self._widget.takeButton.clicked[bool].connect(self.handle_take_sample)
        self._widget.removeButton.clicked[bool].connect(
            self.handle_remove_sample)
        self._widget.computeButton.clicked[bool].connect(
            self.handle_compute_calibration)
        self._widget.saveButton.clicked[bool].connect(
            self.handle_save_calibration)

        self._widget.removeButton.setEnabled(False)
        self._widget.computeButton.setEnabled(False)
        self._widget.saveButton.setEnabled(False)

    def shutdown_plugin(self):
        # TODO unregister all publishers here
        pass

    def save_settings(self, plugin_settings, instance_settings):
        # TODO save intrinsic configuration, usually using:
        # instance_settings.set_value(k, v)
        pass

    def restore_settings(self, plugin_settings, instance_settings):
        # TODO restore intrinsic configuration, usually using:
        # v = instance_settings.value(k)
        pass

        # def trigger_configuration(self):
        # Comment in to signal that the plugin has a way to configure
        # This will enable a setting button (gear icon) in each dock widget title bar
        # Usually used to open a modal configuration dialog

    def _display_sample_list(self, sample_list):
        self._widget.sampleListWidget.clear()

        for i in range(len(sample_list.hand_world_samples)):
            formatted_robot_sample = format_sample(
                sample_list.hand_world_samples[i])
            formatted_tracking_sample = format_sample(
                sample_list.camera_marker_samples[i])
            self._widget.sampleListWidget.addItem(
                '{}) \n hand->world \n {} \n camera->marker\n {}\n'.format(
                    i + 1, formatted_robot_sample, formatted_tracking_sample))
        self._widget.sampleListWidget.setCurrentRow(
            len(sample_list.hand_world_samples) - 1)
        self._widget.removeButton.setEnabled(
            len(sample_list.hand_world_samples) > 0)

    def handle_take_sample(self):
        sample_list = self.client.take_sample()
        self._display_sample_list(sample_list)
        self._widget.computeButton.setEnabled(
            len(sample_list.hand_world_samples) > 1)
        self._widget.saveButton.setEnabled(False)

    def handle_remove_sample(self):
        index = self._widget.sampleListWidget.currentRow()
        sample_list = self.client.remove_sample(index)
        self._display_sample_list(sample_list)
        self._widget.computeButton.setEnabled(
            len(sample_list.hand_world_samples) > 1)
        self._widget.saveButton.setEnabled(False)

    def handle_compute_calibration(self):
        result = self.client.compute_calibration()
        self._widget.computeButton.setEnabled(False)
        if result.valid:
            self._widget.outputBox.setPlainText(
                str(result.calibration.transform.transform))
            self._widget.saveButton.setEnabled(True)
        else:
            self._widget.outputBox.setPlainText(
                'The calibration could not be computed')
            self._widget.saveButton.setEnabled(False)

    def handle_save_calibration(self):
        self.client.save()
        self._widget.saveButton.setEnabled(False)