// it's for Latex

pages

[ Map merging ] #05. Evaluation with evo

[ Map merging ] #04. Run Datasets with ORB-SLAM2 에서 Datasets을 이용해 ORB-SLAM2를 작동시켜 Localization을 진행해보았다.

하지만 모든 실험이 그렇듯이 우리는 SLAM이 제대로 작동했는지 평가할 필요가 있다. 
따라서 우리는 evo 라는 tool을 사용해 해당 localization을 판단해볼 것이다. 

SLAM을 평가하는 tool들은 여러가지(SLAMBENCH, rpg_trajectory, ...)가 있지만
evo를 선택한 이유를 들자면 ROS의 rosbag 명령어를 이용한 evaluating이 가능하기 때문이다. 

그럼 차근차근 살펴보도록 하자.


구동환경

OS : Ubuntu 16.04 LTS
ROS : Kinetic


1. Install evo


아래 링크를 참조해 evo를 설치한다.

https://michaelgrupp.github.io/evo/

명령어로는 아래와 같다.

pip install evo --upgrade --no-binary evo


그리고 github로 부터 예제파일도 다운로드 한다.

명령어로는 아래와 같다.

1
2
$ cd ~
$ git clone https://github.com/MichaelGrupp/evo.git
cs


2. Run the Example


다음 명령어를 통해 예제파일을 돌려보자.

  cd ~/evo/test/data
  evo_traj kitti KITTI_00_ORB.txt KITTI_00_SPTAM.txt --ref=KITTI_00_gt.txt -p --plot_mode=xz


다음과 같은 결과를 얻을 수 있다.



검은색 점선이 laser sensor와 6D pose sensor에 의해 얻어진 uav의 ground truth이고,
파란색 점선이 ORB-SLAM에 의해 얻어진 trajectory data,
초록색 점선이 SPTAM에 의해 얻어진 trajectory data가 된다.

evo의 다양한 툴을 이용해 여러 결과값을 확인할 수 있다.

3. Getting the ground truth data(bag) of EuRoc


먼저 설명하자면 EuRoc의 Datasets을 rosbag을 이용해 작동시켰을 때,
ground truth 를 위한 센서인 leica 센서의 토픽 메세지 형태는 "/geometry_msgs/PointStamped" 형태이다.

하지만 EuRoc 에서는 ROS를 위해 4가지 메세지 형태만이 사용 가능하다. (20.03.06 기준)

1. geometry_msgs/PoseStamped
2. geometry_msgs/TransformStamped
3. geometry_msgs/PoseWithCovarianceStamped , 
4. nav_msgs/Odometry

따라서 다른 방법으로 EuRoc의 ground truth 를 구해주어야 한다.

해당 방법은 다음 링크를 참조했다.

https://github.com/MichaelGrupp/evo/wiki/Formats

먼저 [ Map merging ] #04. Run Datasets with ORB-SLAM2 에서 다운로드한 파일 중에
MH_01_easy.zip 이란 파일이 있을 것이다.

해당 파일의 압축을 풀면 mav0 라는 폴더가 나오는데, 해당 폴더 안의 아래 경로로 가면

mav0/state_groundtruth_estimate0

data.csv 라는 파일을 발견할 수 있다.

해당 파일은 uav의 groundtruth data 를 엑셀 형태로 기록한 것인데,
evo에서는 이러한 EuRoc Datasets의 형태를 변환할 수 있는 모듈을 제공한다.

그러므로 다음 명령어를 이용해 data.csv를 bag 형태로 바꾸어주자.
(경로는 case by case)

1
$ evo_traj euroc ~/Downloads/mav0/state_groundtruth_estimate0/data.csv --save_as_bag
cs

그러면 해당 날짜와 시간을 이름으로 한 bag 파일이 생성되는데,
해당 bag 파일을 적절한 이름(ex: gt.bag)으로 바꾸어 준다.

그러면 최종적으로 gt.bag 이라는 파일이 생성되는데,
해당 bag 파일의 정보를 확인해보면 다음과 같이
"geometry_msgs/PoseStamped" 라는 evo에 가용한 형태로 변환된 것을 확인할 수 있다.
topic명은 data가 된다.

1
2
3
4
5
6
7
8
9
10
11
12
suho@ubuntu:~/Downloads$ rosbag info gt.bag
path:        gt.bag
version:     2.0
duration:    3:01s (181s)
start:       Jun 24 2014 12:03:00.84 (1403636580.84)
end:         Jun 24 2014 12:06:02.74 (1403636762.74)
size:        4.5 MB
messages:    36382
compression: none [6/6 chunks]
types:       geometry_msgs/PoseStamped [d3812c3cbc69362b77dc0b19b345f8f5]
topics:      data   36382 msgs    : geometry_msgs/PoseStamped
cs



4. Getting Pose of ORB-SLAM2


이제 groundtruth data는 획득했으니, ORB-SLAM2 를 이용해 얻어낸 pose와 비교할 일만이 남았다. 다음 과정을 통하여 pose를 얻어낸다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# terminal_1
$ roscore
# terminal_2
$ rosbag play MH_01_easy.bag 
# terminal_3
$ roslaunch orb_slam2_ros orb_slam2_EuRoc.launch
# terminal_4
$ rviz
# terminal_5
# pose.bag 이라는 파일에 /orb_slam2_mono/pose 데이터를 기록
# SLAM이 종료되는 동시에 종료시켜줘야 함
$ rosbag record -O pose /orb_slam2_mono/pose
cs

그러면 pose.bag 이라는 파일이 생성된 것을 확인할 수 있을 것이다.

5. Merging bag files


이제 bag 형태의 groundtruth와 ORB-SLAM2 pose 를 획득했다.
하지만 evo에서는 하나의 파일만 사용할 수 있으므로, 두 bag 파일을 합치는 과정을 진행하겠다.

먼저 아래의 링크에서 bagmerge.py 를 다운로드 한다.

https://gist.github.com/troygibb/21fec0c748227eec89338054e6dd1833

이 후에 해당 파이썬 파일을 gt.bagpose.bag이 있는 경로에 위치시킨 후,
다음 명령어를 이용해 bag 파일을 merge한다.

1
$ ./bagmerge.py gt.bag pose.bag -o merged.bag
cs

그러면 두 bag 파일이 합쳐진 merged.bag 파일을 획득할 수 있을 것이다.

6. Run the evo


이제 해당 파일을 이용해 결과를 확인해보자.
다음 명령어를 이용하면 된다.

1
$ evo_traj bag merged.bag data /orb_slam2_mono/pose  --plot
cs

evo_traj : trajectory에 대한 작업을 수행.
bag : bag 파일을 이용함.
merged.bag : bag 파일의 이름.
data : groundtruth 데이터 토픽 명.
/orb_slam2_mono/pose : ORB-SLAM2 의 pose 데이터 토픽 명.
--plot : 그래프를 출력하는 파라미터.





최종적으로 위와같은 그래프를 확인할 수 있다.

파란선은 groundtruth, 녹색선은 ORB-SLAM2 pose가 되는데,
두 데이터가 너무 많이 차이나 이상하게 생각될 수도 있지만,

ORB-SLAM2 이 거의 초반에 tracking에 실패해서 중간의 pose는 변화가 없었기 때문에,
이렇게 다른 양상의 그래프가 나오는 것이 맞다.

이 두 그래프의 형태를 맞추어 나가는 것이 SLAM의 목표 중 하나라고 생각한다.


댓글 없음:

댓글 쓰기