#!/usr/bin/env bash set -euo pipefail # ============================================================ # photo_sanad.sh # ------------------------------------------------------------ # ONE command to run everything: # ./photo_sanad.sh # # What it does: # 1) Activates teleimager (py3.10) and starts teleimager image_server (--rs) in background # 2) Activates gemini (py3.11) and runs /home/unitree/photographer/sanad_voice.py in foreground # 3) Sets PulseAudio default sink/source (optional) # 4) Sets PYTHONPATH for unitree_sdk2_python (so unitree_sdk2py imports work) # 5) On exit, stops teleimager server # ============================================================ BASE_DIR="/home/unitree/photographer" PY_FILE="$BASE_DIR/voice_sanad.py" # conda CONDA_SH="/home/unitree/miniconda3/etc/profile.d/conda.sh" ENV_TELE="teleimager" # Python 3.10 ENV_GEM="gemini" # Python 3.11 # Optional: choose your camera (if needed) # export CAMERA_DEVICE=/dev/video2 # export PHOTO_PREFIX=photo export CAMERA_DEVICE="${CAMERA_DEVICE:-/dev/video0}" export PHOTO_PREFIX="${PHOTO_PREFIX:-photo}" # PulseAudio device names (change if needed) SINK="${SINK:-alsa_output.usb-Anker_PowerConf_A3321-DEV-SN1-01.analog-stereo}" SOURCE="${SOURCE:-alsa_input.usb-Anker_PowerConf_A3321-DEV-SN1-01.mono-fallback}" # ALSA plugin fix (helps conda envs stop spamming ALSA errors) if [[ -d "/usr/lib/aarch64-linux-gnu/alsa-lib" ]]; then export ALSA_PLUGIN_DIR="/usr/lib/aarch64-linux-gnu/alsa-lib" elif [[ -d "/usr/lib/alsa-lib" ]]; then export ALSA_PLUGIN_DIR="/usr/lib/alsa-lib" fi if [[ -f "/usr/share/alsa/alsa.conf" ]]; then export ALSA_CONFIG_PATH="/usr/share/alsa/alsa.conf" fi export ALSA_LOG_LEVEL=0 echo "๐Ÿ“ Base dir: $BASE_DIR" cd "$BASE_DIR" # ---------- conda init ---------- if [[ ! -f "$CONDA_SH" ]]; then echo "โŒ conda.sh not found: $CONDA_SH" exit 1 fi # shellcheck disable=SC1090 source "$CONDA_SH" # ---------- time sync wait ---------- echo "โฐ Checking system time..." while [ "$(date +%Y)" -lt 2025 ]; do echo "โณ Waiting for time sync... $(date)" sleep 2 done echo "โœ… Time synced: $(date)" # ---------- PulseAudio defaults (optional) ---------- if command -v pactl >/dev/null 2>&1; then echo "๐Ÿ”Š Checking audio server..." READY=0 for _ in {1..20}; do if timeout 0.3s pactl info >/dev/null 2>&1; then READY=1 break fi sleep 0.3 done if [[ "$READY" -eq 1 ]]; then echo "๐ŸŽง Setting default speaker โ†’ $SINK" pactl set-default-sink "$SINK" || true echo "๐ŸŽค Setting default microphone โ†’ $SOURCE" pactl set-default-source "$SOURCE" || true else echo "โš ๏ธ PulseAudio/PipeWire not ready. Continuing anyway." fi else echo "โš ๏ธ pactl not found. Skipping audio defaults." fi # ---------- paths check ---------- if [[ ! -f "$PY_FILE" ]]; then echo "โŒ sanad_voice.py not found: $PY_FILE" exit 1 fi # ---------- start teleimager server (py3.10) ---------- echo "๐Ÿ Activating teleimager env: $ENV_TELE" conda activate "$ENV_TELE" echo "๐Ÿ teleimager python: $(which python)" python -c "import sys; print('โœ… teleimager sys.executable:', sys.executable); print('โœ… teleimager sys.version:', sys.version.split()[0])" TELE_LOG="$BASE_DIR/main_teleimager.log" echo "๐Ÿ“ท Starting teleimager server (--rs) in background..." python -m teleimager.image_server --rs >"$TELE_LOG" 2>&1 & TELE_PID=$! echo "โœ… teleimager PID=$TELE_PID log=$TELE_LOG" cleanup() { echo "" echo "๐Ÿงน Cleaning up..." if kill -0 "$TELE_PID" >/dev/null 2>&1; then echo "๐Ÿ›‘ Stopping teleimager server PID=$TELE_PID" kill "$TELE_PID" >/dev/null 2>&1 || true wait "$TELE_PID" >/dev/null 2>&1 || true fi echo "โœ… Done." } trap cleanup EXIT INT TERM # Give server time to start sleep 2 # ---------- run sanad (py3.11) ---------- echo "๐Ÿ Activating gemini env: $ENV_GEM" conda activate "$ENV_GEM" echo "๐Ÿ gemini python: $(which python)" python -c "import sys; print('โœ… gemini sys.executable:', sys.executable); print('โœ… gemini sys.version:', sys.version.split()[0])" # Ensure unitree_sdk2py can import export PYTHONPATH="$HOME/unitree_sdk2_python:${PYTHONPATH:-}" echo "๐Ÿ”ง PYTHONPATH=$PYTHONPATH" echo "๐Ÿ”ง ALSA_PLUGIN_DIR=${ALSA_PLUGIN_DIR:-"(not set)"}" echo "๐Ÿ”ง ALSA_CONFIG_PATH=${ALSA_CONFIG_PATH:-"(not set)"}" echo "๐ŸŽฅ CAMERA_DEVICE=$CAMERA_DEVICE" echo "๐Ÿ–ผ๏ธ PHOTO_PREFIX=$PHOTO_PREFIX" echo "๐Ÿš€ Starting Sanad Photographer..." exec python "$PY_FILE"