2014-01-20 4 views
6

ICP (Iterative Closest Point)을 통해 두 점 구름을 서로 매핑하는 변환 행렬에 대해 여러 개의 추정치가 있습니다.변환 목록의 평균 변환 행렬

이 모든 행렬에 대한 평균 변환 행렬을 어떻게 만들 수 있습니까?

각 매트릭스는 강체 변환과 회전만으로 구성되며 축척 또는 비뚤어 짐이 없습니다.

이상적으로 나는 가중 평균을 계산하고 싶지만, 가중치가없는 것은 현재로서는 괜찮습니다.

물론 평행 이동 벡터를 평균하는 것은 당연하지만 회전은 문제가됩니다. 내가 찾은 한 가지 접근법은 회전에 대한 개별 기본 벡터를 평균화하는 것이지만, 새로운 정규직 기반이 될 것인지 확신 할 수 없으며 접근 방식이 조금 복잡해 보입니다.

+0

Orthonormality는 제약 조건 집합입니다. 당신은 제한된 최소 자승 솔버를 조사해야합니다. 불행히도, 이러한 제약 조건은 비선형 제약 조건 (비선형 제약 조건이 적용될 때 제대로 작동 함에도 불구하고)이 아닙니다. 최적의 솔루션을 원하면 입력 코퍼스에 가장 근접한 유효한 회전 행렬을 찾으려면 반복적 인 과정이 필요합니다. – comingstorm

+0

나는 이것을 대답 할 자격이 없다. 그러나 신경 과학에서 Python lib를 사용하여 회전에 대한 오일러 방정식 (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* 

그러나, 이것은 단지 근사치이다

평균 근사하는 가장 쉬운 방법은 쿼터니언의 재 정규화 하였다 선형 혼합이다. 그 이유는 두 회전의 조합이 쿼터니언을 추가하는 것이 아니라 곱하는 것입니다. 쿼터니언을 대수 공간으로 변환하면 간단한 선형 혼합을 사용할 수 있습니다 (곱셈이 추가가되기 때문에). 그런 다음 쿼터니언을 원래 공간으로 다시 변환하십시오. 이것이 Spherical Average (Buss 2001)의 아이디어입니다.

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에 대한 임계 값을 정의 할 수 있습니다 : 당신이 운이 좋다면, 당신은 사원 수의 로그 및 특급을 지원하는 라이브러리를 찾을 수 있습니다. 매우 작은 회전 인 경우 루프를 끊을 수 있습니다. 이 알고리즘은 구의 측지선 거리를 보존하는 것으로 입증되었습니다.더 많이 mathermatics 패키지는 그들의 평균 많은보다는 행렬을 도약한다 할 수있는 능력을 가지고 있기 때문에

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 

이 유용하다 : 기존 LERP 방법이있는 경우

+0

고마워요, 이것은 유망 해 보입니다. 내가 이해하는 한 (a, b, c, d)와 (-a, -b, -c, -d)는 동일한 쿼터니온을 나타냅니다. 추가하기 전에 그것을 처리 할 방법이 있습니까? – HugoRune

+0

글쎄, 2 쿼터니언의 경우에는 내적을 검사 할 수 있습니다. 0보다 작 으면 1 쿼터니언을 무효화합니다 (그렇지 않으면 보간이 구의 맨 위로 이동합니다). 두 개 이상의 쿼터니언으로 어떻게 처리해야할지 모르겠습니다. 당신이 모든 도트 제품> = 0을 만들 수 있다면, 그것은 훌륭합니다. 그러나 이것이 가능하지 않을 수도 있습니다. 그러나 보간은 전혀 합리적이지 않을 수도 있습니다. –

1

후 사소한 해결책이있다. 하나의 매트릭스가있는 경우

  • 하면 (요인이 첫번째 매트릭스 1과 동일합니다) 그냥 매트릭스를 사용,

    • 이 : 나는 다른 곳에서이 방법을 건너하지 않았기 때문에

      , 여기에 비공식 증거 두 번째 행렬은 두 번째 행렬의 50 %를 필요로합니다 (두 번째 요소는 50 %이므로 기존 첫 번째 행렬과 새로운 행렬의 중간에 머물러 있습니다)

    • 3 개의 행렬이있는 경우 각 행렬의 33 %가 필요하거나 처음 두 평균의 66 %, 세 번째의 평균 33 %. 0.3333의 lerp 요소가이 일을 만듭니다.

    등등.

    매트릭스로 광범위하게 테스트하지는 않았지만이 데이터를 다른 데이터 유형의 롤링 평균으로 성공적으로 사용했습니다.