The library for calculating and processing the slip acceleration

Committer:
benson516
Date:
Tue Feb 07 09:54:15 2017 +0000
Revision:
4:7b8e13c54dfb
Parent:
3:265a69f4c360
test succeed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benson516 0:4d4bddd95444 1 #include "SLIP_ACCELERATION.h"
benson516 0:4d4bddd95444 2
benson516 3:265a69f4c360 3 SLIP_ACCELERATION_2WHEEL::SLIP_ACCELERATION_2WHEEL(size_t onBoardDelay_ms_in, size_t wheelDelay_ms_in, float samplingTime):
benson516 0:4d4bddd95444 4 Ts(samplingTime),
benson516 0:4d4bddd95444 5 onBoardDelay_ms(onBoardDelay_ms_in),
benson516 3:265a69f4c360 6 wheelDelay_ms(wheelDelay_ms_in),
benson516 0:4d4bddd95444 7 yawAcce_cal(samplingTime),
benson516 4:7b8e13c54dfb 8 lpf_dVs(2, samplingTime, 300.0, 1), // 200 Hz
benson516 3:265a69f4c360 9 // hpf_dVs(2,samplingTime, 0.01, 4), // 0.1 Hz, 4th order critical-damped HPF
benson516 4:7b8e13c54dfb 10 hpf_dVs(2,samplingTime, 0.01, 1), // 0.1 Hz, 4th order critical-damped HPF
benson516 4:7b8e13c54dfb 11 lpf_dVs_biasedEst(2,samplingTime, 0.5, 2), // 0.5 Hz
benson516 3:265a69f4c360 12 OnboardSignal_FIFO(), // Empty
benson516 3:265a69f4c360 13 wheelSignal_FIFO() // Empty
benson516 0:4d4bddd95444 14 {
benson516 0:4d4bddd95444 15 //
benson516 0:4d4bddd95444 16 n = 2; // This class is made specifically for differential-drive vehicle
benson516 0:4d4bddd95444 17 //
benson516 0:4d4bddd95444 18 zeros_2.assign(2,0.0);
benson516 3:265a69f4c360 19 // Not initialized
benson516 3:265a69f4c360 20 Flag_Init = false;
benson516 3:265a69f4c360 21 init_count = 0;
benson516 0:4d4bddd95444 22
benson516 0:4d4bddd95444 23 // Parameters
benson516 0:4d4bddd95444 24 btotal = 0.194; // 0.2; // m
benson516 0:4d4bddd95444 25 br = 0.103; // btotal/2.0; // m
benson516 0:4d4bddd95444 26 bl = btotal - br; // m
benson516 0:4d4bddd95444 27 r = 0.139/2.0; // m
benson516 0:4d4bddd95444 28
benson516 0:4d4bddd95444 29 // Inputs
benson516 0:4d4bddd95444 30 acce_vehicleCenter = 0.0;
benson516 0:4d4bddd95444 31 // wheelRotationalAcce = zeros_2;
benson516 0:4d4bddd95444 32 acce_wheelSpeed = zeros_2;
benson516 0:4d4bddd95444 33 yawRate = 0.0;
benson516 0:4d4bddd95444 34
benson516 0:4d4bddd95444 35 // States
benson516 0:4d4bddd95444 36 yawAcce = 0.0;
benson516 0:4d4bddd95444 37 acce_wheelCenter = zeros_2;
benson516 0:4d4bddd95444 38 acce_wheelCenter_delay = zeros_2;
benson516 3:265a69f4c360 39 acce_wheelSpeed_delay = zeros_2;
benson516 0:4d4bddd95444 40
benson516 0:4d4bddd95444 41 // Results
benson516 0:4d4bddd95444 42 dVs = zeros_2;
benson516 3:265a69f4c360 43 dVs_filtered = zeros_2;
benson516 3:265a69f4c360 44 //
benson516 3:265a69f4c360 45 dVs_unbiased = zeros_2;
benson516 3:265a69f4c360 46 dVs_bias = zeros_2;
benson516 0:4d4bddd95444 47
benson516 0:4d4bddd95444 48
benson516 0:4d4bddd95444 49 // Initialize the queue
benson516 0:4d4bddd95444 50 for (size_t i = 0; i < onBoardDelay_ms; ++i){
benson516 0:4d4bddd95444 51 OnboardSignal_FIFO.push(zeros_2);
benson516 0:4d4bddd95444 52 }
benson516 3:265a69f4c360 53 // Initialize the queue
benson516 3:265a69f4c360 54 for (size_t i = 0; i < onBoardDelay_ms; ++i){
benson516 3:265a69f4c360 55 wheelSignal_FIFO.push(zeros_2);
benson516 3:265a69f4c360 56 }
benson516 0:4d4bddd95444 57 }
benson516 0:4d4bddd95444 58 vector<float> SLIP_ACCELERATION_2WHEEL::iterateOnce(void){ // Calculate dVs
benson516 0:4d4bddd95444 59
benson516 3:265a69f4c360 60 // Initialization
benson516 3:265a69f4c360 61 if (!Flag_Init){
benson516 3:265a69f4c360 62 if (init_count <= (max(wheelDelay_ms, onBoardDelay_ms)+1) ){
benson516 3:265a69f4c360 63 dVs_filtered = zeros_2;
benson516 3:265a69f4c360 64 init_count++;
benson516 3:265a69f4c360 65 return dVs_filtered;
benson516 3:265a69f4c360 66 }
benson516 3:265a69f4c360 67 dVs_bias = zeros_2;
benson516 3:265a69f4c360 68 dVs_unbiased = dVs;
benson516 3:265a69f4c360 69 dVs_filtered = zeros_2;
benson516 3:265a69f4c360 70 //
benson516 3:265a69f4c360 71 resetFilter();
benson516 3:265a69f4c360 72 Flag_Init = true;
benson516 3:265a69f4c360 73 return dVs_filtered; // output = 0.0
benson516 3:265a69f4c360 74 }
benson516 0:4d4bddd95444 75
benson516 0:4d4bddd95444 76 // Claculate the latest signal
benson516 0:4d4bddd95444 77 acce_wheelCenter_cal();
benson516 0:4d4bddd95444 78
benson516 0:4d4bddd95444 79 // Pushing queue (On-board signals need to be delayed)
benson516 3:265a69f4c360 80 // queueOp(acce_wheelCenter_delay,acce_wheelCenter);
benson516 3:265a69f4c360 81 queueOp(acce_wheelCenter_delay, acce_wheelCenter, OnboardSignal_FIFO, onBoardDelay_ms);
benson516 3:265a69f4c360 82 queueOp(acce_wheelSpeed_delay, acce_wheelSpeed, wheelSignal_FIFO, wheelDelay_ms);
benson516 0:4d4bddd95444 83
benson516 0:4d4bddd95444 84 // Calculate the dVs
benson516 3:265a69f4c360 85 /*
benson516 0:4d4bddd95444 86 for (size_t i = 0; i < n; ++i){
benson516 0:4d4bddd95444 87 // acce_wheelSpeed[i] = r*wheelRotationalAcce[i];
benson516 3:265a69f4c360 88 // dVs[i] = acce_wheelSpeed[i] - acce_wheelCenter_delay[i];
benson516 3:265a69f4c360 89 dVs[i] = acce_wheelSpeed_delay[i] - acce_wheelCenter_delay[i];
benson516 0:4d4bddd95444 90 }
benson516 3:265a69f4c360 91 */
benson516 3:265a69f4c360 92
benson516 3:265a69f4c360 93 // dVs = acce_wheelSpeed_delay - acce_wheelCenter_delay;
benson516 3:265a69f4c360 94 dVs = Get_VectorPlus(acce_wheelSpeed_delay, acce_wheelCenter_delay, true); // minus
benson516 3:265a69f4c360 95
benson516 0:4d4bddd95444 96
benson516 0:4d4bddd95444 97 // Filtering the dVs
benson516 0:4d4bddd95444 98 // dVs_filtered = dVs; // Nothing to do
benson516 0:4d4bddd95444 99 // dVs_filtered = lpf_dVs.filter(dVs); // Low-pass: 0.0 Hz ~ 200 Hz
benson516 3:265a69f4c360 100 //
benson516 2:e275f3919042 101 // dVs_filtered = hpf_dVs.filter(lpf_dVs.filter(dVs)); // Band-pass: 0.015 Hz ~ 200 Hz
benson516 3:265a69f4c360 102
benson516 4:7b8e13c54dfb 103
benson516 4:7b8e13c54dfb 104
benson516 3:265a69f4c360 105 // dVs_unbiased = dVs - dVs_bias
benson516 3:265a69f4c360 106 dVs_unbiased = Get_VectorPlus(dVs, dVs_bias, true); // minus
benson516 4:7b8e13c54dfb 107 dVs_filtered = hpf_dVs.filter(lpf_dVs.filter(dVs_unbiased)); // Band-pass: 0.015 Hz ~ 200 Hz
benson516 3:265a69f4c360 108
benson516 4:7b8e13c54dfb 109
benson516 4:7b8e13c54dfb 110 /*
benson516 4:7b8e13c54dfb 111 // dVs_unbiased = dVs - dVs_bias
benson516 4:7b8e13c54dfb 112 dVs_unbiased = lpf_dVs.filter( Get_VectorPlus(dVs, dVs_bias, true) ); // minus
benson516 4:7b8e13c54dfb 113 dVs_filtered = hpf_dVs.filter(dVs_unbiased); // Band-pass: 0.015 Hz ~ 200 Hz
benson516 4:7b8e13c54dfb 114 */
benson516 4:7b8e13c54dfb 115
benson516 4:7b8e13c54dfb 116 lpf_dVs_biasedEst.filter(dVs); // Get the estimation of the bias in dVs
benson516 4:7b8e13c54dfb 117
benson516 0:4d4bddd95444 118
benson516 0:4d4bddd95444 119 //
benson516 0:4d4bddd95444 120 // return dVs;
benson516 0:4d4bddd95444 121 return dVs_filtered;
benson516 0:4d4bddd95444 122 }
benson516 3:265a69f4c360 123 void SLIP_ACCELERATION_2WHEEL::resetFilter(void){ // Rest all filters, includeing LPF and HPF
benson516 3:265a69f4c360 124 // Bias calculation
benson516 3:265a69f4c360 125 // dVs_bias += dVs_unbiased - dVs_filtered
benson516 4:7b8e13c54dfb 126 // Get_VectorIncrement(dVs_bias, Get_VectorPlus(dVs_unbiased, dVs_filtered, true), false); // +=
benson516 4:7b8e13c54dfb 127
benson516 4:7b8e13c54dfb 128 // Set the bias as the estimation of bias
benson516 4:7b8e13c54dfb 129 dVs_bias = lpf_dVs_biasedEst.output;
benson516 4:7b8e13c54dfb 130 dVs_unbiased = zeros_2;
benson516 4:7b8e13c54dfb 131
benson516 3:265a69f4c360 132 //
benson516 3:265a69f4c360 133 yawAcce_cal.reset(yawRate);
benson516 3:265a69f4c360 134 lpf_dVs.reset(zeros_2);
benson516 3:265a69f4c360 135 hpf_dVs.reset(zeros_2);
benson516 3:265a69f4c360 136 dVs_filtered = zeros_2;
benson516 3:265a69f4c360 137 }
benson516 0:4d4bddd95444 138 //
benson516 0:4d4bddd95444 139 void SLIP_ACCELERATION_2WHEEL::acce_wheelCenter_cal(void){ // Calculate the linear acceleration at each wheel center
benson516 0:4d4bddd95444 140 // Calculate the yawAcce
benson516 0:4d4bddd95444 141 yawAcce = yawAcce_cal.filter(yawRate);
benson516 0:4d4bddd95444 142
benson516 0:4d4bddd95444 143 // Calculate the linear acceleration at each wheel center
benson516 0:4d4bddd95444 144 // acce_wheelCenter[0] = acce_vehicleCenter; // Right
benson516 0:4d4bddd95444 145 // acce_wheelCenter[1] = acce_vehicleCenter; // Left
benson516 0:4d4bddd95444 146 //
benson516 0:4d4bddd95444 147 acce_wheelCenter[0] = acce_vehicleCenter + yawAcce*br; // Right
benson516 3:265a69f4c360 148 acce_wheelCenter[1] = acce_vehicleCenter - yawAcce*bl; // Left
benson516 0:4d4bddd95444 149 }
benson516 0:4d4bddd95444 150 //
benson516 0:4d4bddd95444 151 void SLIP_ACCELERATION_2WHEEL::queueOp(vector<float> &signal_delayed, const vector<float> &signal_in){ // The operation of the queue
benson516 0:4d4bddd95444 152
benson516 0:4d4bddd95444 153 // Push into queue first to prevent the "empty" error when onBoardDelay_ms is zero
benson516 0:4d4bddd95444 154 OnboardSignal_FIFO.push(signal_in);
benson516 0:4d4bddd95444 155
benson516 0:4d4bddd95444 156 //----------------------------------------------------------//
benson516 0:4d4bddd95444 157
benson516 0:4d4bddd95444 158 // Get the delayed signal: signal_delayed
benson516 0:4d4bddd95444 159 signal_delayed = OnboardSignal_FIFO.front();
benson516 0:4d4bddd95444 160
benson516 0:4d4bddd95444 161 // Control the buffer size
benson516 0:4d4bddd95444 162 // Currently, the size of the queue is expected to be (onBoardDelay_ms + 1)
benson516 0:4d4bddd95444 163 if (OnboardSignal_FIFO.size() <= onBoardDelay_ms){
benson516 0:4d4bddd95444 164 // nothing to do
benson516 0:4d4bddd95444 165 }else{
benson516 0:4d4bddd95444 166 //
benson516 0:4d4bddd95444 167 while(OnboardSignal_FIFO.size() > onBoardDelay_ms){
benson516 0:4d4bddd95444 168 OnboardSignal_FIFO.pop();
benson516 0:4d4bddd95444 169 }
benson516 0:4d4bddd95444 170 // Now: OnboardSignal_FIFO.size() = onBoardDelay_ms
benson516 0:4d4bddd95444 171 }
benson516 0:4d4bddd95444 172 }
benson516 3:265a69f4c360 173 void SLIP_ACCELERATION_2WHEEL::queueOp(vector<float> &signal_delayed, const vector<float> &signal_in, queue<vector<float> > &queue_in, size_t queue_length){ // The operation of the queue
benson516 3:265a69f4c360 174
benson516 3:265a69f4c360 175 // Push into queue first to prevent the "empty" error when queue_length is zero
benson516 3:265a69f4c360 176 queue_in.push(signal_in);
benson516 3:265a69f4c360 177
benson516 3:265a69f4c360 178 //----------------------------------------------------------//
benson516 3:265a69f4c360 179
benson516 3:265a69f4c360 180 // Get the delayed signal: signal_delayed
benson516 3:265a69f4c360 181 signal_delayed = queue_in.front();
benson516 3:265a69f4c360 182
benson516 3:265a69f4c360 183 // Control the buffer size
benson516 3:265a69f4c360 184 // Currently, the size of the queue is expected to be (queue_length + 1)
benson516 3:265a69f4c360 185 if (queue_in.size() <= queue_length){
benson516 3:265a69f4c360 186 // nothing to do
benson516 3:265a69f4c360 187 }else{
benson516 3:265a69f4c360 188 //
benson516 3:265a69f4c360 189 while(queue_in.size() > queue_length){
benson516 3:265a69f4c360 190 queue_in.pop();
benson516 3:265a69f4c360 191 }
benson516 3:265a69f4c360 192 // Now: queue_in.size() = queue_length
benson516 3:265a69f4c360 193 }
benson516 3:265a69f4c360 194 }
benson516 3:265a69f4c360 195 // Utilities
benson516 3:265a69f4c360 196 void SLIP_ACCELERATION_2WHEEL::Mat_multiply_Vec(vector<float> &v_out, const vector<vector<float> > &m_left, const vector<float> &v_right){ // v_out = m_left*v_right
benson516 3:265a69f4c360 197 static vector<float>::iterator it_out;
benson516 3:265a69f4c360 198 static vector<const float>::iterator it_m_row;
benson516 3:265a69f4c360 199 static vector<const float>::iterator it_v;
benson516 3:265a69f4c360 200 //
benson516 3:265a69f4c360 201 it_out = v_out.begin();
benson516 3:265a69f4c360 202 for (size_t i = 0; i < m_left.size(); ++i){
benson516 3:265a69f4c360 203 *it_out = 0.0;
benson516 3:265a69f4c360 204 it_m_row = m_left[i].begin();
benson516 3:265a69f4c360 205 it_v = v_right.begin();
benson516 3:265a69f4c360 206 for (size_t j = 0; j < m_left[i].size(); ++j){
benson516 3:265a69f4c360 207 // *it_out += m_left[i][j] * v_right[j];
benson516 3:265a69f4c360 208 if (*it_m_row != 0.0 && *it_v != 0.0){
benson516 3:265a69f4c360 209 (*it_out) += (*it_m_row) * (*it_v);
benson516 3:265a69f4c360 210 }else{
benson516 3:265a69f4c360 211 // (*it_out) += 0.0
benson516 3:265a69f4c360 212 }
benson516 3:265a69f4c360 213 // (*it_out) += (*it_m_row) * (*it_v);
benson516 3:265a69f4c360 214 //
benson516 3:265a69f4c360 215 it_m_row++;
benson516 3:265a69f4c360 216 it_v++;
benson516 3:265a69f4c360 217 }
benson516 3:265a69f4c360 218 it_out++;
benson516 3:265a69f4c360 219 }
benson516 3:265a69f4c360 220 }
benson516 3:265a69f4c360 221 vector<float> SLIP_ACCELERATION_2WHEEL::Mat_multiply_Vec(const vector<vector<float> > &m_left, const vector<float> &v_right){ // v_out = m_left*v_right
benson516 3:265a69f4c360 222 static vector<float> v_out;
benson516 3:265a69f4c360 223 // Size check
benson516 3:265a69f4c360 224 if (v_out.size() != m_left.size()){
benson516 3:265a69f4c360 225 v_out.resize(m_left.size());
benson516 3:265a69f4c360 226 }
benson516 3:265a69f4c360 227 // Iterators
benson516 3:265a69f4c360 228 static vector<float>::iterator it_out;
benson516 3:265a69f4c360 229 static vector<const float>::iterator it_m_row;
benson516 3:265a69f4c360 230 static vector<const float>::iterator it_v;
benson516 3:265a69f4c360 231 //
benson516 3:265a69f4c360 232 it_out = v_out.begin();
benson516 3:265a69f4c360 233 for (size_t i = 0; i < m_left.size(); ++i){
benson516 3:265a69f4c360 234 *it_out = 0.0;
benson516 3:265a69f4c360 235 it_m_row = m_left[i].begin();
benson516 3:265a69f4c360 236 it_v = v_right.begin();
benson516 3:265a69f4c360 237 for (size_t j = 0; j < m_left[i].size(); ++j){
benson516 3:265a69f4c360 238 // *it_out += m_left[i][j] * v_right[j];
benson516 3:265a69f4c360 239 if (*it_m_row != 0.0 && *it_v != 0.0){
benson516 3:265a69f4c360 240 (*it_out) += (*it_m_row) * (*it_v);
benson516 3:265a69f4c360 241 }else{
benson516 3:265a69f4c360 242 // (*it_out) += 0.0
benson516 3:265a69f4c360 243 }
benson516 3:265a69f4c360 244 // (*it_out) += (*it_m_row) * (*it_v);
benson516 3:265a69f4c360 245 //
benson516 3:265a69f4c360 246 it_m_row++;
benson516 3:265a69f4c360 247 it_v++;
benson516 3:265a69f4c360 248 }
benson516 3:265a69f4c360 249 it_out++;
benson516 3:265a69f4c360 250 }
benson516 3:265a69f4c360 251 return v_out;
benson516 3:265a69f4c360 252 }
benson516 3:265a69f4c360 253 vector<float> SLIP_ACCELERATION_2WHEEL::Get_VectorPlus(const vector<float> &v_a, const vector<float> &v_b, bool is_minus) // v_a + (or -) v_b
benson516 3:265a69f4c360 254 {
benson516 3:265a69f4c360 255 static vector<float> v_c;
benson516 3:265a69f4c360 256 // Size check
benson516 3:265a69f4c360 257 if (v_c.size() != v_a.size()){
benson516 3:265a69f4c360 258 v_c.resize(v_a.size());
benson516 3:265a69f4c360 259 }
benson516 3:265a69f4c360 260 //
benson516 3:265a69f4c360 261 for (size_t i = 0; i < v_a.size(); ++i){
benson516 3:265a69f4c360 262 if (is_minus){
benson516 3:265a69f4c360 263 v_c[i] = v_a[i] - v_b[i];
benson516 3:265a69f4c360 264 }else{
benson516 3:265a69f4c360 265 v_c[i] = v_a[i] + v_b[i];
benson516 3:265a69f4c360 266 }
benson516 3:265a69f4c360 267 }
benson516 3:265a69f4c360 268 return v_c;
benson516 3:265a69f4c360 269 }
benson516 3:265a69f4c360 270 vector<float> SLIP_ACCELERATION_2WHEEL::Get_VectorScalarMultiply(const vector<float> &v_a, float scale) // scale*v_a
benson516 3:265a69f4c360 271 {
benson516 3:265a69f4c360 272 static vector<float> v_c;
benson516 3:265a69f4c360 273 // Size check
benson516 3:265a69f4c360 274 if (v_c.size() != v_a.size()){
benson516 3:265a69f4c360 275 v_c.resize(v_a.size());
benson516 3:265a69f4c360 276 }
benson516 3:265a69f4c360 277 // for pure negative
benson516 3:265a69f4c360 278 if (scale == -1.0){
benson516 3:265a69f4c360 279 for (size_t i = 0; i < v_a.size(); ++i){
benson516 3:265a69f4c360 280 v_c[i] = -v_a[i];
benson516 3:265a69f4c360 281 }
benson516 3:265a69f4c360 282 return v_c;
benson516 3:265a69f4c360 283 }
benson516 3:265a69f4c360 284 // else
benson516 3:265a69f4c360 285 for (size_t i = 0; i < v_a.size(); ++i){
benson516 3:265a69f4c360 286 v_c[i] = scale*v_a[i];
benson516 3:265a69f4c360 287
benson516 3:265a69f4c360 288 }
benson516 3:265a69f4c360 289 return v_c;
benson516 3:265a69f4c360 290 }
benson516 3:265a69f4c360 291 // Increment
benson516 3:265a69f4c360 292 void SLIP_ACCELERATION_2WHEEL::Get_VectorIncrement(vector<float> &v_a, const vector<float> &v_b, bool is_minus){ // v_a += (or -=) v_b
benson516 3:265a69f4c360 293 // Size check
benson516 3:265a69f4c360 294 if (v_a.size() != v_b.size()){
benson516 3:265a69f4c360 295 v_a.resize(v_b.size());
benson516 3:265a69f4c360 296 }
benson516 3:265a69f4c360 297 //
benson516 3:265a69f4c360 298 if (is_minus){ // -=
benson516 3:265a69f4c360 299 for (size_t i = 0; i < v_b.size(); ++i){
benson516 3:265a69f4c360 300 v_a[i] -= v_b[i];
benson516 3:265a69f4c360 301 }
benson516 3:265a69f4c360 302 }else{ // +=
benson516 3:265a69f4c360 303 for (size_t i = 0; i < v_b.size(); ++i){
benson516 3:265a69f4c360 304 v_a[i] += v_b[i];
benson516 3:265a69f4c360 305 }
benson516 3:265a69f4c360 306 }
benson516 3:265a69f4c360 307
benson516 3:265a69f4c360 308 }