浏览代码

add controller_torquebrake_get_plus. for test torque brake auto.

yuchuli 3 年之前
父节点
当前提交
f070209db6

+ 73 - 0
src/common/modulecommplus/.gitignore

@@ -0,0 +1,73 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+

+ 5 - 0
src/common/modulecommplus/modulecommplus.cpp

@@ -0,0 +1,5 @@
+#include "modulecommplus.h"
+
+Modulecommplus::Modulecommplus()
+{
+}

+ 12 - 0
src/common/modulecommplus/modulecommplus.h

@@ -0,0 +1,12 @@
+#ifndef MODULECOMMPLUS_H
+#define MODULECOMMPLUS_H
+
+#include "modulecommplus_global.h"
+
+class MODULECOMMPLUS_EXPORT Modulecommplus
+{
+public:
+    Modulecommplus();
+};
+
+#endif // MODULECOMMPLUS_H

+ 30 - 0
src/common/modulecommplus/modulecommplus.pro

@@ -0,0 +1,30 @@
+QT -= gui
+
+TEMPLATE = lib
+DEFINES += MODULECOMMPLUS_LIBRARY
+
+CONFIG += c++11
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+    modulecommplus.cpp
+
+HEADERS += \
+    modulecommplus_global.h \
+    modulecommplus.h
+
+# Default rules for deployment.
+unix {
+    target.path = /usr/lib
+}
+!isEmpty(target.path): INSTALLS += target

+ 12 - 0
src/common/modulecommplus/modulecommplus_global.h

@@ -0,0 +1,12 @@
+#ifndef MODULECOMMPLUS_GLOBAL_H
+#define MODULECOMMPLUS_GLOBAL_H
+
+#include <QtCore/qglobal.h>
+
+#if defined(MODULECOMMPLUS_LIBRARY)
+#  define MODULECOMMPLUS_EXPORT Q_DECL_EXPORT
+#else
+#  define MODULECOMMPLUS_EXPORT Q_DECL_IMPORT
+#endif
+
+#endif // MODULECOMMPLUS_GLOBAL_H

+ 6 - 0
src/common/modulecommplus/modulecommplus_impl.cpp

@@ -0,0 +1,6 @@
+#include "modulecommplus_impl.h"
+
+modulecommplus_impl::modulecommplus_impl()
+{
+
+}

+ 11 - 0
src/common/modulecommplus/modulecommplus_impl.h

@@ -0,0 +1,11 @@
+#ifndef MODULECOMMPLUS_IMPL_H
+#define MODULECOMMPLUS_IMPL_H
+
+
+class modulecommplus_impl
+{
+public:
+    modulecommplus_impl();
+};
+
+#endif // MODULECOMMPLUS_IMPL_H

+ 73 - 0
src/tool/controller_torquebrake_get_plus/.gitignore

@@ -0,0 +1,73 @@
+# This file is used to ignore files which are generated
+# ----------------------------------------------------------------------------
+
+*~
+*.autosave
+*.a
+*.core
+*.moc
+*.o
+*.obj
+*.orig
+*.rej
+*.so
+*.so.*
+*_pch.h.cpp
+*_resource.rc
+*.qm
+.#*
+*.*#
+core
+!core/
+tags
+.DS_Store
+.directory
+*.debug
+Makefile*
+*.prl
+*.app
+moc_*.cpp
+ui_*.h
+qrc_*.cpp
+Thumbs.db
+*.res
+*.rc
+/.qmake.cache
+/.qmake.stash
+
+# qtcreator generated files
+*.pro.user*
+
+# xemacs temporary files
+*.flc
+
+# Vim temporary files
+.*.swp
+
+# Visual Studio generated files
+*.ib_pdb_index
+*.idb
+*.ilk
+*.pdb
+*.sln
+*.suo
+*.vcproj
+*vcproj.*.*.user
+*.ncb
+*.sdf
+*.opensdf
+*.vcxproj
+*vcxproj.*
+
+# MinGW generated files
+*.Debug
+*.Release
+
+# Python byte code
+*.pyc
+
+# Binaries
+# --------
+*.dll
+*.exe
+

+ 47 - 0
src/tool/controller_torquebrake_get_plus/controller_torquebrake_get_plus.pro

@@ -0,0 +1,47 @@
+QT       += core gui
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+CONFIG += c++11
+
+# The following define makes your compiler emit warnings if you use
+# any Qt feature that has been marked deprecated (the exact warnings
+# depend on your compiler). Please consult the documentation of the
+# deprecated API in order to know how to port your code away from it.
+DEFINES += QT_DEPRECATED_WARNINGS
+
+# You can also make your code fail to compile if it uses deprecated APIs.
+# In order to do so, uncomment the following line.
+# You can also select to disable deprecated APIs only up to a certain version of Qt.
+#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
+
+SOURCES += \
+    ../../include/msgtype/gps.pb.cc \
+    ../../include/msgtype/gpsimu.pb.cc \
+    ../../include/msgtype/imu.pb.cc \
+    ../../include/msgtype/torquebrake.pb.cc \
+    main.cpp \
+    mainwindow.cpp
+
+HEADERS += \
+    ../../include/msgtype/gps.pb.h \
+    ../../include/msgtype/gpsimu.pb.h \
+    ../../include/msgtype/imu.pb.h \
+    ../../include/msgtype/torquebrake.pb.h \
+    mainwindow.h
+
+FORMS += \
+    mainwindow.ui
+
+# Default rules for deployment.
+qnx: target.path = /tmp/$${TARGET}/bin
+else: unix:!android: target.path = /opt/$${TARGET}/bin
+!isEmpty(target.path): INSTALLS += target
+
+!include(../../../include/common.pri ) {
+    error( "Couldn't find the common.pri file!" )
+}
+
+!include(../../../include/ivprotobuf.pri ) {
+    error( "Couldn't find the ivprotobuf.pri file!" )
+}

+ 11 - 0
src/tool/controller_torquebrake_get_plus/main.cpp

@@ -0,0 +1,11 @@
+#include "mainwindow.h"
+
+#include <QApplication>
+
+int main(int argc, char *argv[])
+{
+    QApplication a(argc, argv);
+    MainWindow w;
+    w.show();
+    return a.exec();
+}

+ 357 - 0
src/tool/controller_torquebrake_get_plus/mainwindow.cpp

@@ -0,0 +1,357 @@
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+
+#include <QFileDialog>
+#include <QFile>
+#include <QMessageBox>
+
+#include <math.h>
+
+MainWindow::MainWindow(QWidget *parent)
+    : QMainWindow(parent)
+    , ui(new Ui::MainWindow)
+{
+    ui->setupUi(this);
+
+    mfBrake = 1.0;
+    mfTorque = 1.0;
+    ui->lineEdit_Brake->setText("1.0");
+    ui->lineEdit_Torque->setText("1.0");
+    ui->lineEdit_speedlimit->setText(QString::number(mfSpeedLimit));
+    ui->lineEdit_TorqueStart->setText(QString::number(mfTorqueStart));
+    ui->lineEdit_VelStep->setText(QString::number(mfVelStep));
+
+    mbEnable = false;
+    mnTestStep = 0;
+    ui->progressBar->setRange(0,100);
+
+    ui->comboBox_accaxis->addItem("x轴");
+    ui->comboBox_accaxis->addItem("y轴");
+    ui->comboBox_accaxis->setCurrentIndex(1);
+
+    ui->progressBar->setValue(0);
+
+    ui->checkBox_TestEnable->setChecked(false);
+    ui->checkBox_notrecordbrake->setChecked(false);
+    ui->pushButton_StartTest->setEnabled(false);
+    ui->pushButton_StartTest_2->setEnabled(false);
+
+    mpa = iv::modulecomm::RegisterSend("torquebrake",1000,1);
+    ModuleFun fungpsimu =std::bind(&MainWindow::UpdateGPSIMU,this,std::placeholders::_1,std::placeholders::_2,std::placeholders::_3,std::placeholders::_4,std::placeholders::_5);
+    mpagpsimu = iv::modulecomm::RegisterRecvPlus("hcp2_gpsimu",fungpsimu);
+
+
+
+    mpTimer = new QTimer();
+    connect(mpTimer,SIGNAL(timeout()),this,SLOT(onTimer()));
+    mpTimer->start(10);
+
+
+
+    setWindowTitle("Get Torque Brake acc Relation");
+
+}
+
+MainWindow::~MainWindow()
+{
+    delete ui;
+}
+
+void MainWindow::onTimer()
+{
+    iv::controller::torquebrake xtb;
+
+    double fstep = 0;
+    switch (mnTestStep) {
+    case 0:
+        xtb.set_torque(0);
+        xtb.set_brake(mfBrake);
+        break;
+    case 1:
+        if(mfSpeedNow < mfSpeedLimit)
+        {
+            xtb.set_torque(mfTorque);
+            xtb.set_brake(0);
+        }
+        else
+        {
+            mnTestStep = 2;
+            xtb.set_torque(0);
+            xtb.set_brake(mfBrake);
+        }
+        if(mfSpeedLimit >0)
+        {
+            fstep = (mfSpeedNow/mfSpeedLimit)/2.0;
+            fstep = fstep * 100.0;
+            ui->progressBar->setValue(fstep);
+        }
+        break;
+    case 2:
+        xtb.set_torque(0);
+        xtb.set_brake(mfBrake);
+        if(mfSpeedLimit >0)
+        {
+            fstep = ((mfSpeedLimit-mfSpeedNow)/mfSpeedLimit)/2.0 + 0.5;
+            fstep = fstep * 100.0;
+            ui->progressBar->setValue(fstep);
+        }
+        if(mfSpeedNow<0.1)
+        {
+            mnTestStep = 0;
+            fstep = 1.0;
+            ui->pushButton_StartTest->setEnabled(true);
+            fstep = fstep * 100.0;
+            ui->progressBar->setValue(fstep);
+        }
+        break;
+    default:
+        break;
+    }
+    xtb.set_enable(mbEnable);
+
+    mfSendTorque = xtb.torque();
+    mfSendBrake = xtb.brake();
+
+    int ndatasize = xtb.ByteSize();
+    std::shared_ptr<char> strbuf_ptr = std::shared_ptr<char>(new char[ndatasize]);
+    if(xtb.SerializeToArray(strbuf_ptr.get(),ndatasize))
+    {
+        iv::modulecomm::ModuleSendMsg(mpa,strbuf_ptr.get(),ndatasize);
+    }
+
+    if(mbEnable)
+    {
+        if(mbGPSIMUUpdate)
+        {
+            iv::gps::gpsimu xgpsimu;
+            mMutexGPSIMU.lock();
+            xgpsimu.CopyFrom(mgpsimu);
+            mbGPSIMUUpdate = false;
+            mMutexGPSIMU.unlock();
+
+            UpdatePlainText(xgpsimu);
+
+        }
+    }
+
+}
+
+
+void MainWindow::UpdateGPSIMU(const char *strdata, const unsigned int nSize, const unsigned int index, const QDateTime *dt, const char *strmemname)
+{
+    (void)strdata;
+    (void)nSize;
+    (void)index;
+    iv::gps::gpsimu  xgpsimu;
+    if(!xgpsimu.ParseFromArray(strdata,nSize))
+    {
+        qDebug("UpdateGPSIMU Parse Error.");
+        return;
+    }
+
+    mfSpeedNow =  3.6 * sqrt(pow(xgpsimu.ve(),2) + pow(xgpsimu.vn(),2));
+    mMutexGPSIMU.lock();
+    mgpsimu.CopyFrom(xgpsimu);
+    mbGPSIMUUpdate = true;
+    mMutexGPSIMU.unlock();
+}
+
+void MainWindow::UpdatePlainText(iv::gps::gpsimu &xgpsimu)
+{
+    char strout[1000];
+
+    double facce = 0.0;
+
+    if(mnAxis == 0)
+    {
+        facce = xgpsimu.acce_x();
+    }
+    else
+    {
+        facce = xgpsimu.acce_y();
+    }
+
+    double fspeed = 3.6 * sqrt(pow(xgpsimu.ve(),2) + pow(xgpsimu.vn(),2));
+    snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f",
+            fspeed,facce * 9.8,mfSendTorque,mfSendBrake);
+    ui->plainTextEdit->appendPlainText(strout);
+
+    double froundspeed = mfVelStep * std::round(fspeed/mfVelStep);
+    if(froundspeed != mfAvgSpeed)
+    {
+        if(mfVectorAcc.size()> 0)
+        {
+            double fAvgAcc = 0.0;
+            unsigned int i;
+            for(i=0;i<mfVectorAcc.size();i++)
+            {
+                fAvgAcc = fAvgAcc + mfVectorAcc[i];
+
+            }
+            fAvgAcc = fAvgAcc/mfVectorAcc.size();
+            if((mfAvgSpeed > 1.0)&&(mbEnable))
+            {
+                if(ui->checkBox_notrecordbrake->isChecked() &&(mfSendBrake>0.00001))
+                {
+
+                }
+                else
+                {
+                    snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f",
+                             mfAvgSpeed,fAvgAcc,mfSendTorque,mfSendBrake);
+                    ui->plainTextEdit_AvgAcc->appendPlainText(strout);
+                }
+            }
+        }
+        mfAvgSpeed = froundspeed;
+        mfVectorAcc.clear();
+    }
+    else
+    {
+        mfVectorAcc.push_back(facce*9.8);
+    }
+}
+
+void MainWindow::on_pushButton_ClearRecord_clicked()
+{
+    ui->plainTextEdit->clear();
+    ui->plainTextEdit_AvgAcc->clear();
+}
+
+
+void MainWindow::on_pushButton_SortTable_clicked()
+{
+    QString str = QFileDialog::getOpenFileName(this,"Load Table",".","*.txt");
+    if(str.isEmpty())return;
+
+    std::vector<iv::tableunit> xvectorunit;
+    std::vector<iv::tableunit> xvectorunitsave;
+
+    QFile xFile;
+    xFile.setFileName(str);
+    if(xFile.open(QIODevice::ReadOnly))
+    {
+        QByteArray ba = xFile.readAll();
+        QString strba;
+        strba.append(ba);
+        QStringList strlinelist =strba.split("\n");// strba.split(QRegExp("[\t ;]+"));
+        int nline = strlinelist.size();
+        int i;
+        for(i=0;i<nline;i++)
+        {
+            QString str = strlinelist.at(i);
+            str = str.trimmed();
+            QStringList strvaluelist = str.split(QRegExp("[\t ;]+"));
+            if(strvaluelist.size()>=4)
+            {
+                double vel,acc,torque,brake;
+                vel = QString(strvaluelist.at(0)).toDouble();
+                acc = QString(strvaluelist.at(1)).toDouble();
+                torque = QString(strvaluelist.at(2)).toDouble();
+                brake = QString(strvaluelist.at(3)).toDouble();
+                iv::tableunit xunit;
+                xunit.mfVel = vel;
+                xunit.mfAcc = acc;
+                xunit.mfTorque = torque;
+                xunit.mfBrake = brake;
+                xvectorunit.push_back(xunit);
+            }
+        }
+
+    }
+    xFile.close();
+
+    if(xvectorunit.size()<1)
+    {
+        QMessageBox::warning(this,"Warning","No Table Found.",QMessageBox::YesAll);
+        return;
+    }
+
+    while(xvectorunit.size()>0)
+    {
+        iv::tableunit xunit = xvectorunit[0];
+        xvectorunit.erase(xvectorunit.begin());
+        unsigned int i = 0;
+        for(i=0;i<xvectorunitsave.size();i++)
+        {
+            if(xunit.mfVel==xvectorunitsave[i].mfVel)
+            {
+                if(xunit.mfAcc < xvectorunitsave[i].mfAcc)
+                {
+                    xvectorunitsave.insert(xvectorunitsave.begin()+i,xunit);
+                    break;
+                }
+            }
+            else
+            {
+                if(xunit.mfVel < xvectorunitsave[i].mfVel)
+                {
+                    xvectorunitsave.insert(xvectorunitsave.begin()+i,xunit);
+                    break;
+                }
+            }
+        }
+        if(i == xvectorunitsave.size())xvectorunitsave.push_back(xunit);
+    }
+
+
+    QString strsavename = QFileDialog::getSaveFileName(this,"Save Table",".","*.txt");
+    if(strsavename.isEmpty())return;
+
+    QFile xFileSave;
+    xFileSave.setFileName(strsavename);
+    if(xFileSave.open(QIODevice::ReadWrite))
+    {
+        unsigned int i;
+        for(i=0;i<xvectorunitsave.size();i++)
+        {
+            char strout[1000];
+            snprintf(strout,1000,"%6.3f\t%6.3f\t%6.3f\t%6.3f\n",
+                     xvectorunitsave[i].mfVel,xvectorunitsave[i].mfAcc,
+                     xvectorunitsave[i].mfTorque,xvectorunitsave[i].mfBrake);
+            xFileSave.write(strout,strnlen(strout,1000));
+        }
+
+    }
+    else
+    {
+        QMessageBox::warning(this,"Warning","Save File Error.",QMessageBox::YesAll);
+    }
+    xFileSave.close();
+}
+
+void MainWindow::on_pushButton_StartTest_clicked()
+{
+    mfTorque = ui->lineEdit_Torque->text().toDouble();
+    mfBrake = ui->lineEdit_Brake->text().toDouble();
+    mfSpeedLimit = ui->lineEdit_speedlimit->text().toDouble();
+
+    mnTestStep = 1;
+
+    mnAxis = ui->comboBox_accaxis->currentIndex();
+
+    ui->progressBar->setValue(0);
+    ui->pushButton_StartTest->setEnabled(false);
+}
+
+void MainWindow::on_pushButton_StartTest_2_clicked()
+{
+    mnTestStep = 0;
+    ui->pushButton_StartTest->setEnabled(true);
+}
+
+void MainWindow::on_checkBox_TestEnable_clicked()
+{
+    if(ui->checkBox_TestEnable->isChecked())
+    {
+        ui->pushButton_StartTest->setEnabled(true);
+        ui->pushButton_StartTest_2->setEnabled(true);
+        mbEnable = true;
+    }
+    else
+    {
+        ui->pushButton_StartTest->setEnabled(false);
+        ui->pushButton_StartTest_2->setEnabled(false);
+        mbEnable = false;
+    }
+}

+ 88 - 0
src/tool/controller_torquebrake_get_plus/mainwindow.h

@@ -0,0 +1,88 @@
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QTimer>
+
+#include "torquebrake.pb.h"
+#include "gpsimu.pb.h"
+#include "modulecomm.h"
+#include <memory>
+
+#include <QMutex>
+
+QT_BEGIN_NAMESPACE
+namespace Ui { class MainWindow; }
+QT_END_NAMESPACE
+
+namespace iv {
+struct tableunit
+{
+public:
+    double mfVel;
+    double mfAcc;
+    double mfTorque;
+    double mfBrake;
+};
+}
+
+class MainWindow : public QMainWindow
+{
+    Q_OBJECT
+
+public:
+    MainWindow(QWidget *parent = nullptr);
+    ~MainWindow();
+
+private slots:
+    void onTimer();
+
+    void on_pushButton_ClearRecord_clicked();
+
+    void on_pushButton_SortTable_clicked();
+
+    void on_pushButton_StartTest_clicked();
+
+    void on_pushButton_StartTest_2_clicked();
+
+    void on_checkBox_TestEnable_clicked();
+
+private:
+    Ui::MainWindow *ui;
+
+    QTimer * mpTimer;
+
+    double mfTorque = 35.0;
+    double mfBrake = 0;
+    bool mbEnable = false;
+    double mfSpeedLimit = 30;
+    double mfTorqueAtLimit = 30;
+    double mfTorqueStart = 100.0;
+
+    double mfSendTorque;
+    double mfSendBrake;
+
+    double mfVelStep = 5.0;
+
+    double mfSpeedNow = 100.0;
+
+    void * mpa;
+    void * mpagpsimu;
+
+    void UpdateGPSIMU(const char * strdata,const unsigned int nSize,const unsigned int index,const QDateTime * dt,const char * strmemname);
+    QMutex mMutexGPSIMU;
+    iv::gps::gpsimu mgpsimu;
+    bool mbGPSIMUUpdate = false;
+
+    void UpdatePlainText(iv::gps::gpsimu & xgpsimu);
+
+
+    double mfAvgSpeed = 0.0;
+    std::vector<double > mfVectorAcc;
+
+    int mnTestStep; //0 Not Start 1 Acc 2 Brake
+
+    int mnAxis = 1; //0 x  1 y
+
+};
+#endif // MAINWINDOW_H

+ 281 - 0
src/tool/controller_torquebrake_get_plus/mainwindow.ui

@@ -0,0 +1,281 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>866</width>
+    <height>664</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>MainWindow</string>
+  </property>
+  <widget class="QWidget" name="centralwidget">
+   <widget class="QPlainTextEdit" name="plainTextEdit">
+    <property name="geometry">
+     <rect>
+      <x>50</x>
+      <y>340</y>
+      <width>521</width>
+      <height>121</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>35</y>
+      <width>111</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>油门</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_Torque">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>30</y>
+      <width>181</width>
+      <height>51</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_ClearRecord">
+    <property name="geometry">
+     <rect>
+      <x>620</x>
+      <y>370</y>
+      <width>161</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Clear Record</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_2">
+    <property name="geometry">
+     <rect>
+      <x>450</x>
+      <y>44</y>
+      <width>111</width>
+      <height>31</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>刹车</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_Brake">
+    <property name="geometry">
+     <rect>
+      <x>550</x>
+      <y>31</y>
+      <width>181</width>
+      <height>51</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_3">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>110</y>
+      <width>131</width>
+      <height>21</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>速度上限值(km/h)</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_speedlimit">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>100</y>
+      <width>131</width>
+      <height>31</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_5">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>169</y>
+      <width>131</width>
+      <height>30</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>起步扭矩</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_TorqueStart">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>167</y>
+      <width>131</width>
+      <height>31</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPlainTextEdit" name="plainTextEdit_AvgAcc">
+    <property name="geometry">
+     <rect>
+      <x>50</x>
+      <y>470</y>
+      <width>521</width>
+      <height>131</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_SortTable">
+    <property name="geometry">
+     <rect>
+      <x>620</x>
+      <y>510</y>
+      <width>161</width>
+      <height>41</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Sort Table</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_6">
+    <property name="geometry">
+     <rect>
+      <x>440</x>
+      <y>110</y>
+      <width>121</width>
+      <height>21</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>速度步进(km/h)</string>
+    </property>
+   </widget>
+   <widget class="QLineEdit" name="lineEdit_VelStep">
+    <property name="geometry">
+     <rect>
+      <x>570</x>
+      <y>100</y>
+      <width>151</width>
+      <height>31</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_StartTest">
+    <property name="geometry">
+     <rect>
+      <x>484</x>
+      <y>220</y>
+      <width>161</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Start  Test</string>
+    </property>
+   </widget>
+   <widget class="QProgressBar" name="progressBar">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>290</y>
+      <width>711</width>
+      <height>23</height>
+     </rect>
+    </property>
+    <property name="value">
+     <number>24</number>
+    </property>
+   </widget>
+   <widget class="QCheckBox" name="checkBox_notrecordbrake">
+    <property name="geometry">
+     <rect>
+      <x>450</x>
+      <y>162</y>
+      <width>211</width>
+      <height>31</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>不记录刹车</string>
+    </property>
+   </widget>
+   <widget class="QLabel" name="label_7">
+    <property name="geometry">
+     <rect>
+      <x>60</x>
+      <y>230</y>
+      <width>131</width>
+      <height>30</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>加速度轴</string>
+    </property>
+   </widget>
+   <widget class="QComboBox" name="comboBox_accaxis">
+    <property name="geometry">
+     <rect>
+      <x>200</x>
+      <y>230</y>
+      <width>141</width>
+      <height>41</height>
+     </rect>
+    </property>
+   </widget>
+   <widget class="QPushButton" name="pushButton_StartTest_2">
+    <property name="geometry">
+     <rect>
+      <x>690</x>
+      <y>220</y>
+      <width>161</width>
+      <height>51</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>Stop  Test</string>
+    </property>
+   </widget>
+   <widget class="QCheckBox" name="checkBox_TestEnable">
+    <property name="geometry">
+     <rect>
+      <x>640</x>
+      <y>162</y>
+      <width>111</width>
+      <height>31</height>
+     </rect>
+    </property>
+    <property name="text">
+     <string>测试使能</string>
+    </property>
+   </widget>
+  </widget>
+  <widget class="QMenuBar" name="menubar">
+   <property name="geometry">
+    <rect>
+     <x>0</x>
+     <y>0</y>
+     <width>866</width>
+     <height>28</height>
+    </rect>
+   </property>
+  </widget>
+  <widget class="QStatusBar" name="statusbar"/>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>