User | Revision | Line number | New contents of line |
benson516 |
0:4d4bddd95444
|
1
|
#include "SLIP_ACCELERATION.h"
|
benson516 |
0:4d4bddd95444
|
2
|
|
benson516 |
0:4d4bddd95444
|
3
|
SLIP_ACCELERATION_2WHEEL::SLIP_ACCELERATION_2WHEEL(size_t onBoardDelay_ms_in, float samplingTime):
|
benson516 |
0:4d4bddd95444
|
4
|
Ts(samplingTime),
|
benson516 |
0:4d4bddd95444
|
5
|
onBoardDelay_ms(onBoardDelay_ms_in),
|
benson516 |
0:4d4bddd95444
|
6
|
yawAcce_cal(samplingTime),
|
benson516 |
1:436de13b3320
|
7
|
lpf_dVs(2,samplingTime,70), // 200 Hz
|
benson516 |
0:4d4bddd95444
|
8
|
hpf_dVs(2,samplingTime,0.015), // 0.015 Hz
|
benson516 |
0:4d4bddd95444
|
9
|
OnboardSignal_FIFO() // Empty
|
benson516 |
0:4d4bddd95444
|
10
|
{
|
benson516 |
0:4d4bddd95444
|
11
|
//
|
benson516 |
0:4d4bddd95444
|
12
|
n = 2; // This class is made specifically for differential-drive vehicle
|
benson516 |
0:4d4bddd95444
|
13
|
//
|
benson516 |
0:4d4bddd95444
|
14
|
zeros_2.assign(2,0.0);
|
benson516 |
0:4d4bddd95444
|
15
|
|
benson516 |
0:4d4bddd95444
|
16
|
// Parameters
|
benson516 |
0:4d4bddd95444
|
17
|
btotal = 0.194; // 0.2; // m
|
benson516 |
0:4d4bddd95444
|
18
|
br = 0.103; // btotal/2.0; // m
|
benson516 |
0:4d4bddd95444
|
19
|
bl = btotal - br; // m
|
benson516 |
0:4d4bddd95444
|
20
|
r = 0.139/2.0; // m
|
benson516 |
0:4d4bddd95444
|
21
|
|
benson516 |
0:4d4bddd95444
|
22
|
// Inputs
|
benson516 |
0:4d4bddd95444
|
23
|
acce_vehicleCenter = 0.0;
|
benson516 |
0:4d4bddd95444
|
24
|
// wheelRotationalAcce = zeros_2;
|
benson516 |
0:4d4bddd95444
|
25
|
acce_wheelSpeed = zeros_2;
|
benson516 |
0:4d4bddd95444
|
26
|
yawRate = 0.0;
|
benson516 |
0:4d4bddd95444
|
27
|
|
benson516 |
0:4d4bddd95444
|
28
|
// States
|
benson516 |
0:4d4bddd95444
|
29
|
yawAcce = 0.0;
|
benson516 |
0:4d4bddd95444
|
30
|
acce_wheelCenter = zeros_2;
|
benson516 |
0:4d4bddd95444
|
31
|
acce_wheelCenter_delay = zeros_2;
|
benson516 |
0:4d4bddd95444
|
32
|
|
benson516 |
0:4d4bddd95444
|
33
|
// Results
|
benson516 |
0:4d4bddd95444
|
34
|
dVs = zeros_2;
|
benson516 |
0:4d4bddd95444
|
35
|
|
benson516 |
0:4d4bddd95444
|
36
|
|
benson516 |
0:4d4bddd95444
|
37
|
// Initialize the queue
|
benson516 |
0:4d4bddd95444
|
38
|
for (size_t i = 0; i < onBoardDelay_ms; ++i){
|
benson516 |
0:4d4bddd95444
|
39
|
OnboardSignal_FIFO.push(zeros_2);
|
benson516 |
0:4d4bddd95444
|
40
|
}
|
benson516 |
0:4d4bddd95444
|
41
|
}
|
benson516 |
0:4d4bddd95444
|
42
|
vector<float> SLIP_ACCELERATION_2WHEEL::iterateOnce(void){ // Calculate dVs
|
benson516 |
0:4d4bddd95444
|
43
|
|
benson516 |
0:4d4bddd95444
|
44
|
|
benson516 |
0:4d4bddd95444
|
45
|
// Claculate the latest signal
|
benson516 |
0:4d4bddd95444
|
46
|
acce_wheelCenter_cal();
|
benson516 |
0:4d4bddd95444
|
47
|
|
benson516 |
0:4d4bddd95444
|
48
|
// Pushing queue (On-board signals need to be delayed)
|
benson516 |
0:4d4bddd95444
|
49
|
queueOp(acce_wheelCenter_delay,acce_wheelCenter);
|
benson516 |
0:4d4bddd95444
|
50
|
|
benson516 |
0:4d4bddd95444
|
51
|
// Calculate the dVs
|
benson516 |
0:4d4bddd95444
|
52
|
for (size_t i = 0; i < n; ++i){
|
benson516 |
0:4d4bddd95444
|
53
|
// acce_wheelSpeed[i] = r*wheelRotationalAcce[i];
|
benson516 |
0:4d4bddd95444
|
54
|
dVs[i] = acce_wheelSpeed[i] - acce_wheelCenter_delay[i];
|
benson516 |
0:4d4bddd95444
|
55
|
}
|
benson516 |
0:4d4bddd95444
|
56
|
|
benson516 |
0:4d4bddd95444
|
57
|
// Filtering the dVs
|
benson516 |
0:4d4bddd95444
|
58
|
// dVs_filtered = dVs; // Nothing to do
|
benson516 |
0:4d4bddd95444
|
59
|
// dVs_filtered = lpf_dVs.filter(dVs); // Low-pass: 0.0 Hz ~ 200 Hz
|
benson516 |
0:4d4bddd95444
|
60
|
dVs_filtered = hpf_dVs.filter(lpf_dVs.filter(dVs)); // Band-pass: 0.015 Hz ~ 200 Hz
|
benson516 |
0:4d4bddd95444
|
61
|
|
benson516 |
0:4d4bddd95444
|
62
|
//
|
benson516 |
0:4d4bddd95444
|
63
|
// return dVs;
|
benson516 |
0:4d4bddd95444
|
64
|
return dVs_filtered;
|
benson516 |
0:4d4bddd95444
|
65
|
}
|
benson516 |
0:4d4bddd95444
|
66
|
//
|
benson516 |
0:4d4bddd95444
|
67
|
void SLIP_ACCELERATION_2WHEEL::acce_wheelCenter_cal(void){ // Calculate the linear acceleration at each wheel center
|
benson516 |
0:4d4bddd95444
|
68
|
// Calculate the yawAcce
|
benson516 |
0:4d4bddd95444
|
69
|
yawAcce = yawAcce_cal.filter(yawRate);
|
benson516 |
0:4d4bddd95444
|
70
|
|
benson516 |
0:4d4bddd95444
|
71
|
// Calculate the linear acceleration at each wheel center
|
benson516 |
0:4d4bddd95444
|
72
|
// acce_wheelCenter[0] = acce_vehicleCenter; // Right
|
benson516 |
0:4d4bddd95444
|
73
|
// acce_wheelCenter[1] = acce_vehicleCenter; // Left
|
benson516 |
0:4d4bddd95444
|
74
|
//
|
benson516 |
0:4d4bddd95444
|
75
|
acce_wheelCenter[0] = acce_vehicleCenter + yawAcce*br; // Right
|
benson516 |
0:4d4bddd95444
|
76
|
acce_wheelCenter[1] = acce_vehicleCenter - yawAcce*br; // Left
|
benson516 |
0:4d4bddd95444
|
77
|
}
|
benson516 |
0:4d4bddd95444
|
78
|
//
|
benson516 |
0:4d4bddd95444
|
79
|
void SLIP_ACCELERATION_2WHEEL::queueOp(vector<float> &signal_delayed, const vector<float> &signal_in){ // The operation of the queue
|
benson516 |
0:4d4bddd95444
|
80
|
|
benson516 |
0:4d4bddd95444
|
81
|
// Push into queue first to prevent the "empty" error when onBoardDelay_ms is zero
|
benson516 |
0:4d4bddd95444
|
82
|
OnboardSignal_FIFO.push(signal_in);
|
benson516 |
0:4d4bddd95444
|
83
|
|
benson516 |
0:4d4bddd95444
|
84
|
//----------------------------------------------------------//
|
benson516 |
0:4d4bddd95444
|
85
|
|
benson516 |
0:4d4bddd95444
|
86
|
// Get the delayed signal: signal_delayed
|
benson516 |
0:4d4bddd95444
|
87
|
signal_delayed = OnboardSignal_FIFO.front();
|
benson516 |
0:4d4bddd95444
|
88
|
|
benson516 |
0:4d4bddd95444
|
89
|
// Control the buffer size
|
benson516 |
0:4d4bddd95444
|
90
|
// Currently, the size of the queue is expected to be (onBoardDelay_ms + 1)
|
benson516 |
0:4d4bddd95444
|
91
|
if (OnboardSignal_FIFO.size() <= onBoardDelay_ms){
|
benson516 |
0:4d4bddd95444
|
92
|
// nothing to do
|
benson516 |
0:4d4bddd95444
|
93
|
}else{
|
benson516 |
0:4d4bddd95444
|
94
|
//
|
benson516 |
0:4d4bddd95444
|
95
|
while(OnboardSignal_FIFO.size() > onBoardDelay_ms){
|
benson516 |
0:4d4bddd95444
|
96
|
OnboardSignal_FIFO.pop();
|
benson516 |
0:4d4bddd95444
|
97
|
}
|
benson516 |
0:4d4bddd95444
|
98
|
// Now: OnboardSignal_FIFO.size() = onBoardDelay_ms
|
benson516 |
0:4d4bddd95444
|
99
|
}
|
benson516 |
0:4d4bddd95444
|
100
|
}
|