-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcontrol.cpp
70 lines (66 loc) · 2.86 KB
/
control.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#include "control.h"
#include "ui_control.h"
/****
* Возвращает посчитанное значение интеграла
* Аргументы:
* *sum - указатель на переменную, в которой будет суммироваться интеграл
* prev - предыдущее значение функции в точке
* curr - текущее значение в точке
* delta - шаг интегрирования (например, промежуток времени)
* rank - порядок производной
*/
float integral(float *sum, float prev, float curr, float delta, int rank)
{
*sum += 0.5*(prev+curr)*delta;
return *sum;
}
/***
* Функция для нахождения производной первого порядка:
* f_curr - текущее значение функции в точке
* f_prev - предыдущее значение функции в точке
* delta - шаг сетки (например, промежуток времени)
*/
float derivative_1(float f_curr, float f_prev, float delta)
{
if (delta == 0.0){
return 0.0;
}
return (f_curr - f_prev) / delta;
}
/***
* Функция для нахождения производной второго порядка:
* f_curr - текущее значение функции в точке
* f_prev - предыдущее значение функции в точке
* f_prev_2 - значение функции в точке два шага назад
* delta - шаг сетки (например, промежуток времени)
*/
float derivative_2(float f_curr, float f_prev, float f_prev_2, float delta)
{
if (delta == 0.0){
return 0.0;
}
return (f_curr - 2*f_prev + f_prev_2)/(delta*delta);
}
Control::Control(QWidget *parent) :
QWidget(parent),
ui(new Ui::Control)
{
ui->setupUi(this);
this->setAttribute( Qt::WA_QuitOnClose, false );
connect(ui->horizontalSlider_Kp, static_cast<void (QSlider::*)(int)>(&QSlider::valueChanged), this, [this](int value){
pid_x->Kp = map(value, 0, 2000, -0.5, 1.0);
ui->label_Kp->setText(QString("K<sub>p</sub>: ") + QString::number(pid_x->Kp, 'f', 3));
});
connect(ui->horizontalSlider_Ki, static_cast<void (QSlider::*)(int)>(&QSlider::valueChanged), this, [this](int value){
pid_x->Ki = map(value, 0, 2000, -0.5, 1.0);
ui->label_Ki->setText(QString("K<sub>i</sub>: ") + QString::number(pid_x->Ki, 'f', 3));
});
connect(ui->horizontalSlider_Kd, static_cast<void (QSlider::*)(int)>(&QSlider::valueChanged), this, [this](int value){
pid_x->Kd = map(value, 0, 2000, -0.5, 1.0);
ui->label_Kd->setText(QString("K<sub>d</sub>: ") + QString::number(pid_x->Kd, 'f', 3));
});
}
Control::~Control()
{
delete ui;
}