我認為大多數人都知道如何在計算機編程中進行數值推導(作為極限-> 0;閱讀:“極限接近零”)。
//example code for derivation of position over time to obtain velocity
float currPosition, prevPosition, currTime, lastTime, velocity;
while (true)
{
prevPosition = currPosition;
currPosition = getNewPosition();
lastTime = currTime;
currTime = getTimestamp();
// Numerical derivation of position over time to obtain velocity
velocity = (currPosition - prevPosition)/(currTime - lastTime);
}
// since the while loop runs at the shortest period of time, we've already
// achieved limit --> 0;
這是大多數派生編程的基本構建塊。
我怎樣才能用積分做到這一點?我是使用 for 回圈并添加還是什么?
uj5u.com熱心網友回復:
物理、地圖、機器人、游戲、航位推算和控制代碼中的數值推導和集成
請注意我在下面使用“估計”與“測量”這兩個詞的位置。區別很重要。
- 測量值是來自傳感器的直接讀數。
- 例如:GPS 直接測量位置(米),而速度計直接測量速度(米/秒)。
- 估計值是您可以通過積分和推導(匯出)測量值獲得的計算預測值。例如:您可以推匯出相對于時間的位置測量值 (m) 以獲得速度或速度 (m/s)估計值,并且您可以整合相對于時間的速度或速度測量值 (m/s) 以獲得位置或位移 (m )估計。
例如,下表是正確的。例如,將第 2 行讀為:“如果您對速度測量值求導,則得到加速度估計值,如果求積分,則得到位置估計值。”
Derivatives and integrals of position
Measurement, y Derivative Integral
Estimate (dy/dt) Estimate (dy*dt)
----------------------- ----------------------- -----------------------
position [m] velocity [m/s] - [m*s]
velocity [m/s] acceleration [m/s^2] position [m]
acceleration [m/s^2] jerk [m/s^3] velocity [m/s]
jerk [m/s^3] snap [m/s^4] acceleration [m/s^2]
snap [m/s^4] crackle [m/s^5] jerk [m/s^3]
crackle [m/s^5] pop [m/s^6] snap [m/s^4]
pop [m/s^6] - [m/s^7] crackle [m/s^5]
對于 jerk、snap 或 jounce、crackle 和 pop,請參閱:
因此,以高采樣率進行采樣是好的。您可以對這些樣本進行基本過濾。
如果您以高速率處理原始樣本,則對高采樣率原始樣本進行數值推導最終會匯出大量噪聲,從而產生噪聲導數估計。這不是很好。最好對過濾后的樣本進行推導:例如:100 或 1000 個快速樣本的平均值。然而,對高采樣率的原始樣本進行數值積分很好,因為正如 Edgar Bonet所說,“積分時,你得到的樣本越多,噪聲的平均效果就越好。” 這與我上面的筆記一致。
但是,僅將過濾后的樣本用于數值積分和數值推導就可以了。
使用合理的控制回路速率
控制回路速率不應太快。采樣率越高越好,因為您可以過濾它們以減少噪音。然而,控制回路速率越高,不一定越好,因為控制回路速率存在一個最佳點。如果您的控制回路速率太慢,系統的頻率回應會很慢,并且對環境的回應速度不夠快,如果控制回路速率太快,它最終只會回應樣本噪聲而不是真實測量資料的變化。
因此,即使您有 1 kHz 的采樣率,例如,為了對資料進行過采樣和過濾,也不需要快速的控制回路,因為在非常小的時間間隔內真實傳感器讀數的噪聲會太大。在10 Hz ~ 100 Hz的任何地方使用控制回路,對于具有干凈資料的簡單系統,可能高達400 Hz。在某些情況下,您可以走得更快,但50 Hz在控制系統中非常常見。系統越復雜和/或傳感器測量的噪聲越大,通常控制回路必須越慢,低至約1~10 Hz左右。例如,非常復雜的自動駕駛汽車,經常在只有 10 Hz 的控制回路中運行。
回圈計時和多任務處理
為了完成上述獨立的測量和濾波回路以及控制回路,您需要一種執行精確和高效的回路定時和多任務處理的方法。
如果需要在 Linux 中使用 C 或 C 執行精確、重復的回圈,請使用sleep_until_ns()我timinglib上面的函式。我有一個我在 Linux 中使用的函式的演示,以像這里一樣快sleep_until_us()地獲得重復回圈。1 KHz to 100 kHz
如果在微控制器上使用裸機(無作業系統)作為計算平臺,請根據需要使用基于時間戳的協作多任務處理來執行控制回圈和其他回圈,例如測量回圈。在這里查看我的詳細答案:如何進行高解析度、基于時間戳、非阻塞、單執行緒協作多任務。
完整的數值積分和多任務示例
我在代碼中的完整庫侖計數器示例中使用我的宏在裸機系統上進行了數值積分和協作多任務處理的深入示例。CREATE_TASK_TIMER()在我看來,這是一個很好的學習演示。
卡爾曼濾波器
對于穩健的測量,您可能需要卡爾曼濾波器,也許是“無味卡爾曼濾波器”或 UKF,因為它們顯然是“無味的”,因為它們“不臭”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/474845.html
