Revision:
0:4d4bddd95444
Child:
1:436de13b3320
diff -r 000000000000 -r 4d4bddd95444 SLIP_ACCELERATION.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SLIP_ACCELERATION.cpp	Thu Jan 05 11:15:13 2017 +0000
@@ -0,0 +1,100 @@
+#include "SLIP_ACCELERATION.h"
+
+SLIP_ACCELERATION_2WHEEL::SLIP_ACCELERATION_2WHEEL(size_t onBoardDelay_ms_in, float samplingTime):
+        Ts(samplingTime),
+        onBoardDelay_ms(onBoardDelay_ms_in),
+        yawAcce_cal(samplingTime),
+        lpf_dVs(2,samplingTime,200), // 200 Hz
+        hpf_dVs(2,samplingTime,0.015), // 0.015 Hz
+        OnboardSignal_FIFO() // Empty
+{
+    //
+    n = 2; // This class is made specifically for differential-drive vehicle
+    //
+    zeros_2.assign(2,0.0);
+
+    // Parameters
+    btotal = 0.194; // 0.2; // m
+    br = 0.103; // btotal/2.0; // m
+    bl = btotal - br; // m
+    r = 0.139/2.0; // m
+
+    // Inputs
+    acce_vehicleCenter = 0.0;
+    // wheelRotationalAcce = zeros_2;
+    acce_wheelSpeed = zeros_2;
+    yawRate = 0.0;
+
+    // States
+    yawAcce = 0.0;
+    acce_wheelCenter = zeros_2;
+    acce_wheelCenter_delay = zeros_2;
+
+    // Results
+    dVs = zeros_2;
+
+
+    // Initialize the queue
+    for (size_t i = 0; i < onBoardDelay_ms; ++i){
+        OnboardSignal_FIFO.push(zeros_2);
+    }
+}
+vector<float> SLIP_ACCELERATION_2WHEEL::iterateOnce(void){ // Calculate dVs
+
+
+    // Claculate the latest signal
+    acce_wheelCenter_cal();
+
+    // Pushing queue (On-board signals need to be delayed)
+    queueOp(acce_wheelCenter_delay,acce_wheelCenter);
+
+    // Calculate the dVs
+    for (size_t i = 0; i < n; ++i){
+        // acce_wheelSpeed[i] = r*wheelRotationalAcce[i];
+        dVs[i] = acce_wheelSpeed[i] - acce_wheelCenter_delay[i];
+    }
+
+    // Filtering the dVs
+    // dVs_filtered = dVs; // Nothing to do
+    // dVs_filtered = lpf_dVs.filter(dVs); // Low-pass: 0.0 Hz ~ 200 Hz
+    dVs_filtered = hpf_dVs.filter(lpf_dVs.filter(dVs)); // Band-pass: 0.015 Hz ~ 200 Hz
+
+    //
+    // return dVs;
+    return dVs_filtered;
+}
+//
+void SLIP_ACCELERATION_2WHEEL::acce_wheelCenter_cal(void){ // Calculate the linear acceleration at each wheel center
+    // Calculate the yawAcce
+    yawAcce = yawAcce_cal.filter(yawRate);
+
+    // Calculate the linear acceleration at each wheel center
+    // acce_wheelCenter[0] = acce_vehicleCenter; // Right
+    // acce_wheelCenter[1] = acce_vehicleCenter; // Left
+    //
+    acce_wheelCenter[0] = acce_vehicleCenter + yawAcce*br; // Right
+    acce_wheelCenter[1] = acce_vehicleCenter - yawAcce*br; // Left
+}
+//
+void SLIP_ACCELERATION_2WHEEL::queueOp(vector<float> &signal_delayed, const vector<float> &signal_in){ // The operation of the queue
+
+    // Push into queue first to prevent the "empty" error when onBoardDelay_ms is zero
+    OnboardSignal_FIFO.push(signal_in);
+
+    //----------------------------------------------------------//
+
+    // Get the delayed signal: signal_delayed
+    signal_delayed = OnboardSignal_FIFO.front();
+
+    // Control the buffer size
+    // Currently, the size of the queue is expected to be (onBoardDelay_ms + 1)
+    if (OnboardSignal_FIFO.size() <= onBoardDelay_ms){
+        // nothing to do
+    }else{
+        //
+        while(OnboardSignal_FIFO.size() > onBoardDelay_ms){
+            OnboardSignal_FIFO.pop();
+        }
+        // Now: OnboardSignal_FIFO.size() = onBoardDelay_ms
+    }
+}