2012-02-11 37 views
5

Tôi đang lắp một mặt phẳng vào một điểm 3D được đặt bằng phương pháp ít nhất vuông. Tôi đã có thuật toán để làm điều đó, nhưng tôi muốn sửa đổi nó để sử dụng trọng số ít nhất vuông. Có nghĩa là tôi có một trọng lượng cho mỗi điểm (trọng lượng lớn hơn, máy bay càng gần đến điểm).Trọng lượng ít nhất vuông - vừa với mặt phẳng để đặt điểm 3D

Thuật toán hiện hành (không có trọng lượng) trông như thế này:

Tính tổng:

for(Point3D p3d : pointCloud) { 
    pos = p3d.getPosition(); 
    fSumX += pos[0]; 
    fSumY += pos[1]; 
    fSumZ += pos[2]; 
    fSumXX += pos[0]*pos[0]; 
    fSumXY += pos[0]*pos[1]; 
    fSumXZ += pos[0]*pos[2]; 
    fSumYY += pos[1]*pos[1]; 
    fSumYZ += pos[1]*pos[2]; 
} 

hơn làm cho các ma trận:

double[][] A = { 
    {fSumXX, fSumXY, fSumX}, 
    {fSumXY, fSumYY, fSumY}, 
    {fSumX, fSumY, pointCloud.size()} 
}; 

double[][] B = { 
    {fSumXZ}, 
    {fSumYZ}, 
    {fSumZ} 
}; 

hơn giải quyết Ax = B và 3 các thành phần của giải pháp là các hệ số của đồng bằng được trang bị ...

S o, bạn có thể vui lòng giúp tôi làm thế nào để sửa đổi điều này để sử dụng trọng lượng? Cảm ơn!

+4

FYI - nếu bạn có thể có nhiều điểm (> nói 20) và/hoặc tọa độ có chênh lệch lớn, không bao giờ tính toán thống kê theo cách bạn đang làm (bằng cách lấy tổng các bình phương của vị trí thô) - nó có độ nhạy kém với các lỗi số. Ở mức tối thiểu, bạn có thể trừ giá trị trung bình của tọa độ X/Y/Z trước, sau đó thực hiện quá trình xử lý của bạn, sau đó ở cuối, hãy thêm giá trị bù trừ. Có những cách giải thuật cụ thể khác để làm điều này, nhưng tôi không hiểu chính xác cách thuật toán của bạn sử dụng các ô vuông nhỏ nhất để không thể giúp nhiều hơn thế. –

+0

Ý của bạn là gì? (xin lỗi, không hiểu nó trong ngữ cảnh này). –

+2

Ví dụ nhanh: điểm p1 = (10001, 10002, 10003), p2 = (10005, 10006, 10007), p3 = (10009, 10004, 10008). Những giá trị này có giá trị trung bình (10005, 10004, 10006). Vì vậy, bạn bù đắp (dịch) các tọa độ điểm bởi đối diện của số tiền này để có được p1 '= (-4, -2, -3), p2' = (0,2,1), p3 '= (4,0, 2). Sau đó, làm toán học của bạn, sau đó thêm trở lại trong bù đắp. –

Trả lời

10

Trực giác

Một điểm x trên một chiếc máy bay được xác định bởi bình thường n và một điểm trên mặt phẳng p tuân theo: n.(x - p) = 0. Nếu một điểm y không nằm trên mặt phẳng, n.(y -p) sẽ không bằng 0, do đó, cách hữu ích để xác định chi phí là |n.(y - p)|^2. Đây là khoảng cách bình phương của điểm y từ mặt phẳng.

Với trọng lượng bằng nhau, bạn muốn tìm một n giảm thiểu tổng bình phương lỗi khi tổng hợp qua các điểm:

f(n) = sum_i | n.(x_i - p) |^2 

Bây giờ điều này giả định chúng ta đã biết một số điểm p nằm trên mặt phẳng. Chúng ta có thể dễ dàng tính toán một như là trung tâm, mà chỉ đơn giản là ý nghĩa thành phần-khôn ngoan của các điểm trong đám mây điểm và sẽ luôn nằm trong mặt phẳng hình vuông nhỏ nhất.

Giải pháp

Hãy xác định một ma trận M nơi mỗi hàng là ith điểm x_i trừ đi trọng tâm c, chúng ta có thể viết lại:

f(n) = | M n |^2 

Bạn sẽ có thể để thuyết phục bản thân rằng phiên bản nhân ma trận này giống như tổng của phương trình trước.

Sau đó bạn có thể mất singular value decomposition của Mn bạn muốn sau đó được đưa ra bởi các vector đặc biệt bên phải của M tương ứng với giá trị đơn lẻ nhỏ nhất.

Để kết hợp trọng số, bạn chỉ cần xác định trọng số w_i cho mỗi điểm. Tính c làm trọng số trung bình của các điểm và thay đổi sum_i | n.(x_i - c) |^2 thành sum_i | w_i * n.(x_i - c) |^2 và ma trận M theo cách tương tự. Sau đó giải quyết như trước.

+0

Bạn đã làm đúng sau khi tất cả, điều này hoạt động tốt. Cảm ơn bạn! –

2

Nhân mỗi cụm từ trong mỗi tổng theo trọng số tương ứng. Ví dụ:

fSumZ += weight * pos[2]; 
fSumXX += weight * pos[0]*pos[0]; 

Kể từ pointCloude.size() là tổng của 1 cho tất cả các điểm, nó nên được thay thế bằng tổng của tất cả trọng lượng.

+0

Tôi nghĩ rằng nó sẽ là đủ để nhân mỗi kỳ hạn theo trọng lượng, nhưng tôi đã không chắc chắn ... Tôi sẽ thử nó và lấy lại. Cảm ơn. –

0

Bắt đầu xác định lại phép tính sai số nhỏ nhất. Công thức sẽ cố gắng giảm thiểu tổng số ô vuông của các lỗi. Nhân sai số bình phương với một hàm của hai điểm giảm theo khoảng cách của chúng. Sau đó, cố gắng giảm thiểu tổng trọng số của các lỗi bình phương và lấy được các hệ số từ đó.