3.0 KiB
3.0 KiB
GPS-Denied Navigation
How the system navigates without GPS.
Principle
All navigation uses relative positioning from visual sensors. GPS is only used for geofencing (safety boundaries).
| Function | GPS Used? |
|---|---|
| Position estimation | No - visual odometry |
| Waypoint navigation | No - local coordinates |
| Velocity control | No - optical flow |
| Geofencing | Yes - safety only |
Position Estimation
Visual Odometry
- Detect features in camera image (ORB, SIFT)
- Match features between consecutive frames
- Estimate camera motion from feature displacement
- Accumulate motion into position estimate
Optical Flow
- Capture ground images from downward camera
- Measure pixel displacement between frames
- Convert to velocity using altitude
- Integrate for position
Sensor Fusion
Extended Kalman Filter combines:
- Visual odometry (position)
- Optical flow (velocity)
- IMU (acceleration, rotation)
- Barometer (altitude)
Output: Full 6-DOF pose estimate
ArduPilot Configuration
Key parameters for GPS-denied operation:
# EKF Source Configuration
EK3_SRC1_POSXY = 6 # External Nav for position
EK3_SRC1_VELXY = 6 # External Nav for velocity
EK3_SRC1_POSZ = 1 # Barometer for altitude
# Disable GPS for navigation
GPS_TYPE = 0 # No GPS (or keep for geofence)
# Enable external navigation
VISO_TYPE = 1 # Enable visual odometry input
# Arming checks
ARMING_CHECK = 0 # Disable pre-arm checks (for testing)
See config/ardupilot_gps_denied.parm for complete parameters.
Sending Position to ArduPilot
Visual odometry sends position via MAVLink:
# VISION_POSITION_ESTIMATE message
msg = mavutil.mavlink.MAVLink_vision_position_estimate_message(
usec=timestamp_us,
x=position_x, # meters, NED frame
y=position_y,
z=position_z,
roll=roll, # radians
pitch=pitch,
yaw=yaw
)
Drift Mitigation
Visual odometry accumulates drift over time. Strategies:
- Loop Closure: Recognize previously visited locations
- Landmark Matching: Use known visual markers
- Multi-Sensor Fusion: Weight sensors by confidence
- Periodic Reset: Return to known position
Geofencing
GPS is only used for safety boundaries:
geofence:
enabled: true
use_gps: true
fence_type: polygon
action: RTL
max_altitude: 50
If drone crosses boundary, triggers return-to-launch.
Coordinate System
All waypoints use local NED coordinates:
- X: North (meters from origin)
- Y: East (meters from origin)
- Z: Down (negative for altitude)
Example mission:
waypoints = [
{"x": 0, "y": 0, "z": -5}, # Takeoff to 5m
{"x": 10, "y": 0, "z": -5}, # 10m north
{"x": 10, "y": 10, "z": -5}, # 10m east
{"x": 0, "y": 0, "z": -5}, # Return
{"x": 0, "y": 0, "z": 0}, # Land
]
Limitations
- Drift accumulates over distance/time
- Requires visual features (fails in featureless environments)
- Requires sufficient lighting
- Performance degrades with fast motion or blur