import os
import copy
import logging
import numpy as np
import matplotlib.pyplot as plt
from roboskin.calibration.optimizer import (
OurMethodOptimizer,
MittendorferMethodOptimizer,
)
from roboskin.calibration.kinematic_chain import construct_kinematic_chain
from roboskin.calibration.data_logger import DataLogger
from roboskin.calibration.evaluator import Evaluator
from roboskin.calibration import utils
from roboskin.examples.calibration.calibrate_imu_poses import parse_arguments
REPODIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))))
CONFIGDIR = os.path.join(REPODIR, 'config')
[docs]def initialize_optimizers_and_loggers(args, robotic_configs, imu_mappings, datadir, evaluator):
optimizers = []
data_loggers = []
# Our Method
kinematic_chain = construct_kinematic_chain(
robot_configs, imu_mappings, args.test, args.optimizeall)
data_logger = DataLogger(datadir, args.robot, args.method, overwrite=True)
optimizer = OurMethodOptimizer(
kinematic_chain, evaluator, data_logger,
args.optimizeall, args.error_functions, args.stop_conditions)
optimizers.append(optimizer)
data_loggers.append(data_logger)
kinematic_chain = construct_kinematic_chain(
robot_configs, imu_mappings, args.test, args.optimizeall)
data_logger = DataLogger(datadir, args.robot, args.method, overwrite=True)
optimizer = MittendorferMethodOptimizer(
kinematic_chain, evaluator, data_logger,
args.optimizeall, args.error_functions, args.stop_conditions, method='mittendorfer')
optimizers.append(optimizer)
data_loggers.append(data_logger)
kinematic_chain = construct_kinematic_chain(
robot_configs, imu_mappings, args.test, args.optimizeall)
data_logger = DataLogger(datadir, args.robot, args.method, overwrite=True)
optimizer = MittendorferMethodOptimizer(
kinematic_chain, evaluator, data_logger,
args.optimizeall, args.error_functions, args.stop_conditions, method='modified_mittendorfer')
optimizers.append(optimizer)
data_loggers.append(data_logger)
return optimizers, data_loggers
[docs]def run_optimizations(measured_data, optimizers, data_loggers, method_names, n_noise=10, sigma=0.1, outlier_ratio=1):
noise_sigmas = sigma * np.arange(n_noise)
ave_euclidean_distance = np.zeros((n_noise, len(method_names)))
total_time = np.zeros((n_noise, len(method_names)))
for i, noise_sigma in enumerate(noise_sigmas):
data = copy.deepcopy(measured_data)
utils.add_outlier(data, ['static', 'dynamic'], sigma=noise_sigma, outlier_ratio=outlier_ratio)
for j, (optimizer, data_logger) in enumerate(zip(optimizers, data_loggers)):
logging.info('Optimizer: {}, sigma={}, Outlier: {}'.format(
method_names[j], noise_sigma, outlier_ratio))
optimizer.optimize(data)
ave_euclidean_distance[i, j] = data_logger.average_euclidean_distance
total_time[i, j] = data_logger.elapsed_times['total']
print(ave_euclidean_distance)
return ave_euclidean_distance, total_time
if __name__ == '__main__':
args = parse_arguments()
utils.initialize_logging(args.log, args.logfile)
robot_configs = utils.load_robot_configs(CONFIGDIR, args.robot)
evaluator = Evaluator(true_su_pose=robot_configs['su_pose'])
datadir = utils.parse_datadir(args.datadir)
measured_data, imu_mappings = utils.load_data(args.robot, datadir)
method_names = ['OM', 'MM', 'mMM']
colors = ['-b', '-r', '-g']
outlier_ratios = [0.1, 0.5, 1.0]
sigmas = [1, 0.5, 0.1]
n_noise = 10
for outlier_ratio, sigma in zip(outlier_ratios, sigmas):
optimizers, data_loggers = initialize_optimizers_and_loggers(
args,
robot_configs,
imu_mappings,
datadir,
evaluator
)
if len(method_names) != len(optimizers):
raise ValueError('Lengths of method_names and optimizers do not much')
ave_euclidean_distance, total_time = run_optimizations(
measured_data,
optimizers,
data_loggers,
method_names,
n_noise=n_noise,
sigma=sigma,
outlier_ratio=outlier_ratio
)
filename = f"ave_l2_norm_graph_{0}_{(n_noise-1)*sigma}_{outlier_ratio}_loss1.png"
title = f"Ave. L2 norms (sigma={0}-{(n_noise-1)*sigma}, outliers={outlier_ratio})"
plot_performance(
data_loggers,
method_names,
colors,
ave_euclidean_distance,
total_time,
n_noise,
sigma,
filename,
title)