import os
from pathlib import Path
import yaml
from sklearn.model_selection import ParameterSampler
from scipy.stats.distributions import truncnorm, loguniform
import database
[docs]def create_test_case_config(base_config: dict, params: dict, index: int, parameter_study_name: str) -> dict:
test_case_config = base_config.copy()
test_case_config['test_case'] = str(index)
test_case_config['parameter_study_name'] = str(parameter_study_name)
test_case_config['ukf']['sigma_alpha'] = float(params['sigma_alpha'])
test_case_config['ukf']['P'][0] = float(params['P_initial_pos'])
test_case_config['ukf']['P'][1] = float(params['P_initial_pos'])
test_case_config['ukf']['P'][2] = float(params['P_initial_v_x'])
test_case_config['ukf']['P'][3] = float(params['P_initial_psi'])
test_case_config['ukf']['template_Q'][0] = float(params['Q_pos'])
test_case_config['ukf']['template_Q'][1] = float(params['Q_pos'])
test_case_config['ukf']['template_Q'][2] = float(params['Q_v_x'])
test_case_config['ukf']['template_Q'][3] = float(params['Q_psi'])
test_case_config['ukf']['minimal_cone_covariance_area'] = float(params['minimal_cone_covariance_area'])
test_case_config['local_mapping']['data_association']['chi2_quantile'] = float(params['chi2_quantile'])
test_case_config['local_mapping']['fov_gate']['min_distance'] = float(params['fov_min_distance'])
test_case_config['local_mapping']['fov_gate']['max_distance'] = float(params['fov_max_distance'])
test_case_config['local_mapping']['fov_gate']['angle'] = float(params['fov_angle'])
test_case_config['local_mapping']['R_azimuth'] = float(params['R_azimuth'])
test_case_config['local_mapping']['R_distance_factor'] = float(params['R_distance_factor'])
test_case_config['local_mapping']['R_distance_offset'] = float(params['R_distance_offset'])
test_case_config['novatel_position']['R_scaling'] = float(params['gps_heading_R_scaling'])
test_case_config['novatel_heading']['R_scaling'] = float(params['gps_position_R_scaling'])
test_case_config['wheelspeed']['R'] = float(params['wheelspeed_R'])
return test_case_config
[docs]def create_test_case_configs(base_config: dict, param_sampler: ParameterSampler, parameter_study_name: str):
Path(f'{os.path.abspath(os.path.dirname(__file__))}/../../param_study'
f'/{parameter_study_name}/configs').mkdir(parents=True, exist_ok=True)
session = database.Session()
for test_case_i, params in enumerate(list(param_sampler)):
Path(f'{os.path.abspath(os.path.dirname(__file__))}/../../'
f'param_study/{parameter_study_name}/{test_case_i}').mkdir(parents=True, exist_ok=True)
with open(f'{os.path.abspath(os.path.dirname(__file__))}/../../param_study/'
f'{parameter_study_name}/configs/test_case_{test_case_i}.yaml', 'w') as stream:
yaml.dump(create_test_case_config(base_config=base_config, params=params, index=test_case_i,
parameter_study_name=parameter_study_name), stream)
session.add(database.TestCase.create(parameter_study_name, test_case_i))
session.commit()
[docs]def fuck_you_scipy(a: float, b: float, loc: float, scale: float):
return truncnorm(a=((a - loc) / scale), b=(b - loc) / scale, loc=loc, scale=scale)
if __name__ == '__main__':
parameter_study_name = 'test'
with open(f'{os.path.abspath(os.path.dirname(__file__))}/../../config/slam.yaml', 'r') as stream:
base_config = yaml.safe_load(stream)
param_distributions = [
{
'sigma_alpha': loguniform(0.001, 0.3),
'P_initial_pos': fuck_you_scipy(0.01, 4, 0.1, 0.3),
'P_initial_v_x': fuck_you_scipy(0.01, 4, 0.2, 0.3),
'P_initial_psi': fuck_you_scipy(1, 100, 50, 40),
'Q_pos': fuck_you_scipy(0.1, 4, 1, 1),
'Q_v_x': fuck_you_scipy(0.1, 15, 5, 4),
'Q_psi': fuck_you_scipy(1, 50, 15, 10),
'minimal_cone_covariance_area': fuck_you_scipy(0.1, 1.5, 0.3, 0.5),
'chi2_quantile': fuck_you_scipy(0.5, 0.95, 0.7, 0.2),
'fov_min_distance': fuck_you_scipy(0.5, 1.5, 1, 0.3),
'fov_max_distance': fuck_you_scipy(9, 15, 12, 2),
'fov_angle': fuck_you_scipy(80, 120, 100, 15),
'R_azimuth': fuck_you_scipy(3, 20, 10, 5),
'R_distance_factor': fuck_you_scipy(0.1, 0.5, 0.15, 0.2),
'R_distance_offset': fuck_you_scipy(0.1, 0.5, 0.15, 0.2),
'gps_heading_R_scaling': fuck_you_scipy(0.7, 2, 1, 0.3),
'gps_position_R_scaling': fuck_you_scipy(0.7, 2, 1, 0.3),
'wheelspeed_R': fuck_you_scipy(5, 100, 50, 30)
}
]
param_sampler = ParameterSampler(param_distributions, n_iter=2000, random_state=42)
create_test_case_configs(base_config=base_config, param_sampler=param_sampler,
parameter_study_name=parameter_study_name)