저는 현재 레이저 스캐너로 포인트 로봇을 위해 확장 된 칼만 필터를 구현해야하는 학교 프로젝트를 진행하고 있습니다. 로봇은 0도 회전 반경으로 회전하고 앞으로 주행 할 수 있습니다. 모든 동작은 부분적으로 선형입니다 (구동, 회전, 구동).
우리가 사용하는 시뮬레이터는 가속을 지원하지 않으며 모든 동작이 즉각적입니다.
또한 현지화해야하는 알려진 맵 (png 이미지)이 있습니다. 레이저 스캔을 시뮬레이션하기 위해 이미지에서 광선 추적을 할 수 있습니다.
내 파트너와 나는 우리가 사용해야 할 모션 및 센서 모델에 대해 약간 혼란스러워합니다.
지금까지 상태를 벡터로 모델링하고 있습니다 .
다음과 같이 업데이트 방정식을 사용하고 있습니다
void kalman::predict(const nav_msgs::Odometry msg){
this->X[0] += linear * dt * cos( X[2] ); //x
this->X[1] += linear * dt * sin( X[2] ); //y
this->X[2] += angular * dt; //theta
this->F(0,2) = -linear * dt * sin( X[2] ); //t+1 ?
this->F(1,2) = linear * dt * cos( X[2] ); //t+1 ?
P = F * P * F.t() + Q;
this->linear = msg.twist.twist.linear.x;
this->angular = msg.twist.twist.angular.z;
return;
}
우리는 초기화를 잊어 버렸고 P
그것이 0이라는 것을 알 때까지 모든 것이 효과가 있다고 생각 했습니다. 아직 시스템에 노이즈가 발생하지 않았기 때문에 전파가 매우 정확했습니다.
모션 모델의 경우 F에 다음 행렬을 사용합니다.
업데이트 공식의 Jacobian으로. 이 올바른지?
센서 모델의 경우 로봇의 유한 차이를 취하여 야 코비안 (H)을 근사화합니다. , 과 지도에서 위치와 광선 추적. 우리는 이것이 효과가 있다고 말한 TA와 이야기했지만 여전히 그럴 것이라고 확신하지 않습니다. 우리의 교수진이 떨어져서 불행히도 물어볼 수 없습니다. 보정 단계 당 3 개의 레이저 측정을 사용하므로 H는 3x3입니다.
P를 초기화하는 방법이있는 다른 문제. 우리는 1,10,100을 시도하고 맵이 50x50 일 때 로봇을 (-90, -70)에 배치합니다.
우리 프로젝트의 코드는 여기에서 찾을 수 있습니다 : https://github.com/en4bz/kalman/blob/master/src/kalman.cpp
모든 조언을 부탁드립니다.
편집하다:
이 시점에서 나는 기본적인 움직임 노이즈로 안정화시키기 위해 필터를 얻었지만 실제 움직임은 없습니다. 로봇이 움직이기 시작하자마자 필터가 아주 빠르게 분기되어 맵에서 나옵니다.