하지만 모든 실험이 그렇듯이 우리는 SLAM이 제대로 작동했는지 평가할 필요가 있다.
따라서 우리는 evo 라는 tool을 사용해 해당 localization을 판단해볼 것이다.
SLAM을 평가하는 tool들은 여러가지(SLAMBENCH, rpg_trajectory, ...)가 있지만
evo를 선택한 이유를 들자면 ROS의 rosbag 명령어를 이용한 evaluating이 가능하기 때문이다.
그럼 차근차근 살펴보도록 하자.
구동환경
OS : Ubuntu 16.04 LTSROS : 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.bag와 pose.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의 목표 중 하나라고 생각한다.
댓글 없음:
댓글 쓰기