#!/bin/bash # ============================================================================= # Drone Simulation - macOS Installation Script # ============================================================================= # Installs ROS 2 Humble via robostack (conda), PyBullet, and dependencies # Uses a conda environment for all packages # # Usage: # chmod +x install_macos.sh # ./install_macos.sh # # Tested on: macOS Ventura, Sonoma (Apple Silicon & Intel) # ============================================================================= set -e # Exit on error echo "==============================================" echo " Drone Simulation - macOS Installation" echo "==============================================" # Get the script directory and project root SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" ENV_NAME="drone_simulation" echo "[INFO] Project root: $PROJECT_ROOT" # Detect architecture ARCH=$(uname -m) echo "[INFO] Detected architecture: $ARCH" # ----------------------------------------------------------------------------- # Step 1: Install Homebrew (if not present) # ----------------------------------------------------------------------------- echo "" echo "[STEP 1/5] Checking Homebrew..." if ! command -v brew &> /dev/null; then echo "[INFO] Installing Homebrew..." /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Add Homebrew to PATH for Apple Silicon if [[ "$ARCH" == "arm64" ]]; then echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile eval "$(/opt/homebrew/bin/brew shellenv)" fi else echo "[INFO] Homebrew already installed" fi # Update Homebrew brew update # ----------------------------------------------------------------------------- # Step 2: Install Miniforge (conda) # ----------------------------------------------------------------------------- echo "" echo "[STEP 2/5] Installing Miniforge (conda)..." if ! command -v conda &> /dev/null; then echo "[INFO] Downloading Miniforge..." if [[ "$ARCH" == "arm64" ]]; then curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-arm64.sh" bash Miniforge3-MacOSX-arm64.sh -b -p $HOME/miniforge3 rm Miniforge3-MacOSX-arm64.sh else curl -L -O "https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-MacOSX-x86_64.sh" bash Miniforge3-MacOSX-x86_64.sh -b -p $HOME/miniforge3 rm Miniforge3-MacOSX-x86_64.sh fi # Initialize conda $HOME/miniforge3/bin/conda init zsh bash # Source conda for this session source $HOME/miniforge3/etc/profile.d/conda.sh else echo "[INFO] Conda already installed" # Ensure conda is available in this session source $(conda info --base)/etc/profile.d/conda.sh fi # ----------------------------------------------------------------------------- # Step 3: Create conda environment with ROS 2 # ----------------------------------------------------------------------------- echo "" echo "[STEP 3/5] Creating conda environment with ROS 2..." # Remove existing environment if present conda deactivate 2>/dev/null || true conda env remove -n $ENV_NAME 2>/dev/null || true # Create new environment conda create -n $ENV_NAME python=3.11 -y # Activate environment conda activate $ENV_NAME # Add robostack channels conda config --env --add channels conda-forge conda config --env --add channels robostack-staging echo "[INFO] Installing ROS 2 Humble via robostack (this may take a while)..." conda install ros-humble-desktop ros-humble-geometry-msgs ros-humble-std-msgs -y # ----------------------------------------------------------------------------- # Step 4: Install Python Dependencies # ----------------------------------------------------------------------------- echo "" echo "[STEP 4/5] Installing Python dependencies..." pip install pybullet pyinstaller # ----------------------------------------------------------------------------- # Step 5: Create Activation Script # ----------------------------------------------------------------------------- echo "" echo "[STEP 5/5] Creating activation script..." ACTIVATE_SCRIPT="$PROJECT_ROOT/activate.sh" cat > "$ACTIVATE_SCRIPT" << 'EOF' #!/bin/bash # ============================================================================= # Drone Competition - Environment Activation Script (macOS) # ============================================================================= # This script activates the conda environment with ROS 2. # # Usage: # source activate.sh # ============================================================================= # Get the directory where this script is located SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" # Initialize conda if [ -f "$HOME/miniforge3/etc/profile.d/conda.sh" ]; then source "$HOME/miniforge3/etc/profile.d/conda.sh" elif [ -f "$(conda info --base)/etc/profile.d/conda.sh" ]; then source "$(conda info --base)/etc/profile.d/conda.sh" fi # Activate conda environment conda activate drone_competition echo "[OK] Conda environment 'drone_competition' activated" echo "" echo "Environment ready! You can now run:" echo " python simulation_host.py" echo " python ros_bridge.py" echo "" EOF chmod +x "$ACTIVATE_SCRIPT" echo "[INFO] Created activation script: $ACTIVATE_SCRIPT" # ----------------------------------------------------------------------------- # Verification # ----------------------------------------------------------------------------- echo "" echo "==============================================" echo " Installation Complete!" echo "==============================================" echo "" echo "Verifying installation..." echo "" echo -n " ROS 2: " ros2 --version 2>/dev/null && echo "" || echo "FAILED" echo -n " PyBullet: " python3 -c "import pybullet; print('OK')" 2>/dev/null || echo "FAILED" echo -n " rclpy: " python3 -c "import rclpy; print('OK')" 2>/dev/null || echo "FAILED" echo -n " PyInstaller: " python3 -c "import PyInstaller; print('OK')" 2>/dev/null || echo "FAILED" echo "" echo "==============================================" echo " IMPORTANT: Activate the environment first!" echo "==============================================" echo "" echo "Before running any scripts, activate the environment:" echo " source $ACTIVATE_SCRIPT" echo "" echo "Then run the simulation:" echo " python simulation_host.py" echo ""