We are trying to integrate a DVL running on a Blue Robotics Navigator.
The DVL data is received by our own application running on the companion computer and forwarded to ArduSub via MAVLink2Rest.
Our goal is relatively simple:
- GPS provides the absolute horizontal position while available.
- The DVL provides horizontal velocity/odometry when submerged.
- Ultimately we would like ArduSub/Cockpit to use the DVL for position hold and later for running search patterns.
At the moment we are testing ExternalNav integration.
Current EKF configuration:
AHRS_EKF_TYPE = 3EK3_ENABLE = 1EK3_SRC1_POSXY = GPSEK3_SRC1_VELXY = ExternalNavEK3_SRC1_POSZ = BaroEK3_SRC1_VELZ = NoneEK3_SRC1_YAW = CompassEK3_SRC_OPTIONS = FuseAllVelocitiesVISO_TYPE = MAVLink
We initially sent VISION_SPEED_ESTIMATE at approximately 5 Hz.
We then added VISION_POSITION_DELTA. The message is definitely present on the MAVLink bus and MAVLink2Rest shows valid data.
Example:
{
"angle_delta": [
0,
0,
0
],
"confidence": 100,
"position_delta": [
-0.0006236645858734846,
0,
0
],
"time_delta_usec": 311832,
"time_usec": 41479512,
"type": "VISION_POSITION_DELTA"
}
The position delta is calculated from the DVL body-frame velocities:
- X = Forward velocity Ă— dt
- Y = Right velocity Ă— dt
- Z = Down velocity Ă— dt
The actual DVL measurement timestamp is used to calculate time_delta_usec, so duplicate samples are not integrated twice.
MAVLink2Rest confirms that VISION_SPEED_ESTIMATE and VISION_POSITION_DELTA are being transmitted. The ArduSub vehicle itself is system ID 1/component ID 1; our ExternalNav messages are transmitted from a separate MAVLink system/component.
However, EKF3 does not appear to consume/fuse the ExternalNav data. Moving the DVL produces the expected changes in VISION_POSITION_DELTA, but we do not see the corresponding effect in the EKF/local position.
Before we start implementing our own complete dead-reckoning solution outside ArduSub, we would like to understand whether we are missing something in the ArduSub/EKF3 configuration or in the MAVLink messages.
A few specific questions:
- Is
VISION_POSITION_DELTAsupported as an ExternalNav velocity/odometry source in current ArduSub/EKF3? - Is
EK3_SRC1_VELXY = ExternalNavsufficient for this, while keepingEK3_SRC1_POSXY = GPS? - Does ArduSub require
ODOMETRYor another MAVLink message instead of/in addition toVISION_POSITION_DELTAfor DVL integration? - Does the MAVLink source system/component ID matter for VisualOdom/ExternalNav messages?
- Are there specific EKF logs/innovations/status flags we should inspect to verify whether the ExternalNav measurements are being received but rejected by EKF3?
- Is there a recommended configuration for the common use case of GPS at the surface and DVL dead reckoning underwater?
The DVL itself is working correctly, has bottom lock, and produces stable Forward/Right/Down velocity measurements. We can also obtain North/East/Up velocity from it.
Any pointers on where to look next would be greatly appreciated.