Refactor infrastructure scripts and add mock hardware support

Changes:
- Refactor project scripts for better dev/prod workflow separation
- Add mock_hardware.py for local development without real hardware
- Add Makefile for common commands
- Add .env.example for environment variable reference
- Split scripts into dev-backend.sh, dev-frontend.sh, prod-backend.sh
- Add stop.sh for clean shutdown

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-22 12:31:32 +08:00
parent 1429442dbd
commit cb6498cd2b
12 changed files with 592 additions and 167 deletions
+35 -9
View File
@@ -12,13 +12,32 @@ import requests
from flask import Flask, render_template, jsonify, request, Response, send_from_directory
from flask_cors import CORS
from config import SERVER_CONFIG, ARM_CONFIG, AGV_CONFIG, UPLOAD_CONFIG, MAP_CONFIG, ARM_CAMERA_CONFIG, CAMERA_CONFIG, DATA_DIR, State, ZHIJIAN_BASE_URL, ZHIJIAN_AUTH_TOKEN, set_api_mode
from utils.arm_client import ArmClient
from utils.agv_controller_ros2 import AGVController
from utils.qr_scanner import QRScanner
from config import (
SERVER_CONFIG, ARM_CONFIG, AGV_CONFIG, UPLOAD_CONFIG, MAP_CONFIG,
ARM_CAMERA_CONFIG, CAMERA_CONFIG, DATA_DIR, State, ZHIJIAN_BASE_URL,
ZHIJIAN_AUTH_TOKEN, set_api_mode, MOCK_HARDWARE
)
# 根据 MOCK_HARDWARE 配置选择导入真实或 Mock 实现
if MOCK_HARDWARE:
print("[启动] ===========================================")
print("[启动] Mock 硬件模式 - 本地开发环境")
print("[启动] ===========================================")
from utils.mock_hardware import (
MockArmClient as ArmClient,
MockAGVController as AGVController,
MockQRScanner as QRScanner,
MockNav2Navigator as Nav2Navigator,
MockNav2Status as Nav2Status
)
else:
from utils.arm_client import ArmClient
from utils.agv_controller_ros2 import AGVController
from utils.qr_scanner import QRScanner
from utils.nav2_navigator import Nav2Navigator, Nav2Status
from utils.image_uploader import ImageUploader
from utils.mission_executor import MissionExecutorV3
from utils.nav2_navigator import Nav2Navigator, Nav2Status
# 配置日志
logging.basicConfig(
@@ -133,9 +152,17 @@ try:
import threading
def _auto_connect_all():
time.sleep(2) # 等待 Flask 完全就绪
# 连接 AGV
if MOCK_HARDWARE:
print("[启动] Mock 模式跳过硬件自动连接")
# Mock 模式下也创建实例供 API 使用
gs.agv_controller = AGVController()
gs.arm_client = ArmClient(ARM_CONFIG["host"], ARM_CONFIG["port"])
gs.qr_scanner = QRScanner(CAMERA_CONFIG["device_index"])
gs.navigator = Nav2Navigator()
return
# 连接 AGV(真实硬件)
try:
from utils.agv_controller_ros2 import AGVController
gs.agv_controller = AGVController()
if gs.agv_controller.connect():
print("[启动] AGV 自动连接成功")
@@ -143,9 +170,8 @@ try:
print("[启动] AGV 自动连接失败,请手动连接")
except Exception as e:
print(f"[启动] AGV 自动连接异常: {e}")
# 连接机械臂
# 连接机械臂(真实硬件)
try:
from utils.arm_client import ArmClient
gs.arm_client = ArmClient(ARM_CONFIG["host"], ARM_CONFIG["port"])
if gs.arm_client.connect():
gs.arm_client.power_on()