From b047c6c145a7535941be825e15d332abd913e460 Mon Sep 17 00:00:00 2001 From: devuser Date: Fri, 8 May 2026 09:12:56 +0800 Subject: [PATCH] feat: demo suite - autorun/stop/mapping/yolo/vlm modes, .env.defaults --- .env.defaults | 25 ++++++++++++++++++ README_DEMO.md | 69 +++++++++++++++++++++++++++++++++++++++++++++++++ autorun.sh | 9 ++++--- run_all.sh | 5 ++++ run_all_stop.sh | 28 ++++++++++++++++---- run_mapping.sh | 4 +++ run_vlm.sh | 11 ++++++++ run_yolo.sh | 5 ++++ 8 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 .env.defaults create mode 100644 README_DEMO.md create mode 100755 run_mapping.sh create mode 100755 run_vlm.sh create mode 100755 run_yolo.sh diff --git a/.env.defaults b/.env.defaults new file mode 100644 index 0000000..0053d15 --- /dev/null +++ b/.env.defaults @@ -0,0 +1,25 @@ +# ================================================================ +# 演示方案默认环境变量 +# 容器重启后 autorun.sh 会自动加载此文件 +# ================================================================ + +# 视觉后端模式:yolo | vlm | hybrid +# yolo : YOLOv8n CPU 检测(轻量、快速) +# vlm : Qwen2.5-VL-3B GPU 检测(语义理解强) +# hybrid: YOLO 持续 + VLM 定期深度分析 +export VISION_BACKEND="${VISION_BACKEND:-yolo}" + +# VLM 采样间隔(秒) +export VLM_INTERVAL="${VLM_INTERVAL:-5.0}" + +# VLM 模型名称(本地路径优先) +export VLM_MODEL="${VLM_MODEL:-Qwen/Qwen2.5-VL-3B-Instruct}" + +# VLM 提示词(空则使用内置默认) +export VLM_PROMPT="${VLM_PROMPT:-}" + +# HuggingFace / ModelScope 缓存目录 +export HF_HOME="${HF_HOME:-/workspace/.cache/huggingface}" + +# 默认地图路径(localization 模式使用) +export NAV2_MAP_PATH="${NAV2_MAP_PATH:-/workspace/turtlebot3_simulations/turtlebot3_gazebo/map/office_map.yaml}" diff --git a/README_DEMO.md b/README_DEMO.md new file mode 100644 index 0000000..363a55e --- /dev/null +++ b/README_DEMO.md @@ -0,0 +1,69 @@ +# 机器人巡检演示方案 + +## 快速开始 + +### 1. 默认自动运行(容器重启后自动执行) +```bash +# 容器启动后自动执行 autorun.sh: +# mapping + explore + gzweb,不运行 detector +``` + +### 2. 手动控制 + +```bash +# 停止所有仿真进程 +./run_all_stop.sh + +# 纯制图(无 detector) +./run_mapping.sh + +# YOLO CPU 视觉巡检 +./run_yolo.sh + +# VLM GPU 视觉巡检(需要 GPU 实例) +./run_vlm.sh + +# VLM 混合模式(YOLO + VLM 互补) +VISION_BACKEND=hybrid ./run_vlm.sh +``` + +### 3. 高级参数 + +```bash +# 自定义 VLM 采样间隔 +VLM_INTERVAL=3.0 ./run_vlm.sh + +# 使用 AWQ 量化版(显存 3-4GB) +VLM_MODEL=Qwen/Qwen2.5-VL-3B-Instruct-AWQ ./run_vlm.sh + +# 不启动 gzweb(节省资源) +./run_mapping.sh --no-rviz + +# 使用已有地图定位导航 +./run_all.sh localization --map /path/to/map.yaml +``` + +## 文件结构 + +| 文件 | 说明 | +|------|------| +| `autorun.sh` | 容器默认启动脚本(mapping + explore,无 detector) | +| `run_all.sh` | 统一启动器(支持 mapping/localization + 各种选项) | +| `run_all_stop.sh` | 干净停止所有仿真进程 | +| `run_mapping.sh` | 便捷脚本:纯制图 | +| `run_yolo.sh` | 便捷脚本:YOLO CPU 视觉巡检 | +| `run_vlm.sh` | 便捷脚本:VLM GPU 视觉巡检 | +| `.env.defaults` | 默认环境变量配置 | + +## 日志与输出 + +| 位置 | 内容 | +|------|------| +| `/workspace/logs/run_all_*/` | 各进程运行日志 | +| `/workspace/vision_output/YYYYMMDD_HHMMSS/` | 摄像头画面 + 标注图像 | +| `/workspace/camera_latest.jpg` | 最新摄像头画面 | +| `/workspace/.vlm_model_path` | VLM 本地模型路径 | + +## TODO + +- [ ] 自然语言 CLI 控制("去冰箱前"等指令) diff --git a/autorun.sh b/autorun.sh index b14a8b5..0a71eb9 100755 --- a/autorun.sh +++ b/autorun.sh @@ -1,6 +1,9 @@ #!/usr/bin/env bash -# 与 run_all.sh mapping --gzweb 相同,但不起 workspace 内 gzweb-demo 的 npm run dev。 -# 浏览器使用镜像内 foundation 已在 /opt/gzweb(8000)起的页面;本脚本仍起 gz sim、websocket.sdf(9002)、Nav2 等。 +# autorun.sh — 容器启动后自动执行:移动巡检 + 自动制图 +# 默认不运行 detector,保持最稳定的基础行为 +# 如需启用 detector,手动运行: +# VISION_BACKEND=yolo ./run_all.sh mapping --explore --gzweb --no-gzweb-vite --vision +# VISION_BACKEND=vlm ./run_all.sh mapping --explore --gzweb --no-gzweb-vite --vision set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" -exec bash "${ROOT}/run_all.sh" mapping --explore --gzweb --no-gzweb-vite --vision +exec bash "${ROOT}/run_all.sh" mapping --explore --gzweb --no-gzweb-vite diff --git a/run_all.sh b/run_all.sh index 244a399..186e52b 100755 --- a/run_all.sh +++ b/run_all.sh @@ -1,5 +1,10 @@ #!/bin/bash set -euo pipefail +# 加载默认环境变量 +if [[ -f "${ROOT}/.env.defaults" ]]; then + set -a; source "${ROOT}/.env.defaults"; set +a +fi + # Link pip deps from EFS vendor if /workspace/.site-packages is missing ROOT="/workspace/" if [[ ! -d "${ROOT}/.site-packages" && -d "/opt/vendor/yolov8" ]]; then diff --git a/run_all_stop.sh b/run_all_stop.sh index e5cd632..facd840 100755 --- a/run_all_stop.sh +++ b/run_all_stop.sh @@ -1,13 +1,31 @@ #!/usr/bin/env bash set -euo pipefail -# run_all_stop.sh — send stop signal to run_all.sh loop mode +# run_all_stop.sh — 干净停止所有仿真、导航、视觉进程 +echo "[run_all_stop] Stopping all simulation processes..." + +# 1. 发送循环停止信号(让 run_all.sh 优雅退出) touch /workspace/.run_all_stop -echo "[run_all_stop] stop signal sent. run_all.sh will exit after current exploration cycle." -# Also send SIGTERM to run_all.sh directly (excluding this script) -PIDS=$(ps aux | grep -E "run_all\.sh" | grep -v grep | grep -v run_all_stop | awk '{print $2}' || true) +# 2. 发送 SIGTERM 给 run_all.sh(触发其 cleanup trap) +PIDS=$(pgrep -f "run_all\.sh" | grep -v $$ || true) if [[ -n "$PIDS" ]]; then - echo "[run_all_stop] sending SIGTERM to run_all.sh pids: $PIDS" + echo "[run_all_stop] Sending SIGTERM to run_all.sh: $PIDS" kill $PIDS 2>/dev/null || true fi + +# 3. 等待优雅退出 +sleep 3 + +# 4. 强制清理残留的 ROS2 / Gazebo / 视觉进程 +echo "[run_all_stop] Force killing remaining processes..." +pkill -9 -f "gz sim\|gz launch\|ros2 launch\|ros2 run" 2>/dev/null || true +pkill -9 -f "explore_lite\|nav2_bringup\|turtlebot3_gazebo" 2>/dev/null || true +pkill -9 -f "vision_yolo\|vision_daemon" 2>/dev/null || true +pkill -9 -f "selkies-gstreamer\|code-server" 2>/dev/null || true + +# 5. 清理状态文件 +rm -f /workspace/.run_all_stop +rm -f /workspace/.vision_daemon_stop + +echo "[run_all_stop] All processes stopped." diff --git a/run_mapping.sh b/run_mapping.sh new file mode 100755 index 0000000..efd0487 --- /dev/null +++ b/run_mapping.sh @@ -0,0 +1,4 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +exec bash "${ROOT}/run_all.sh" mapping --explore --gzweb --no-gzweb-vite "$@" diff --git a/run_vlm.sh b/run_vlm.sh new file mode 100755 index 0000000..2be4b26 --- /dev/null +++ b/run_vlm.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +export VISION_BACKEND=vlm +export VLM_INTERVAL="${VLM_INTERVAL:-5.0}" +export VLM_MODEL="${VLM_MODEL:-Qwen/Qwen2.5-VL-3B-Instruct}" +# 如果 install_vlm.sh 预下载了本地模型,优先使用 +if [[ -f /workspace/.vlm_model_path ]]; then + source /workspace/.vlm_model_path +fi +exec bash "${ROOT}/run_all.sh" mapping --explore --gzweb --no-gzweb-vite --vision "$@" diff --git a/run_yolo.sh b/run_yolo.sh new file mode 100755 index 0000000..6b0a854 --- /dev/null +++ b/run_yolo.sh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -euo pipefail +ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +export VISION_BACKEND=yolo +exec bash "${ROOT}/run_all.sh" mapping --explore --gzweb --no-gzweb-vite --vision "$@"