diff --git a/src/sim_transmission_loss_node.py b/src/sim_transmission_loss_node.py index 6ca53edc67266ca30e893954fedb66a70a30ebfb..83264fde3cd9d686fcfc64fc119822ae848c1880 100755 --- a/src/sim_transmission_loss_node.py +++ b/src/sim_transmission_loss_node.py @@ -19,67 +19,72 @@ class SimTransmissionLossNode(object): rospy.init_node('sim_transmission_loss_node', log_level=rospy.INFO) rospy.loginfo("Starting sim_transmission_loss_node...") - # Check that bellhop.exe is available. If it isn't, crash our now rather than waiting until we try to - # simulate. - if which('bellhop.exe') is None: - rospy.logfatal("bellhop.exe was not found on your path (check the ros_acomms README for instructions). " - "sim_transmission_loss_node terminating.") - exit() - # Get node parameters self.sound_speed = rospy.get_param('~sound_speed', default=1500) - self.water_depth = rospy.get_param('~water_depth', default=None) + self.water_depth = rospy.get_param('~water_depth', default=1000) self.plot = rospy.get_param('~plot', default=False) - + self.model = rospy.get_param('~model', default='bellhop') self.bellhop_env_nbeams = rospy.get_param('~bellhop_env_nbeams', default=3000) self.bellhop_transmission_loss_mode = rospy.get_param('~bellhop_transmission_loss_mode', default='incoherent') self.bellhop_arrivals = rospy.get_param('~bellhop_arrivals', default=False) - # Check node parameters - # TODO: check validity of the parameters here and output contents to log - - self.env = pm.create_env2d(name='SimTransmissionEnvironment', - bottom_absorption=0.1, # [dB/wavelength] - bottom_density=1600, # [kg/m^3] - bottom_roughness=0, # [m (RMS)] - bottom_soundspeed=1600, # [m/s] - depth=1000, # [m] - depth_interp='linear', # [curvilinear/linear] - frequency=10000, # [Hz] ###### Changes - max_angle=80, # [deg] - min_angle=-80, # [deg] - nbeams=0, # [Number of beams 0 = auto] - rx_depth=10, # [m] ###### Changes - rx_range=1000, # [m] ###### Changes - soundspeed=1500, # [m/s] - soundspeed_interp='spline', # [spline/linear] - surface=None, # [surface profile] - surface_interp='linear', # [curvilinear/linear] - tx_depth=5, # [m] ###### Changes - tx_directionality=None, # [(deg, dB)...] - type='2D' # [2D/3D] - ) - - - if self.sound_speed is not None: - # TODO: Parse sound speed arrays and pass into environment - self.env['sound_speed'] = self.sound_speed - - if self.water_depth is not None: - rospy.logdebug("Parameter water_depth: " + str(self.water_depth)) - self.env['depth'] = self.water_depth - - if self.bellhop_env_nbeams is not None: - rospy.logdebug("Parameter bellhop env nbeams: " + str(self.bellhop_env_nbeams)) - self.env['nbeams'] = self.bellhop_env_nbeams - - pm.print_env(self.env) - - # Check that the environment is sane - try: - pm.check_env2d(self.env) - except ValueError as e: - rospy.logerr("Error in Bellhop environment: {}\nUsing environment:\n{}".format(e, self.env)) + if self.model == 'bellhop': + # Check that bellhop.exe is available. If it isn't, crash our now rather than waiting until we try to + # simulate. + if which('bellhop.exe') is None: + rospy.logfatal("bellhop.exe was not found on your path (check the ros_acomms README for instructions). " + "sim_transmission_loss_node terminating.") + exit() + + # Check node parameters + # TODO: check validity of the parameters here and output contents to log + + self.env = pm.create_env2d(name='SimTransmissionEnvironment', + bottom_absorption=0.1, # [dB/wavelength] + bottom_density=1600, # [kg/m^3] + bottom_roughness=0, # [m (RMS)] + bottom_soundspeed=1600, # [m/s] + depth=1000, # [m] + depth_interp='linear', # [curvilinear/linear] + frequency=10000, # [Hz] ###### Changes + max_angle=80, # [deg] + min_angle=-80, # [deg] + nbeams=0, # [Number of beams 0 = auto] + rx_depth=10, # [m] ###### Changes + rx_range=1000, # [m] ###### Changes + soundspeed=1500, # [m/s] + soundspeed_interp='spline', # [spline/linear] + surface=None, # [surface profile] + surface_interp='linear', # [curvilinear/linear] + tx_depth=5, # [m] ###### Changes + tx_directionality=None, # [(deg, dB)...] + type='2D' # [2D/3D] + ) + + + if self.sound_speed is not None: + # TODO: Parse sound speed arrays and pass into environment + self.env['sound_speed'] = self.sound_speed + + if self.water_depth is not None: + rospy.logdebug("Parameter water_depth: " + str(self.water_depth)) + self.env['depth'] = self.water_depth + + if self.bellhop_env_nbeams is not None: + rospy.logdebug("Parameter bellhop env nbeams: " + str(self.bellhop_env_nbeams)) + self.env['nbeams'] = self.bellhop_env_nbeams + + pm.print_env(self.env) + + # Check that the environment is sane + try: + pm.check_env2d(self.env) + except ValueError as e: + rospy.logerr("Error in Bellhop environment: {}\nUsing environment:\n{}".format(e, self.env)) + else: + # unknown model + rospy.loginfo("Unknown or default model specified, modeled RL will match TL") + pass # Subscribe to sound speed profile updates, if they are available self.ssp_subscriber = rospy.Subscriber('sound_speed_profile', SoundSpeedProfile, self.on_ssp_update) @@ -145,6 +150,13 @@ class SimTransmissionLossNode(object): return GetOptimalTxDepthResponse(rcv_rx_level_db=best_rl, optimal_tx_depth=best_depth) def get_receive_level(self, horizontal_range, src_depth, dest_depth, center_frequency=10000, tx_level_db=185): + if self.model == 'bellhop': + return self.get_receive_level_bellhop(horizontal_range, src_depth, dest_depth, + center_frequency, tx_level_db) + else: + return 185 + + def get_receive_level_bellhop(self, horizontal_range, src_depth, dest_depth, center_frequency=10000, tx_level_db=185): # Modify environment file self.env['tx_depth'] = src_depth self.env['rx_depth'] = dest_depth