Date: November 2025 Version: 3.3 Impact: Medium - Requires CSV file updates and system restart
The config.csv and config_sitl.csv files have been simplified and modernized to remove deprecated fields and centralize global configuration, while maintaining per-drone hardware flexibility.
Old Format (10 columns - v3.2):
hw_id,pos_id,x,y,ip,mavlink_port,debug_port,gcs_ip,serial_port,baudrate
New Format (8 columns - v3.3):
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
| Column | Reason for Removal | New Location |
|---|---|---|
debug_port |
Deprecated UDP telemetry feature no longer used | Removed entirely |
gcs_ip |
Same for all drones; causes configuration redundancy | Centralized in src/params.py with UI configuration |
✅ Cleaner Configuration - Reduced from 10 to 8 columns ✅ GCS Configuration UI - New “Configure GCS” button for centralized GCS IP management ✅ Custom Hardware Options - UI dropdowns now support custom serial ports and baudrates ✅ Git Integration - GCS configuration changes auto-commit to repository ✅ No Backward Compatibility - Only supports new 8-column format (clean break)
1. Redundant GCS IP Configuration
src/params.py, editable via UI2. Deprecated Debug Port
debug_port column unused (UDP telemetry deprecated in v2.0)3. Limited Hardware Flexibility
GCS IP is now configured in src/params.py:
# ===================================================================================
# GCS (Ground Control Station) CONFIGURATION
# ===================================================================================
GCS_IP = "100.96.32.75" # GCS IP address (★ CHANGE THIS FOR YOUR SETUP ★)
GCS_FLASK_PORT = 5000 # GCS Flask backend port
connectivity_check_ip = GCS_IP # Use GCS_IP for connectivity checks
connectivity_check_port = GCS_FLASK_PORT
Mission Config Dashboard now includes a “Configure GCS” button:
src/params.py file⚠️ Important: After changing GCS IP:
The GCS IP address is used by all drones for:
Version 3.3 does NOT support backward compatibility. The old 10-column format will be rejected.
You MUST migrate your CSV files before upgrading.
cd ~/mavsdk_drone_show
cp config.csv config.csv.v3.2.backup
cp config_sitl.csv config_sitl.csv.v3.2.backup
Old header:
hw_id,pos_id,x,y,ip,mavlink_port,debug_port,gcs_ip,serial_port,baudrate
New header:
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
Before (10 columns):
hw_id,pos_id,x,y,ip,mavlink_port,debug_port,gcs_ip,serial_port,baudrate
1,1,-2.5,10.0,100.96.240.11,14551,13541,100.96.32.75,/dev/ttyS0,57600
2,2,-2.5,5.0,100.96.28.52,14552,13542,100.96.32.75,/dev/ttyAMA0,57600
After (8 columns):
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,-2.5,10.0,100.96.240.11,14551,/dev/ttyS0,57600
2,2,-2.5,5.0,100.96.28.52,14552,/dev/ttyAMA0,57600
Edit src/params.py and set your GCS IP:
GCS_IP = "100.96.32.75" # ← Update this to your GCS server IP
Or use the UI after deployment (Configure GCS button).
Same process for SITL configuration:
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,-13.5,13.5,172.18.0.2,14563,N/A,N/A
2,2,-13.5,10.5,172.18.0.3,14564,N/A,N/A
python3 test_config_simple.py
sudo systemctl restart coordinator
sudo systemctl restart gcs-server
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,0,0,100.96.1.10,14551,/dev/ttyS0,57600
2,2,5,0,100.96.1.11,14552,/dev/ttyS0,57600
3,3,10,0,100.96.1.12,14553,/dev/ttyS0,57600
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,0,0,100.96.1.10,14551,/dev/ttyS0,57600
2,2,5,0,100.96.1.11,14552,/dev/ttyAMA0,57600
3,3,10,0,100.96.1.12,14553,/dev/ttyS0,57600
4,4,15,0,100.96.1.13,14554,/dev/ttyAMA0,57600
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,0,0,100.96.1.10,14551,/dev/ttyTHS1,921600
2,2,5,0,100.96.1.11,14552,/dev/ttyTHS1,921600
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,0,0,100.96.1.10,14551,/dev/ttyUSB0,38400
2,2,5,0,100.96.1.11,14552,/dev/ttyACM0,115200
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrate
1,1,-13.5,13.5,172.18.0.2,14563,N/A,N/A
2,2,-13.5,10.5,172.18.0.3,14564,N/A,N/A
New “Configure GCS” Button:
Read-Only View:
Edit Mode: Dropdown selectors with custom options:
Serial Port Options:
/dev/ttyS0 (Raspberry Pi 4)/dev/ttyAMA0 (Raspberry Pi 5)/dev/ttyTHS1 (Jetson)N/A (SITL/Simulation)Baudrate Options:
960057600 (Standard) ← Default115200 (High Speed)921600 (Very High Speed)N/A (SITL/Simulation)When clicking “Add New Drone”, the system automatically sets:
serial_port: /dev/ttyS0 (default for RP4)baudrate: 57600 (standard)| Hardware Platform | Serial Port | Default Baudrate | Notes |
|---|---|---|---|
| Raspberry Pi 4 | /dev/ttyS0 |
57600 | Standard UART |
| Raspberry Pi 5 | /dev/ttyAMA0 |
57600 | New UART mapping |
| Raspberry Pi Zero | /dev/ttyS0 |
57600 | Same as RP4 |
| NVIDIA Jetson | /dev/ttyTHS1 |
921600 | High-speed UART |
| USB Serial Adapter | /dev/ttyUSB0 |
Variable | Check adapter specs |
| Arduino/Custom | /dev/ttyACM0 |
Variable | Device-specific |
| SITL/Simulation | N/A |
N/A |
Not used in simulation |
| Baudrate | Use Case | Compatibility |
|---|---|---|
| 9600 | Very slow (debugging) | Universal |
| 38400 | Custom hardware | Some devices |
| 57600 | Standard (default) | Most common |
| 115200 | High speed | Most modern hardware |
| 921600 | Very high speed | Jetson, high-performance systems |
CONFIG_COLUMNS to 8 columns (removed debug_port, gcs_ip)src/params.py/get-gcs-config endpoint/save-gcs-config endpoint with git commit supportParams.GCS_IP instead of per-drone configParams.GCS_IP for MAVLink routing endpointsParams.GCS_IP for origin fetchingParams.GCS_IP for telemetry and broadcastopenGcsConfigModal propCause: Using old 10-column format or incorrect header
Solution:
hw_id,pos_id,x,y,ip,mavlink_port,serial_port,baudrateCause: GCS IP not configured in params.py
Solution:
src/params.py has correct GCS_IPCause: Wrong serial port configured
Solution:
cat /proc/cpuinfo | grep "Model"
serial_port in config.csv:
/dev/ttyS0/dev/ttyAMA0/dev/ttyTHS1Cause: Wrong baudrate
Solution:
baudrate in config.csv to Pixhawk settingCause: Git repository not initialized or permissions issue
Solution:
git statusls -la src/params.pyCause: Old cached frontend build
Solution:
cd app/dashboard/drone-dashboard
npm run build
python3 test_config_simple.pyQ: Can I still use the old 10-column format? A: No. Version 3.3 removes backward compatibility. You must migrate to 8 columns.
Q: Where do I set the GCS IP now?
A: Either edit src/params.py directly or use the “Configure GCS” button in the Mission Config UI.
Q: What happened to debug_port? A: Removed. It was for deprecated UDP telemetry. All telemetry now uses MAVLink port.
Q: Can I use custom serial ports not in the dropdown? A: Yes! Select “Custom…” option and enter any serial port path.
Q: Will changing GCS IP via UI work immediately? A: No. All drones and GCS server must be restarted after GCS IP change.
Q: Can I mix RP4 and RP5 in the same fleet?
A: Yes! Set different serial_port values per drone in config.csv.
Q: What if I have a custom baudrate like 38400? A: Use the “Custom…” option in the baudrate dropdown and enter your value.
Q: Will this affect my existing trajectories? A: No. This only affects hardware/network configuration, not trajectory data.
Q: Are GCS configuration changes tracked in git? A: Yes. The UI automatically commits changes to params.py with a descriptive message.
Q: Can I revert a GCS IP change? A: Yes. Use git to revert the commit or manually edit src/params.py.
If you encounter issues during migration:
config.csv.v3.2.backuppython3 test_config_simple.pyjournalctl -u gcs-server -f| Version | Date | Changes |
|---|---|---|
| 3.3 | Nov 2025 | Removed debug_port and gcs_ip; added GCS configuration UI; custom hardware options |
| 3.2 | Nov 2025 | Added serial_port and baudrate columns (10 columns total) |
| 3.1 | Earlier | Added environment variable support for Git config |
| 3.0 | Earlier | Initial multi-drone support |
End of Migration Guide