-
Notifications
You must be signed in to change notification settings - Fork 0
Visual SLAM
SLAMμμ μ ν μ μλ μ νλμ λ¬Έμ μλ ν¬κ² λΉλμ°¨ μμ€ν
(Non-honomegenous
), λμ°¨ μμ€ν
(Homogeneous
)μ΄ μ‘΄μ¬νλ€.
λͺ¨λ₯΄λ λ―Έμ§μλ₯Ό
-
squared(full rank,
$x=A^{-1}b$ )
νλ ¬$A$ κ° μ λ°©νλ ¬μ΄λ©°Full rank
(μ νλ λ¦½μΈ ν벑ν°μ κ°―μκ° νλ ¬μ νμ κ°―μμ λμΌ) κ°μ₯ κΈ°λ³Έμ μΈ κ²½μ°λ₯Ό μλ―Ένκ³ μ μΌν΄κ° μ‘΄μ¬νλ κ²½μ°μ΄λ€. κ°λ¨νκ² νλ ¬$A$ μ μνλ ¬μ ꡬνμ¬$x$ λ₯Ό ꡬν μ μλ€. -
overdetermined (
$x^*=argmin||Ax-b||$ )
νλ ¬ Aμ νμ ν¬κΈ°κ° μ΄μ ν¬κΈ°λ³΄λ€ ν° κ²½μ°λ₯Ό μλ―Ένλ©°, μ€μ μΈκ³μμ μμ£Ό λ°μνλ μΌλ°μ μΈ κ²½μ°μ΄λ€. λͺ¨λ λ¨μλ₯Ό λ§μ‘±μν€λ μ νν solutionμ΄ μ‘΄μ¬νμ§ μμΌλ©°$Ax-b=0$ μ κ·Όμ¬ν΄λ₯Ό μ°Ύλ μ΅μ μμΉ λ¬Έμ (least-square
)λ‘ λ³κ²½ν μ μλ€. -
underdetermined
νλ ¬ Aμ νμ ν¬κΈ°κ° μ΄μ ν¬κΈ°λ³΄λ€ μμ κ²½μ°λ₯Ό μλ―Έ, λ―Έμ§μμ κ°μκ° λ¨μμ κ°μλ³΄λ€ λ§μ κ²½μ°μ΄λ©° 무νν λ§μ ν΄κ° μ‘΄μ¬νκ±°λ μ΄ μμ€ν μ λ§μ‘±μν€λ ν΄κ° μ‘΄μ¬νμ§ μμ μ μλ€.
μ벑ν°κ° μλλ©΄μ μμ μμμ λ§μ‘±μν€λ₯Ό λ²‘ν° null space
λΌ νλ€. λμ°¨ μμ€ν
μ ν΄λ₯Ό μ°Ύλ λ°©λ²μλ SVD(Singular value Decompostion)
μ΄ μλ€. μ΄λ Eigenvalue
μ Eigenvector
λ₯Ό μ΄μ©νλ€.
κ³ μ³κ°κ³Ό κ³ μ 벑ν°λ μ λ°©νλ ¬μ΄λ©΄μ μ€μ κ°μ κ°μ§λ λμΉνλ ¬ null space
κ° λλ€.
μΌλ°μ μΈ μ νμμ€ν
μμ νλ ¬ Non-squared
)νλ ¬μ΄λ€. κ³ μ³κ°κ³Ό κ³ μ 벑ν°μ μ±μ§μ μ μ§νλ©΄μ λΉμ λ°© νλ ¬μ κ²½μ°λ‘ νμ₯λ κ°λ
μ΄ λ°λ‘ νΉμ΄κ°κ³Ό νΉμ΄λ²‘ν°μ΄λ€.
λΉμ λ°© νλ ¬
λκ° νλ ¬ Non-trivial solution
)μ΄ λλ€. μ¬κΈ°μ λΉμλͺ
ν΄λ
λ°λμΉ νλ ¬μ μ΄λ€ νλ ¬ Cross product
)μ λ°λμΉ νλ ¬κ³Ό λ²‘ν° μ¬μ΄μ κ³±μ
μΌλ‘ ννν μ μλ€.
SLAM μμ€ν
μμ μμ£Ό μ νλ μ ν μμ€ν
μ ννμΈ Over-determined
μμ€ν
μ νΈλ λ°©λ²μ΄λ€. κ·Όμ¬ν΄λ₯Ό μ°ΎκΈ° μν λνμ μΈ λ°©λ²μΌλ‘ κ²½μ¬ νκ°λ²(Gradient descent method
), κ°μ°μ€-λ΄ν΄λ²(Gauss-Newton method
), λ§μ§λ§μΌλ‘ μ΄ λμ μ‘°ν©μΈ λ₯΄λ²€λ²κ·Έ-λ§μΏΌνΈλ²(Levenberg-Marquardt method
)κ° μ‘΄μ¬νλ€.
Over-determined μμ€ν μ λ¨μμ κ°μκ° λ―Έμ§μμ κ°μλ³΄λ€ λ§μ λ λ§λ€μ΄μ§λ μ ν μμ€ν μ΄κ³ λͺ¨λ λ¨μλ₯Ό λ§μ‘±μν€λ μλ°ν΄κ° μ‘΄μ¬νμ§ μλ κ²½μ°μ΄λ€. λ°λΌμ λͺ¨λ λ¨μμ λν΄ μ΄λ μ λ λ§μ‘±μν€λ κ·Όμ¬ν΄λ₯Ό μ°Ύλλ€. μμλ‘ λ€μκ³Ό κ°μ μμμ μ νμμ€ν μΌλ‘ νννλ©΄ λ€μκ³Ό κ°λ€.
$ax_{i}^2+bx_i+c=y_i$
μ΄λ Over-determined
μ ν μμ€ν
μ΄λ€!
μ΄λ¬ν μμ€ν μ μλ°ν΄λ₯Ό μ°Ύλ κ²μ λ€μ λ§νλ©΄ λͺ¨λ ν¬μΈνΈλ€μ μ§λκ°λ μ§μ μ λ°©μ μμ μ°Ύλ κ²κ³Ό κ°κ³ κ·Έλ° ν΄λ λμμ μΌλ‘ λΆκ°λ₯ν ν΄μ΄λ€. λ°λΌμ μ΄ μμ€ν μ μ΅μ μ κ³± λ¬Έμ λ‘ λ³ννμ¬ κ·Όμ¬ν΄λ₯Ό μ°Ύλ λ¬Έμ λ‘ λ§λ€κΈ° μν΄μ κ° ν¬μΈνΈλ€μ μ€μ κ΄μΈ‘κ°κ³Ό μμΈ‘ κ° μ¬μ΄μ μ°¨μ΄λ₯Ό λνλ΄λ κΈ°λ³Έ μ€μ°¨λ₯Ό μ μνλ€.
$e_i(x)=A_{i}x+b_i$ , loss functionμ΄ νκ· μ΄ 0μ΄κ³ 곡λΆμ°μ΄$\Sigma$ μΈ gaussian distributionμ λ°λ₯Έλ€κ³ κ°μ
μ΅μ’ μ μΌλ‘ μ μλλ μ κ³± μ€μ°¨ν¨μλ λ€μκ³Ό κ°λ€.
$E_i(x)=e_i^T(x)\Sigma^{-1}e_i(x)$
μ¬κΈ°μ Information matrix
λΌκ³ μΉνλ€. μ¦ κ³΅λΆμ°μ΄ ν¬λ©΄ λ°μ΄ν°μ λΆν¬κ° λκ² νΌμ ΈμμΌλ―λ‘ information
μ μκ³ , 곡λΆμ°μ΄ μμΌλ©΄ λ°μ΄ν°μ λΆν¬κ° μμΌλ―λ‘ information
ν¬λ€. κ²°κ΅, μ΅μ ν μμ
λ°λΌμ global loss functionμ λ€μκ³Ό κ°λ€.
$F(x)=\Sigma_i{(e_i^T(x)\Sigma^{-1}e_i(x))}$
κ·Όμ¬ν΄λ₯Ό μ°ΎκΈ° μν μ΅μ ν μμμ λ€μκ³Ό κ°λ€.
$x^*=argmin_{x}{F(x)}$
$x^*=argmin_{x}\Sigma_i{(e_i^T(x)\Sigma^{-1}e_i(x))}$
μ΄λ¬ν μ΅μ μ κ³± λ¬Έμ λ νλ²μ μ°μ°μ ν΅ν΄ μ§μ μ μΌλ‘ ν΄λ₯Ό ꡬν μ μκ³ iterative
νκ² ν΄μ κ°μ μ‘°κΈμ© μ
λ°μ΄νΈ ν΄κ°λ©° μλ ΄νλ μ§μ μ μ°ΎμμΌ νλ€.
κ²½μ¬νκ° λ°©λ²μ μ μ μ€μ°¨ ν¨μ Gradient
λ₯Ό μ΄μ©νλ λ°©λ²μ΄λ€.
μμ μμμ λ€μκ³Ό κ°μ΄ μ 리ν μ μλ€.
$\nabla E_{i}(x)=2J_{i}^T(x) \Omega_i e_i(x)$
μ΄ κΈ°μΈκΈ° κ°μ μ΄μ©ν΄ ꡬνλ €λ μ΅μ ν΄μΈ
$\Delta x=\Sigma_i{\lambda\nabla_{i}(x)=\Sigma_i(2\lambda J_{i}^T(x) \Omega_i e_i(x))}$
κ²°κ΅ μ€μΉΌλΌ κ°μΈ step size
λΌκ³ μΉνλ learning rate
)μ λμΌν μλ―Έλ₯Ό μ§λλ€.
κ°μ°μ€-λ΄ν΄ λ°©λ²μ μ μ μ€μ°¨ ν¨μ taylor expansion
μ μ΄μ©νμ¬ μμμ λλ₯Ό νλ©΄ λ€μκ³Ό κ°λ€.
$e_i(x+\Delta x)\approx e_i(x)+J_i(x)\Delta x$
μ΄λ κ² μ λλ μ μ μ€μ°¨ ν¨μ
$F(x+\Delta x)\approx c+2b^T\Delta x+\Delta x^TH\Delta x$
$\frac{\partial F(x+\Delta x)}{\partial\Delta x}\approx 2b+2H\Delta x$
$0 = 2b + 2H\Delta x$
$H\Delta x=-b$
$\Delta x = -H^{-1}b$
κ°μ°μ€-λ΄ν΄ λ°©λ²μ 곑λ₯ μ μ΄μ©ν΄ ν΄λ₯Ό μ°ΎκΈ° λλ¬Έμ 걸리λ μκ°μ΄ λ μ λ€λ μ₯μ μ΄ μμ§λ§ μνλ ¬μ ꡬν λ μμΉμ μΌλ‘ λΆμμ νκ³ ν΄κ° λ°μ°ν μνμ΄ μλ€λ λ¨μ μ΄ μ‘΄μ¬νλ€.
#include <iostream>
#include <Eigen/Core>
#include <Eigen/Dense>
#include <chrono>
#include <vector>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace Eigen;
int main(int argc, char** argv){
double ar = 1.0, br = 2.0, cr = 1.0; // real value(μ€μ ν΄)
double ae = 2.0, be = -1.0, ce = -5.0 // init value(μ΅μ νλ₯Ό ν΅ν΄ μ
λ°μ΄νΈλλ λ³μ)
int N = 100; // λ°μ΄ν°μ μ΄ κ°―μ
double w_sigma = 1.0;
double inv_sigma = 1.0 / w_sigma;
cv::RNG rng;
vector<double> x_data, y_data;
for(int i = 0; i < N; i++){
double x = i / 100.0;
x_data.push_back(x); // λͺ¨λΈμ μ
λ ₯κ°
y_data.push_back(exp(ar * x * x + br * x + cr) + rng.gaussian(w_sigma * w_sigma)); // λͺ¨λΈμ μΆλ ₯κ° κ³μ° λ° κ°μ°μμ λ
Έμ΄μ¦ μΆκ°
}
int iterations = 100;
double cost = 0, last_cost = 0;
// least squre
chrono::stead_clock::time_point t1 = chrono::steady_clock::now();
for(int iter = 0; iter < iterations; iter++){
Matrix3d H = Matrix3d::Zero(); // νλ ¬ H(μνλ ¬)
Vector3d b = Vector3d::Zero(); // λ²‘ν° b(μ벑ν°)
cost = 0;
for(int i = 0; i < N; i++){
double xi = x_data[i], yi = y_data[i];
double error = yi - exp(ae * xi * xi + be * xi + ce);
Vector3d J;
// Jacobian calculation
J[0] = -xi * xi * exp(ae * xi * xi + be * xi + ce); // aeμ λν νΈλ―ΈλΆ
J[1] = -xi * exp(ae * xi * xi + be * xi + ce); // beμ λν νΈλ―ΈλΆ
J[2] = -exp(ae * xi * xi + be * xi + ce); // ceμ λν νΈλ―ΈλΆ
H += inv_simga * inv_sigma * J * J.transpose();
b += -inv_simga * inv_sigma * error * J;
cost += error * error;
}
Vector3d dx = H.ldlt.solve(b); // cholesky decomposition
if (iter > 0 && cost >= lastCost){
cout << "cost:" << cost << ">= last cost:" << lastCost << ", break." << endl;
break;
}
ae += dx[0];
be += dx[1];
ce += dx[2];
lastCost = cost;
}
chorono::steady_cllock::time_point t2 = chrono::stead_clock::now();
chrono::duration<double> time_used = chrono::duration_cast<chrono::duration<double>>(t2-t1)
cout << "estimated abc :" << ae << be << ce << endl
}
vanishing point(μμ€μ )κ°μ νμμ΄ λνλλ μ΄μ λ μκ·Όλ²
μ μν κ²μ΄λ€. μ¦, νμ€μΈκ³μμλ νννμ§λ§ μ¬μλ 곡κ°μμλ κ΅μ°¨νλ νμμ΄ λ°μνλ€. μ΄λ‘ μΈν΄ 3d 곡κ°μ λ€λ£° λ νμν μ ν΄λ¦¬λ κΈ°ννμ΄ μ΄λ―Έμ§λ₯Ό λ€λ£°λλ μ μ©μ΄ λ μ μλ€. μ¬μμ ν΅ν΄ μμ€λλ κ°μ λ€μκ³Ό κ°λ€.
- Depth(거리)
- Orthogonality(μ§κ΅μ±) - 3d 곡κ°μμλ μ§κ΅νλ λ¬Όμ²΄κ° μ΄λ―Έμ§ μμμ μ§κ΅νμ§ μμ
- Parallelism(ννμ±) - 3d 곡κ°μμλ νννλ λ¬Όμ²΄κ° μ΄λ―Έμ§ μμμ νννμ§ μμ
- Scale(λΉμ¨) - 3d 곡κ°μμλ λμΌν ν¬κΈ°λ₯Ό κ°μ§μλ κ°κΉμ΄ μλ 물체λ ν¬κ² λνλκ³ λ©λ¦¬ μλ 물체λ μκ² λνλ¨
μ ν΄λ¦¬λ λ³νκ³Ό κ°μ₯ ν° μ°¨μ΄μ μ μ ν΄λ¦¬λ λ³νμ λ³ν μ κ³Ό νμ 물체μ κΈΈμ΄, μ§κ΅μ±, ννμ±, λΉμ¨ λ±μ μ μ§ν΄μΌ νλ μ μ½ μ‘°κ±΄μ΄ μ‘΄μ¬νμ§λ§ μ¬μ λ³ν(projective transformation)μ μ΄λ₯Ό λͺ¨λ μ μ§νμ§ μμλ λλ€λ κ²μ΄λ€. μ¦, 3d 곡κ°μμλ 무νμ 거리λ₯Ό 2d μ΄λ―Έμ§μμλ μ ννκ² ννν μ μλ€λ κ²μ μλ―Ένλ€. μ΄λ μ¬μ κΈ°ννμμ μ¬μ©νλ μ’νκ³λ₯Ό λμ°¨ μ’νκ³(Homogeneous coordinates)λΌκ³ νλ€.
λκ°μ λ²‘ν° {1, 2, 3}
, {2, 4, 6}
μ΄ μ‘΄μ¬ν λ μ ν΄λ¦¬λ κΈ°ννμμλ λ 벑ν°λ λ€λ₯Έ κ°μ κ°μ§κ³ μκΈ° λλ¬Έμ λ€λ₯Έ μ’νλ₯Ό κ°λ¦¬ν€λ κ²μ μλ―Ένλ€. νμ§λ§ μ¬μκΈ°ννμ λμ°¨ μ’νκ³μμλ {2, 4, 6}
μ μ΅λ 곡μ½μμΈ 2λ‘ λλμμ λ {1, 2, 3}
μ΄ λκ³ λκ°μ 벑ν°λ κ°μ μ’νλ₯Ό κ°λ¦¬ν¨λ€κ³ λ³Ό μ μλ€. μ¦, μμμ μ μνλ λΉμ¨μ λν μ μ½μ‘°κ±΄μ μ μ§νμ§ μμλ λλ€λ κ²μ μλ―Ένλ λνμ μΈ μμ μ΄λ€. κ²°λ‘ μ μΌλ‘ λ²‘ν° μ 체λ₯Ό λΉμ¨κ°μΌλ‘ λλλ€λ©΄ λ³νμ§ μλ 물체μ μ§μ§ ν¬κΈ°λ‘ λμκ°λ€λ μ μ μλ―Ένλ€.
μμ κ·Έλ¦Όμμ {0, 0, 0}
μμ μμνμ¬ {x, y, 1}
μ μ§λ {wx, wy, w}
λ‘ μ°μ₯λλ μ§μ μ΄ λλ€. λ°λΌμ μ¬μ κΈ°ννμ μ μλ ν¬μμ ν΅ν N+1 μ°¨μμμ Nμ°¨μμΌλ‘μ μ°¨μ μΆμλ₯Ό μν κΈ°ννμμ λνλΈλ€.
νλ ¬ λν λμ°¨ μ’νκ³λ‘ ννλ μ μλ€. SO(3)
νμ 맀νΈλ¦μ€λ μ ν΄λ¦¬λ 곡κ°μμ λ°μΉ΄λ₯΄νΈ μ’νκ³λ‘ ννλλ 3x3 ννμ νλ ¬μ΄λ€. μ΄ νλ ¬μ μ¬μ 곡κ°μμ νννκΈ° μν΄μλ νλ ¬μ μ°¨μμ νλ μ¦κ°μν€κ³ μ°μΈ‘ μ΅νλ¨ νμ 1μ μμΉμν¨λ€. SE(3)
λ³ν νλ ¬μ μ ν΄λ¦¬λ 곡κ°μμ 6 DOF
κ°μ²΄μ΄λμ νννλ 4x4ννμ νλ ¬μ΄λ€. SO(3)
, SE(3)
νλ ¬ λͺ¨λ μ°μΈ‘ μ΅νλ¨ κ°μ΄ 1λ‘ λμ΄μλ κ²½μ°λ₯Ό λ³Ό μ μλλ°, μ΄λ μ ν΄λ¦¬λ 곡κ°μμμ λ³νμ μννκ³ μλ€λ κ²μ μλ―Ένλ€.
νΉμ§μ μ Object detection, Tracking, Matchingκ³Ό κ°μ CVμ μμμμ μ¬μ©λλ κΈ°μ μ΄λ€. νΉμ§μ μ ν¬κ² 2κ°λ‘ μ΄λ£¨μ΄μ Έ μλ€.
- Keypoint(ν€ν¬μΈνΈ) - μ½λ, μ£μ§, μμ(blob)κ³Ό κ°μ΄ μ΄λ―Έμ§ μ λλλ¬μ§λ μ±μ§μ κ°μ§ μμ
- Descriptor(κΈ°μ μ) - μ΄λ―Έμ§ μ ν€ν¬μΈνΈκ° μμΉν μμ μ£Όλ³μ΄ μ΄λ»κ² μκ²Όκ³ μ΄λ ν μκ°μ μμλ₯Ό κ°μ§κ³ μλμ§ νννλ 벑ν°
μ΄λ₯Ό ν΅ν΄ ν¨μ¨μ μΌλ‘ μλ‘ λ€λ₯Έ μμ§ μμμ λμΌν 물체λ₯Ό μλ―Ένλ λΆλΆμ μ°Ύμ μ΄λ―Έμ§ 맀μΉμ μννκ³ , μ΄λ₯Ό ν΅ν΄ λ μ΄λ―Έμ§ κ°μ μ΄λμ΄λ 3D 곡κ°μ΄ μ΄λ»κ² ꡬμ±λμ΄μλμ§ μΆλ‘ ν μ μλ€.
μΉ΄λ©λΌμ νλΌλ―Έν°λ worldλ₯Ό ꡬμ±νκ³ μλ 3μ°¨μ μ’νκ° μ΄λ»κ² μΉ΄λ©λΌμ 2μ°¨μ ν½μ λ‘ λ³νλλμ§ μμμ μΌλ‘ μ΄ν΄νκΈ° μν΄ νμν κ°μ΄λ€.
κ²°κ΅ μΉ΄λ©λΌ μΊλ¦¬λΈλ μ΄μ
κ³Όμ μ΄λ
Parameters | μ€λͺ |
---|---|
Extrinsic | world μ’νκ³μμ camera μ’νκ³λ‘ λ³ννλλ° νμν νλΌλ―Έν°(from |
Intrinsic | camera μ’νκ³μμ image μ’νκ³λ₯Ό κ±°μ³ sensor μ’νκ³λ‘ λ³ννλλ° νμν νλΌλ―Έν°, μΉ΄λ©λΌ distortion νλΌλ―Έν° ν¬ν¨(from |
μΉ΄λ©λΌμ μΈλΆ νλΌλ―Έν°λ world μ’νκ³λ₯Ό κΈ°μ€μΌλ‘ μλμ μΈ μΉ΄λ©λΌμ μμΈλ₯Ό λνλ΄λ κ°μ΄λ©° 3μμ λμ μΉ΄λ©λΌ μ΄λ νλΌλ―Έν°μ 3 μμ λμ μΉ΄λ©λΌ νμ νλΌλ―Έν°λ₯Ό κ°μ§λ€. μ¦ μ ν΄λ¦¬λ곡κ°μμμ λ³ν νλ ¬μ ꡬνλ κ²μ μλ―Ένλ€.
μμ κ·Έλ¦Όκ³Ό κ°μ΄ world μ’νκ³ μμ μ
${X_p}^k=R(X_p-X_o)$
μ΄λ μ
μ¦ SE(3)
λ³ν νλ ¬μ μλ―Ένλ κ²μ΄λ€.
μΉ΄λ©λΌμ λ΄λΆ νλΌλ―Έν°λ 3μ°¨μ μ
- μκ·Ό μ¬μ λ³ν
- μμ μ’νμμ μ€μ μΌμ μ’ν λ³ν
- λμ¦ μ곑 λ³ν
μκ·Ό μ¬μ λ³νμ νν μΉ΄λ©λΌ λͺ¨λΈμμ μκ³‘μ΄ μλ λ μ¦λ₯Ό κ°μ νμ¬ 3μ°¨μ μ
μμ κ·Έλ¦Όμμ
μμ μ’νμμ μ€μ μΌμ μ’ν λ³νμ λ μ’νκ³μ μ€μ¬μ΄ μΌμΉνμ§ μκ³ λ¬Όμ²΄μ λν μμ΄ λ§Ίνλ μ€μ μΌμμ κ°λ‘μΈλ‘ μΆμ λΉμ¨μ΄ λμΌνμ§ μμ μ°¨μ΄λ₯Ό affine λ³νμ νμ©νμ¬ λ³΄μ νλ κ³Όμ μ μλ―Ένλ€.
μμ κ·Έλ¦Όκ³Ό κ°μ΄ μμ μ’νκ³
μμμ μ΄ν΄λ³Έ μ’νκ³ μ¬μ΄μ λ³ν κ³Όμ μ λ μ¦μ μ곑 κ³μλ₯Ό κ³ λ €νκ³ μμ§ μλ€. λ°λΌμ μΌμ μ’νκ³μμ
μ΄λ¬ν μ곑 λͺ¨λΈμ κ°μ§ κ²½μ° μΌμ μ’νκ³
κ²°λ‘ μ μΌλ‘ μ΅μ’
μ μΈ camera calibration matrix