def configure_rider(pathToRider, bicycle, bicyclePar, measuredPar, draw): """ Returns the rider parameters, bicycle paramaters with a rider and a human object that is configured to sit on the bicycle. Parameters ---------- pathToRider : string Path to the rider's data folder. bicycle : string The short name of the bicycle. bicyclePar : dictionary Contains the benchmark bicycle parameters for a bicycle. measuredPar : dictionary Contains the measured values of the bicycle. draw : boolean, optional If true, visual python will be used to draw a three dimensional image of the rider. Returns ------- riderpar : dictionary The inertial parameters of the rider with reference to the benchmark coordinate system. human : yeadon.human The human object that represents the rider seated on the bicycle. bicycleRiderPar : dictionary The benchmark parameters of the bicycle with the rider added to the rear frame. """ try: # get the rider name rider = os.path.split(pathToRider)[1] # get the paths to the yeadon data files pathToYeadon = os.path.join(pathToRider, 'RawData', rider + 'YeadonMeas.txt') pathToCFG = os.path.join(pathToRider, 'RawData', rider + bicycle + 'YeadonCFG.txt') # generate the human that has been configured to sit on the bicycle human = rider_on_bike(bicyclePar, measuredPar, pathToYeadon, pathToCFG, draw) # build a dictionary to store the inertial data riderPar = {'IBxx': human.Inertia[0, 0], 'IByy': human.Inertia[1, 1], 'IBzz': human.Inertia[2, 2], 'IBxz': human.Inertia[2, 0], 'mB': human.Mass, 'xB': human.COM[0][0], 'yB': human.COM[1][0], 'zB': human.COM[2][0]} except: #except if this fails # no rider was added print('Calculations in yeadon failed. No rider added.') # raise the error that caused things to fail raise else: bicycleRiderPar = combine_bike_rider(bicyclePar, riderPar) return riderPar, human, bicycleRiderPar
def add_rider(self, riderName, reCalc=False, draw=False): """ Adds the inertial effects of a rigid rider to the bicycle. Parameters ---------- riderName : string A rider name that corresponds to a folder in `<pathToData>/riders/`. reCalc : boolean, optional If true, the rider parameters will be recalculated. draw : boolean, optional If true, visual python will be used to draw a three dimensional image of the rider. """ # can't draw the rider model without the human object if draw: reCalc = True # first check to see if a rider has already been added if self.hasRider == True: print(("D'oh! This bicycle already has {0} as a " + "rider!").format(self.riderName)) else: print("There is no rider on the bicycle, now adding " + "{0}.".format(riderName)) pathToData = os.path.split(os.path.split(self.directory)[0])[0] # get the path to the rider's folder pathToRider = os.path.join(pathToData, 'riders', riderName) # load in the parameters bicyclePar = self.parameters['Benchmark'] bicycleName = self.bicycleName if reCalc == True: print("Calculating the human configuration.") # run the calculations try: measuredPar = self.parameters['Measured'] except KeyError: print('The measured bicycle parameters need to be ' + 'available, create your bicycle such that they ' + 'are available.') raise riderPar, human, bicycleRiderPar =\ rider.configure_rider(pathToRider, bicycleName, bicyclePar, measuredPar, draw) else: pathToParFile = os.path.join( pathToRider, 'Parameters', riderName + self.bicycleName + 'Benchmark.txt') try: # load the parameter file riderPar = io.load_parameter_text_file(pathToParFile) except IOError: # file doesn't exist so run the calculations print("No parameter files found, calculating the human " + "configuration.") try: measuredPar = self.parameters['Measured'] except KeyError: print( 'The measured bicycle parameters need to be ' + 'available, create your bicycle such that they ' + 'are available.') raise riderPar, human, bicycleRiderPar =\ rider.configure_rider(pathToRider, bicycleName, bicyclePar, measuredPar, draw) else: print("Loaded the precalculated parameters from " + "{0}".format(pathToParFile)) bicycleRiderPar = inertia.combine_bike_rider( bicyclePar, riderPar) # set the attributes self.riderPar['Benchmark'] = riderPar try: self.human = human except NameError: self.human = None self.parameters['Benchmark'] = bicycleRiderPar self.riderName = riderName self.hasRider = True
def configure_rider(pathToRider, bicycle, bicyclePar, measuredPar, draw): """ Returns the rider parameters, bicycle paramaters with a rider and a human object that is configured to sit on the bicycle. Parameters ---------- pathToRider : string Path to the rider's data folder. bicycle : string The short name of the bicycle. bicyclePar : dictionary Contains the benchmark bicycle parameters for a bicycle. measuredPar : dictionary Contains the measured values of the bicycle. draw : boolean, optional If true, visual python will be used to draw a three dimensional image of the rider. Returns ------- riderpar : dictionary The inertial parameters of the rider with reference to the benchmark coordinate system. human : yeadon.human The human object that represents the rider seated on the bicycle. bicycleRiderPar : dictionary The benchmark parameters of the bicycle with the rider added to the rear frame. """ try: # get the rider name rider = os.path.split(pathToRider)[1] # get the paths to the yeadon data files pathToYeadon = os.path.join(pathToRider, 'RawData', rider + 'YeadonMeas.txt') pathToCFG = os.path.join(pathToRider, 'RawData', rider + bicycle + 'YeadonCFG.txt') # generate the human that has been configured to sit on the bicycle # the human's inertial parameters are expressed in the Yeadon # reference frame about the Yeadon origin. human = rider_on_bike(bicyclePar, measuredPar, pathToYeadon, pathToCFG, draw) # This is the rotation matrix that relates Yeadon's reference frame # to the bicycle reference frame. rot_mat = np.array([[0.0, -1.0, 0.0], [-1.0, 0.0, 0.0], [0.0, 0.0, -1.0]]) # This is the human's inertia expressed in the bicycle reference # frame about the human's center of mass. human_inertia_in_bike_frame = \ human.inertia_transformed(rotmat=rot_mat) human_com_in_bike_frame = \ yeadon_vec_to_bicycle_vec(human.center_of_mass, measuredPar, bicyclePar) # build a dictionary to store the inertial data riderPar = { 'IBxx': human_inertia_in_bike_frame[0, 0], 'IByy': human_inertia_in_bike_frame[1, 1], 'IBzz': human_inertia_in_bike_frame[2, 2], 'IBxz': human_inertia_in_bike_frame[2, 0], 'mB': human.mass, 'xB': human_com_in_bike_frame[0, 0], 'yB': human_com_in_bike_frame[1, 0], 'zB': human_com_in_bike_frame[2, 0] } except: # except if this fails # no rider was added print('Calculations in yeadon failed. No rider added.') # raise the error that caused things to fail raise else: bicycleRiderPar = combine_bike_rider(bicyclePar, riderPar) return riderPar, human, bicycleRiderPar
def configure_rider(pathToRider, bicycle, bicyclePar, measuredPar, draw): """ Returns the rider parameters, bicycle paramaters with a rider and a human object that is configured to sit on the bicycle. Parameters ---------- pathToRider : string Path to the rider's data folder. bicycle : string The short name of the bicycle. bicyclePar : dictionary Contains the benchmark bicycle parameters for a bicycle. measuredPar : dictionary Contains the measured values of the bicycle. draw : boolean, optional If true, visual python will be used to draw a three dimensional image of the rider. Returns ------- riderpar : dictionary The inertial parameters of the rider with reference to the benchmark coordinate system. human : yeadon.human The human object that represents the rider seated on the bicycle. bicycleRiderPar : dictionary The benchmark parameters of the bicycle with the rider added to the rear frame. """ try: # get the rider name rider = os.path.split(pathToRider)[1] # get the paths to the yeadon data files pathToYeadon = os.path.join(pathToRider, 'RawData', rider + 'YeadonMeas.txt') pathToCFG = os.path.join(pathToRider, 'RawData', rider + bicycle + 'YeadonCFG.txt') # generate the human that has been configured to sit on the bicycle # the human's inertial parameters are expressed in the Yeadon # reference frame about the Yeadon origin. human = rider_on_bike(bicyclePar, measuredPar, pathToYeadon, pathToCFG, draw) # This is the rotation matrix that relates Yeadon's reference frame # to the bicycle reference frame. rot_mat = np.array([[0.0, -1.0, 0.0], [-1.0, 0.0, 0.0], [0.0, 0.0, -1.0]]) # This is the human's inertia expressed in the bicycle reference # frame about the human's center of mass. human_inertia_in_bike_frame = \ human.inertia_transformed(rotmat=rot_mat) human_com_in_bike_frame = \ yeadon_vec_to_bicycle_vec(human.center_of_mass, measuredPar, bicyclePar) # build a dictionary to store the inertial data riderPar = {'IBxx': human_inertia_in_bike_frame[0, 0], 'IByy': human_inertia_in_bike_frame[1, 1], 'IBzz': human_inertia_in_bike_frame[2, 2], 'IBxz': human_inertia_in_bike_frame[2, 0], 'mB': human.mass, 'xB': human_com_in_bike_frame[0, 0], 'yB': human_com_in_bike_frame[1, 0], 'zB': human_com_in_bike_frame[2, 0]} except: # except if this fails # no rider was added print('Calculations in yeadon failed. No rider added.') # raise the error that caused things to fail raise else: bicycleRiderPar = combine_bike_rider(bicyclePar, riderPar) return riderPar, human, bicycleRiderPar
def add_rider(self, riderName, reCalc=False, draw=False): """ Adds the inertial effects of a rigid rider to the bicycle. Parameters ---------- riderName : string A rider name that corresponds to a folder in `<pathToData>/riders/`. reCalc : boolean, optional If true, the rider parameters will be recalculated. draw : boolean, optional If true, visual python will be used to draw a three dimensional image of the rider. """ # can't draw the rider model without the human object if draw: reCalc=True # first check to see if a rider has already been added if self.hasRider == True: print(("D'oh! This bicycle already has {0} as a " + "rider!").format(self.riderName)) else: print("There is no rider on the bicycle, now adding " + "{0}.".format(riderName)) pathToData = os.path.split(os.path.split(self.directory)[0])[0] # get the path to the rider's folder pathToRider = os.path.join(pathToData, 'riders', riderName) # load in the parameters bicyclePar = self.parameters['Benchmark'] bicycleName = self.bicycleName if reCalc == True: print("Calculating the human configuration.") # run the calculations try: measuredPar = self.parameters['Measured'] except KeyError: print('The measured bicycle parameters need to be ' + 'available, create your bicycle such that they ' + 'are available.') raise riderPar, human, bicycleRiderPar =\ rider.configure_rider(pathToRider, bicycleName, bicyclePar, measuredPar, draw) else: pathToParFile = os.path.join(pathToRider, 'Parameters', riderName + self.bicycleName + 'Benchmark.txt') try: # load the parameter file riderPar = io.load_parameter_text_file(pathToParFile) except IOError: # file doesn't exist so run the calculations print("No parameter files found, calculating the human " + "configuration.") try: measuredPar = self.parameters['Measured'] except KeyError: print('The measured bicycle parameters need to be ' + 'available, create your bicycle such that they ' + 'are available.') raise riderPar, human, bicycleRiderPar =\ rider.configure_rider(pathToRider, bicycleName, bicyclePar, measuredPar, draw) else: print("Loaded the precalculated parameters from " + "{0}".format(pathToParFile)) bicycleRiderPar = inertia.combine_bike_rider(bicyclePar, riderPar) # set the attributes self.riderPar['Benchmark'] = riderPar try: self.human = human except NameError: self.human = None self.parameters['Benchmark'] = bicycleRiderPar self.riderName = riderName self.hasRider = True