示例#1
0
    def __init__(self):

        self.cuprint = CUPrint("SonarAssociator")
        self.cuprint("Loading")
        self.association_threshold_distance = rospy.get_param("~threshold", 1)

        self.landmark_dict = rospy.get_param("~landmarks", {})

        # pose_topic = "etddf/estimate" + rospy.get_namespace()[:-1]
        pose_topic = rospy.get_namespace()[:-1] + "/pose_gt"
        rospy.Subscriber(pose_topic, Odometry, self.pose_callback)
        rospy.wait_for_message(pose_topic, Odometry)

        self.red_team_names = rospy.get_param("~red_team_names")
        blue_team = rospy.get_param("~blue_team_names")
        self.blue_team = {}
        for b in blue_team:
            if b == "surface":
                continue
            rospy.Subscriber("etddf/estimate/" + b,
                             Odometry,
                             self.blue_team_callback,
                             callback_args=b)
            self.cuprint("Waiting for msg: " + "etddf/estimate/" + b)
            rospy.wait_for_message("etddf/estimate/" + b, Odometry)

        self.pub = rospy.Publisher("sonar_processing/target_list/associated",
                                   SonarTargetList,
                                   queue_size=10)

        sonar_topic = "sonar_processing/target_list"
        rospy.Subscriber(sonar_topic, SonarTargetList, self.sonar_callback)

        self.cuprint("Loaded")
示例#2
0
    def __init__(self, name):
        rospy.Subscriber("{}/mavros/global_position/rel_alt".format(name),
                         Float64, self.baro_callback)
        rospy.Subscriber("{}/dvl".format(name), TwistWithCovarianceStamped,
                         self.dvl_callback)
        rospy.Subscriber("{}/imu/data_raw".format(name), Imu,
                         self.compass_callback)
        rospy.Subscriber("{}/etddf/packages_in".format(name),
                         MeasurementPackage, self.modem_callback)
        self.cuprint = CUPrint("tuner")

        self.baro_msgs = []
        self.dvl_x_msgs = []
        self.dvl_y_msgs = []
        self.dvl_z_msgs = []

        # Compass
        self.compass_roll_msgs = []
        self.compass_pitch_msgs = []
        self.compass_yaw_msgs = []
        self.gyro_x_msgs = []
        self.gyro_y_msgs = []
        self.gyro_z_msgs = []
        self.accel_x_msgs = []
        self.accel_y_msgs = []
        self.accel_z_msgs = []

        # Modem
        self.range_msgs = []
        self.azimuth_msgs = []
示例#3
0
    def __init__(self, x0, P0, Q, default_meas_variance, strapdown=True):
        self.cuprint = CUPrint(rospy.get_name())

        self.last_update_time = None
        self.update_lock = threading.Lock()
        # initialize estimate and covariance
        self.x = x0.reshape(-1)
        self.P = P0
        self.Q = Q
        self.pub = rospy.Publisher("strapdown/estimate",
                                   Odometry,
                                   queue_size=10)
        self.ci_pub = rospy.Publisher("strapdown/intersection",
                                      PositionVelocity,
                                      queue_size=1)
        self.last_depth = None
        self.last_intersection = None
        self.data_x, self.data_y = None, None
        self.dvl_x, self.dvl_y = None, None
        self.skip_multiplexer = 0
        rospy.sleep(rospy.get_param("~wait_on_startup"))
        # rospy.Subscriber("mavros/global_position/rel_alt", Float64, self.depth_callback, queue_size=1)
        rospy.Subscriber("baro", Float64, self.depth_callback, queue_size=1)
        rospy.Subscriber("dvl", Vector3, self.dvl_callback, queue_size=1)
        # rospy.Subscriber("pose_gt", Odometry, self.gps_callback, queue_size=1)

        if strapdown:
            rospy.Subscriber("imu", Imu, self.propagate_strap, queue_size=1)
        else:
            rospy.Subscriber("imu", Imu, self.propagate_normal, queue_size=1)
        rospy.Subscriber("strapdown/intersection_result", PositionVelocity,
                         self.intersection_result)
        self.cuprint("loaded")
    def __init__(self):
        self.cuprint = CUPrint("Sonar Control")
        self.own_yaw = None
        # ownship = "etddf/estimate" + rospy.get_namespace()[:-1]
        ownship = rospy.get_namespace()[:-1] + "/pose_gt"
        rospy.Subscriber(ownship, Odometry, self.pose_callback)
        rospy.wait_for_message(ownship, Odometry)

        # rospy.Subscriber("ping_360_target",SonarTargetList,self.check_for_landmark)
        self.landmark_dict = rospy.get_param("~landmarks", {})
        default_track = rospy.get_param("~default_track")
        print(default_track)
        if default_track != "None":
            self.last_req = SetSonarModeRequest()
            self.last_req.mode.object = default_track
            self.last_req.mode.mode = self.last_req.mode.TRACK
            self.cuprint("Tracking Landmark: " +
                         self.last_req.mode.object[len("landmark_"):])
        else:
            self.last_req = None
        self.scan_update_rate = rospy.get_param("~scan_update_rate_hz")
        self.scan_range_360 = rospy.get_param("~360_scan_range_m",
                                              DEFAULT_SCAN_360_RANGE_M)

        self._red_team_names = rospy.get_param('~red_team_names', [])
        if len(self._red_team_names) > 0:
            self._red_agent_id = self._red_team_names[0]
            for i in self._red_team_names:
                rospy.Subscriber("etddf/estimate/" + i, Odometry,
                                 self.red_actor_callback)
        else:
            self._red_agent_id = -1

        self.cuprint("waiting for set_sonar_settings service")
        rospy.wait_for_service("ping360_node/sonar/set_sonar_settings")
        self.set_sonar = rospy.ServiceProxy(
            "ping360_node/sonar/set_sonar_settings", SetSonarSettings)
        self.cuprint("...service found")

        rospy.Service("ping360_node/sonar/set_scan_mode", SetSonarMode,
                      self.handle_scan_mode)
示例#5
0
    def __init__(self):

        self.my_name = rospy.get_namespace()[:-1].strip("/")
        self.cuprint = CUPrint("{}/associator_node".format(self.my_name))

        # Associator Params
        self.association_sigma = rospy.get_param("~association_sigma")
        time_to_drop = rospy.get_param("~time_to_drop")
        self.lost_agent_unc = rospy.get_param("~lost_agent_unc")
        proto_track_points = rospy.get_param("~proto_track_points")
        process_noise = rospy.get_param("~position_process_noise")
        proto_Q = np.array([[process_noise, 0], [0, process_noise]])
        self.associator = Associator(time_to_drop, self.lost_agent_unc,
                                     proto_track_points, proto_Q)

        self.bearing_var = rospy.get_param("~force_sonar_az_var")
        self.range_var = rospy.get_param("~force_sonar_range_var")

        # Subscribe to all blue team poses
        blue_team = rospy.get_param("~blue_team_names")
        self.agent_poses = {}
        for b in blue_team:
            if b == "surface":
                continue
            rospy.Subscriber("etddf/estimate/" + b,
                             Odometry,
                             self.blue_team_callback,
                             callback_args=b)

        # Get my pose
        self.my_name = rospy.get_namespace()[:-1].strip("/")
        pose_topic = "etddf/estimate/" + self.my_name
        rospy.Subscriber(pose_topic, Odometry, self.pose_callback)
        self.cuprint("Waiting for orientation")
        rospy.wait_for_message(pose_topic, Odometry)  # TODO add back in

        # Debug purposes
        # o = Odometry() # main agent at zero-zero
        # cov = np.eye(6)
        # o.pose.covariance = list( cov.flatten() )
        # o.pose.pose.orientation.w = 1
        # self.pose_callback(o)
        # self.cuprint("Orientation found")

        self.red_agent_name = rospy.get_param("~red_agent_name")
        if self.red_agent_name != "":
            rospy.Subscriber("etddf/estimate/" + self.red_agent_name, Odometry,
                             self.red_agent_callback)

        self.pub = rospy.Publisher("sonar_processing/target_list/associated",
                                   SonarTargetList,
                                   queue_size=10)

        # Sonar Controller Params
        self.enable_sonar_control = rospy.get_param("~enable_sonar_control")
        rospy.Subscriber("associator/enable_scan_control", Bool,
                         self.enable_sonar_control_callback)
        self.sonar_control_pub = rospy.Publisher("ping360_node/sonar/set_scan",
                                                 SonarSettings,
                                                 queue_size=10)
        self.scan_size_deg = rospy.get_param("~scan_size_deg")
        self.ping_thresh = rospy.get_param("~ping_thresh")
        self.scan_angle = None
        self.prototrack = None
        rospy.Subscriber("ping360_node/sonar/scan_complete", UInt16,
                         self.scan_angle_callback)
        if self.enable_sonar_control:
            self.cuprint("Waiting for scan to complete")
            rospy.wait_for_message("ping360_node/sonar/scan_complete", UInt16)

        sonar_topic = "sonar_processing/target_list"
        rospy.Subscriber(sonar_topic, SonarTargetList, self.sonar_callback)

        self.cuprint("Loaded")
示例#6
0
    def __init__(self, 
                my_name, \
                update_rate, \
                delta_tiers, \
                asset2id, \
                delta_codebook_table, \
                buffer_size, \
                meas_space_table, \
                x0,\
                P0,\
                Q,\
                default_meas_variance,
                use_control_input):

        # self.br = tf.TransformBroadcaster()

        self.update_rate = update_rate
        self.asset2id = asset2id
        self.Q = Q
        self.use_control_input = use_control_input
        self.default_meas_variance = default_meas_variance
        self.my_name = my_name
        self.landmark_dict = rospy.get_param("~landmarks", {})
        self.topside_name = rospy.get_param("mission_config/surface_beacon_name")
        

        self.cuprint = CUPrint(rospy.get_name())
        self.cuprint(self.topside_name)
        
        if rospy.get_param("~simple_sharing"):
            self.cuprint("Sharing most recent")
            self.filter = MostRecent(NUM_OWNSHIP_STATES, \
                                    x0,\
                                    P0,\
                                    buffer_size,\
                                    meas_space_table,\
                                    delta_codebook_table,\
                                    delta_tiers,\
                                    self.asset2id,\
                                    my_name,
                                    default_meas_variance
            )
        else:
            self.cuprint("Delta Tiering")
            self.filter = DeltaTier(NUM_OWNSHIP_STATES, \
                                    x0,\
                                    P0,\
                                    buffer_size,\
                                    meas_space_table,\
                                    delta_codebook_table,\
                                    delta_tiers,\
                                    self.asset2id,\
                                    my_name, \
                                    default_meas_variance)
        
        self.network_pub = rospy.Publisher("etddf/estimate/network", NetworkEstimate, queue_size=10)

        self.cuprint("Loading...")

        self.asset_pub_dict = {}
        for asset in self.asset2id.keys():
            if self.topside_name in asset:
                continue
            self.asset_pub_dict[asset] = rospy.Publisher("etddf/estimate/" + asset, Odometry, queue_size=10)        

        self.update_seq = 0
        self.last_depth_meas = None
        rospy.sleep(rospy.Duration(1 / self.update_rate))
        self.last_update_time = rospy.get_rostime() - rospy.Duration(1 / self.update_rate)
        self.meas_lock = threading.Lock()
        self.update_lock = threading.Lock()
        self.last_orientation = None
        self.red_asset_found = False
        self.red_asset_names = rospy.get_param("~red_team_names")

        # Modem & Measurement Packages
        rospy.Subscriber("etddf/packages_in", MeasurementPackage, self.meas_pkg_callback, queue_size=1)

        # Get modem corrections
        modem_az_bias = rospy.get_param("mission_config/modem_az/bias") # Just configure global pose
        modem_az_std_deg = np.sqrt( rospy.get_param("mission_config/modem_az/var") )
        self.modem_az_var = np.radians(modem_az_std_deg) ** 2
        self.modem_range_bias = rospy.get_param("mission_config/modem_range/bias")
        self.modem_range_var = rospy.get_param("mission_config/modem_range/var")
        self.surface_beacon_pose = rospy.get_param("mission_config/surface_beacon_position")
        self.surface_beacon_pose.append( np.radians( modem_az_bias) )
        self.cuprint(str(self.modem_az_var))
        self.cuprint(str(self.surface_beacon_pose))

        if self.use_control_input:
            raise NotImplementedError("Control input")
            self.control_input = None
            rospy.Subscriber("uuv_control/control_status", ControlStatus, self.control_status_callback, queue_size=1)

        if rospy.get_param("~strapdown_topic") != "None":
            self.cuprint("Intersecting with strapdown")
            rospy.Subscriber( rospy.get_param("~strapdown_topic"), Odometry, self.nav_filter_callback, queue_size=1)
            # Set up publisher for correcting the odom estimate
            self.intersection_pub = rospy.Publisher("set_pose", PoseWithCovarianceStamped, queue_size=1)
            rospy.wait_for_message( rospy.get_param("~strapdown_topic"), Odometry)
        else:
            self.cuprint("Not intersecting with strapdown filter")
            rospy.Timer(rospy.Duration(1 / self.update_rate), self.no_nav_filter_callback)
        
        # Initialize Buffer Service
        rospy.Service('etddf/get_measurement_package', GetMeasurementPackage, self.get_meas_pkg_callback)

        # Wait for our first strapdown msg
        self.cuprint("loaded, sleeping for RL to correct...")
        rospy.sleep(10) # Wait for RL to correct

        # Sonar Subscription
        if rospy.get_param("~measurement_topics/sonar") != "None":
            self.cuprint("Subscribing to sonar")
            rospy.Subscriber(rospy.get_param("~measurement_topics/sonar"), SonarTargetList, self.sonar_callback)
示例#7
0
    def __init__(self, my_name, \
                update_rate, \
                delta_tiers, \
                asset2id, \
                delta_codebook_table, \
                buffer_size, \
                meas_space_table, \
                missed_meas_tolerance_table, \
                x0,\
                P0,\
                Q,\
                default_meas_variance,
                use_control_input):

        self.update_rate = update_rate
        self.asset2id = asset2id
        self.Q = Q
        self.use_control_input = use_control_input
        self.default_meas_variance = default_meas_variance
        self.my_name = my_name

        self.filter = DeltaTier(NUM_OWNSHIP_STATES, \
                                x0,\
                                P0,\
                                buffer_size,\
                                meas_space_table,\
                                missed_meas_tolerance_table, \
                                delta_codebook_table,\
                                delta_tiers,\
                                self.asset2id,\
                                my_name)

        self.cuprint = CUPrint(rospy.get_name())
        self.network_pub = rospy.Publisher("etddf/estimate/network",
                                           NetworkEstimate,
                                           queue_size=10)
        self.statistics_pub = rospy.Publisher("etddf/statistics",
                                              EtddfStatistics,
                                              queue_size=10)
        self.statistics = EtddfStatistics(0, rospy.get_rostime(), 0, 0,
                                          delta_tiers,
                                          [0 for _ in delta_tiers], 0.0, [],
                                          False)

        self.asset_pub_dict = {}
        for asset in self.asset2id.keys():
            if "surface" in asset:
                continue
            self.asset_pub_dict[asset] = rospy.Publisher("etddf/estimate/" +
                                                         asset,
                                                         Odometry,
                                                         queue_size=10)

        self.update_seq = 0
        self.last_depth_meas = None
        rospy.sleep(rospy.Duration(1 / self.update_rate))
        self.last_update_time = rospy.get_rostime() - rospy.Duration(
            1 / self.update_rate)
        self.meas_lock = threading.Lock()
        self.update_lock = threading.Lock()
        self.last_orientation = None

        # Initialize Measurement Callbacks
        rospy.Subscriber("mavros/global_position/local",
                         Odometry,
                         self.depth_callback,
                         queue_size=1)
        rospy.Subscriber("etddf/packages_in",
                         MeasurementPackage,
                         self.meas_pkg_callback,
                         queue_size=1)

        if self.use_control_input:
            rospy.Subscriber("uuv_control/control_status",
                             ControlStatus,
                             self.control_status_callback,
                             queue_size=1)

        # IMU Covariance Intersection
        if rospy.get_param("~measurement_topics/imu_ci") == "None":
            rospy.Timer(rospy.Duration(1 / self.update_rate),
                        self.no_nav_filter_callback)
        else:
            rospy.Subscriber(rospy.get_param("~measurement_topics/imu_ci"),
                             Odometry,
                             self.nav_filter_callback,
                             queue_size=1)
            self.set_pose_pub = rospy.Publisher("set_pose",
                                                PoseWithCovarianceStamped,
                                                queue_size=10)

        # Sonar Subscription
        if rospy.get_param("~measurement_topics/sonar") != "None":
            rospy.Subscriber(rospy.get_param("~measurement_topics/sonar"),
                             SonarTargetList, self.sonar_callback)

        # Initialize Buffer Service
        rospy.Service('etddf/get_measurement_package', GetMeasurementPackage,
                      self.get_meas_pkg_callback)
        self.cuprint("loaded")
示例#8
0
    def __init__(self, my_name, \
                update_rate, \
                delta_tiers, \
                asset2id, \
                delta_codebook_table, \
                buffer_size, \
                meas_space_table, \
                missed_meas_tolerance_table, \
                x0,\
                P0,\
                Q,\
                default_meas_variance,
                use_control_input):

        self.update_rate = update_rate
        self.asset2id = asset2id
        self.Q = Q
        self.use_control_input = use_control_input
        self.default_meas_variance = default_meas_variance
        self.my_name = my_name
        self.landmark_dict = rospy.get_param("~landmarks", {})

        self.cuprint = CUPrint(rospy.get_name())

        self.filter = DeltaTier(NUM_OWNSHIP_STATES, \
                                x0,\
                                P0,\
                                buffer_size,\
                                meas_space_table,\
                                missed_meas_tolerance_table, \
                                delta_codebook_table,\
                                delta_tiers,\
                                self.asset2id,\
                                my_name)

        self.network_pub = rospy.Publisher("etddf/estimate/network",
                                           NetworkEstimate,
                                           queue_size=10)
        self.statistics_pub = rospy.Publisher("etddf/statistics",
                                              EtddfStatistics,
                                              queue_size=10)
        self.statistics = EtddfStatistics(0, rospy.get_rostime(), 0, 0,
                                          delta_tiers,
                                          [0 for _ in delta_tiers], 0.0, [],
                                          False)

        self.asset_pub_dict = {}
        for asset in self.asset2id.keys():
            if "surface" in asset:
                continue
            self.asset_pub_dict[asset] = rospy.Publisher("etddf/estimate/" +
                                                         asset,
                                                         Odometry,
                                                         queue_size=10)

        self.update_seq = 0
        self.last_depth_meas = None
        rospy.sleep(rospy.Duration(1 / self.update_rate))
        self.last_update_time = rospy.get_rostime() - rospy.Duration(
            1 / self.update_rate)
        self.meas_lock = threading.Lock()
        self.update_lock = threading.Lock()
        self.last_orientation = None
        self.red_asset_found = False
        self.red_asset_names = rospy.get_param("~red_team_names")

        # Depth Sensor
        if rospy.get_param("~measurement_topics/depth") != "None":
            rospy.Subscriber(rospy.get_param("~measurement_topics/depth"),
                             Float64,
                             self.depth_callback,
                             queue_size=1)

        # Modem & Measurement Packages
        rospy.Subscriber("etddf/packages_in",
                         MeasurementPackage,
                         self.meas_pkg_callback,
                         queue_size=1)

        if self.use_control_input:
            self.control_input = None
            rospy.Subscriber("uuv_control/control_status",
                             ControlStatus,
                             self.control_status_callback,
                             queue_size=1)

        if rospy.get_param("~strapdown"):
            rospy.Subscriber(rospy.get_param("~measurement_topics/imu_est"),
                             Odometry,
                             self.orientation_estimate_callback,
                             queue_size=1)
            rospy.wait_for_message(
                rospy.get_param("~measurement_topics/imu_est"), Odometry)

        # IMU Covariance Intersection
        if rospy.get_param("~strapdown") and rospy.get_param(
                "~measurement_topics/imu_ci") != "None":
            self.cuprint("Intersecting with strapdown")
            self.intersection_pub = rospy.Publisher(
                "strapdown/intersection_result",
                PositionVelocity,
                queue_size=1)
            rospy.Subscriber(rospy.get_param("~measurement_topics/imu_ci"),
                             PositionVelocity,
                             self.nav_filter_callback,
                             queue_size=1)
        else:
            self.cuprint("Not intersecting with strapdown filter")
            rospy.Timer(rospy.Duration(1 / self.update_rate),
                        self.no_nav_filter_callback)

        # Sonar Subscription
        if rospy.get_param("~measurement_topics/sonar") != "None":
            rospy.Subscriber(rospy.get_param("~measurement_topics/sonar"),
                             SonarTargetList, self.sonar_callback)

        self.data_x, self.data_y = None, None
        # rospy.Subscriber("pose_gt", Odometry, self.gps_callback, queue_size=1)

        # Initialize Buffer Service
        rospy.Service('etddf/get_measurement_package', GetMeasurementPackage,
                      self.get_meas_pkg_callback)
        self.cuprint("loaded")
示例#9
0
from logging import error
import rospy
from etddf_minau.msg import Measurement, MeasurementPackage
from geometry_msgs.msg import PoseWithCovarianceStamped
import numpy as np
from cuprint.cuprint import CUPrint

MEASUREMENT_COVARIANCE = 2
TOPSIDE_NAME = "wamv_1"

rospy.init_node("beacon_to_pose")
pub = rospy.Publisher("beacon_pose", PoseWithCovarianceStamped, queue_size=1)

my_name = rospy.get_namespace().replace("/", "")
my_cuprint = CUPrint(rospy.get_name())


def callback(msg):
    global pub, my_name, MEASUREMENT_COVARIANCE, my_cuprint

    my_cuprint("Receiving modem measurements")

    azimuth, _range = None, None
    global_pose = [0, 0, 0, 0]  # x,y,z, yaw (degrees)
    for meas in msg.measurements:
        if meas.measured_asset != my_name:
            continue
        elif meas.src_asset != TOPSIDE_NAME:
            rospy.logerr("Expected src asset to be topside!! was: {}".format(
                meas.src_asset))
示例#10
0
    def __init__(self):
        self.my_name = rospy.get_param("~my_name")
        self.cuprint = CUPrint("{}/etddf".format(self.my_name))
        self.blue_agent_names = rospy.get_param("~blue_team_names")
        blue_positions = rospy.get_param("~blue_team_positions")

        self.topside_name = rospy.get_param("~topside_name")
        assert self.topside_name not in self.blue_agent_names

        red_agent_name = rospy.get_param("~red_team_name")

        self.update_times = []

        self.red_agent_exists = red_agent_name != ""
        if self.red_agent_exists:
            self.red_agent_name = red_agent_name
            self.red_agent_id = len(self.blue_agent_names)

        self.use_strapdown = rospy.get_param("~use_strapdown")
        self.do_correct_strapdown = rospy.get_param("~correct_strapdown")
        self.correct_strapdown_next_seq = False
        self.position_process_noise = rospy.get_param(
            "~position_process_noise")
        self.velocity_process_noise = rospy.get_param(
            "~velocity_process_noise")
        self.fast_ci = rospy.get_param("~fast_ci")
        self.force_modem_pose = rospy.get_param("~force_modem_pose")
        self.meas_variances = {}
        self.meas_variances["sonar_range"] = rospy.get_param(
            "~force_sonar_range_var")
        self.meas_variances["sonar_az"] = rospy.get_param(
            "~force_sonar_az_var")
        self.meas_variances["modem_range"] = rospy.get_param(
            "~force_modem_range_var")
        self.meas_variances["modem_az"] = rospy.get_param(
            "~force_modem_az_var")

        known_position_uncertainty = rospy.get_param(
            "~known_position_uncertainty")
        unknown_position_uncertainty = rospy.get_param(
            "~unknown_position_uncertainty")

        self.is_deltatier = rospy.get_param("~is_deltatier")
        if self.is_deltatier:
            self.delta_multipliers = rospy.get_param("~delta_tiers")
            self.delta_codebook_table = {
                "sonar_range": rospy.get_param("~sonar_range_start_et_delta"),
                "sonar_azimuth": rospy.get_param("~sonar_az_start_et_delta")
            }
            self.buffer_size = rospy.get_param("~buffer_space")

        if self.is_deltatier:
            rospy.Service('etddf/get_measurement_package',
                          GetMeasurementPackage, self.get_meas_pkg_callback)

        self.kf = KalmanFilter(blue_positions, [], self.red_agent_exists, self.is_deltatier, \
            known_posititon_unc=known_position_uncertainty,\
            unknown_agent_unc=unknown_position_uncertainty)

        self.network_pub = rospy.Publisher("etddf/estimate/network",
                                           NetworkEstimate,
                                           queue_size=10)
        self.asset_pub_dict = {}
        for asset in self.blue_agent_names:
            self.asset_pub_dict[asset] = rospy.Publisher("etddf/estimate/" +
                                                         asset,
                                                         Odometry,
                                                         queue_size=10)
        if self.red_agent_exists:
            self.asset_pub_dict[self.red_agent_name] = rospy.Publisher(
                "etddf/estimate/" + self.red_agent_name,
                Odometry,
                queue_size=10)

        self.last_update_time = rospy.get_rostime()

        # Modem & Measurement Packages
        rospy.Subscriber("etddf/packages_in",
                         MeasurementPackage,
                         self.meas_pkg_callback,
                         queue_size=1)

        # Strapdown configuration
        self.update_seq = 0
        self.strapdown_correction_period = rospy.get_param(
            "~strapdown_correction_period")
        strap_topic = "odometry/filtered/odom"
        rospy.Subscriber(strap_topic,
                         Odometry,
                         self.nav_filter_callback,
                         queue_size=1)
        self.intersection_pub = rospy.Publisher("set_pose",
                                                PoseWithCovarianceStamped,
                                                queue_size=1)
        self.cuprint("Waiting for strapdown")
        rospy.wait_for_message(strap_topic, Odometry)
        self.cuprint("Strapdown found")

        # Sonar Subscription
        rospy.Subscriber("sonar_processing/target_list/associated",
                         SonarTargetList, self.sonar_callback)
        self.cuprint("Loaded")