diff --git a/qt/configuration_window/main.cpp b/qt/configuration_window/main.cpp new file mode 100644 index 0000000..d49f7d9 --- /dev/null +++ b/qt/configuration_window/main.cpp @@ -0,0 +1,12 @@ +#include "mainwindow.h" + +#include + +int main(int argc, char *argv[]) +{ + QApplication a(argc, argv); + MainWindow w; + //w.resize(1200,1200); + w.show(); + return a.exec(); +} diff --git a/qt/configuration_window/mainwindow.cpp b/qt/configuration_window/mainwindow.cpp new file mode 100644 index 0000000..d126298 --- /dev/null +++ b/qt/configuration_window/mainwindow.cpp @@ -0,0 +1,590 @@ +#include "mainwindow.h" +#include "./ui_mainwindow.h" +#include +#include + +MainWindow::MainWindow(QWidget *parent) + : QMainWindow(parent) + , ui(new Ui::MainWindow) +{ + ui->setupUi(this); + timerId = startTimer(50); + + ui->statusbar->addPermanentWidget(ui->label_author); + ui->label_author->setText("Juan Jose Quiroz Omana"); + ui->statusbar->showMessage("Welcome to JuankaEmika", 5000); + ui->lineEdit_robotIp->setText("172.16.0.2"); + + reference_joint_x_ + = {ui->reference_joint_1, ui->reference_joint_2, ui->reference_joint_3, + ui->reference_joint_4, ui->reference_joint_5, ui->reference_joint_6, + ui->reference_joint_7}; + + label_ref_joint_x_ + ={ui->label_ref_joint_1, ui->label_ref_joint_2, ui->label_ref_joint_3, + ui->label_ref_joint_4, ui->label_ref_joint_5, ui->label_ref_joint_6, + ui->label_ref_joint_7}; + + spin_box_read_joint_x_ + = {ui->doubleSpinBox_q_1, ui->doubleSpinBox_q_2, ui->doubleSpinBox_q_3, + ui->doubleSpinBox_q_4, ui->doubleSpinBox_q_5, ui->doubleSpinBox_q_6, + ui->doubleSpinBox_q_7}; + + spin_box_read_deg_joint_x_ + = {ui->doubleSpinBox_deg_q_1, ui->doubleSpinBox_deg_q_2, ui->doubleSpinBox_deg_q_3, + ui->doubleSpinBox_deg_q_4, ui->doubleSpinBox_deg_q_5, ui->doubleSpinBox_deg_q_6, + ui->doubleSpinBox_deg_q_7}; + + spin_box_read_deg_joint_vel_x_ + ={ui->doubleSpinBox_q_dot_1, ui->doubleSpinBox_q_dot_2, ui->doubleSpinBox_q_dot_3, + ui->doubleSpinBox_q_dot_4, ui->doubleSpinBox_q_dot_5, ui->doubleSpinBox_q_dot_6, + ui->doubleSpinBox_q_dot_7,}; + + enable_reference_sliders(false); + ui->pushButton_robotHoming->setEnabled(false); + ui->pushButton_handHoming->setEnabled(false); + ui->pushButton_default_ref->setEnabled(false); + ui->pushButton_joint_commands->setEnabled(false); + ui->pushButton_move_hand->setEnabled(false); + + ui->horizontalSlider_gripper->setEnabled(false); + ui->horizontalSlider_gripper->setRange(0, 800); + ui->horizontalSlider_gripper->setSliderPosition(500); + + ui->checkBox_handGripper->setCheckState(Qt::Checked); + ui->checkBox_handGripper->setEnabled(false); + //ui->checkBox_robotHoming->setEnabled(false); + //ui->checkBox_homingGripper->setEnabled(false); + //ui->checkBox_joint_commands->setEnabled(false); + //ui->checkBox_move_hand->setEnabled(false); + enable_check_boxes(false); + + ui->pushButton_led->setEnabled(false); + + ui->pushButton_initialize->setEnabled(false); + ui->pushButton_deinitialize->setEnabled(false); + ui->pushButton_disconnect->setEnabled(false); + + set_push_button_color(ui->pushButton_connect, green_color_); + set_push_button_color(ui->pushButton_initialize, gray_color_); + set_push_button_color(ui->pushButton_deinitialize, gray_color_); + set_push_button_color(ui->pushButton_disconnect, gray_color_); + + set_reference_sliders(q_rest_configuration_); + set_push_button_color(ui->pushButton_joint_commands, gray_color_); + set_push_button_color(ui->pushButton_default_ref, gray_color_); + set_push_button_color(ui->pushButton_handHoming, gray_color_); + set_push_button_color(ui->pushButton_move_hand, gray_color_); + set_push_button_color(ui->pushButton_robotHoming, gray_color_); + std::cout<<"---------------------------------------------------------------"<checkBox_robotHoming->setEnabled(state); + ui->checkBox_homingGripper->setEnabled(state); + ui->checkBox_joint_commands->setEnabled(state); + ui->checkBox_move_hand->setEnabled(state); +} + +void MainWindow::update_status_bar(const std::string &message) +{ + ui->statusbar->showMessage(QString::fromStdString(message), 5000); +} + +void MainWindow::set_reference_sliders(const VectorXd& q_initial) +{ + + + /* + connect(ui->reference_joint_1, SIGNAL(valueChanged(int)), + ui->label_ref_joint_1, SLOT(setValue(int))); + + */ + Eigen::VectorXd q_max_ = + (Eigen::VectorXd(7)<< 130, 85, 140, -25, 140, 240, 150).finished(); + Eigen::VectorXd q_min_ = + (Eigen::VectorXd(7)<<-130,-85, -140, -150, -140, 48, -150).finished(); + + + int i=0; + for (auto& elem : reference_joint_x_) + { + elem->setRange(q_min_[i], q_max_[i]); + elem->setSliderPosition((180/M_PI)*q_initial[i]); + label_ref_joint_x_[i]->setText(QString::number((180/M_PI)*q_initial[i])); + i++; + } + +} + +void MainWindow::enable_reference_sliders(const bool& status) +{ + ui->pushButton_joint_commands->setDisabled(status); + for (auto& elem : reference_joint_x_) + { + elem->setEnabled(status); + } +} + +void MainWindow::set_push_button_color(QPushButton *push_button, const QColor &color) +{ + push_button->setStyleSheet(QString("background-color: %1").arg(color.name())); +} + + + + + +void MainWindow::on_pushButton_connect_clicked() +{ + QString robotIp = ui->lineEdit_robotIp->text(); + std::string robotIp_std = robotIp.toStdString(); + + //QMessageBox::about(this,"title", "This will move the robot!"); + //QMessageBox::critical(this, "Title", "Hey hey"); + auto mode_txt = ui->comboBox->currentText().toStdString(); + RobotInterfaceFranka::MODE MODE; + if (mode_txt== std::string("None")) + { + MODE = RobotInterfaceFranka::MODE::None; + }else if (mode_txt== std::string("PositionControl")) + { + MODE = RobotInterfaceFranka::MODE::PositionControl; + }else if (mode_txt== std::string("VelocityControl")) + { + MODE = RobotInterfaceFranka::MODE::VelocityControl; + } + else + { + std::runtime_error(std::string("Wrong mode. ")); + } + + + //qDebug()<<"Robot pointer: "<< !!robot_driver_franka_sptr_; + if (!robot_driver_franka_sptr_) + { + //qDebug()<<"Create Pointer "; + robot_driver_franka_sptr_ = std::make_shared(robotIp_std, + MODE, + RobotInterfaceFranka::HAND::ON); + + } + + robot_driver_franka_sptr_->connect(); + q_rest_configuration_ = robot_driver_franka_sptr_->get_home_robot_configuration(); + set_reference_sliders(robot_driver_franka_sptr_->get_joint_positions()); + connect_flag_ = true; + initialize_flag_ = false; + deinitialize_flag_ = false; + disconnect_flag_ = false; + + enable_push_button(ui->pushButton_connect, false); + enable_push_button(ui->pushButton_initialize, true); + enable_push_button(ui->pushButton_disconnect, true); + + auto max_width = robot_driver_franka_sptr_->read_gripper(RobotInterfaceFranka::MAX_WIDTH); + ui->horizontalSlider_gripper->setRange(100, int(max_width*10000)-100); + auto width = robot_driver_franka_sptr_->read_gripper(RobotInterfaceFranka::WIDTH); + ui->doubleSpinBox_hand->setValue(width); + + //qDebug()<<"Hola: "<< mode_txt ; +} + +void MainWindow::on_pushButton_initialize_clicked() +{ + QMessageBox::warning(this, "Warning", "Initialize can move the robot. " + "Please make sure to have the user stop button at hand! " + "Use at your own risk"); + + enable_push_button(ui->pushButton_initialize, false); + enable_push_button(ui->pushButton_deinitialize, true); + enable_push_button(ui->pushButton_disconnect, false); + initialize_flag_ = true; + robot_driver_franka_sptr_->initialize(); + enable_check_boxes(true); + +} + +void MainWindow::on_pushButton_deinitialize_clicked() +{ + enable_push_button(ui->pushButton_deinitialize, false); + enable_push_button(ui->pushButton_disconnect, true); + + initialize_flag_ = false; + deinitialize_flag_ = true; + enable_check_boxes(false); + robot_driver_franka_sptr_->deinitialize(); + + ui->checkBox_homingGripper->setCheckState(Qt::Unchecked); + ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Unchecked); + ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); +} + + +void MainWindow::on_pushButton_disconnect_clicked() +{ + enable_push_button(ui->pushButton_disconnect, false); + enable_push_button(ui->pushButton_initialize, false); + enable_push_button(ui->pushButton_deinitialize, false); + enable_push_button(ui->pushButton_connect, true); + update_status_bar(robot_driver_franka_sptr_->get_status_message()); + ui->comboBox->setEnabled(false); + connect_flag_ = false; + initialize_flag_ = false; + deinitialize_flag_ = false; + disconnect_flag_ = false; + robot_driver_franka_sptr_->disconnect(); + + ui->checkBox_homingGripper->setCheckState(Qt::Unchecked); + ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Checked); + ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); + + +} + + + +void MainWindow::timerEvent(QTimerEvent *event) +{ + //qDebug() << "Update... "<get_joint_positions(); + auto q_dot = robot_driver_franka_sptr_->get_joint_velocities(); + time_from_robot_ = robot_driver_franka_sptr_->get_time(); + //std::cout<<"q: "<doubleSpinBox_time->setValue(time_from_robot_); + robot_driver_franka_sptr_->set_target_joint_positions(q_target_); + ui->label_robot_mode->setText(QString::fromStdString(robot_driver_franka_sptr_->get_robot_mode())); + + }else + { + enable_push_button(ui->pushButton_led, false); + } + if (robot_driver_franka_sptr_) + { + update_status_bar(robot_driver_franka_sptr_->get_status_message()); + } + +} + + +void MainWindow::update_led_timer_status() +{ + int number = int(time_from_robot_)%2; + blink_button(ui->pushButton_led, number, green_led_color_, gray_color_); +} + +void MainWindow::update_read_joints(const VectorXd& q, const VectorXd& q_dot) +{ + int i=0; + for (auto& elem : spin_box_read_joint_x_) + { + elem->setValue(q[i]); + spin_box_read_deg_joint_x_[i]->setValue(q[i]*180/M_PI); + spin_box_read_deg_joint_vel_x_[i]->setValue(q_dot[i]); + i++; + } + +} + + + + +void MainWindow::enable_push_button(QPushButton* push_button, const bool& state) +{ + push_button->setEnabled(state); + QColor color; + if (state == true) + { + color = green_color_; + }else + { + color = gray_color_; + } + set_push_button_color(push_button, color); +} + + +void MainWindow::blink_button(QPushButton* push_button, + const bool& state, + const QColor& color_on, + const QColor& color_off) +{ + //push_button->setEnabled(false); + QColor color; + if (state == true) + { + color = color_on; + }else + { + color = color_off; + } + set_push_button_color(push_button, color); +} + + +void MainWindow::on_reference_joint_1_valueChanged(int value) +{ + ui->label_ref_joint_1->setText(QString::number(value)); + q_target_[0] = value*(M_PI/180.0); +} + +void MainWindow::on_reference_joint_2_valueChanged(int value) +{ + ui->label_ref_joint_2->setText(QString::number(value)); + q_target_[1] = value*(M_PI/180.0); +} +void MainWindow::on_reference_joint_3_valueChanged(int value) +{ + ui->label_ref_joint_3->setText(QString::number(value)); + q_target_[2] = value*(M_PI/180.0); +} +void MainWindow::on_reference_joint_4_valueChanged(int value) +{ + ui->label_ref_joint_4->setText(QString::number(value)); + q_target_[3] = value*(M_PI/180.0); +} +void MainWindow::on_reference_joint_5_valueChanged(int value) +{ + ui->label_ref_joint_5->setText(QString::number(value)); + q_target_[4] = value*(M_PI/180.0); +} +void MainWindow::on_reference_joint_6_valueChanged(int value) +{ + ui->label_ref_joint_6->setText(QString::number(value)); + q_target_[5] = value*(M_PI/180.0); +} +void MainWindow::on_reference_joint_7_valueChanged(int value) +{ + ui->label_ref_joint_7->setText(QString::number(value)); + q_target_[6] = value*(M_PI/180.0); +} + +void MainWindow::on_pushButton_default_ref_clicked() +{ + set_reference_sliders(q_rest_configuration_); + ui->horizontalSlider_gripper->setSliderPosition(7); +} + + + + +void MainWindow::on_horizontalSlider_gripper_valueChanged(int value) +{ + ui->label_ref_joint_hand->setText(QString::number(value)); + command_gripper_ = double(value*0.0001); + //qDebug()<<"command: "<checkBox_homingGripper->setCheckState(Qt::Unchecked); + ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Unchecked); + ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); + } +} + + +void MainWindow::on_checkBox_move_hand_clicked(bool checked) +{ + if (checked){ + // Uncheck other checkboxeshandHoming + ui->checkBox_homingGripper->setCheckState(Qt::Unchecked); + //ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Unchecked); + ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); + + } +} + + +void MainWindow::on_checkBox_robotHoming_clicked(bool checked) +{ + if (checked){ + // Uncheck other checkboxes + ui->checkBox_homingGripper->setCheckState(Qt::Unchecked); + ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Unchecked); + ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + //ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); + } +} + + +void MainWindow::on_checkBox_joint_commands_clicked(bool checked) +{ + if (checked){ + // Uncheck other checkboxes + ui->checkBox_homingGripper->setCheckState(Qt::Unchecked); + ui->checkBox_move_hand->setCheckState(Qt::Unchecked); + ui->checkBox_handGripper->setCheckState(Qt::Unchecked); + //ui->checkBox_joint_commands->setCheckState(Qt::Unchecked); + ui->checkBox_robotHoming->setCheckState(Qt::Unchecked); + + } +} + + +void MainWindow::on_checkBox_joint_commands_stateChanged() +{ + Qt::CheckState current_state = ui->checkBox_joint_commands->checkState(); + if (current_state == Qt::Checked) + { + enable_reference_sliders(true); + ui->pushButton_joint_commands->setEnabled(true); + ui->pushButton_default_ref->setEnabled(true); + set_push_button_color(ui->pushButton_joint_commands, green_color_); + set_push_button_color(ui->pushButton_default_ref, green_color_); + //set_push_button_color(ui->pushButton_handHoming, gray_color_); + //set_push_button_color(ui->pushButton_move_hand, gray_color_); + //set_push_button_color(ui->pushButton_robotHoming, gray_color_); + + } + else{ + enable_reference_sliders(false); + ui->pushButton_joint_commands->setEnabled(false); + ui->pushButton_default_ref->setEnabled(false); + set_push_button_color(ui->pushButton_joint_commands, gray_color_); + set_push_button_color(ui->pushButton_default_ref, gray_color_); + } +} + +void MainWindow::on_checkBox_robotHoming_stateChanged() +{ + Qt::CheckState current_state = ui->checkBox_robotHoming->checkState(); + if (current_state == Qt::Checked) + { + + ui->pushButton_robotHoming->setEnabled(true); + set_push_button_color(ui->pushButton_robotHoming, green_color_); + + } + else{ + ui->pushButton_robotHoming->setEnabled(false); + set_push_button_color(ui->pushButton_robotHoming, gray_color_); + } +} + + +void MainWindow::on_checkBox_move_hand_stateChanged() +{ + Qt::CheckState current_state = ui->checkBox_move_hand->checkState(); + if (current_state == Qt::Checked) + { + + ui->pushButton_move_hand->setEnabled(true); + set_push_button_color(ui->pushButton_move_hand, green_color_); + ui->horizontalSlider_gripper->setEnabled(true); + + } + else{ + ui->pushButton_move_hand->setEnabled(false); + set_push_button_color(ui->pushButton_move_hand, gray_color_); + ui->horizontalSlider_gripper->setEnabled(false); + } +} + + + +void MainWindow::on_checkBox_homingGripper_stateChanged() +{ + Qt::CheckState current_state = ui->checkBox_homingGripper->checkState(); + if (current_state == Qt::Checked) + { + + ui->pushButton_handHoming->setEnabled(true); + set_push_button_color(ui->pushButton_handHoming, green_color_); + + } + else{ + ui->pushButton_handHoming->setEnabled(false); + set_push_button_color(ui->pushButton_handHoming, gray_color_); + } +} + + + + +void MainWindow::on_pushButton_robotHoming_clicked() +{ + QMessageBox::warning(this, "Warning", "This will move the robot. " + "Please make sure to have the user stop button at hand! " + "Use at your own risk"); + robot_driver_franka_sptr_->move_robot_to_target_joint_positions( + robot_driver_franka_sptr_->get_home_robot_configuration()); +} + + + + +void MainWindow::on_pushButton_joint_commands_clicked() +{ + std::cout<<"q_target_: "<move_robot_to_target_joint_positions(q_target_); + robot_driver_franka_sptr_->move_robot_to_target_joint_positions(q_target_); +} + + + + +void MainWindow::on_pushButton_handHoming_clicked() +{ + robot_driver_franka_sptr_->gripper_homing(); + auto width = robot_driver_franka_sptr_->read_gripper(RobotInterfaceFranka::WIDTH); + ui->doubleSpinBox_hand->setValue(width); +} + + +void MainWindow::on_pushButton_move_hand_clicked() +{ + auto max_width = robot_driver_franka_sptr_->read_gripper(RobotInterfaceFranka::MAX_WIDTH); + auto width = robot_driver_franka_sptr_->read_gripper(RobotInterfaceFranka::WIDTH); + ui->doubleSpinBox_hand->setValue(width); + + if (command_gripper_ < 0.01 or command_gripper_ > max_width) + { + qDebug()<<"The desired value is outside the range. "; + }else{ + + robot_driver_franka_sptr_->set_gripper(command_gripper_); + } +} + diff --git a/qt/configuration_window/mainwindow.h b/qt/configuration_window/mainwindow.h new file mode 100644 index 0000000..09b0ee3 --- /dev/null +++ b/qt/configuration_window/mainwindow.h @@ -0,0 +1,124 @@ +#pragma once +#include "QtWidgets/qlabel.h" +#include "QtWidgets/qslider.h" +#include "qpushbutton.h" +#include +#include + +#include +#include "qspinbox.h" +#include "robot_interface_franka.h" + +QT_BEGIN_NAMESPACE +namespace Ui { class MainWindow; } +QT_END_NAMESPACE + +class MainWindow : public QMainWindow +{ + Q_OBJECT + +public: + MainWindow(QWidget *parent = nullptr); + ~MainWindow(); + + void set_reference_sliders(const VectorXd& q_initial); + void enable_reference_sliders(const bool& status); + void set_push_button_color(QPushButton* push_button, const QColor& color); + void enable_push_button(QPushButton* push_button, const bool& state); + void blink_button(QPushButton* push_button, const bool& state, const QColor& color_on, const QColor& color_off); + void update_read_joints(const VectorXd& q, const VectorXd& q_dot); + void update_led_timer_status(); + void enable_check_boxes(const bool& state); + void update_status_bar(const std::string& message); + + +private slots: + + + + void on_pushButton_connect_clicked(); + + void on_reference_joint_1_valueChanged(int value); + void on_reference_joint_2_valueChanged(int value); + void on_reference_joint_3_valueChanged(int value); + void on_reference_joint_4_valueChanged(int value); + void on_reference_joint_5_valueChanged(int value); + void on_reference_joint_6_valueChanged(int value); + void on_reference_joint_7_valueChanged(int value); + + void on_pushButton_default_ref_clicked(); + + //void on_checkBox_joint_commands_clicked(bool checked); + //void on_checkBox_homingGripper_clicked(bool checked); + //void on_checkBox_robotHoming_clicked(bool checked); + //void on_checkBox_move_hand_clicked(bool checked); + + void on_horizontalSlider_gripper_valueChanged(int value); + + + void on_checkBox_homingGripper_clicked(bool checked); + + void on_checkBox_move_hand_clicked(bool checked); + + void on_checkBox_robotHoming_clicked(bool checked); + + void on_checkBox_joint_commands_clicked(bool checked); + + void on_checkBox_joint_commands_stateChanged(); + + void on_checkBox_move_hand_stateChanged(); + + void on_checkBox_robotHoming_stateChanged(); + + void on_checkBox_homingGripper_stateChanged(); + + void on_pushButton_disconnect_clicked(); + + void on_pushButton_initialize_clicked(); + + void on_pushButton_deinitialize_clicked(); + + void on_pushButton_robotHoming_clicked(); + + + + void on_pushButton_joint_commands_clicked(); + + + + void on_pushButton_handHoming_clicked(); + + void on_pushButton_move_hand_clicked(); + +private: + Ui::MainWindow *ui; + //std::shared_ptr ui; + std::vector reference_joint_x_; + std::vector label_ref_joint_x_; + std::vector spin_box_read_joint_x_; + std::vector spin_box_read_deg_joint_x_; + std::vector spin_box_read_deg_joint_vel_x_; + + QColor green_color_ = QColor::fromRgb(144,238,144); + + QColor green_led_color_ = QColor::fromRgb(0,255,0); + QColor gray_color_ = QColor::fromRgb(180,180,180); + + std::shared_ptr robot_driver_franka_sptr_ = nullptr; + int timerId; + + VectorXd q_target_ =(VectorXd(7)<<0, -0.3, 0, -1.92, 0, M_PI_2, M_PI_4).finished(); + VectorXd q_rest_configuration_= (VectorXd(7)<<0, -0.3, 0, -1.92, 0, M_PI_2, M_PI_4).finished(); + + double command_gripper_ = 0.05; + + double time_from_robot_; + + bool connect_flag_ = false; + bool initialize_flag_ = false; + bool deinitialize_flag_ = false; + bool disconnect_flag_ = false; + +protected: + void timerEvent(QTimerEvent *event); +}; diff --git a/qt/configuration_window/mainwindow.ui b/qt/configuration_window/mainwindow.ui new file mode 100644 index 0000000..ad850e5 --- /dev/null +++ b/qt/configuration_window/mainwindow.ui @@ -0,0 +1,1043 @@ + + + MainWindow + + + + 0 + 0 + 776 + 640 + + + + JuankaEmika + + + + + + + + + + + + + + + + + + + Robot IP: + + + + + + + + + + + + + + Include Franka Hand + + + + + + + + + + + Mode: + + + + + + + + None + + + + + PositionControl + + + + + VelocityControl + + + + + + + + + + + + + + + + Qt::Horizontal + + + + + + + + + Connect + + + + + + + Initialize + + + + + + + Deinitialize + + + + + + + Disconnect + + + + + + + + + Hand Zone + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + + + false + + + Hand Homing + + + false + + + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + + + + + Hand + + + + + + + 8 + + + Qt::Horizontal + + + + + + + 0 + + + + + + + + + + + true + + + true + + + 0.010000000000000 + + + 0.080000000000000 + + + + + + + false + + + Move hand + + + false + + + + + + + Qt::Horizontal + + + + + + + + + Robot Zone + + + + + + + Robot State Zone + + + + + + + + + Status + + + + + + + Qt::Vertical + + + + + + + Time (s): + + + + + + + 99990000.000000000000000 + + + + + + + RobotMode + + + + + + + + + + + + + + + + + + + + + + Homing + + + false + + + false + + + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + + q1 + + + + + + + q2 + + + + + + + q3 + + + + + + + q4 + + + + + + + q5 + + + + + + + q6 + + + + + + + q7 + + + + + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + Qt::Horizontal + + + + + + + + + + + 0 + + + + + + + 0 + + + + + + + 0 + + + + + + + 0 + + + + + + + 0 + + + + + + + 0 + + + + + + + 0 + + + + + + + + + + + + + Default + + + + + + + Qt::Horizontal + + + + + + + + + + + + + + + + Move the Robot + + + false + + + + + + + + + + + + + + + + + q1 + + + + + + + q2 + + + + + + + q3 + + + + + + + q4 + + + + + + + q5 + + + + + + + q6 + + + + + + + q7 + + + + + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + true + + + true + + + -360.000000000000000 + + + 360.000000000000000 + + + + + + + + + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + + + + + + + + + + + q_dot_1 + + + + + + + q_dot_2 + + + + + + + q_dot_3 + + + + + + + q_dot_4 + + + + + + + q_dot_5 + + + + + + + q_dot_6 + + + + + + + q_dot_7 + + + + + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + true + + + true + + + -3.000000000000000 + + + 3.000000000000000 + + + + + + + + + + + TextLabel + + + + + + + + + 0 + 0 + 776 + 22 + + + + + + + +