2014-01-20 44 views
6

我有一個轉換矩陣的多個估計值,通過ICP (Iterative Closest Point)將兩個點雲映射到彼此。轉換列表的平均轉換矩陣

如何生成所有這些矩陣的平均變換矩陣?

每個矩陣由一個剛性平移和一個只旋轉,沒有比例或歪斜。

理想情況下,我也想計算一個加權平均值,但未加權的一個現在是好的。

平均翻譯矢量當然是微不足道的,但旋轉是有問題的。我發現的一種方法是平均旋轉的單個基本向量,但我不確定這會導致新的正交基,並且該方法看起來有點特別。

+0

正交性是一組約束;你應該看看約束最小二乘解算器。不幸的是,這些約束是非線性的(儘管它們隨着非線性約束而行爲良好)。如果你想要一個最佳解決方案,你可能需要某種迭代過程來找到最接近你輸入語料庫的有效旋轉矩陣。 – comingstorm

+0

我很快就沒有資格回答這個問題。然而,我用神經科學的Python庫來獲取歐拉旋轉方程(NiPY)。該圖書館非常注意電杆等。然後,爲了從非線性變換中獲得僞映射矩陣,可以在兩個方向上執行平均值並對其進行平均。 – wbg

回答

2

http://en.wikipedia.org/wiki/Quaternions_and_spatial_rotationhttp://en.wikipedia.org/wiki/Rotation_matrix#Quaternion會給你一些優雅的數學和一種方法來將旋轉矩陣轉換成圍繞旋轉軸的旋轉角度。每次旋轉將有兩種可能的表示形式,旋轉角度和旋轉軸線的符號都不同。

你可以轉換一切並將它們標準化爲+ ve角度的旋轉,然後找出平均旋轉角度和平均旋轉軸線,將其重新歸一化爲單位矢量。

OTOH如果您的目的是計算出最準確的轉換估計值,您需要寫下任何候選轉換的擬合優度的一些度量 - 平方誤差的總和通常在數學上方便 - 然後解決一個優化問題,找出哪個變換使平方誤差的總和最小化。這至少比單個容易出錯的估計更容易證明,而且可能更準確。

+1

平均角度和軸看起來像一個簡單的解決方案,但你肯定它是數學上的聲音?平均兩個角度看起來很奇怪,如果每個角度都與不同的座標軸有關。 – HugoRune

+0

如果個人旋轉非常正確,它們之間的差異應該非常小,應該簡單地平均一個相當不錯的近似值,以確定你真正需要做什麼。我認爲數學上合理的或者統計上有效率的要做的事就是寫下給定底層變換的觀察結果的可能性,然後求解一個優化問題,找出與最高對數似然相關的底層變換,線性最小二乘問題可能與此非常接近。 – mcdowella

8

拆分翻譯和旋轉的轉換是一個好的開始。平均翻譯是微不足道的。

平均旋轉並不那麼容易。大多數方法將使用四元數。所以你需要將旋轉矩陣轉換爲四元數。

近似平均最簡單的方法是一個線性混合,接着是四元數的再歸一化:

q* = w1 * q1 + w2 * q2 + ... + w2 * qn 
normalize q* 

然而,這只是一個近似值。原因在於兩個旋轉的組合不是通過添加四元數來執行的,而是通過將它們相乘來執行的。如果我們將四元數轉換爲對數空間,我們可以使用簡單的線性混合(因爲乘法將成爲加法)。然後將四元數轉換回原始空間。這是球形平均值的概念(Buss,2001)。如果幸運的話,你會發現,它支持四元數的對數和EXP庫:

start with q* as above 
do until convergence 
    for each input quaternion i (index) 
     diff = q[i] * inverse(q*) 
     u[i] = log(diff, base q*) 
    //Now perform the linear blend 
    adapt := zero quaternion 
    weights := 0 
    for each input quaternion i 
     adapt += weight[i] * u[i] 
     weights += weight[i] 
    adapt *= 1/weights 
    adaptInOriginalSpace = q*^adapt (^ is the power operator) 
    q* = adaptInOriginalSpace * q* 

您可以定義一個閾值adaptInOriginalSpace。如果它是非常小的旋轉,你可以打破循環。該算法被證明可以保持球體上的測地距離。

+0

謝謝,這看起來很有希望。據我瞭解(a,b,c,d)和(-a,-b,-c,-d)表示相同的四元數,在添加它們之前是否有辦法處理? – HugoRune

+0

那麼,對於兩個四元數,你可以檢查點積。如果它小於零,則取消一個四元數(否則插值將遍佈球體的遠側)。我不知道如何處理這與兩個以上的四元數。如果你可以使所有的點積> = 0,那很好。但是,有些情況下這是不可能的。但是插值可能根本不合理。 –

1

如果你有一個現有的線性插值方法,然後有一個平凡的解決方案:

count = 1 
average_transform = Matrix.Identity(4) 
for new_transform in list_of_matrices: 
    factor = 1/count 
    average_transform = lerp(average_transform, new_transform, factor) 
    count += 1 

因爲其它更多mathermatics包得線性插值矩陣比平均水平很多很多的能力,這是唯一有用的。

因爲我還沒有碰到過其他地方這種方法來,這裏是一個非正式的證據:

  • 如果有一個矩陣,使用只是矩陣(因子將等於1爲第一矩陣)
  • 如果有是兩個矩陣,我們所需要的第二個的50%(第二個因素是50%,所以我們現有的第一個和所述新的一個之間進行線性插值,以一半)
  • 如果有三個矩陣,我們需要每個的33%,或前兩名的平均值的66%和第三名的33%。 0.3333的lerp因子使這發生。

等。

我還沒有廣泛測試矩陣,但我已經成功地將其用作其他數據類型的滾動平均值。