Open Robotics
카메라 랜드마크를 이용한 이동로봇의 EKF 위치인식 view 발행 | Localization
방랑야옹이~ 2011.07.29 17:50
안녕하세요. 블로그에서 많은걸 공부하고 있는 학생입니다.
소스와 함께 친절한 설명서까지 정말 감사드리고 있습니다.
다름이 아니라,

소스와 설명서 부분에 이해가 잘 되지 않는 부분이 있어서 염치불구하고 질문을 드립니다.


Correspondence test 함수에서
F = [Fx Fy]' 인데요,
그렇다면,

F =     [ 1 0 0 ... ]
         [ 0 1 0 ...]
         [ 0 0 1 ...]
         [ 1 0 0 ...]
         [ 0 1 0 ...]

로 되는것 같습니다.
그런데 아래 함수 부분에서는

                                                                 F(3,0) = F(4,1) = 0; //1;

이와 같이 해주셨습니다.

어떤 의미가 있는지 설명해주시면 정말 감사하겠습니다.


double CEKF_SLAM::correspondence_test(double r, double a)
{
...
for(int i=0; i<n; ++i)
{
                                                                                                                                                                                                                                                                                 ...
dMatrix F(5, Fv.colno());
F.null();
F(0,0) = F(1,1) = F(2,2) = 1;
F(3,0) = F(4,1) = 0; //1;
F(3,3+i*2) = F(4,4+i*2) = 1;
                                                                                                                                                                                                                                                                 ...
                                                                                                                                                                                                                                                                 }
...
}

한가지 더, 궁금한게 있습니다.

새로운 랜드 마크 등록을 위한, Feature_initialization 함수 부분에서,

공분산 행렬을 추가 하는데요,

P(i,col-2) = 0; // P01(i,0);
P(i,col-1) = 0; // P01(i,1);                                

P(row-2,i) = 0; // P10(0,i);
P(row-1,i) = 0; // P10(1,i);

P01과 P10의 값으로 하지 않고 왜 0으로 하는지.. 설명을 좀 부탁드립니다.


void CEKF_SLAM::Feature_initialization(double r, double a)
{
...
생략.
...
dMatrix P01 = Pc*~Yv;
dMatrix P10 = Yv*Pr;
dMatrix P11 = Yv*Pe0*~Yv + Yz*R*~Yz;

P.resize(P.rowno()+2, P.colno()+2);

int row = P.rowno();
int col = P.colno();

for (unsigned int i=0; i<P.rowno()-2; ++i) { // initialize for add Covariance Matrix
P(i,col-2) = 0; // P01(i,0);
P(i,col-1) = 0; // P01(i,1);                                

P(row-2,i) = 0; // P10(0,i);
P(row-1,i) = 0; // P10(1,i);
}

P(row-2,col-2) = P11(0,0);
P(row-2,col-1) = P11(0,1);
P(row-1,col-2) = P11(1,0);
P(row-1,col-1) = P11(1,1);
}

안녕하세요.

첫 번째 내용은 문서(pdf)에는 1로 되어있는데 코드에서는 0으로 해놨는데요. 제가 참조한 문서에서 1이라 그대로 따라 썼는데 내 생각으로는 0이 되어야 할 것 같습니다. 다른 참조 문서를 참고하여 검증이 필요한 내용입니다.

두 번째 내용에서 계산한 값을 사용하지 않고 0으로 초기 값을 둔 것은, 로봇의 위치 불확실성과 새로 찾은 랜드마크의 위치 불확실성간의 관계를 끊은것입니다. 아마도 몇 가지 실험을 하다가 코드를 원래대로 돌리지 않고 올린것같습니다.
답변감사드립니다. 답글 다시자마자 읽었는데 이제서야 답글을 다네요. ^^;;
등록
텍스티콘 텍스티콘
EKF Localization(Identified 2D Feature).pdf (197 KB) 다운로드
mobile_robot_EKF.zip (108 KB) 다운로드
mobile_robot_EKF_camera_landmark.zip (113 KB) 다운로드