Skip to content

User-Guide

Getting Started

Installation

Pkg sensor_fusion comes as part of the medusa_vx stack.

Configuration

This section explains how to write the node configuration file. A sample is given below

ROS Node Parameters

node_frequency: 10                                              # ROS node output rate
topics:
    subscribers: [                  # std::string containing topics < reset, position, velocity, orientation> 
        "reset", "/measurement/position", "/measurement/velocity", "/measurement/orientation"
    ]
    publishers: [                                               # std::string containing topics <state, debug>
        "state", "debug"
    ]

Class Node Parameters

tf:                                                             # TF publishers
    broadcast: true                                             # flag to publish node TF frames
    frames: [                                                   # std::string containing frame <base_link, odom, map, world>
        "base_link", "odom", "map", "map"
    ]
kalman_filter:
    config:             [0.1, 5.0, 16]                          # predict period, save measurement interval, outlier rejection threshold 
    reject_counter:     [8, 5, 12, 3, 3, 3]                     # outlier reject counters for position, velocity, angle, angle rate, acceleration, altitude
    process_covariance: [0.03, 0.015, 0.85, 1.2, 0.9, 0.12]     # process noise for position, velocity, angles, angle rate, acceleration, altitude
    vertical_drag:      [-0.1287, -0.4097, -0.013]              # alpha, beta, bouyancy
    bypass_ahrs: false                                          # Set True to treat AHRS as input
    initialize:                                                 # Define initialization condition
        trigger: false                                          # Set true to initialize at start
        meas:                                                   # If trigger is set to true, define initial position and state. If it is set to false, define initial state except position
            frame_id: "gnss"                                    # If trigger is set to false, define measurement frame used for initialization
            value: [0, 0, 0,                                    # Position - x, y, z             
                    0, 0, 0,                                    # Velocity - vx, vy, vz
                    0, 0, 0,                                    # Orientation - r, p, h
                    0, 0, 0,                                    # Orientation Rate - dr, dp, vh
                    0, 0, 0]                                    # Acceleration & Altitude - ax, ay, A
            noise: [1000, 1000, 1000,                           # If trigger is set to true, define initial position and state covariance. 
                    0.1 , 0.1 , 0.1 ,                           # If trigger is set to false, define initial state covariance except position
                    1   , 1   , 1   ,                           # Array format is same as above
                    0.1 , 0.1 , 0.1 ,
                    0.01, 0.01, 1000]
    sensors:                                                    # Define sensors as input here. Any sensor frame ids not defined here will be ignored by the filter     
        -   frame_id:   "gnss"                                  # Example Sensor 1: Sat Nav Input 
            config:     [true,  true,  false,                   # frame_id takes in the frame_id associated with the input measurement
                        false, false, false,                    # Config is a 15-state bool array that defines the input measurement 
                        false, false, false,                    # The number of inputs should be equal to the no of "true" flags in the config array
                        false, false, false,                    # For sensor providing position (x, y) input, config has two flags triggered as shown
                        false, false, false]                    # 
            noise:      [0.5, 0.5, 0.0,                         # Noise if an optional 15-state double array that overrides incoming measurement noise 
                        0.0, 0.0, 0.0,                          # Filter will always take 0.5 as measurement noise during update stage of the kalman filter here
                        0.0, 0.0, 0.0,                          # 
                        0.0, 0.0, 0.0,
                        0.0, 0.0, 0.0]
        -   frame_id:   "dvl_bt"                                # Example Sensor 2: DVL Bottom Track
            config:     [false, false, false,                   # Sensor updates inertial position of the vehicle
                        true,  true,  false,                    # For sensor providing velocity (vx, vy) input, config has two flags triggered as shown
                        false, false, false,                    # Filter takes in noise measurement from the input, ignore the input if there is none
                        false, false, false,
                        false, false, false]
        -   frame_id:   "depth"                                 # Example Sensor 3: Depth Sensor
            config:     [false, false, true,                    # Sensor updates depth of the vehicle
                        false, false, false,                    # For sensor providing Depth (z) input, config has one flag triggered as shown
                        false, false, false, 
                        false, false, false, 
                        false, false, false]
            noise:      [0.0, 0.0, 0.0, 
                        0.0, 0.0, 1.0, 
                        0.0, 0.0, 0.0, 
                        0.0, 0.0, 0.0, 
                        0.0, 0.0, 0.0]
        -   frame_id:   "ahrs"                                  # Example Sensor 4: AHRS Sensor
            config:     [false, false, false,                   # Sensor updates inertial position of the vehicle
                        false, false, false,                    # For sensor providing rotation (r, p, h, vr, vp, vh) input, config has 6 flags triggered as shown
                        true,  true,  true,  
                        true,  true,  true,  
                        false, false, false]
            noise:      [0.0, 0.0, 0.0, 
                        0.0, 0.0, 0.0, 
                        1.0, 1.0, 1.0, 
                        1.0, 1.0, 1.0, 
                        0.0, 0.0, 0.0]

Config Breakdown

ROS Node Parameters**

Name Type Function
node_frequency int Filter output frequency
topics/subscribers string[4] Input topics for reset, position, velocity and orientation
topics/publishers string[2] Output topics for state estimate and debug info

Remarks - position, velocity, orientation topics subscribe to input of type medusa_msgs::Measurement - state topic publishes state estimate in auv_msgs::NavigationStatus - topic debug publishes debug information in std::string

Class Parameters

TF

Name Type Function
tf/broadcast bool Flag to trigger state broadcast to ros::tfs
tf/frames string[4] Frame names from base_link, odom, map and world frame

Remarks - If dead reckoning is not needed, set odom frame as "null" - If tf/broadcast flag is set to true while odom frame is not set, filter will publish the tf tree as: base_link -> map -> world - If tf/broadcast flag is set to true while odom frame is set, filter will publish the tf tree as: base_link -> odom -> map -> world

Kalman Parameters

Name Type Function
kalman_filter/config double[3] Set parameters for predict period, save measurement interval, outlier rejection threshold
kalman_filter/reject_counter int[6] Set outlier reject counters for position, velocity, angle, angle rate, acceleration and altitude
kalman_filter/process_covariance double[6] Set process noise for position, velocity, angles, angle rate, acceleration and altitude
kalman_filter/vertical_drag double[3] Set alpha, beta, bouyancy for vertical filter
kalman_filter/bypass_ahrs bool Trigger to treat AHRS as an Input

Remarks - predict period defines the frequency of kalman filter predicts stage - save measurement interval sets the interval over which measurements are rejected by the filter. If no input is received for more than twice this interval, filter resets. - outlier rejection threshold sets the threshold for outlier measurement rejection. - reject counter defines the no of measurements to reject before accepting outliers as the input

Initialization Parameters

  • `` Defines the initial covariance of the state vector
  • Defines the drag parameters used in the state model of vertical filter.
  • Flag to treat inputs to the rotation filter as input. If set to true, any input sent to the node bypasses the filter and is output directly.

Initialization Parameters

Name Type Function
kalman_filter/initialize/.
./trigger bool Flag to trigger initialization at startup
./meas/frame_id string Sensor frame to initialize filter with
./meas/value double[15] Defines the initial state of the vessel
./meas/noise bool[15] Defines the initial state covariance

Remarks - If trigger is set to false, filter will initialize horizontal position with a measurement with frame ./meas/frame_id. The rest is set by the ./meas

Sensor Input Input sensors to the filter are described as a list of type <XmlRpc::XmlRpcValue>. Any number of sensors may be defined following the format described below.

Name Type Function
kalman_filter/sensors/.
- frame_id, config, noise
frame_id string Defines the name of the sensor frame.
config bool[15] Defines the observation matrix of the kalman filter
noise (optional) double[15] Defines the noise associated with the measurement.

Remarks - Each sensor to the filter must have a unique frame_id and a static TF to base_link associated with it. - Incoming measurement must always contain the same no of inputs, as described in the observation matrix. - If the noise in input measurement is zero or invalid, filter will ignore the measurement.

Launching the Nodes

An example launch file is provided below where two sensor_fusion/sensor_fusion nodes are being launched, named filter and filter_dr.

<?xml version="1.0"?>
<launch>

<env name="ROSCONSOLE_FORMAT" value="[${severity}] [${time}]: ${node}: ${message}"/>

<!-- ######################## -->
<!-- Parameters and Arguments -->
<!-- ######################## -->
    <arg name="map"        default="map"   />  <!-- name of config file for node ~filter    -->
    <arg name="odom"       default="odom"  />  <!-- name of config file for node ~filter_dr -->

    <group ns="nav">
        <!-- ############################ -->
        <!-- filters_dr: Estimates the position of the vehicle in <odom> frame. -->
        <!-- ############################ -->
        <node pkg="sensor_fusion" type="sensor_fusion" name="filter_dr" respawn="false">
            <rosparam command="load" file="$(find medusa_bringup)/config/$(arg odom).yaml" />
        </node>

        <!-- ############################ -->
        <!-- filters: Estimates the position of the vehicle in <map> frame. -->
        <!-- ############################ -->
        <node pkg="sensor_fusion" type="sensor_fusion" name="filter" respawn="false" output="screen">
            <rosparam command="load" file="$(find medusa_bringup)/config/$(arg map).yaml" />
        </node>
    </group>
</launch>

Last update: May 30, 2022
Back to top