Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
pd.options.display.width = 80
pd.options.display.max_colwidth = 20
log.configure_logging(args.verbose, args.silent, args.debug,
local_logfile=args.logfile)
if args.debug:
import pprint
arg_dict = {arg: getattr(args, arg) for arg in vars(args)}
logger.debug("main_parser config:\n{}\n".format(
pprint.pformat(arg_dict)))
df = load_results_as_dataframe(args.result_files, args.use_filenames,
args.merge)
keys = df.columns.values.tolist()
if SETTINGS.plot_usetex:
keys = [key.replace("_", "\\_") for key in keys]
df.columns = keys
duplicates = [x for x in keys if keys.count(x) > 1]
if duplicates:
logger.error("Values of 'est_name' must be unique - duplicates: {}\n"
"Try using the --use_filenames option to use filenames "
"for labeling instead.".format(", ".join(duplicates)))
sys.exit(1)
# derive a common index type if possible - preferably timestamps
common_index = None
time_indices = ["timestamps", "seconds_from_start", "sec_from_start"]
if args.use_rel_time:
del time_indices[0]
for idx in time_indices:
if idx not in df.loc["np_arrays"].index:
if args.clear_log:
from evo.tools import user
if user.confirm("clear logfile? (y/n)"):
open(settings.GLOBAL_LOGFILE_PATH, mode='w')
elif args.subcommand == "cat_log":
if os.name == "nt":
print("cat_log feature not available on Windows")
sys.exit(1)
if not args.message and sys.stdin.isatty():
if not os.path.exists(settings.GLOBAL_LOGFILE_PATH):
print("no logfile found - run: "
"evo_config set global_logfile_enabled", end=line_end)
else:
print(open(settings.GLOBAL_LOGFILE_PATH).read(), end="")
elif not settings.SETTINGS.global_logfile_enabled:
print("logfile disabled", end=line_end)
sys.exit(1)
else:
import logging
logger = logging.getLogger(__name__)
from evo.tools import log
file_fmt = log.DEFAULT_LONG_FMT
if args.source:
file_fmt = file_fmt.replace(
"%(module)s.%(funcName)s():%(lineno)s", args.source)
log.configure_logging(silent=True, file_fmt=file_fmt)
if not args.message:
msg = sys.stdin.read()
else:
msg = args.message
getattr(logger, args.loglevel)(msg)
"title": title,
"xlabel": "{} sub-sequences ({})".format(mode, bin_unit.value)
})
rpe_for_each_result.add_stats({bin: result for bin, result in zip(bins, results)})
# TODO use a more suitable name than seconds
rpe_for_each_result.add_np_array("seconds_from_start", bins)
rpe_for_each_result.add_np_array("error_array", results)
logger.debug(SEP)
logger.info(rpe_for_each_result.pretty_str())
if show_plot or save_plot or serialize_plot:
from evo.tools import plot
import matplotlib.pyplot as plt
plot_collection = plot.PlotCollection(title)
fig = plt.figure(figsize=(SETTINGS.plot_figsize[0], SETTINGS.plot_figsize[1]))
plot.error_array(fig, results, x_array=bins,
name="mean RPE" + (" (" + rpe_unit.value + ")") if rpe_unit else "",
marker="o", title=title,
xlabel=mode + " sub-sequences " + " (" + bin_unit.value + ")")
# info text
if SETTINGS.plot_info_text and est_name and ref_name:
ax = fig.gca()
ax.text(0, -0.12, "estimate: " + est_name + "\nreference: " + ref_name,
transform=ax.transAxes, fontsize=8, color="gray")
plt.title(title)
plot_collection.add_figure("raw", fig)
if show_plot:
plot_collection.show()
if save_plot:
plot_collection.export(save_plot, confirm_overwrite=not no_warnings)
if serialize_plot:
traj_ref.timestamps, bin, tol, True)
if len(id_pairs) == 0:
raise RuntimeError("bin " + str(bin) + " (" + str(bin_unit.value) + ") "
+ "produced empty index list - try other values")
# calculate RPE with all IDs (delta 1 frames)
data = (traj_ref, traj_est)
# the delta here has nothing to do with the bin - 1f delta just to use all poses of the bin
rpe_metric = metrics.RPE(pose_relation, delta=1, delta_unit=metrics.Unit.frames,
all_pairs=True)
rpe_metric.process_data(data, id_pairs)
mean = rpe_metric.get_statistic(metrics.StatisticsType.mean)
results.append(mean)
if SETTINGS.plot_usetex:
mode.replace("_", "\_")
title = "mean RPE w.r.t. " + pose_relation.value + "\nfor different " + mode + " sub-sequences"
if align and not correct_scale:
title += "\n(with SE(3) Umeyama alignment)"
elif align and correct_scale:
title += "\n(with Sim(3) Umeyama alignment)"
elif correct_only_scale:
title += "\n(scale corrected)"
else:
title += "\n(not aligned)"
rpe_for_each_result = result.Result()
rpe_for_each_result.add_info({
"label": "RPE ({})".format(rpe_unit.value),
"est_name": est_name,
"ref_name": ref_name,
help="unit of delta - `f` (frames), `d` (deg), `r` (rad), `m`(meters)",
choices=['f', 'd', 'r', 'm'])
algo_opts.add_argument(
"--all_pairs",
action="store_true",
help="use all pairs instead of consecutive pairs (disables plot)",
)
output_opts.add_argument(
"-p",
"--plot",
action="store_true",
help="show plot window",
)
output_opts.add_argument(
"--plot_mode", default=SETTINGS.plot_mode_default,
help="the axes for plot projection",
choices=["xy", "xz", "yx", "yz", "zx", "zy", "xyz"])
output_opts.add_argument(
"--plot_colormap_max", type=float,
help="the upper bound used for the color map plot "
"(default: maximum error value)")
output_opts.add_argument(
"--plot_colormap_min", type=float,
help="the lower bound used for the color map plot "
"(default: minimum error value)")
output_opts.add_argument(
"--plot_colormap_max_percentile", type=float,
help="percentile of the error distribution to be used "
"as the upper bound of the color map plot "
"(in %%, overrides --plot_colormap_max)")
output_opts.add_argument(
def plot(args, result, traj_ref, traj_est, traj_ref_full=None):
from evo.tools import plot
from evo.tools.settings import SETTINGS
import matplotlib.pyplot as plt
import numpy as np
logger.debug(SEP)
logger.debug("Plotting results... ")
plot_mode = plot.PlotMode(args.plot_mode)
# Plot the raw metric values.
fig1 = plt.figure(figsize=SETTINGS.plot_figsize)
if "seconds_from_start" in result.np_arrays:
seconds_from_start = result.np_arrays["seconds_from_start"]
else:
seconds_from_start = None
plot.error_array(
fig1, result.np_arrays["error_array"], x_array=seconds_from_start,
statistics={
s: result.stats[s]
for s in SETTINGS.plot_statistics if s not in ("min", "max")
}, name=result.info["label"], title=result.info["title"],
xlabel="$t$ (s)" if seconds_from_start else "index")
# Plot the values color-mapped onto the trajectory.
fig2 = plt.figure(figsize=SETTINGS.plot_figsize)
ax = plot.prepare_axis(fig2, plot_mode)
action="store_true")
algo_opts.add_argument("-s", "--correct_scale", action="store_true",
help="correct scale with Umeyama's method")
algo_opts.add_argument(
"--align_origin",
help="align the trajectory origin to the origin of the reference "
"trajectory", action="store_true")
output_opts.add_argument(
"-p",
"--plot",
action="store_true",
help="show plot window",
)
output_opts.add_argument(
"--plot_mode", default=SETTINGS.plot_mode_default,
help="the axes for plot projection",
choices=["xy", "xz", "yx", "yz", "zx", "zy", "xyz"])
output_opts.add_argument(
"--plot_colormap_max", type=float,
help="the upper bound used for the color map plot "
"(default: maximum error value)")
output_opts.add_argument(
"--plot_colormap_min", type=float,
help="the lower bound used for the color map plot "
"(default: minimum error value)")
output_opts.add_argument(
"--plot_colormap_max_percentile", type=float,
help="percentile of the error distribution to be used "
"as the upper bound of the color map plot "
"(in %%, overrides --plot_colormap_max)")
output_opts.add_argument(
plot a path/trajectory based on xyz coordinates into an axis
:param ax: the matplotlib axis
:param plot_mode: PlotMode
:param traj: trajectory.PosePath3D or trajectory.PoseTrajectory3D object
:param style: matplotlib line style
:param color: matplotlib color
:param label: label (for legend)
:param alpha: alpha value for transparency
"""
x_idx, y_idx, z_idx = plot_mode_to_idx(plot_mode)
x = traj.positions_xyz[:, x_idx]
y = traj.positions_xyz[:, y_idx]
if plot_mode == PlotMode.xyz:
z = traj.positions_xyz[:, z_idx]
ax.plot(x, y, z, style, color=color, label=label, alpha=alpha)
if SETTINGS.plot_xyz_realistic:
set_aspect_equal_3d(ax)
else:
ax.plot(x, y, style, color=color, label=label, alpha=alpha)
if label:
ax.legend(frameon=True)
xlabel = "$x$ (m)"
elif plot_mode in {PlotMode.yz, PlotMode.yx}:
xlabel = "$y$ (m)"
else:
xlabel = "$z$ (m)"
if plot_mode in {PlotMode.xy, PlotMode.zy, PlotMode.xyz}:
ylabel = "$y$ (m)"
elif plot_mode in {PlotMode.zx, PlotMode.yx}:
ylabel = "$x$ (m)"
else:
ylabel = "$z$ (m)"
ax.set_xlabel(xlabel)
ax.set_ylabel(ylabel)
if plot_mode == PlotMode.xyz:
ax.set_zlabel('$z$ (m)')
if SETTINGS.plot_invert_xaxis:
plt.gca().invert_xaxis()
if SETTINGS.plot_invert_yaxis:
plt.gca().invert_yaxis()
return ax
if args.plot or args.save_plot or args.serialize_plot:
# check if data has NaN "holes" due to different indices
inconsistent = error_df.isnull().values.any()
if inconsistent and common_index != "timestamps" and not args.no_warnings:
logger.debug(SEP)
logger.warning("Data lengths/indices are not consistent, "
"raw value plot might not be correctly aligned")
from evo.tools import plot
import matplotlib.pyplot as plt
import seaborn as sns
import math
# use default plot settings
figsize = (SETTINGS.plot_figsize[0], SETTINGS.plot_figsize[1])
use_cmap = SETTINGS.plot_multi_cmap.lower() != "none"
colormap = SETTINGS.plot_multi_cmap if use_cmap else None
linestyles = ["-o" for x in args.result_files
] if args.plot_markers else None
# labels according to first dataset
if "xlabel" in df.loc["info"].index and not df.loc[
"info", "xlabel"].isnull().values.any():
index_label = df.loc["info", "xlabel"][0]
else:
index_label = "$t$ (s)" if common_index else "index"
metric_label = df.loc["info", "label"][0]
plot_collection = plot.PlotCollection(first_title)
# raw value plot
fig_raw = plt.figure(figsize=figsize)
# handle NaNs from concat() above