0

Qt GUI を使用してセンサーの動きを追跡しています。mainwindow.cpp ファイルは次のとおりです。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ATC3DG.h"
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include "QTimer"
#include "qtimer.h"
#include "math.h"

double square(double x)
{
    return x*x;
}


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_start_clicked()
{
    points.clear();   //points is a global std::vector<cv::Point3> declared in mainwindow.h
    errorCode = InitializeBIRDSystem();
    errorCode = GetBIRDSystemConfiguration(&ATC3DG.m_config);
    id = 0;
    errorCode = SetSystemParameter(SELECT_TRANSMITTER, &id, sizeof(id));
    EM_time = new QTimer(this);
    connect(EM_time, SIGNAL(timeout()), this, SLOT(showValues()));
    EM_time->start();
}

void MainWindow::showValues()
{
    EM_time->stop();
    pRecord = &record;
    {
        sensorID = 0;
        {
            errorCode = GetAsynchronousRecord(sensorID, pRecord, sizeof(record));
            unsigned int status = GetSensorStatus(sensorID);
            if ( status == VALID_STATUS )
            {
                points.push_back(cv::Point3f(record.x, record.y, record.z));
                QString str;
                str.sprintf("%f, %f, %f",record.x, record.y, record.z );
                this->ui->label->setText(str);
            }
        }
    }
    EM_time->start();
}

void MainWindow::on_stop_clicked()
{
    EM_time->stop();
    double sum = 0;
    double dist;
    QString str;

    for (int i=0; i<points.size()-1; i++)
    {
       dist = sqrt(square(points[i].x - points[i+1].x) + square(points[i].y - points[i+1].y) + square(points[i].z - points[i+1].z));
       sum = sum+dist;
    }
    str.sprintf("%d cm", sum*2.54);
    this->ui->distance->setText(str);
}

ATC3DG.h は、センサーのヘッダー ファイルです。record.x、record.y、record.z は、センサーの x、y、および z 位置の 3D 位置をインチで示します。基本的に私がやっていることは、開始ボタンをクリックするとセンサーがオンになり、QTimer がタイムアウト中に発行された信号で開始し、showvalues()関数が実行を開始することです。この関数は、センサーの位置をQt GUI のラベルに表示します。このループ中、ポイントはセンサーのすべての位置値で満たされます。

停止ボタンはタイマーを停止し、ポイントベクトルに含まれるすべてのポイントを使用して距離を計算します。これは以下を使用して行われます。

double sum=0;
double dist;
for (int i=0; i<points.size()-1; i++)
    {
       dist = sqrt(square(points[i].x - points[i+1].x) + square((int)points[i].y - (int)points[i+1].y) + square(points[i].z - points[i+1].z));
       sum = sum+dist;
    }

合計は私に完全に奇妙な値を与えています。たとえば、センサーが約 5 ~ 6 インチしか移動していない場合、100 などの範囲の値を示しています。

私の mainwindow.h ファイルは次のとおりです。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ATC3DG.h"
#include "QTimer"
#include <opencv2/core/core.hpp>

namespace Ui {
class MainWindow;
}

class CSystem
{
public:
    SYSTEM_CONFIGURATION m_config;
};
class CSensor
{
public: SENSOR_CONFIGURATION m_config;
};
class CXmtr
{
public: TRANSMITTER_CONFIGURATION m_config;
};

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();


public slots:
    void on_start_clicked();
    void showValues();
    void on_stop_clicked();

private:
    Ui::MainWindow *ui;
private:
    DOUBLE_POSITION_ANGLES_RECORD record, *pRecord;
    CSystem ATC3DG;
    CSensor *pSensor;
    CXmtr *pXmtr;
    int errorCode;
    int sensorID;
    int i;
    short id;
    QTimer *EM_time;
    std::vector<cv::Point3f> points;
};

#endif // MAINWINDOW_H
4

1 に答える 1

1

あなたのコードに見られる問題:

  1. 中かっこの使いすぎ (何もしない) - これは奇妙に見え、エラーにつながる可能性があります
  2. GetAsynchronousRecord非同期アクションを提案すると、値をすぐに使用できます! このライブラリは知りませんが、疑わしいようです。
  3. 同じメソッドでタイマーを開始および停止します。
  4. おそらく非常にノイズの多いデータから距離の合計を計算しています。これは、一定時間センサーを動かさない場合、ノイズの合計を計算していることを意味し、その結果、センサーがまったく動かされない場合、距離が大きくなります。そのような距離を計算する前に、データをフィルタリングする必要があります (最も簡単なのはローパス フィルターです)。
于 2014-10-08T15:50:23.113 に答える