Major changes: - New square-root implementation for optimization and marginalization, giving faster optimization and numerically more stable marginalization. The square root solver is the new default, but the Schur complement based implementation is still available. (Implements the ICCV'21 paper.) - The odometry estimator is now fully templetized and you can run in float or double. Default is float, which works well with the new square-root implementation and gives best runtimes. - Batch evaluation scripts and documentation to reproduce the ICCV'21 experiments. Additional changes: - New options in VIO to marginalize lost landmark right away and not only when the frame is marginalized (enabled by default). - small bugfix for keypoint patch extraction bounds - basalt_vio: more logging for batch evaluation - basalt_vio: better handling of closing the GUI while estimator is still running - basalt_vio: new command line argument to limit the number of frames processed - basalt_vio: new command line argument to save ground truth trajectory - added unit tests for square root marginalization - update basalt-headers - new submodules: gmt, nlohmann/json, magic_enum
140 lines
3.8 KiB
Bash
Executable File
140 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
||
##
|
||
## BSD 3-Clause License
|
||
##
|
||
## This file is part of the Basalt project.
|
||
## https://gitlab.com/VladyslavUsenko/basalt.git
|
||
##
|
||
## Copyright (c) 2019-2021, Vladyslav Usenko and Nikolaus Demmel.
|
||
## All rights reserved.
|
||
##
|
||
|
||
#
|
||
# Usage:
|
||
# list-jobs.sh DIRNAME [DIRNAME ...] [-s|--short] [-o|--only STATUS]
|
||
#
|
||
# Lists all batch jobs found in DIRNAME. If the optional argument
|
||
# STATUS is passed, only lists jobs with that status. Multiple
|
||
# statuses can be passed in a space-separated string.
|
||
#
|
||
# Possible status arguments: queued, running, completed, failed, unknown
|
||
# You can also use 'active' as a synonym for 'queued running unknown'
|
||
|
||
# exit on error
|
||
set -o errexit -o pipefail
|
||
|
||
|
||
# we need GNU getopt...
|
||
GETOPT=getopt
|
||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||
if [ -f /usr/local/opt/gnu-getopt/bin/getopt ]; then
|
||
GETOPT="/usr/local/opt/gnu-getopt/bin/getopt"
|
||
fi
|
||
fi
|
||
|
||
# option parsing, see: https://stackoverflow.com/a/29754866/1813258
|
||
usage() { echo "Usage: `basename $0` DIRNAME [DIRNAME ...] [-s|--short] [-o|--only STATUS]" ; exit 1; }
|
||
|
||
# -allow a command to fail with !’s side effect on errexit
|
||
# -use return value from ${PIPESTATUS[0]}, because ! hosed $?
|
||
! "$GETOPT" --test > /dev/null
|
||
if [[ ${PIPESTATUS[0]} -ne 4 ]]; then
|
||
echo 'I’m sorry, `getopt --test` failed in this environment.'
|
||
exit 1
|
||
fi
|
||
|
||
OPTIONS=hsjo:
|
||
LONGOPTS=help,short,jobids,only:
|
||
|
||
# -regarding ! and PIPESTATUS see above
|
||
# -temporarily store output to be able to check for errors
|
||
# -activate quoting/enhanced mode (e.g. by writing out “--options”)
|
||
# -pass arguments only via -- "$@" to separate them correctly
|
||
! PARSED=$("$GETOPT" --options=$OPTIONS --longoptions=$LONGOPTS --name "`basename $0`" -- "$@")
|
||
if [[ ${PIPESTATUS[0]} -ne 0 ]]; then
|
||
# e.g. return value is 1
|
||
# then getopt has complained about wrong arguments to stdout
|
||
usage
|
||
fi
|
||
# read getopt’s output this way to handle the quoting right:
|
||
eval set -- "$PARSED"
|
||
|
||
SHORT=n
|
||
ONLY=""
|
||
JOBIDS=n
|
||
# now enjoy the options in order and nicely split until we see --
|
||
while true; do
|
||
case "$1" in
|
||
-h|--help) usage ;;
|
||
-s|--short) SHORT=y; shift ;;
|
||
-j|--jobids) JOBIDS=y; shift ;;
|
||
-o|--only) ONLY="$2"; shift 2 ;;
|
||
--) shift; break ;;
|
||
*) echo "Programming error"; exit 3 ;;
|
||
esac
|
||
done
|
||
|
||
# handle non-option arguments --> directories
|
||
if [[ $# -lt 1 ]]; then
|
||
echo "Error: Pass at least one folder"
|
||
usage
|
||
fi
|
||
DIRS=("$@")
|
||
|
||
# status aliases:
|
||
ONLY="${ONLY/active/queued running unknown}"
|
||
ONLY="${ONLY/notcompleted/queued running failed unknown}"
|
||
|
||
contains() {
|
||
[[ $1 =~ (^| )$2($| ) ]] && return 0 || return 1
|
||
}
|
||
|
||
display() {
|
||
if [ -z "$ONLY" ] || contains "$ONLY" $2; then
|
||
if [ $SHORT = y ]; then
|
||
echo "$1"
|
||
else
|
||
echo -n "$1 : $2"
|
||
if [ -n "$3" ]; then
|
||
echo -n " - $3"
|
||
fi
|
||
echo ""
|
||
fi
|
||
fi
|
||
}
|
||
|
||
for d in "${DIRS[@]}"; do
|
||
for f in `find "$d" -name status.log | sort`; do
|
||
DIR=`dirname "$f"`
|
||
|
||
# ignore backup folder from "rerun" scripts
|
||
if [[ `basename $DIR` = results-backup* ]]; then
|
||
continue
|
||
fi
|
||
|
||
if ! grep Started "$f" > /dev/null; then
|
||
display "$DIR" unknown "not started"
|
||
continue
|
||
fi
|
||
|
||
# job has started:
|
||
|
||
if grep Completed "$f" > /dev/null ; then
|
||
display "$DIR" completed ""
|
||
continue
|
||
fi
|
||
|
||
# job has started, but not completed (cleanly)
|
||
|
||
# check signs of termination
|
||
if [ -f "$DIR"/output.log ] && grep "Command terminated by signal" "$DIR"/output.log > /dev/null; then
|
||
display "$DIR" failed killed "`grep -oP 'Command terminated by \Ksignal .+' "$DIR"/output.log`"
|
||
continue
|
||
fi
|
||
|
||
# might be running or aborted
|
||
display "$DIR" unknown started
|
||
|
||
done
|
||
done
|