for Robot Artificial Inteligence

Interpolation 개념

|

linear intterpolation이란 무엇일까.

보간법 즉 delta_x_1, delta_x_2 구간에서의 y값을 추정을 하는 것이다.

interpolation, in mathematics, the determination or estimation of the value of f(x), or a function of x, from certain known values of the function.

Comment  Read more

Colmap dependency install(Colmap 설치 방법)

|

https://blog.csdn.net/weixin_46353422/article/details/120472288

https://github.com/colmap/colmap

Ceres

sudo apt-get install  liblapack-dev libsuitesparse-dev libcxsparse3 libgflags-dev libgoogle-glog-dev libgtest-dev

https://github.com/ceres-solver/ceres-solver

OPENCV error

https://blog.csdn.net/xihuanzhi1854/article/details/90765199

Opencv 3.2.0 install

https://bigdata-analyst.tistory.com/220

Comment  Read more

간단 FULL BA and LOCAL BA

|

BA소개

Structure from Motion을 수행할 때, 다수의 프레임에 존재하는 Visual keypoint 들의 위치 (i.e. 2D pixel location)를 기반으로 추정할 수 있는 3D landmark position과 카메라 프레임간의 3D relative motion을 동시에 최적화하는 과정

SLAM에서는 다음과 같은 방법으로 사용한다.

  1. Sliding window optimisation
    • 실시간으로 SLAM 프로그램을 돌리면서, 마지막 N개의 keyframe 정보를 기반으로 Bundle adjustment를 수행하여 실시간으로 local map + pose를 보정하는 작업
  2. Loop closure
    • 실시간으로 SLAM을 돌리면서, Loop closure detection이 일어났을 때 Loop closure optimisation을 다른 쓰레드에서 비실시간으로 수행하여 loop에 대한 pose + global map을 보정하는 작업
  3. Global optimisation
    • 실시간으로 SLAM을 돌리면서, 종종 다른 쓰레드에서 비실시간으로 모든 map + pose를 보정하는 작업. (잘 안쓰임)
  4. Global optimisation as 후처리
    • SLAM이 끝나고나서, 모든 map + pose를 비실시간으로 보정하는 작업.

간단 메카니즘

  • 보통 closed-form 방식으로 initial guess 정보가 있음.
    • Initialization 단계에서 Homography/Fundamental matrix를 이용하여 얻어낸 relative motion 정보 + 이후 PnP로 추가해내간 relative motion 정보.

    • Initialization 단계에서 초기 R t로 얻어낸 3D landmark position 정보 + 이후 triangulation으로 추가해내간 3D landmark position 정보.
    • 하지만 이러한 정보들은 어쩔 수 없이 error를 내포하고 있음.
  • 위의 error를 보정하기 위해 최적화를 진행함.
    • 3D landmark에서 카메라 coordinate의 원점까지의 직선을 ‘ray’로 표현할 수 있음.
    • 이러한 ray가 다수 있을 경우 ‘bundle of ray’라고 표현함.
    • 이 ‘bundle of ray’를 보정 (i.e. adjust) 한다는 의미로 bundle adjustment라는 이름을 사용함.
  • 슬라이딩을 하면서 이전에 카메라 프레임정보(points,pose,extrinic,instrinic parameters)(Local일 경우 i_th번째까지의 카메라 프레임, Full일 경우 전체 프레임 정보)와 현재 프레임정보를 cost function을 통해서 Iteration K만큼 포인트들과 포즈 파라미터들을 최적화 하는 작업

Cost Function(Reprojection error)

Image Projection 방법

Parameter 수

<a

Sparse한 매트릭스 성질을 이용하여서 symmetric matrix 성질을 이용한 QR한다.

Comment  Read more

Ubuntu에 Cuda Install

|

참고

https://ghostweb.tistory.com/829

Comment  Read more

slope estimation(곡선 길이 및 곡률 계산)

|

with curavture, we are able to define an angle of a slope plane. the way to do is using plane parameter can get curvature.

the other one to detemine a slope plane,

set one vertical line and dot product normal vector, can define a angle of plane.

Consider a car driving along a curvy road. The tighter the curve, the more difficult the driving is. In math we have a number, the curvature, that describes this “tightness”. If the curvature is zero then the curve looks like a line near this point. While if the curvature is a large number, then the curve has a sharp bend.

Normal vector마다 곡률을 구할 수 있느데, 한번 해보자

2d case

Fomular

k(t) = (x'y'' - x''y') / (x' * x' + y' * y')^(3/2)
Eigen::MatrixXf m(2,7);
m = [[1,1],[1.5,2],[2,3],[2.5,3.5],[3,4],[3.5,4.25],[4,4.5]]; //원래는 블라캣이다.
Eigen::Vector2f Gradient(7);

//  Step 1 : Gradient(vector)
for(int idx = 0; idx < m.cols()-1; idx++)
{
  Gradient[idx] = m.col(idx)-m.col(idx+1);

  // Gradient stored result
  // [[0.5   1.   ]
  //  [0.5   1.   ]
  //  [0.5   0.75 ]
  //  [0.5   0.5  ]
  //  [0.5   0.375]
  //  [0.5   0.25 ]
  //  [0.5   0.25 ]]
}

// Step 2 : 곡률 길이
std::vector<float> distance(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
  distance(idx) = sqrt(Gradient[idx].x() * Gradient[idx].x() + Gradient[idx].y() * Gradient[idx].y());

  // distance result
 //  [1.11803399 1.11803399 0.90138782 0.70710678 0.625      0.55901699
 // 0.55901699]
}

// Step 3: 벡터들에 대한 탄젠트 계산하기
Eigen::Vector2f Tangent(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
    Tangent[idx].x() = Gradient[idx].x() / distance(idx);
    Tangent[idx].y() = Gradient[idx].y() / distance(idx);
}

// STEP 4: 탄젠트의 구성요소를 분리하고 기울기를 계산하여 법선 벡터를 찾는다.
std::vector<float> Gradient_distance(7)
Eigen::Vector2f G_Gradient(7);

for(int idx = 0; idx < Gradient.size()-1; idx++)
{
    Gradient_distance[idx] = distance[idx] - distance[idx+1];
    G_Gradient[idx] = Gradient[idx] - Gradient[idx+1];
}

// STEP 5 : estimation Curve Rate of Vector
std::vector<float> curvature(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
  curavture[idx] = abs(G_Gradient.x() * Gradient.y() - Gradient.x() * G_Gradient.y())/((Gradient.x() * Gradient.x() + Gradient.y() * Gradient.y())**1.5);

  // Curvature Result
  // [0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 // 0.        ]
}

3D Case

https://www.youtube.com/watch?v=NlcvU67YWpQ

Fomular

r'(t).cross(r''(t))= A;
k(t) = (sqrt(A.dot(A))) / (sqrt(r'.dot(r'))^3
Eigen::MatrixXf m(3,7);
m = [[1,1,1],[1.5,2,2],[2,3,3],[2.5,3.5,4],[3,4,5],[3.5,4.25,6],[4,4.5,7]]; //원래는 블라캣이다.
Eigen::Vector3f Gradient(7);

//  Step 1 : Gradient(vector)
for(int idx = 0; idx < m.cols()-1; idx++)
{
  Gradient[idx] = m.col(idx)-m.col(idx+1); // r'(t)
  // Gradient stored result
  // [[0.5   1.   , 1]
  //  [0.5   1.   , 1]
  //  [0.5   0.75 , 0.75]
  //  [0.5   0.5  , 0.5]
  //  [0.5   0.375, 0.375]
  //  [0.5   0.25 , 0.25]
  //  [0.5   0.25 , 0.25]]
}

// Step 2 : 곡률 길이
std::vector<float> distance(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
  distance(idx) = sqrt(Gradient[idx].x() * Gradient[idx].x() + Gradient[idx].y() * Gradient[idx].y() + Gradient[idx].z() * Gradient[idx].z());

  // distance result
 //  [1.5 1.5 1,17260394 0.8660254038 0.7288689869      0.6123724357
 // 0.6123724357]
}

// Step 3: 벡터들에 대한 탄젠트 계산하기
Eigen::Vector3f Tangent(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
    Tangent[idx].x() = Gradient[idx].x() / distance(idx);
    Tangent[idx].y() = Gradient[idx].y() / distance(idx);
    Tangent[idx].z() = Gradient[idx].z() / distance(idx);
}

// STEP 4: 탄젠트의 구성요소를 분리하고 기울기를 계산하여 법선 벡터를 찾는다.
std::vector<float> Gradient_distance(7)
Eigen::Vector3f G_Gradient(7);

for(int idx = 0; idx < Gradient.size()-1; idx++)
{
    Gradient_distance[idx] = distance[idx] - distance[idx+1];
    G_Gradient[idx] = Gradient[idx] - Gradient[idx+1];
}

// STEP 5 : estimation Curve Rate of Vector
std::vector<float> curvature(7);
for(int idx = 0; idx < Gradient.size(); idx++)
{
  Eigen::Vector3f Temp_Normal_vector;
  Temp_Normal_vector = Gradient[idx].cross(G_Gradient[idx]);

  curavture[idx] = sqrt(Temp_Normal_vector.dot(Temp_Normal_vector))/(sqrt(Gradient[idx].dot(Gradient[idx])))**3;

  // Curvature Result
  // [0.         0.04472136 0.17067698 0.26516504 0.256      0.17888544
 // 0.        ]
}

slope를 구할때도 많이 쓰이며, lidar에서는 포인트 클라우드 Feature Extraction을 위해 사용이 된다.

참고자료

about 2D

https://www.delftstack.com/ko/howto/numpy/curvature-formula-numpy/

all about curavture

https://math.libretexts.org/Bookshelves/Calculus/Supplemental_Modules_(Calculus)/Vector_Calculus/2%3A_Vector-Valued_Functions_and_Motion_in_Space/2.3%3A_Curvature_and_Normal_Vectors_of_a_Curve

https://openstax.org/books/calculus-volume-3/pages/3-3-arc-length-and-curvature

Comment  Read more