File size: 3,876 Bytes
15b8951
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env bash
# ══ NaVILA · CHẠY TẤT CẢ TRONG 1 LỆNH ═══════════════════════════════════════
# driver robot + não NaVILA :8100 + web GUI :8001 — 1 terminal duy nhất.
#   cd ~/ros2_vlm/src/navila && ./scripts/run.sh
# Rồi mở:  http://localhost:8001  (gõ nhiệm vụ tiếng Anh)
# Ctrl-C = tắt SẠCH cả 3 (không còn tiến trình mồ côi).
#
# Log 2 phần chạy nền (terminal này chỉ hiện log web cho gọn):
#   tail -f ~/ros2_vlm/log/navila_driver.log     # driver robot
#   tail -f ~/ros2_vlm/log/navila_brain.log      # não NaVILA
#
# Override (đặt trước lệnh), vd:
#   MOTION_LIN_SPEED=0.6 ./scripts/run.sh   # đi nhanh hơn (mặc định 0.4)
#   DECODE_LIDAR=true    ./scripts/run.sh   # bật lidar (có /scan auto-né vật cản)
#   ROBOT_IP=192.168.1.7 ./scripts/run.sh   # đổi IP robot 1 lần
set -e

WS="$HOME/ros2_vlm"
LOG_DIR="$WS/log"; mkdir -p "$LOG_DIR"
DRIVER_LOG="$LOG_DIR/navila_driver.log"
BRAIN_LOG="$LOG_DIR/navila_brain.log"

NAVILA_DIR="${NAVILA_DIR:-$HOME/NaVILA}"
CKPT_DIR="${CKPT_DIR:-$HOME/navila-ckpt}"
ENV_NAME="${ENV_NAME:-navila}"
SERVER_PY="$WS/src/navila/navila_server.py"

pkill -9 -f "go2_driver|robot.launch|agent_server|navila_server" 2>/dev/null || true
sleep 2

PIDS=()
cleanup() {
  echo; echo "⏹ Dừng tất cả (driver + não + web)…"
  kill "${PIDS[@]}" 2>/dev/null || true
  pkill -9 -f "go2_driver|navila_server|agent_server" 2>/dev/null || true
  exit 0
}
trap cleanup INT TERM

# ── [1/3] Driver robot (background, env ROS) ─────────────────────────────────
echo "▶ [1/3] Driver robot (camera+odom) → $DRIVER_LOG"
(
  source /opt/ros/jazzy/setup.bash
  source "$WS/install/setup.bash"
  export DECODE_LIDAR="${DECODE_LIDAR:-false}"
  export ROBOT_IP="${ROBOT_IP:-}"
  exec ros2 launch go2_navigation bringup.launch.py teleop:=true
) >"$DRIVER_LOG" 2>&1 &
PIDS+=($!)

# ── [2/3] Não NaVILA (background, env conda navila, 8-bit) ────────────────────
echo "▶ [2/3] Não NaVILA :8100 (8-bit) → $BRAIN_LOG"
(
  cd "$NAVILA_DIR"
  exec env \
    CUDA_HOME="$HOME/miniconda3/envs/$ENV_NAME" \
    PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True \
    conda run -n "$ENV_NAME" --no-capture-output \
      python "$SERVER_PY" --model-path "$CKPT_DIR" --port 8100
) >"$BRAIN_LOG" 2>&1 &
PIDS+=($!)
BRAIN_PID=$!

# Đợi model nạp xong (health OK) mới bật web — tránh web hỏi khi não chưa sẵn sàng.
echo -n "⏳ Đợi NaVILA nạp model (~30-60s)"
READY=0
for _ in $(seq 1 150); do          # tối đa ~5 phút
  if curl -sf http://127.0.0.1:8100/health >/dev/null 2>&1; then
    READY=1; echo " — SẴN SÀNG ✅"; break
  fi
  if ! kill -0 "$BRAIN_PID" 2>/dev/null; then
    echo; echo "❌ Não NaVILA chết khi nạp. Xem: cat $BRAIN_LOG" >&2; cleanup
  fi
  echo -n "."; sleep 2
done
[ "$READY" = 1 ] || echo " — (quá lâu, vẫn bật web; kiểm $BRAIN_LOG nếu web báo lỗi não)"

# ── [3/3] Web GUI (foreground, env ROS) ──────────────────────────────────────
echo "▶ [3/3] Web GUI :8001 — mở http://localhost:8001 . Ctrl-C = tắt TẤT CẢ."
cd "$WS/src"
VLA_BRAIN=navila \
VLA_CONTROL=vlm \
USE_YOLO=0 \
VLA_NAVILA_URL="${VLA_NAVILA_URL:-http://127.0.0.1:8100}" \
VLA_NAVILA_FRAMES="${VLA_NAVILA_FRAMES:-8}" \
VLA_MAX_TURN_DEG="${VLA_MAX_TURN_DEG:-30}" \
NAVILA_FALLBACK="${NAVILA_FALLBACK:-stop}" \
MOTION_LIN_SPEED="${MOTION_LIN_SPEED:-0.4}" \
MOTION_ANG_SPEED="${MOTION_ANG_SPEED:-0.7}" \
MOTION_ANG_MAX_DEG="${MOTION_ANG_MAX_DEG:-45}" \
  ./vlm/scripts/run_demo1.sh

# Web thoát bình thường → hạ nốt driver + não.
cleanup