Ver código fonte

change view_ndtmatching.

yuchuli 1 ano atrás
pai
commit
7629353164

+ 28 - 0
src/include/proto/fwadmin.proto

@@ -0,0 +1,28 @@
+syntax = "proto2";
+
+package iv.fw;
+
+enum ADMINREQ_TYPE
+{
+	QUERYUSER = 0;
+	ADDUSER = 1;
+	RESETUSER = 2;
+	UPDATEUSER = 3;
+}
+
+message adminreq
+{
+	required ADMINREQ_TYPE admintype = 1;
+	required string username = 2;
+	optional string password = 3;
+	optional string strvalidtime = 4;
+};
+
+
+message adminreply
+{
+	required int32 nresult = 1;  //0 fail    1 success
+	optional string errstr = 2; //
+}
+
+

+ 1 - 0
src/include/proto3/commonrpc.proto

@@ -31,6 +31,7 @@ service CommonRPC {
 enum CommonRPCType //枚举消息类型
 {
 	LOGIN = 0; 
+	USERADMIN = 1;
 }
 
 message queryrpcReq {

+ 4 - 2
src/tool/fwupdate_admin/fwupdate_admin.pro

@@ -31,7 +31,8 @@ SOURCES += \
     ../../include/msgtype/fwlogin.pb.cc \
     ../server_fwupdate/commonrpc.grpc.pb.cc \
     grpcfwclient.cpp \
-    mainwindowadminuser.cpp
+    mainwindowadminuser.cpp \
+    ../../include/msgtype/fwadmin.pb.cc
 
 HEADERS += \
         mainwindow.h \
@@ -40,7 +41,8 @@ HEADERS += \
     ../../include/msgtype/fwlogin.pb.h \
     ../server_fwupdate/commonrpc.grpc.pb.h \
     grpcfwclient.h \
-    mainwindowadminuser.h
+    mainwindowadminuser.h \
+    ../../include/msgtype/fwadmin.pb.h
 
 FORMS += \
         mainwindow.ui \

+ 123 - 0
src/tool/fwupdate_admin/mainwindowadminuser.cpp

@@ -1,6 +1,20 @@
 #include "mainwindowadminuser.h"
 #include "ui_mainwindowadminuser.h"
 
+#include <QMessageBox>
+
+
+#include "grpcfwclient.h"
+
+#include "mainwindow.h"
+#include "mainwindowlogin.h"
+#include "mainwindowadminuser.h"
+
+extern MainWindow * gwmain;
+extern MainWindowLogin * gwlogin;
+extern MainWindowAdminUser * gwadminuser;
+extern grpcfwclient * gpgrpcfwclient;
+
 MainWindowAdminUser::MainWindowAdminUser(QWidget *parent) :
     QMainWindow(parent),
     ui(new Ui::MainWindowAdminUser)
@@ -14,3 +28,112 @@ MainWindowAdminUser::~MainWindowAdminUser()
 {
     delete ui;
 }
+
+void MainWindowAdminUser::on_pushButton_clicked()
+{
+    std::string struser = ui->lineEdit_UserName->text().toStdString();
+    if(struser.length()<1)
+    {
+        QMessageBox::warning(this,tr("Warning"),tr("User Name is Empty."),QMessageBox::YesAll);
+        return;
+    }
+
+    iv::fw::adminreq xadminreq;
+    xadminreq.set_admintype(iv::fw::ADMINREQ_TYPE::QUERYUSER);
+    xadminreq.set_username(struser);
+    xadminreq.set_password(struser);
+
+    iv::queryrpcReq xreq;
+    xreq.set_ntype(iv::CommonRPCType::USERADMIN);
+    int ndatasize = xadminreq.ByteSize();
+    xreq.set_ndatasize(ndatasize);
+    std::shared_ptr<char> pstr_ptr = std::shared_ptr<char>(new char[ndatasize]);
+    if(xadminreq.SerializeToArray(pstr_ptr.get(),ndatasize))
+    {
+        xreq.set_data(pstr_ptr.get(),ndatasize);
+
+        mpthread = new std::thread(&MainWindowAdminUser::threadadmin,this,xreq);
+        DisableAllButton();
+    }
+    else
+    {
+        QMessageBox::warning(this,tr("Warning"),tr("admin serialize fail."),QMessageBox::YesAll);
+        return;
+    }
+
+
+}
+
+void MainWindowAdminUser::threadadmin(iv::queryrpcReq  xreq)
+{
+    int i;
+    for(i=0;i<3;i++)
+    {
+        int nreq = gpgrpcfwclient->SetReq(xreq);
+        if(nreq == 0)
+        {
+            std::cout<<"MainWindowAdminUser::threadlogin setreq fail."<<std::endl;
+            std::this_thread::sleep_for(std::chrono::milliseconds(10));
+            continue;
+        }
+        iv::queryrpcReply xReply;
+        int nreply = gpgrpcfwclient->GetReply(xReply);
+        while(nreply == 0)
+        {
+            nreply = gpgrpcfwclient->GetReply(xReply);
+        }
+        if(nreply<0)
+        {
+            emit adminstate(0,"can't connect to server");
+        }
+        else
+        {
+            if(xReply.ntype() == iv::CommonRPCType::USERADMIN)
+            {
+                iv::fw::adminreply xAdminReply;
+                if(xAdminReply.ParseFromArray(xReply.data().data(),xReply.ndatasize()))
+                {
+                    if(xAdminReply.nresult() == 0)
+                    {
+                        std::cout<<"error code: "<<xAdminReply.errstr()<<std::endl;
+                        strncpy(mstrlasterr,xAdminReply.errstr().data(),256);
+                        emit adminstate(0,mstrlasterr);
+                    }
+                    else
+                    {
+                        emit adminstate(1,"Success.");
+                    }
+                }
+                else
+                {
+                    emit adminstate(0,"Parse Reply Fail.");
+                }
+            }
+            else
+            {
+                emit adminstate(0,"admin fail.");
+            }
+        }
+        break;
+    }
+
+}
+
+void MainWindowAdminUser::DisableAllButton()
+{
+    ui->pushButton->setEnabled(false);
+    ui->pushButton_Disable->setEnabled(false);
+    ui->pushButton_Enable->setEnabled(false);
+    ui->pushButton_Query->setEnabled(false);
+    ui->pushButton_ResetPass->setEnabled(false);
+}
+
+void MainWindowAdminUser::EnableAllButton()
+{
+    ui->pushButton->setEnabled(true);
+    ui->pushButton_Disable->setEnabled(true);
+    ui->pushButton_Enable->setEnabled(true);
+    ui->pushButton_Query->setEnabled(true);
+    ui->pushButton_ResetPass->setEnabled(true);
+}
+

+ 21 - 0
src/tool/fwupdate_admin/mainwindowadminuser.h

@@ -3,6 +3,11 @@
 
 #include <QMainWindow>
 
+#include <thread>
+
+#include "fwadmin.pb.h"
+#include "commonrpc.pb.h"
+
 namespace Ui {
 class MainWindowAdminUser;
 }
@@ -15,8 +20,24 @@ public:
     explicit MainWindowAdminUser(QWidget *parent = 0);
     ~MainWindowAdminUser();
 
+private slots:
+    void on_pushButton_clicked();
+
+signals:
+    void adminstate(int nstate,const char * strerr);
+
+private:
+    void threadadmin(iv::queryrpcReq xreq);
+
+    void DisableAllButton();
+    void EnableAllButton();
+
 private:
     Ui::MainWindowAdminUser *ui;
+
+    std::thread * mpthread;
+
+    char mstrlasterr[256];
 };
 
 #endif // MAINWINDOWADMINUSER_H

+ 150 - 8
src/tool/fwupdate_admin/mainwindowadminuser.ui

@@ -1,24 +1,166 @@
+<?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <author/>
- <comment/>
- <exportmacro/>
  <class>MainWindowAdminUser</class>
  <widget class="QMainWindow" name="MainWindowAdminUser">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>800</width>
-    <height>600</height>
+    <width>559</width>
+    <height>420</height>
    </rect>
   </property>
   <property name="windowTitle">
    <string>MainWindow</string>
   </property>
-  <widget class="QMenuBar" name="menubar"/>
-  <widget class="QWidget" name="centralwidget"/>
+  <widget class="QWidget" name="centralwidget">
+   <widget class="QPushButton" name="pushButton">
+    <property name="geometry">
+     <rect>
+      <x>50</x>
+      <y>300</y>
+      <width>101</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Add User</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_Query">
+    <property name="geometry">
+     <rect>
+      <x>232</x>
+      <y>30</y>
+      <width>121</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Query User</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_Disable">
+    <property name="geometry">
+     <rect>
+      <x>418</x>
+      <y>300</y>
+      <width>101</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Disable User</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_ResetPass">
+    <property name="geometry">
+     <rect>
+      <x>224</x>
+      <y>300</y>
+      <width>131</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Reset PassWord</string>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_Enable">
+    <property name="geometry">
+     <rect>
+      <x>420</x>
+      <y>30</y>
+      <width>101</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Enable User</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label">
+    <property name="geometry">
+     <rect>
+      <x>46</x>
+      <y>113</y>
+      <width>141</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>User Name:</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_UserName">
+    <property name="geometry">
+     <rect>
+      <x>240</x>
+      <y>110</y>
+      <width>281</width>
+      <height>41</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_2">
+    <property name="geometry">
+     <rect>
+      <x>48</x>
+      <y>204</y>
+      <width>141</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Valid Date:</string>
+    </property>
+   </widget>
+   <widget class="QDateTimeEdit" name="dateTimeEdit_valid">
+    <property name="geometry">
+     <rect>
+      <x>240</x>
+      <y>200</y>
+      <width>281</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="dateTime">
+     <datetime>
+      <hour>0</hour>
+      <minute>0</minute>
+      <second>0</second>
+      <year>2023</year>
+      <month>1</month>
+      <day>1</day>
+     </datetime>
+    </property>
+    <property name="displayFormat">
+     <string>yyyy/M/d hh:mm</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_2">
+    <property name="geometry">
+     <rect>
+      <x>40</x>
+      <y>30</y>
+      <width>131</width>
+      <height>41</height>
+     </rect>
+    </property>
+   </widget>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>559</width>
+     <height>28</height>
+    </rect>
+   </property>
+  </widget>
   <widget class="QStatusBar" name="statusbar"/>
  </widget>
- <pixmapfunction/>
+ <resources/>
  <connections/>
 </ui>

+ 52 - 0
src/tool/server_fwupdate/fwadminproc.cpp

@@ -19,6 +19,9 @@ iv::queryrpcReply fwadminproc::ProcReq(const iv::queryrpcReq * req)
     case iv::CommonRPCType::LOGIN:
         xreply = ProcLogin(req);
         break;
+    case iv::CommonRPCType::USERADMIN:
+        xreply = ProcAdminUser(req);
+        break;
     default:
         break;
     }
@@ -61,3 +64,52 @@ iv::queryrpcReply fwadminproc::ProcLogin(const iv::queryrpcReq *req)
 
     return xreply;
 }
+
+iv::queryrpcReply fwadminproc::ProcAdminUser(const iv::queryrpcReq *req)
+{
+    iv::queryrpcReply xreply;
+    iv::fw::adminreq xadminreq;
+    iv::fw::adminreply xadminreply;
+
+    if(xadminreq.ParseFromArray(req->data().data(),req->ndatasize()))
+    {
+        std::string strerrorcode = "username or password error.";
+
+        switch (xadminreq.admintype()) {
+        case iv::fw::ADMINREQ_TYPE::ADDUSER:
+            {
+            int nauth = mpfwdb->AddUser(xadminreq.username(),xadminreq.password(),strerrorcode);
+            xadminreply.set_nresult(nauth);
+            if(nauth == 0)
+            {
+                xadminreply.set_errstr(strerrorcode);
+            }
+            }
+            break;
+        default:
+            break;
+        }
+
+
+    }
+    else
+    {
+        xadminreply.set_nresult(0);
+        xadminreply.set_errstr("Parse Request Fail.");
+
+    }
+    xreply.set_ntype(iv::CommonRPCType::USERADMIN);
+    int ndatasize = xadminreply.ByteSize();
+    std::shared_ptr<char> pstr_ptr = std::shared_ptr<char>(new char[ndatasize]);
+    if(xadminreply.SerializeToArray(pstr_ptr.get(),ndatasize))
+    {
+        xreply.set_ndatasize(ndatasize);
+        xreply.set_data(pstr_ptr.get(),ndatasize);
+    }
+    else
+    {
+        std::cout<<"fwadminproc::xadminreply Serialxze fail "<<std::endl;
+    }
+
+    return xreply;
+}

+ 2 - 0
src/tool/server_fwupdate/fwadminproc.h

@@ -4,6 +4,7 @@
 #include "fwdb.h"
 
 #include "fwlogin.pb.h"
+#include "fwadmin.pb.h"
 #include "commonrpc.pb.h"
 
 class fwadminproc
@@ -18,6 +19,7 @@ public:
 
 private:
     iv::queryrpcReply ProcLogin(const iv::queryrpcReq * req);
+    iv::queryrpcReply ProcAdminUser(const iv::queryrpcReq *req);
 
 private:
     fwdb * mpfwdb;

+ 52 - 3
src/tool/server_fwupdate/fwdb.cpp

@@ -35,7 +35,7 @@ void fwdb::OpenDataBase()
     mdatabase.setDatabaseName(mstrdbpath.data());
     if (!mdatabase.open())
     {
-        qDebug("Error: Failed to connect database. error is %s ",mdatabase.lastError());
+        qDebug("Error: Failed to connect database. error is %s ",mdatabase.lastError().text().toLatin1().data());
         return;
     }
     else
@@ -54,7 +54,7 @@ void fwdb::OpenDataBase()
     sql_query.exec("select count(*)  from sqlite_master where type='table' and name = 'accountdata'");
     if(!sql_query.exec())
     {
-        qDebug("%s",sql_query.lastError());
+        qDebug("%s",sql_query.lastError().text().toLatin1().data());
         return;
     }
     else
@@ -120,7 +120,7 @@ int fwdb::CheckAuth(std::string strusername, std::string strpassword ,std::strin
 
 
     snprintf(strsen,1000,"select * from accountdata where((accountdata.username = \"%s\"))",
-             strusername.data(),strpassword.data());
+             strusername.data());
     query.exec(strsen);
     if(!query.exec(strsen))
     {
@@ -237,3 +237,52 @@ int fwdb::CheckAuth(std::string strusername, std::string strpassword ,std::strin
     mmutexdb.unlock();
     return nrtn;
 }
+
+int fwdb::AddUser(std::string strusername, std::string strpassword, std::string &strerrorcode)
+{
+ //   int nrtn = 0;
+    mmutexdb.lock();
+    QSqlQuery query(mdatabase);
+    char strsen[1000];
+
+
+    snprintf(strsen,1000,"select * from accountdata where((accountdata.username = \"%s\"))",
+             strusername.data());
+    query.exec(strsen);
+    if(!query.exec(strsen))
+    {
+        std::cout<<query.lastError().text().toLatin1().data()<<std::endl;
+        strerrorcode = "SQL Error.";
+        mmutexdb.unlock();
+        return 0;
+    }
+    else
+    {
+        if(query.next())
+        {
+            strerrorcode = "User Exist.";
+            mmutexdb.unlock();
+            return 0;
+
+        }
+    }
+
+    QDateTime now = QDateTime::currentDateTime();
+
+    QString strnow = now.toString("yyyy-MM-dd hh:mm:ss");
+    snprintf(strsen,1000,"INSERT INTO accountdata(username,password,passerrorcount,uservalidtime,usercreatetime,lastloginerrortime)"
+             " VALUES(\"%s\",\"%s\",%d,\"%s\",\"%s\",\"%s\")",
+                                 strusername.data(),strpassword.data(),0,"2099-12-31 23:59:59",strnow.toLatin1().data(),"1970-1-1 1:00:00");
+    if(!query.exec(strsen))
+    {
+        std::cout<<query.lastError().text().toLatin1().data()<<std::endl;
+        strerrorcode = "SQL Error.";
+        mmutexdb.unlock();
+        return 0;
+    }
+
+    strerrorcode = "Success.";
+    mmutexdb.unlock();
+    return 1;
+
+}

+ 2 - 0
src/tool/server_fwupdate/fwdb.h

@@ -23,6 +23,8 @@ public:
 public:
     int CheckAuth(std::string strusername,std::string strpassword,std::string & strerrorcode);
 
+    int AddUser(std::string strusername,std::string strpassword, std::string & strerrorcode);
+
 private:
     std::thread * mpthread;
     bool mbthreadrun = true;

+ 4 - 2
src/tool/server_fwupdate/server_fwupdate.pro

@@ -32,7 +32,8 @@ SOURCES += \
     commonrpc.grpc.pb.cc \
     ../../include/msgtype/commonrpc.pb.cc \
     fwadminproc.cpp \
-    ../../include/msgtype/fwlogin.pb.cc
+    ../../include/msgtype/fwlogin.pb.cc \
+    ../../include/msgtype/fwadmin.pb.cc
 
 HEADERS += \
         mainwindow.h \
@@ -40,7 +41,8 @@ HEADERS += \
     commonrpc.grpc.pb.h \
     ../../include/msgtype/commonrpc.pb.h \
     fwadminproc.h \
-    ../../include/msgtype/fwlogin.pb.h
+    ../../include/msgtype/fwlogin.pb.h \
+    ../../include/msgtype/fwadmin.pb.h
 
 FORMS += \
         mainwindow.ui

+ 64 - 1
src/tool/view_ndtmatching/mainwindow.cpp

@@ -7,6 +7,14 @@
 
 static pose gCurPose;
 
+static double gView_Z = 100.0;
+
+static bool gbAutoCam = true;
+
+static int gnViewMode = 0;
+
+static double gfViewAngle = 30.0;
+
 #include <cmath>
 
 struct Quaternion {
@@ -92,7 +100,21 @@ void viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
 
     double yaw_calc = M_PI/2.0 - gCurPose.yaw;
 
-    viewer.setCameraPosition(gCurPose.x,gCurPose.y,100,gCurPose.x,gCurPose.y,gCurPose.z,sin(yaw_calc),cos(yaw_calc),0);
+    if(gbAutoCam)
+    {
+        if(gnViewMode == 0)
+            viewer.setCameraPosition(gCurPose.x,gCurPose.y,gView_Z,gCurPose.x,gCurPose.y,gCurPose.z,sin(yaw_calc),cos(yaw_calc),0);
+
+        if(gnViewMode == 1)
+        {
+            double gfZsin = gView_Z * sin(gfViewAngle * M_PI/180.0);
+            double gfZcos = gView_Z * cos(gfViewAngle * M_PI/180.0);
+
+            double fcam_x = gCurPose.x + gfZcos * cos(gCurPose.yaw+M_PI);
+            double fcam_y = gCurPose.y + gfZcos * sin(gCurPose.yaw+M_PI);
+            viewer.setCameraPosition(fcam_x,fcam_y,gfZsin,gCurPose.x,gCurPose.y,gCurPose.z,sin(yaw_calc),cos(yaw_calc),0);
+        }
+    }
 
     std::stringstream ss;
  //   viewer.setCameraPosition(mpos_x,0,30,mpos_x + 20,0,0,0,0,0);
@@ -110,13 +132,27 @@ MainWindow::MainWindow(QWidget *parent) :
 {
     ui->setupUi(this);
 
+    ui->pushButton_EnableRelocation->setEnabled(false);
+
+    ui->horizontalSlider->setRange(5,300);
+    ui->horizontalSlider->setValue(100);
+
+    ui->comboBox->addItem("Look Down");
+    ui->comboBox->addItem("Tracking");
+
+    ui->checkBox->setChecked(true);
+
     mCurPose.x = 0; mCurPose.y = 0; mCurPose.z = 0;
     mCurPose.yaw = 0; mCurPose.pitch = 0; mCurPose.roll = 0;
 
     gCurPose = mCurPose;
+
+
 \
     mpthreadpcd = new std::thread(&MainWindow::threadpcdview,this);
 
+    setWindowTitle("NDT Matching View & Relocation Enable");
+
 }
 
 MainWindow::~MainWindow()
@@ -180,3 +216,30 @@ void MainWindow::on_pushButton_Test_clicked()
 
     gCurPose = mCurPose;
 }
+
+void MainWindow::on_pushButton_EnableRelocation_clicked()
+{
+
+}
+
+void MainWindow::on_horizontalSlider_valueChanged(int value)
+{
+    gView_Z = value;
+}
+
+void MainWindow::on_checkBox_clicked()
+{
+    if(ui->checkBox->isChecked())
+    {
+       gbAutoCam = true;
+    }
+    else
+    {
+        gbAutoCam = false;
+    }
+}
+
+void MainWindow::on_comboBox_currentIndexChanged(int index)
+{
+    gnViewMode = index;
+}

+ 10 - 0
src/tool/view_ndtmatching/mainwindow.h

@@ -39,6 +39,14 @@ public:
 private slots:
     void on_pushButton_Test_clicked();
 
+    void on_pushButton_EnableRelocation_clicked();
+
+    void on_horizontalSlider_valueChanged(int value);
+
+    void on_checkBox_clicked();
+
+    void on_comboBox_currentIndexChanged(int index);
+
 private:
     void threadpcdview();
 
@@ -52,6 +60,8 @@ private:
     bool mbRun = true;
 
     pose mCurPose;
+
+
 };
 
 #endif // MAINWINDOW_H

+ 51 - 12
src/tool/view_ndtmatching/mainwindow.ui

@@ -6,7 +6,7 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>771</width>
+    <width>673</width>
     <height>478</height>
    </rect>
   </property>
@@ -17,8 +17,8 @@
    <widget class="QPushButton" name="pushButton_Test">
     <property name="geometry">
      <rect>
-      <x>480</x>
-      <y>320</y>
+      <x>250</x>
+      <y>380</y>
       <width>201</width>
       <height>51</height>
      </rect>
@@ -99,7 +99,7 @@
    <widget class="QLabel" name="label_4">
     <property name="geometry">
      <rect>
-      <x>310</x>
+      <x>395</x>
       <y>160</y>
       <width>61</width>
       <height>31</height>
@@ -112,7 +112,7 @@
    <widget class="QLineEdit" name="lineEdit_roll">
     <property name="geometry">
      <rect>
-      <x>380</x>
+      <x>465</x>
       <y>160</y>
       <width>121</width>
       <height>31</height>
@@ -122,7 +122,7 @@
    <widget class="QLabel" name="label_5">
     <property name="geometry">
      <rect>
-      <x>310</x>
+      <x>395</x>
       <y>40</y>
       <width>61</width>
       <height>31</height>
@@ -135,7 +135,7 @@
    <widget class="QLineEdit" name="lineEdit_pitch">
     <property name="geometry">
      <rect>
-      <x>380</x>
+      <x>465</x>
       <y>100</y>
       <width>121</width>
       <height>31</height>
@@ -145,7 +145,7 @@
    <widget class="QLabel" name="label_6">
     <property name="geometry">
      <rect>
-      <x>310</x>
+      <x>395</x>
       <y>100</y>
       <width>61</width>
       <height>31</height>
@@ -158,7 +158,7 @@
    <widget class="QLineEdit" name="lineEdit_yaw">
     <property name="geometry">
      <rect>
-      <x>380</x>
+      <x>465</x>
       <y>40</y>
       <width>121</width>
       <height>31</height>
@@ -168,20 +168,59 @@
    <widget class="QComboBox" name="comboBox">
     <property name="geometry">
      <rect>
-      <x>80</x>
-      <y>320</y>
+      <x>184</x>
+      <y>300</y>
       <width>181</width>
       <height>51</height>
      </rect>
     </property>
    </widget>
+   <widget class="QPushButton" name="pushButton_EnableRelocation">
+    <property name="geometry">
+     <rect>
+      <x>400</x>
+      <y>301</y>
+      <width>201</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Enable Relocation</string>
+    </property>
+   </widget>
+   <widget class="QSlider" name="horizontalSlider">
+    <property name="geometry">
+     <rect>
+      <x>63</x>
+      <y>240</y>
+      <width>521</width>
+      <height>31</height>
+     </rect>
+    </property>
+    <property name="orientation">
+     <enum>Qt::Horizontal</enum>
+    </property>
+   </widget>
+   <widget class="QCheckBox" name="checkBox">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>300</y>
+      <width>111</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Auto</string>
+    </property>
+   </widget>
   </widget>
   <widget class="QMenuBar" name="menubar">
    <property name="geometry">
     <rect>
      <x>0</x>
      <y>0</y>
-     <width>771</width>
+     <width>673</width>
      <height>28</height>
     </rect>
    </property>