121 lines
2.8 KiB
Markdown
121 lines
2.8 KiB
Markdown
# Architecture
|
|
|
|
System architecture for GPS-denied UAV/UGV navigation.
|
|
|
|
## Overview
|
|
|
|
The system uses vision-based navigation with GPS reserved only for geofencing.
|
|
|
|
```
|
|
Vision Sensors (Cameras)
|
|
|
|
|
v
|
|
Visual Odometry & Optical Flow
|
|
|
|
|
v
|
|
Position Estimator (EKF)
|
|
|
|
|
v
|
|
ArduPilot Flight Controller
|
|
|
|
|
v
|
|
Motor Control
|
|
```
|
|
|
|
## Components
|
|
|
|
### Perception
|
|
|
|
- **Forward Camera**: Visual odometry, feature tracking
|
|
- **Downward Camera**: Optical flow, ground plane detection
|
|
- **IMU**: Angular velocity, acceleration
|
|
|
|
### Localization
|
|
|
|
- **Visual Odometry**: Estimates motion from camera images
|
|
- **Optical Flow**: Velocity estimation from downward camera
|
|
- **EKF Fusion**: Combines all sensor inputs into position estimate
|
|
|
|
### Navigation
|
|
|
|
- **Waypoint Navigation**: Relative coordinates (meters from origin)
|
|
- **Path Planning**: Collision-free paths using local map
|
|
- **Position Hold**: Maintain position using vision
|
|
|
|
### Control
|
|
|
|
- **ArduPilot**: Flight controller firmware
|
|
- **MAVROS**: ROS interface to ArduPilot
|
|
- **Velocity/Position Control**: Low-level motor commands
|
|
|
|
### Safety
|
|
|
|
- **Geofencing**: GPS-based boundary checking (safety only)
|
|
- **Altitude Limits**: Maximum flight ceiling
|
|
- **Failsafe**: RTL on signal loss or boundary breach
|
|
|
|
## Coordinate Frames
|
|
|
|
| Frame | Description |
|
|
|-------|-------------|
|
|
| body | Attached to vehicle, X forward, Y right, Z down |
|
|
| odom | Origin at takeoff, accumulates drift |
|
|
| map | Fixed world frame (may be corrected) |
|
|
|
|
All navigation commands use local coordinates relative to takeoff point.
|
|
|
|
## Data Flow
|
|
|
|
```
|
|
Camera Images
|
|
|
|
|
v
|
|
Feature Detection (ORB/SIFT)
|
|
|
|
|
v
|
|
Feature Matching (frame to frame)
|
|
|
|
|
v
|
|
Motion Estimation (Essential Matrix)
|
|
|
|
|
v
|
|
EKF Update (fuse with IMU)
|
|
|
|
|
v
|
|
Position Estimate (x, y, z, roll, pitch, yaw)
|
|
|
|
|
v
|
|
ArduPilot (external position input)
|
|
|
|
|
v
|
|
PID Control -> Motor PWM
|
|
```
|
|
|
|
## ArduPilot Integration
|
|
|
|
ArduPilot receives external position via MAVLink:
|
|
|
|
1. Visual odometry → `VISION_POSITION_ESTIMATE`
|
|
2. EKF uses external source (EK3_SRC1_POSXY=6)
|
|
3. GPS disabled for navigation (GPS_TYPE=0 or EK3_SRC1_POSXY!=1)
|
|
|
|
## Geofencing
|
|
|
|
GPS is only used for safety boundaries:
|
|
|
|
1. GPS position → lat/lon
|
|
2. Check against polygon/circle boundary
|
|
3. If outside: trigger RTL or LAND
|
|
|
|
Navigation continues using vision regardless of GPS status.
|
|
|
|
## ROS 2 Topics
|
|
|
|
| Topic | Type | Description |
|
|
|-------|------|-------------|
|
|
| /uav/camera/forward/image_raw | sensor_msgs/Image | Forward camera |
|
|
| /uav/camera/downward/image_raw | sensor_msgs/Image | Downward camera |
|
|
| /mavros/local_position/pose | geometry_msgs/PoseStamped | Current position |
|
|
| /mavros/setpoint_position/local | geometry_msgs/PoseStamped | Target position |
|
|
| /mavros/imu/data | sensor_msgs/Imu | IMU data |
|