updated trajectory comparison

This commit is contained in:
Christian Forster
2014-03-31 21:21:34 +02:00
parent 74a6d3d699
commit d0a2406041
4 changed files with 78 additions and 90 deletions
+2
View File
@@ -0,0 +1,2 @@
*.yaml
!.gitignore
+1
View File
@@ -1,2 +1,3 @@
dataset: asl_vicon_d2 dataset: asl_vicon_d2
param_settings: vo_accurate param_settings: vo_accurate
experiment_label: 'svo acc'
+1
View File
@@ -1,2 +1,3 @@
dataset: asl_vicon_d2 dataset: asl_vicon_d2
param_settings: vo_fast param_settings: vo_fast
experiment_label: 'svo fast'
+59 -75
View File
@@ -1,31 +1,31 @@
# -*- coding: utf-8 -*- #!/usr/bin/python
import os
import sys
import time
import rospkg
import numpy as np import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
import yaml import yaml
import argparse
from matplotlib import rc from matplotlib import rc
# tell matplotlib to use latex font
rc('font',**{'family':'serif','serif':['Cardo']})
rc('text', usetex=True)
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset from mpl_toolkits.axes_grid1.inset_locator import mark_inset
def plot_trajectory(ax, filename, label, color, linewidth):
def plotTrajectory(ax, filename, label, color, linewidth):
file = open(filename) file = open(filename)
data = file.read() data = file.read()
lines = data.replace(","," ").replace("\t"," ").split("\n") lines = data.replace(","," ").replace("\t"," ").split("\n")
trajectory = np.array([[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"], dtype=np.float64) trajectory = np.array([[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"], dtype=np.float64)
ax.plot(trajectory[:,1], trajectory[:,2], label=label, color=color, linewidth=linewidth) ax.plot(trajectory[:,1], trajectory[:,2], label=label, color=color, linewidth=linewidth)
def compare_results(experiments, results_dir, comparison_dir,
if __name__ == '__main__': plot_scale_drift = False):
results_dir = '../results'
experiments = ['20130911_2113_nslam_i7_asl2_acc',
'20130911_2229_nslam_i7_asl2_fast',
'20130906_2149_ptam_i7_asl2']
# tell matplotlib to use latex font
rc('font',**{'family':'serif','serif':['Cardo']})
rc('text', usetex=True)
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# position error # position error
@@ -37,15 +37,12 @@ if __name__ == '__main__':
for exp in experiments: for exp in experiments:
# load dataset parameters # load dataset parameters
params_stream = open(results_dir+'/'+exp+'/params.yaml') params_stream = open(os.path.join(results_dir, exp, 'params.yaml'))
params = yaml.load(params_stream) params = yaml.load(params_stream)
# plot translation error # plot translation error
trans_error_filename = results_dir+'/'+exp+'/translation_error.txt' trans_error = np.loadtxt(os.path.join(results_dir, exp, 'translation_error.txt'))
file = open(trans_error_filename) trans_error[:,0] = trans_error[:,0]-trans_error[0,0]
data = file.read()
lines = data.replace(","," ").replace("\t"," ").split("\n")
trans_error = np.array([[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"], dtype=np.float64)
ax_poserr_x.plot(trans_error[:,0], trans_error[:,1], label=params['experiment_label']) ax_poserr_x.plot(trans_error[:,0], trans_error[:,1], label=params['experiment_label'])
ax_poserr_y.plot(trans_error[:,0], trans_error[:,2]) ax_poserr_y.plot(trans_error[:,0], trans_error[:,2])
ax_poserr_z.plot(trans_error[:,0], trans_error[:,3]) ax_poserr_z.plot(trans_error[:,0], trans_error[:,3])
@@ -58,7 +55,7 @@ if __name__ == '__main__':
ax_poserr_y.grid() ax_poserr_y.grid()
ax_poserr_z.grid() ax_poserr_z.grid()
fig_poserr.tight_layout() fig_poserr.tight_layout()
fig_poserr.savefig('../results/translation_error.pdf') fig_poserr.savefig(os.path.join(comparison_dir, 'translation_error.pdf'))
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# orientation error # orientation error
@@ -70,15 +67,12 @@ if __name__ == '__main__':
for exp in experiments: for exp in experiments:
# load dataset parameters # load dataset parameters
params_stream = open(results_dir+'/'+exp+'/params.yaml') params_stream = open(os.path.join(results_dir, exp, 'params.yaml'))
params = yaml.load(params_stream) params = yaml.load(params_stream)
# plot translation error # plot translation error
rot_error_filename = results_dir+'/'+exp+'/orientation_error.txt' rot_error = np.loadtxt(os.path.join(results_dir, exp, 'orientation_error.txt'))
file = open(rot_error_filename) rot_error[:,0] = rot_error[:,0]-rot_error[0,0]
data = file.read()
lines = data.replace(","," ").replace("\t"," ").split("\n")
rot_error = np.array([[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"], dtype=np.float64)
ax_roterr_r.plot(rot_error[:,0], rot_error[:,3], label=params['experiment_label']) ax_roterr_r.plot(rot_error[:,0], rot_error[:,3], label=params['experiment_label'])
ax_roterr_p.plot(rot_error[:,0], rot_error[:,2]) ax_roterr_p.plot(rot_error[:,0], rot_error[:,2])
ax_roterr_y.plot(rot_error[:,0], rot_error[:,1]) ax_roterr_y.plot(rot_error[:,0], rot_error[:,1])
@@ -91,76 +85,66 @@ if __name__ == '__main__':
ax_roterr_p.grid() ax_roterr_p.grid()
ax_roterr_y.grid() ax_roterr_y.grid()
fig_roterr.tight_layout() fig_roterr.tight_layout()
fig_roterr.savefig('../results/orientation_error.pdf') fig_roterr.savefig(os.path.join(comparison_dir, 'orientation_error.pdf'))
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# scale error # scale error
if plot_scale_drift:
fig_scale = plt.figure(figsize=(8,2.5)) fig_scale = plt.figure(figsize=(8,2.5))
ax_scale = fig_scale.add_subplot(111, xlabel='time [s]', ylabel='scale change [\%]') ax_scale = fig_scale.add_subplot(111, xlabel='time [s]', ylabel='scale change [\%]')
for exp in experiments: for exp in experiments:
# load dataset parameters # load dataset parameters
params_stream = open(results_dir+'/'+exp+'/params.yaml') params = yaml.load(open(os.path.join(results_dir, exp, 'params.yaml')))
params = yaml.load(params_stream)
# plot translation error # plot translation error
scale_drift_filename = results_dir+'/'+exp+'/scale_drift.txt' scale_drift = open(os.path.join(results_dir, exp, 'scale_drift.txt'))
file = open(scale_drift_filename) scale_drift[:,0] = scale_drift[:,0]-scale_drift[0,0]
data = file.read()
lines = data.replace(","," ").replace("\t"," ").split("\n")
scale_drift = np.array([[v.strip() for v in line.split(" ") if v.strip()!=""] for line in lines if len(line)>0 and line[0]!="#"], dtype=np.float64)
ax_scale.plot(scale_drift[:,0], scale_drift[:,1], label=params['experiment_label']) ax_scale.plot(scale_drift[:,0], scale_drift[:,1], label=params['experiment_label'])
ax_scale.set_xlim([0, rot_error[-1,0]+4]) ax_scale.set_xlim([0, rot_error[-1,0]+4])
ax_scale.legend(bbox_to_anchor=[0, 1], loc='upper left', ncol=3) ax_scale.legend(bbox_to_anchor=[0, 1], loc='upper left', ncol=3)
ax_scale.grid() ax_scale.grid()
fig_scale.tight_layout() fig_scale.tight_layout()
fig_scale.savefig('../results/scale_drift.pdf') fig_scale.savefig(os.path.join(comparison_dir, 'scale_drift.pdf'))
# ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------
# trajectory # trajectory
# fig_traj = plt.figure(figsize=(8,4.8))
fig_traj = plt.figure(figsize=(8,4.8)) # ax_traj = fig_traj.add_subplot(111, xlabel='x [m]', ylabel='y [m]', aspect='equal', xlim=[-3.1, 4], ylim=[-1.5, 2.6])
ax_traj = fig_traj.add_subplot(111, xlabel='x [m]', ylabel='y [m]', aspect='equal', xlim=[-3.1, 4], ylim=[-1.5, 2.6])
plotTrajectory(ax_traj, '/home/cforster/Datasets/asl_vicon_d2/groundtruth_filtered.txt', 'Groundtruth', 'k', 1.5)
plotTrajectory(ax_traj, results_dir+'/20130911_2229_nslam_i7_asl2_fast/traj_estimate_rotated.txt', 'Fast', 'g', 1)
plotTrajectory(ax_traj, results_dir+'/20130906_2149_ptam_i7_asl2/traj_estimate_rotated.txt', 'PTAM', 'r', 1)
# show detail:
axins = zoomed_inset_axes(ax_traj, 5.0, loc=1) # zoom = 6
plotTrajectory(axins, '/home/cforster/Datasets/asl_vicon_d2/groundtruth_filtered.txt', 'Groundtruth', 'k', 1.5)
plotTrajectory(axins, results_dir+'/20130911_2229_nslam_i7_asl2_fast/traj_estimate_rotated.txt', 'Fast', 'g', 1)
plotTrajectory(axins, results_dir+'/20130906_2149_ptam_i7_asl2/traj_estimate_rotated.txt', 'PTAM', 'r', 1)
axins.set_xlim(1.2, 1.70)
axins.set_ylim(-0.8, -0.3)
axins.patch.set_facecolor('0.9')
plt.xticks(visible=False)
plt.yticks(visible=False)
mark_inset(ax_traj, axins, loc1=2, loc2=4, fc="none", ec='b')
plt.draw()
plt.show()
ax_traj.legend(bbox_to_anchor=[1, 0], loc='lower right', ncol=3)
ax_traj.grid()
fig_traj.tight_layout()
fig_traj.savefig('../results/trajectory_asl.pdf')
# ------------------------------------------------------------------------------
# number of matches
# plot number of klt tracked and matched points
# fig = plt.figure(figsize=(8,2))
# ax = fig.add_subplot(111, xlabel='time [s]', ylabel='no. features', ylim=[0,220])
# ax.plot(np.arange(len(n_fts_1))/25.0, n_fts_1, 'b-', label='Accurate')
# ax.plot(np.arange(len(n_fts_2))/25.0, n_fts_2, 'g-', label='Fast')
# ax.legend(bbox_to_anchor=[1, 0], loc='lower right', ncol=2)
# fig.tight_layout()
# fig.savefig('../results/number_of_features2.pdf', bbox_inches="tight")
# #
# plotTrajectory(ax_traj, '/home/cforster/Datasets/asl_vicon_d2/groundtruth_filtered.txt', 'Groundtruth', 'k', 1.5)
# plotTrajectory(ax_traj, results_dir+'/20130911_2229_nslam_i7_asl2_fast/traj_estimate_rotated.txt', 'Fast', 'g', 1)
# plotTrajectory(ax_traj, results_dir+'/20130906_2149_ptam_i7_asl2/traj_estimate_rotated.txt', 'PTAM', 'r', 1)
#
# mark_inset(ax_traj, axins, loc1=2, loc2=4, fc="none", ec='b')
# plt.draw()
# plt.show()
# ax_traj.legend(bbox_to_anchor=[1, 0], loc='lower right', ncol=3)
# ax_traj.grid()
# fig_traj.tight_layout()
# fig_traj.savefig('../results/trajectory_asl.pdf')
if __name__ == '__main__':
default_name = time.strftime("%Y%m%d_%H%M", time.localtime())+'_comparison'
parser = argparse.ArgumentParser(description='Compare results.')
parser.add_argument('result_directories', nargs='+', help='list of result directories to compare')
parser.add_argument('--name', help='name of the comparison', default=default_name)
args = parser.parse_args()
# create folder for comparison results
results_dir = os.path.join(rospkg.RosPack().get_path('svo_analysis'), 'results')
comparison_dir = os.path.join(results_dir, args.name)
if not os.path.exists(comparison_dir):
os.makedirs(comparison_dir)
# run comparison
compare_results(args.result_directories, results_dir, comparison_dir)