feat: demo suite - autorun/stop/mapping/yolo/vlm modes, .env.defaults

This commit is contained in:
devuser 2026-05-08 09:12:56 +08:00
parent c8186aa573
commit b047c6c145
8 changed files with 148 additions and 8 deletions

25
.env.defaults Normal file
View File

@ -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}"

69
README_DEMO.md Normal file
View File

@ -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 控制("去冰箱前"等指令)

View File

@ -1,6 +1,9 @@
#!/usr/bin/env bash #!/usr/bin/env bash
# 与 run_all.sh mapping --gzweb 相同,但不起 workspace 内 gzweb-demo 的 npm run dev。 # autorun.sh — 容器启动后自动执行:移动巡检 + 自动制图
# 浏览器使用镜像内 foundation 已在 /opt/gzweb8000起的页面本脚本仍起 gz sim、websocket.sdf(9002)、Nav2 等。 # 默认不运行 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 set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 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

View File

@ -1,5 +1,10 @@
#!/bin/bash #!/bin/bash
set -euo pipefail 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 # Link pip deps from EFS vendor if /workspace/.site-packages is missing
ROOT="/workspace/" ROOT="/workspace/"
if [[ ! -d "${ROOT}/.site-packages" && -d "/opt/vendor/yolov8" ]]; then if [[ ! -d "${ROOT}/.site-packages" && -d "/opt/vendor/yolov8" ]]; then

View File

@ -1,13 +1,31 @@
#!/usr/bin/env bash #!/usr/bin/env bash
set -euo pipefail 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 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) # 2. 发送 SIGTERM 给 run_all.sh触发其 cleanup trap
PIDS=$(ps aux | grep -E "run_all\.sh" | grep -v grep | grep -v run_all_stop | awk '{print $2}' || true) PIDS=$(pgrep -f "run_all\.sh" | grep -v $$ || true)
if [[ -n "$PIDS" ]]; then 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 kill $PIDS 2>/dev/null || true
fi 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."

4
run_mapping.sh Executable file
View File

@ -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 "$@"

11
run_vlm.sh Executable file
View File

@ -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 "$@"

5
run_yolo.sh Executable file
View File

@ -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 "$@"