wsl guide
This commit is contained in:
660
docs/wsl_setup_guide.md
Normal file
660
docs/wsl_setup_guide.md
Normal file
@@ -0,0 +1,660 @@
|
||||
# WSL Setup Guide for UAV-UGV Simulation
|
||||
|
||||
This guide walks you through setting up the GPS-denied UAV-UGV simulation on **Windows Subsystem for Linux (WSL)**.
|
||||
|
||||
---
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Windows 10 version 2004+ (Build 19041+) or Windows 11
|
||||
- Administrator access to Windows
|
||||
- At least 16GB RAM (8GB minimum)
|
||||
- 50GB free disk space
|
||||
- NVIDIA GPU (optional, for hardware acceleration)
|
||||
|
||||
---
|
||||
|
||||
## Part 1: Install WSL2 with Ubuntu 22.04
|
||||
|
||||
### Step 1.1: Enable WSL
|
||||
|
||||
Open **PowerShell as Administrator** and run:
|
||||
|
||||
```powershell
|
||||
# Enable WSL and Virtual Machine Platform
|
||||
wsl --install
|
||||
|
||||
# Or if already installed, update to WSL2
|
||||
wsl --set-default-version 2
|
||||
```
|
||||
|
||||
**Restart your computer** after this step.
|
||||
|
||||
### Step 1.2: Install Ubuntu 22.04
|
||||
|
||||
```powershell
|
||||
# List available distributions
|
||||
wsl --list --online
|
||||
|
||||
# Install Ubuntu 22.04
|
||||
wsl --install -d Ubuntu-22.04
|
||||
```
|
||||
|
||||
When prompted, create a username and password for your Ubuntu installation.
|
||||
|
||||
### Step 1.3: Verify WSL2
|
||||
|
||||
```powershell
|
||||
wsl --list --verbose
|
||||
```
|
||||
|
||||
You should see Ubuntu-22.04 with VERSION 2:
|
||||
|
||||
```
|
||||
NAME STATE VERSION
|
||||
* Ubuntu-22.04 Running 2
|
||||
```
|
||||
|
||||
If it shows VERSION 1, upgrade it:
|
||||
|
||||
```powershell
|
||||
wsl --set-version Ubuntu-22.04 2
|
||||
```
|
||||
|
||||
### Step 1.4: Configure WSL Memory
|
||||
|
||||
Create or edit `%USERPROFILE%\.wslconfig` (Windows path: `C:\Users\YourName\.wslconfig`):
|
||||
|
||||
```ini
|
||||
[wsl2]
|
||||
# Allocate memory (adjust based on your system)
|
||||
memory=8GB
|
||||
processors=4
|
||||
|
||||
# Swap file
|
||||
swap=4GB
|
||||
|
||||
# Enable systemd (required for ROS 2)
|
||||
[boot]
|
||||
systemd=true
|
||||
```
|
||||
|
||||
**Restart WSL** after creating this file:
|
||||
|
||||
```powershell
|
||||
wsl --shutdown
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 2: Setup GUI Support for Gazebo
|
||||
|
||||
WSL2 supports GUI applications through **WSLg** (Windows 11) or **X11 forwarding** (Windows 10).
|
||||
|
||||
### Option A: WSLg (Windows 11 - Recommended)
|
||||
|
||||
**WSLg is built-in to Windows 11.** No additional setup needed! GUI apps work out of the box.
|
||||
|
||||
Verify WSLg is working:
|
||||
|
||||
```bash
|
||||
# Inside WSL Ubuntu
|
||||
sudo apt update
|
||||
sudo apt install -y x11-apps
|
||||
xcalc # Should open a calculator window
|
||||
```
|
||||
|
||||
### Option B: X11 Server (Windows 10)
|
||||
|
||||
#### Install VcXsrv
|
||||
|
||||
1. Download and install [VcXsrv](https://sourceforge.net/projects/vcxsrv/)
|
||||
2. Launch **XLaunch** with these settings:
|
||||
- Display: Multiple windows
|
||||
- Start no client
|
||||
- **Check**: Disable access control
|
||||
- Save configuration for future use
|
||||
|
||||
#### Configure WSL to use X Server
|
||||
|
||||
Add to `~/.bashrc` in WSL:
|
||||
|
||||
```bash
|
||||
# X11 forwarding for WSL1/WSL2 (Windows 10)
|
||||
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
|
||||
export LIBGL_ALWAYS_INDIRECT=1
|
||||
```
|
||||
|
||||
Apply changes:
|
||||
|
||||
```bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
Test X11:
|
||||
|
||||
```bash
|
||||
sudo apt install -y x11-apps
|
||||
xcalc # Should open a calculator
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 3: Install ROS 2 Humble
|
||||
|
||||
### Step 3.1: Setup ROS 2 Repository
|
||||
|
||||
```bash
|
||||
# Update system
|
||||
sudo apt update && sudo apt upgrade -y
|
||||
|
||||
# Install prerequisites
|
||||
sudo apt install -y software-properties-common
|
||||
sudo add-apt-repository universe
|
||||
|
||||
# Add ROS 2 GPG key
|
||||
sudo apt install -y curl gnupg lsb-release
|
||||
sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key \
|
||||
-o /usr/share/keyrings/ros-archive-keyring.gpg
|
||||
|
||||
# Add repository
|
||||
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] \
|
||||
http://packages.ros.org/ros2/ubuntu $(lsb_release -cs) main" | \
|
||||
sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null
|
||||
```
|
||||
|
||||
### Step 3.2: Install ROS 2 Humble
|
||||
|
||||
```bash
|
||||
# Update package list
|
||||
sudo apt update
|
||||
|
||||
# Install ROS 2 Desktop (includes RViz, demos, tutorials)
|
||||
sudo apt install -y ros-humble-desktop
|
||||
|
||||
# Install development tools
|
||||
sudo apt install -y \
|
||||
ros-dev-tools \
|
||||
python3-colcon-common-extensions \
|
||||
python3-rosdep
|
||||
```
|
||||
|
||||
### Step 3.3: Initialize rosdep
|
||||
|
||||
```bash
|
||||
sudo rosdep init
|
||||
rosdep update
|
||||
```
|
||||
|
||||
### Step 3.4: Setup Environment
|
||||
|
||||
Add to `~/.bashrc`:
|
||||
|
||||
```bash
|
||||
# ROS 2 Humble
|
||||
source /opt/ros/humble/setup.bash
|
||||
|
||||
# Optional: Auto-source workspace
|
||||
if [ -f ~/ros2_ws/install/setup.bash ]; then
|
||||
source ~/ros2_ws/install/setup.bash
|
||||
fi
|
||||
```
|
||||
|
||||
Apply changes:
|
||||
|
||||
```bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
### Step 3.5: Verify ROS 2
|
||||
|
||||
```bash
|
||||
ros2 --version
|
||||
# Should output: ros2 cli version: 0.x.x
|
||||
|
||||
# Test with a demo (optional)
|
||||
ros2 run demo_nodes_cpp talker
|
||||
# Press Ctrl+C to stop
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 4: Install Gazebo Classic 11
|
||||
|
||||
```bash
|
||||
# Install Gazebo Classic
|
||||
sudo apt install -y gazebo11 libgazebo11-dev
|
||||
|
||||
# Install ROS 2 Gazebo packages
|
||||
sudo apt install -y \
|
||||
ros-humble-gazebo-ros-pkgs \
|
||||
ros-humble-gazebo-plugins
|
||||
```
|
||||
|
||||
### Test Gazebo
|
||||
|
||||
```bash
|
||||
gazebo --verbose
|
||||
```
|
||||
|
||||
A Gazebo window should open. **Note**: First launch may be slow.
|
||||
|
||||
**Common Issues:**
|
||||
|
||||
- **Black screen**: Wait 30-60 seconds for Gazebo to fully initialize
|
||||
- **Slow performance**: Use software rendering (see below)
|
||||
- **Crashes**: Check GPU drivers and memory allocation in `.wslconfig`
|
||||
|
||||
### Performance Tweaks
|
||||
|
||||
If Gazebo is slow, force software rendering:
|
||||
|
||||
```bash
|
||||
export LIBGL_ALWAYS_SOFTWARE=1
|
||||
gazebo
|
||||
```
|
||||
|
||||
Add to `~/.bashrc` to make permanent:
|
||||
|
||||
```bash
|
||||
echo "export LIBGL_ALWAYS_SOFTWARE=1" >> ~/.bashrc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 5: Install ArduPilot SITL
|
||||
|
||||
### Step 5.1: Install Dependencies
|
||||
|
||||
```bash
|
||||
sudo apt install -y \
|
||||
git \
|
||||
gitk \
|
||||
git-gui \
|
||||
python3-dev \
|
||||
python3-opencv \
|
||||
python3-wxgtk4.0 \
|
||||
python3-pip \
|
||||
python3-matplotlib \
|
||||
python3-lxml \
|
||||
python3-pygame \
|
||||
libxml2-dev \
|
||||
libxslt1-dev \
|
||||
python3-scipy
|
||||
```
|
||||
|
||||
### Step 5.2: Clone ArduPilot
|
||||
|
||||
```bash
|
||||
cd ~
|
||||
git clone https://github.com/ArduPilot/ardupilot.git
|
||||
cd ardupilot
|
||||
git submodule update --init --recursive
|
||||
```
|
||||
|
||||
### Step 5.3: Install ArduPilot Prerequisites
|
||||
|
||||
```bash
|
||||
cd ~/ardupilot
|
||||
Tools/environment_install/install-prereqs-ubuntu.sh -y
|
||||
```
|
||||
|
||||
**Reload your shell:**
|
||||
|
||||
```bash
|
||||
. ~/.profile
|
||||
```
|
||||
|
||||
### Step 5.4: Build ArduCopter SITL
|
||||
|
||||
```bash
|
||||
cd ~/ardupilot
|
||||
./waf configure --board sitl
|
||||
./waf copter
|
||||
```
|
||||
|
||||
### Step 5.5: Test ArduPilot SITL
|
||||
|
||||
```bash
|
||||
cd ~/ardupilot/ArduCopter
|
||||
sim_vehicle.py --console --map
|
||||
```
|
||||
|
||||
You should see MAVProxy console and a map window. Press Ctrl+C to exit.
|
||||
|
||||
---
|
||||
|
||||
## Part 6: Install ardupilot_gazebo Plugin
|
||||
|
||||
```bash
|
||||
# Clone the plugin
|
||||
cd ~
|
||||
git clone https://github.com/ArduPilot/ardupilot_gazebo.git
|
||||
cd ardupilot_gazebo
|
||||
|
||||
# Build
|
||||
mkdir build && cd build
|
||||
cmake ..
|
||||
make -j4
|
||||
sudo make install
|
||||
```
|
||||
|
||||
### Configure Gazebo Paths
|
||||
|
||||
Add to `~/.bashrc`:
|
||||
|
||||
```bash
|
||||
# ArduPilot Gazebo
|
||||
export GAZEBO_MODEL_PATH=$HOME/ardupilot_gazebo/models:$GAZEBO_MODEL_PATH
|
||||
export GAZEBO_RESOURCE_PATH=$HOME/ardupilot_gazebo/worlds:$GAZEBO_RESOURCE_PATH
|
||||
```
|
||||
|
||||
Apply changes:
|
||||
|
||||
```bash
|
||||
source ~/.bashrc
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 7: Install MAVROS
|
||||
|
||||
```bash
|
||||
sudo apt install -y \
|
||||
ros-humble-mavros \
|
||||
ros-humble-mavros-extras
|
||||
```
|
||||
|
||||
### Install GeographicLib Datasets
|
||||
|
||||
```bash
|
||||
sudo /opt/ros/humble/lib/mavros/install_geographiclib_datasets.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 8: Setup UAV-UGV Simulation Project
|
||||
|
||||
### Step 8.1: Create ROS 2 Workspace
|
||||
|
||||
```bash
|
||||
mkdir -p ~/ros2_ws/src
|
||||
cd ~/ros2_ws/src
|
||||
```
|
||||
|
||||
### Step 8.2: Clone Project
|
||||
|
||||
```bash
|
||||
# Replace with your repository URL
|
||||
git clone https://git.sirblob.co/SirBlob/simulation.git uav_ugv_simulation
|
||||
cd uav_ugv_simulation
|
||||
```
|
||||
|
||||
### Step 8.3: Install Python Dependencies
|
||||
|
||||
```bash
|
||||
# Install system Python packages
|
||||
sudo apt install -y \
|
||||
python3-pip \
|
||||
python3-venv \
|
||||
python3-opencv \
|
||||
libopencv-dev
|
||||
|
||||
# Install additional ROS packages
|
||||
sudo apt install -y \
|
||||
ros-humble-cv-bridge \
|
||||
ros-humble-image-transport \
|
||||
ros-humble-tf2 \
|
||||
ros-humble-tf2-ros \
|
||||
ros-humble-tf2-geometry-msgs
|
||||
|
||||
# Create virtual environment
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
|
||||
# Install Python packages
|
||||
pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
### Step 8.4: Build ROS Package
|
||||
|
||||
```bash
|
||||
cd ~/ros2_ws
|
||||
colcon build --packages-select uav_ugv_simulation --symlink-install
|
||||
source install/setup.bash
|
||||
```
|
||||
|
||||
### Step 8.5: Make Scripts Executable
|
||||
|
||||
```bash
|
||||
cd ~/ros2_ws/src/uav_ugv_simulation
|
||||
chmod +x scripts/*.sh
|
||||
chmod +x setup.sh
|
||||
chmod +x activate_venv.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Part 9: Test the Installation
|
||||
|
||||
### Test 1: Gazebo
|
||||
|
||||
```bash
|
||||
gazebo --verbose
|
||||
```
|
||||
|
||||
### Test 2: ROS 2
|
||||
|
||||
```bash
|
||||
ros2 topic list
|
||||
```
|
||||
|
||||
### Test 3: ArduPilot SITL
|
||||
|
||||
```bash
|
||||
cd ~/ardupilot/ArduCopter
|
||||
sim_vehicle.py -v ArduCopter -f gazebo-iris --console --map
|
||||
```
|
||||
|
||||
### Test 4: Complete Simulation (Final Test)
|
||||
|
||||
**Terminal 1 - Gazebo:**
|
||||
```bash
|
||||
cd ~/ros2_ws/src/uav_ugv_simulation
|
||||
source activate_venv.sh
|
||||
gazebo --verbose worlds/empty_custom.world
|
||||
```
|
||||
|
||||
**Terminal 2 - ArduPilot:**
|
||||
```bash
|
||||
cd ~/ardupilot/ArduCopter
|
||||
sim_vehicle.py -v ArduCopter -f gazebo-iris --console --map -I0
|
||||
```
|
||||
|
||||
**Terminal 3 - MAVROS & Nodes:**
|
||||
```bash
|
||||
cd ~/ros2_ws/src/uav_ugv_simulation
|
||||
source activate_venv.sh
|
||||
ros2 launch uav_ugv_simulation uav_only.launch.py
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## WSL-Specific Issues & Solutions
|
||||
|
||||
### Issue 1: "Cannot open display"
|
||||
|
||||
**Solution:**
|
||||
|
||||
Windows 10:
|
||||
```bash
|
||||
export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
|
||||
```
|
||||
|
||||
Windows 11 (WSLg):
|
||||
```bash
|
||||
export DISPLAY=:0
|
||||
```
|
||||
|
||||
### Issue 2: Gazebo Black Screen
|
||||
|
||||
**Solutions:**
|
||||
|
||||
1. Wait 30-60 seconds for initialization
|
||||
2. Use software rendering:
|
||||
```bash
|
||||
export LIBGL_ALWAYS_SOFTWARE=1
|
||||
```
|
||||
3. Increase WSL memory in `.wslconfig`
|
||||
|
||||
### Issue 3: GPU Acceleration Not Working
|
||||
|
||||
**For NVIDIA GPUs in WSL2:**
|
||||
|
||||
1. Install NVIDIA drivers on **Windows** (not in WSL)
|
||||
2. Install CUDA in WSL:
|
||||
```bash
|
||||
sudo apt install -y nvidia-cuda-toolkit
|
||||
```
|
||||
3. Verify:
|
||||
```bash
|
||||
nvidia-smi
|
||||
```
|
||||
|
||||
### Issue 4: "Permission denied" on Serial Ports
|
||||
|
||||
```bash
|
||||
sudo usermod -aG dialout $USER
|
||||
# Logout and login again
|
||||
```
|
||||
|
||||
### Issue 5: Slow Performance
|
||||
|
||||
1. Increase memory in `.wslconfig`
|
||||
2. Close unnecessary Windows applications
|
||||
3. Use software rendering for Gazebo
|
||||
4. Reduce Gazebo real-time factor:
|
||||
```bash
|
||||
gazebo --verbose -u # Start paused
|
||||
```
|
||||
|
||||
### Issue 6: Network Issues (MAVROS connection)
|
||||
|
||||
Ensure localhost is working:
|
||||
|
||||
```bash
|
||||
# Test connection
|
||||
nc -zv 127.0.0.1 14550
|
||||
|
||||
# If fails, check WSL networking
|
||||
cat /etc/resolv.conf
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Quick Start After Installation
|
||||
|
||||
```bash
|
||||
# 1. Navigate to project
|
||||
cd ~/ros2_ws/src/uav_ugv_simulation
|
||||
|
||||
# 2. Activate environment
|
||||
source activate_venv.sh
|
||||
|
||||
# 3. Run simulation
|
||||
bash scripts/run_simulation.sh
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Performance Optimization for WSL
|
||||
|
||||
### 1. Increase WSL Resources
|
||||
|
||||
Edit `C:\Users\YourName\.wslconfig`:
|
||||
|
||||
```ini
|
||||
[wsl2]
|
||||
memory=12GB
|
||||
processors=6
|
||||
swap=8GB
|
||||
localhostForwarding=true
|
||||
```
|
||||
|
||||
### 2. Enable Systemd
|
||||
|
||||
In `.wslconfig`:
|
||||
|
||||
```ini
|
||||
[boot]
|
||||
systemd=true
|
||||
```
|
||||
|
||||
### 3. Disable Windows Defender for WSL
|
||||
|
||||
Add exclusion in Windows Security:
|
||||
- Path: `C:\Users\YourName\AppData\Local\Packages\CanonicalGroupLimited*`
|
||||
|
||||
### 4. Use Fast SSD
|
||||
|
||||
Move WSL to SSD if on HDD:
|
||||
|
||||
```powershell
|
||||
wsl --export Ubuntu-22.04 ubuntu-backup.tar
|
||||
wsl --unregister Ubuntu-22.04
|
||||
wsl --import Ubuntu-22.04 D:\WSL\Ubuntu ubuntu-backup.tar
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Useful WSL Commands
|
||||
|
||||
```powershell
|
||||
# List WSL distributions
|
||||
wsl --list --verbose
|
||||
|
||||
# Shutdown WSL (free resources)
|
||||
wsl --shutdown
|
||||
|
||||
# Access WSL files from Windows
|
||||
\\wsl$\Ubuntu-22.04\home\youruser
|
||||
|
||||
# Run Linux command from Windows
|
||||
wsl ls -la
|
||||
|
||||
# Set default WSL distribution
|
||||
wsl --set-default Ubuntu-22.04
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Troubleshooting Resources
|
||||
|
||||
- **WSL Issues**: https://github.com/microsoft/WSL/issues
|
||||
- **Gazebo WSL**: https://classic.gazebosim.org/tutorials?tut=wsl
|
||||
- **ROS 2 WSL**: https://docs.ros.org/en/humble/How-To-Guides/Installing-on-Raspberry-Pi.html
|
||||
- **ArduPilot Forums**: https://discuss.ardupilot.org/
|
||||
|
||||
---
|
||||
|
||||
## Next Steps
|
||||
|
||||
After successful installation:
|
||||
|
||||
1. Read the [Usage Guide](usage.md)
|
||||
2. Understand [GPS-Denied Navigation](gps_denied_navigation.md)
|
||||
3. Review [Architecture](architecture.md)
|
||||
4. Try example missions in `docs/usage.md`
|
||||
|
||||
---
|
||||
|
||||
## Known Limitations in WSL
|
||||
|
||||
1. **Performance**: ~70% of native Linux performance
|
||||
2. **GPU**: Limited DirectX translation in WSLg
|
||||
3. **Real-time**: WSL2 is not real-time capable
|
||||
4. **USB**: Direct USB forwarding requires usbipd-win
|
||||
5. **GUI**: Some OpenGL features may not work perfectly
|
||||
|
||||
For production work, consider **dual-boot Ubuntu 22.04** or a **native Linux installation**.
|
||||
Reference in New Issue
Block a user