Skip to content

Commit 576b626

Browse files
committed
Gettting noise functionality ready for batch experiments #929 #928 #926
- Bigger noises are still bugged but now gives a atomWarn() - Encapsulated ntfv in a specific function - -ntfv now overrides -nig - addNoiseToTF now calls a subfunction computeNoise() to reduce boilerplate code - other misc small qol improvements
1 parent a57f165 commit 576b626

File tree

3 files changed

+52
-24
lines changed

3 files changed

+52
-24
lines changed

atom_calibration/scripts/calibrate

+9-17
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ from atom_calibration.calibration.visualization import setupVisualization, visua
2727
from atom_core.dataset_io import (addNoiseToInitialGuess,
2828
addBiasToJointParameters,
2929
addNoiseToTF,
30+
addNoiseFromNoisyTFLinks,
3031
checkIfAtLeastOneLabeledCollectionPerSensor,
3132
filterCollectionsFromDataset,
3233
filterSensorsFromDataset,
@@ -40,7 +41,7 @@ from atom_core.naming import generateName, generateKey
4041
from atom_core.utilities import (atomError, createLambdaExpressionsForArgs,
4142
waitForKeyPress2,
4243
atomStartupPrint,
43-
verifyAnchoredSensor,
44+
verifyAnchoredSensor,
4445
printComparisonToGroundTruth, saveCommandLineArgsYml)
4546
from atom_core.xacro_io import saveResultsXacro
4647
from atom_core.results_yml_io import saveResultsYml
@@ -53,6 +54,7 @@ from atom_core.config_io import parse_list_of_transformations, mutually_inclusiv
5354
def signal_handler(sig, frame):
5455
print("Stopping optimization (Ctrl+C pressed)")
5556
sys.exit(0)
57+
5658

5759

5860
# -------------------------------------------------------------------------------
@@ -111,9 +113,9 @@ def main():
111113
ap.add_argument("-nig", "--noisy_initial_guess", nargs=2, metavar=("translation", "rotation"),
112114
help="Magnitude of noise to add to the initial guess atomic transformations set before starting optimization [meters, radians].", type=float, default=[0.0, 0.0],),
113115

114-
# TODO make note in help that this overrides nig flag.
115-
ap.add_argument("-ntfl", "--noisy_tf_links", type=parse_list_of_transformations, help='''Pairs of links defining the transformations to which noise will be added, in the format link1:link2,linkA:linkB (links defining a transformation separated by
116-
: and different pairs separeted by ,)''')
116+
ap.add_argument("-ntfl", "--noisy_tf_links", type=parse_list_of_transformations, help='''Pairs of links defining the transformations to which noise will be added, in the format linkParent1:linkChild2,linkParentA:linkChildB (links defining a transformation separated by
117+
: and different pairs separeted by ,)
118+
Note : This flag overrides the -nig flag''')
117119
ap.add_argument("-ntfv", "--noisy_tf_values", nargs=2, type=float, metavar=("translation", "rotation"),
118120
help="Translation(m) and Rotation(rad)(respectively) noise values to add to the transformations specified by-ntfl")
119121

@@ -195,6 +197,7 @@ def main():
195197
# make a copy before filtering out collections and sensors
196198
dataset_original = copy.deepcopy(dataset)
197199

200+
198201
# ---------------------------------------
199202
# --- Filter some collections, sensors, joints and additional tfs from the dataset
200203
# ---------------------------------------
@@ -238,20 +241,9 @@ def main():
238241
dataset_ground_truth = deepcopy(dataset) # make a copy before adding noise
239242

240243
addNoiseToInitialGuess(dataset, args, selected_collection_key)
241-
# addBiasToJointParameters(dataset, args)
242-
243-
# TODO Put this encapsulated in a single function
244-
# Verify both arguments were provided
245-
# Unfortunately, mutually inclusive arguments are not built into argparse
246-
# https://github.com/python/cpython/issues/55797
247-
248-
if mutually_inclusive_conditions(args['noisy_tf_links'], args['noisy_tf_values']):
249-
# Iterate through pairs of tf's and apply noise
250-
translation_tf_noise = args['noisy_tf_values'][0]
251-
rotation_tf_noise = args['noisy_tf_values'][1]
244+
addBiasToJointParameters(dataset, args)
245+
addNoiseFromNoisyTFLinks(dataset,args,selected_collection_key)
252246

253-
# for tf_pair in args['noisy_tf_links']:
254-
# addNoiseToTF(dataset,selected_collection_key,tf_pair[0],tf_pair[1],translation_tf_noise,rotation_tf_noise)
255247

256248
# ---------------------------------------
257249
# --- SETUP OPTIMIZER: Create data models

atom_core/src/atom_core/dataset_io.py

+41-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
from colorama import Fore, Style
2525
from rospy_message_converter import message_converter
2626
from std_msgs.msg import Header
27-
from atom_core.config_io import uriReader
27+
from atom_core.config_io import uriReader,mutually_inclusive_conditions
2828
from atom_core.naming import generateName, generateKey
2929
from atom_calibration.collect.label_messages import (convertDepthImage32FC1to16UC1, convertDepthImage16UC1to32FC1,
3030
numpyFromPointCloudMsg)
@@ -782,6 +782,24 @@ def addBiasToJointParameters(dataset, args):
782782

783783
# TODO Create a new function called addNoiseFromNoisyTFLinks
784784

785+
def addNoiseFromNoisyTFLinks(dataset,args,selected_collection_key):
786+
787+
# Verify both arguments were provided
788+
# Unfortunately, mutually inclusive arguments are not built into argparse
789+
# https://github.com/python/cpython/issues/55797
790+
791+
if not mutually_inclusive_conditions(args['noisy_tf_links'], args['noisy_tf_values']):
792+
return
793+
794+
# Iterate through pairs of tf's and apply noise
795+
translation_tf_noise = args['noisy_tf_values'][0]
796+
rotation_tf_noise = args['noisy_tf_values'][1]
797+
798+
for tf_pair in args['noisy_tf_links']:
799+
800+
calibration_parent,calibration_child = tf_pair[0],tf_pair[1]
801+
addNoiseToTF(dataset,selected_collection_key,calibration_parent,calibration_child,translation_tf_noise,rotation_tf_noise)
802+
785803

786804
def addNoiseToInitialGuess(dataset, args, selected_collection_key):
787805
"""
@@ -801,14 +819,26 @@ def addNoiseToInitialGuess(dataset, args, selected_collection_key):
801819
nig_trans = args['noisy_initial_guess'][0]
802820
nig_rot = args['noisy_initial_guess'][1]
803821

804-
# TODO if the transform to get get is also in the args noisy_tf_links, then we should not add noise to it.
805-
# skip it. with a warn
822+
823+
# Checking if tf to add noise is also defined in -ntfl, in which case the noise shouldn't be added here
824+
# Determining membership in sets is much faster than lists
825+
ntfl_tfs = set()
826+
if args['noisy_tf_links']:
827+
for tf_pair in args['noisy_tf_links']:
828+
ntfl_tfs.add(generateKey(tf_pair[0],tf_pair[1]))
806829

807830
# add noise to additional tfs for simulation
808831
if dataset['calibration_config']['additional_tfs'] is not None:
809832
for _, additional_tf in dataset['calibration_config']['additional_tfs'].items():
833+
810834
calibration_child = additional_tf['child_link']
811835
calibration_parent = additional_tf['parent_link']
836+
837+
tf_to_add_noise = generateKey(calibration_parent,calibration_child)
838+
if tf_to_add_noise in ntfl_tfs:
839+
atomWarn(f'Not adding initial guess noise to {tf_to_add_noise} because its defined in -ntfl')
840+
continue
841+
812842
addNoiseToTF(dataset, selected_collection_key, calibration_parent, calibration_child, nig_trans, nig_rot)
813843

814844
# add noise to sensors tfs for simulation
@@ -819,8 +849,12 @@ def addNoiseToInitialGuess(dataset, args, selected_collection_key):
819849
if sensor_key != dataset['calibration_config']['anchored_sensor']:
820850
calibration_child = sensor['calibration_child']
821851
calibration_parent = sensor['calibration_parent']
822-
print(calibration_child)
823-
print(calibration_parent)
852+
853+
tf_to_add_noise = generateKey(calibration_parent,calibration_child)
854+
if tf_to_add_noise in ntfl_tfs:
855+
atomWarn(f'Not adding initial guess noise to {tf_to_add_noise} because its defined in -ntfl')
856+
continue
857+
824858
addNoiseToTF(dataset, selected_collection_key, calibration_parent, calibration_child, nig_trans, nig_rot)
825859

826860
# TODO make a basic function called by fixed and multiple
@@ -853,6 +887,8 @@ def addNoiseToTF(dataset, selected_collection_key, calibration_parent, calibrati
853887
print(Fore.RED + 'Transformation parent ' + calibration_parent + ' child ' + calibration_child + Style.RESET_ALL)
854888
transform_key = generateKey(calibration_parent, calibration_child, suffix='')
855889

890+
atomWarn(f'Adding noise bigger than 1.0m/rad right now is bugged and might yield unexpected results. Check issue #929 for more information')
891+
856892
# because of #900, and for retrocompatibility with old datasets, we will assume that if the transforms field does
857893
# not exist in the dataset, then the transformation is fixed
858894
if 'transforms' not in dataset or dataset['transforms'][transform_key]['type'] == 'fixed':

atom_core/src/atom_core/utilities.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,17 @@ def compareAtomTransforms(transform_1, transform_2):
6666

6767
rotation_delta = t_delta[0:3, 0:3]
6868
# roll, pitch, yaw = euler_from_matrix(rotation_delta)
69+
translation_delta = t_delta[0:3, 3]
6970

7071
import tf
7172
euler_angles_init = tf.transformations.euler_from_quaternion(transform_1['quat'])
7273
euler_angles_final = tf.transformations.euler_from_quaternion(transform_2['quat'])
7374

7475

7576
deuler = np.subtract(euler_angles_final,euler_angles_init)
77+
rotation_error = np.linalg.norm(deuler)
7678

7779

78-
translation_delta = t_delta[0:3, 3]
7980
# print('translation_delta = ' + str(translation_delta))
8081
# nor = np.linalg.norm(translation_delta)
8182
# print('nor = ' + str(nor))
@@ -84,7 +85,6 @@ def compareAtomTransforms(transform_1, transform_2):
8485
# translation_error = float(abs(np.average(translation_delta)))
8586
translation_error = np.linalg.norm(translation_delta)
8687
# rotation_error = np.linalg.norm([roll, pitch, yaw])
87-
rotation_error = np.linalg.norm(deuler)
8888

8989
# print(Fore.GREEN + str(translation_error) + Style.RESET_ALL)
9090
# print(Fore.GREEN + str(translation_error) + Style.RESET_ALL)

0 commit comments

Comments
 (0)