Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
感謝您重貼一遍。這篇我有看到,實在還是不了解它為什麼是正確答案,
雖然 Eigen 網友很盡心,algorithm 也很精彩,只是勸您再核對一兩下‧‧‧
發表於: 2007/5/11 23:11
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
首先恭賀 hellowanz 網友找到所需的解答。
不過,我往前翻了半天,不知道哪一篇才是正確答案? 我找不到,有誰能明示一下是哪一篇文章嗎? (日期時間是 2007/5/? ??:??:?? 的) 357, 91, 92 的平均值標準答案應該是 60 對不對?
發表於: 2007/5/11 18:24
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
使用Eigen大大所提供的Solution,確實能正常的平均角度,在此提供這項資訊給大家參考,也非常感謝Eigen大大的智慧,若有興趣者可以記下此演算法,也許那一天用得到哩。畢竟也是花了幾天所想出來的精華,可別白費了,越多人使用,越有價值。
發表於: 2007/5/10 22:17
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
計算出的角度範圍是0~359.9度,不會有大於360度的值出現,角度感測出來是絶對角度,並非相對角度。 角度變化量要看這個感測的物件翻轉的速度而定,原則上不會翻很快,兩次的取樣應該不會大於90度。 假定 sensor --> 360度 絕對角度 SO 361 = 1 ; 721 = 1 ...... 物理行為 ---> 擺盪 ( 兩次的取樣應該不會大於90度。) ============= 由 cheng100 貼於 2007/5/8 16:45:36 我想這個問題是要預測一抖動物體靜止後最終位置. 譬如指針式重量計,一個胖子突然往秤台一跳.造成指針劇烈抖動.在指針尚未靜止之前.我要立刻得知重量.若重量計轉一圈為100kg(0kg),而指針剛開始在90與30之間抖動,然後慢慢衰減 95--25,100--20..... ============================== 但不知是否如 CHENG100 大所言 為趨於靜止平衡 ? 如單為 取得平均角度: X[1 ,2,3,4,........N] BIG = .F. SMALL = .F. TOTAL = X[1] XX = X[1] FOR i = 2 TO N . . IF (XX >= 270 & X[i] < 180) THEN . X[i] = (360 + X[i] ) . ELSE . IF XX <= 90 & X[i] > 181 . THEN X[i] = ( 360 - X[i] . ENDIF . ENDIF . XX = X[i] . TOTAL = TOTAL + X[i] NEXT AVE = TOTAL / N 如擺盪是固定在某一 90 度 區間 內 可用此法 如會一直延伸出去 則需再加其他判斷式 如為 cheng100 大 所言 則應該抓兩端極點 再求出衰減率 以求出穩定點
發表於: 2007/5/9 17:03
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
中級會員
![]() ![]() ![]() |
Hi !!! 你還看得真仔細,
if(new_angle >= 180) new_angle = new_angle - 360; if(new_angle <= -180) new_angle = new_angle + 360; 表示新角度差值大於 180 度或小於-180 度時作角度差值調整 將角度差值調整為相反方向, 因為此方向的夾角角度較小, 這是因為你有提到角度以 0 ~ 359.9 的角度來表示。 例: 前平均角度為 1, 新值為 350 角度差為 350 - 1 = 349 (實際值為 11) 大於 180 的條件成立, 調整為 349 - 360 = -11 (得正確值) ------------------------------------------------------------------- 前平均角度為 355, 新值為 30 角度差為 30 - 355 = -325 (實際值為 35) 小於180 的條件成立, 調整為 -325 + 360 = 35 (得正確值) ------------------------------------------------------------------- 至於你提了其中唯一的特例角度差 180 度, 因為剛好在正對面, 所以要不要在剛好差 180 度時調整就看你高興了, 如果改為 if(new_angle > 180) new_angle = new_angle - 360; if(new_angle < -180) new_angle = new_angle + 360; 在角度差超過 180 度時才調整, 嗯..嗯.....效果一樣呢!! 哈! 哈! 不過你不也提到了抖動的角度差會在 90 度內嗎, 那不理會它也沒關係吧!
發表於: 2007/5/9 0:38
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
To C_H_M
這機制在你貼上來之前已有加入程式中了,Sensor輸出的穩定度運算就是靠它,但Sensor輸出的值並非角度,而是物理量的值,只是...有一個疑問 if(new_angle >= 180) new_angle = new_angle - 360; 設new_angle=180 new_angle=180-360=-180 接下來 if(new_angle <= -180) new_angle = new_angle + 360; new_angle=-180+360=180又回到原來的值了,看不太懂這邊。
發表於: 2007/5/8 23:47
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
資深會員
![]() ![]() ![]() |
To cheng100
我試了6組角度來試算 1. 359-180=179 0-180=-180 1-180=-179 (179+180+179)/3+180=359.333近似0,ok 2. 330-180=150 20-180=-160 50-180=-130 (150+160+130)/3+180=326.6667,但應該為13.333 3. 80-180=-100 90-180=-90 100-180=-80 (100+90+80)/3+180=270,但應該為90 4. 179-180=-1 180-180=0 181-180=1 (1+0+1)/3+180=180.66667近似180,ok 5. 269-180=89 270-180=90 271-180=91 (89+90+91)/3+180=270 ,正解 6. 272-180=92 274-180=94 276-180=96 (92+94+96)/3+180=274 ,正解 角度大部份都對,有幾個角度有錯,是不是我又有那裡算錯的地方? 我還是非常感謝你能提供此演算法,在我所使用的角度必需精準的算出角度,有些答案會近似正確答案,不適用在這個專案中,還是很感謝這個方法,也可提供其他人參考這個方法。 To Eigen 以上試算的角度使用你的演算法都能正確的算出角度,等有時間,我再加到我的程式中直接計算看看,如果都能正確無誤的平均出角度,到時我再回報給各位大大知曉。
發表於: 2007/5/8 22:38
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
初級會員
![]() ![]() ![]() |
我想這個問題是要預測一抖動物體靜止後最終位置.
譬如指針式重量計,一個胖子突然往秤台一跳.造成指針劇烈抖動.在指針尚未靜止之前.我要立刻得知重量.若重量計轉一圈為100kg(0kg),而指針剛開始在90與30之間抖動,然後慢慢衰減 95--25,100--20..... 把問題抽像化後,就成了數學問題了.所以這只是利用數學幫助解決問題.利用"平均偏差 +平均值"就能正確預測這位老兄的重量(該減肥了),不管你的取樣時間在哪裡開始,在哪裡結束,結果完全一致.數學的威力!
發表於: 2007/5/8 16:45
|
|||
|
Re: 角度平均計算
|
||||
---|---|---|---|---|
中級會員
![]() ![]() ![]() |
如果不是純要計算數學的平均值,
而只是希望降低sensor輸入訊號抖動的輸入均值的話! 那試試以下的方法吧! 看看合不合你的需求。 double average_angle, new_angle; average_angle = 0; ... ... ... ... ... // 以下這段請放在 sensor 取樣後的處理程式中 new_angle = (角度 sensor 輸入) - average_angle; if(new_angle >= 180) new_angle = new_angle - 360; if(new_angle <= -180) new_angle = new_angle + 360; average_angle = average_angle + (new_angle / 20); if(average_angle < 0) average_angle = average_angle + 360; if(average_angle >= 360) average_angle = average_angle - 360; // 係數 20 的地方會影響平均值的反應速度, 小一點反應快, 大一點反應慢 // 但是也會影響平均的效果, 小一點均值的效果好, 大一點均值的效果差 ... ... ... ... ...
發表於: 2007/5/8 15:06
|
|||
|