任务执行

This commit is contained in:
ywb
2026-05-23 10:02:19 +08:00
parent 35d5c3d70e
commit 6920403035
6 changed files with 883 additions and 420 deletions
+61 -24
View File
@@ -16,7 +16,7 @@ from utils.arm_client import ArmClient
from utils.agv_controller_ros2 import AGVController
from utils.qr_scanner import QRScanner
from utils.image_uploader import ImageUploader
from utils.mission_executor import MissionExecutor, TaskStatus
from utils.mission_executor import MissionExecutorV3
from utils.nav2_navigator import Nav2Navigator, Nav2Status
# 配置日志
@@ -1241,41 +1241,39 @@ def api_agv_reset():
# ========== 任务执行 API ==========
@app.route("/api/mission/start", methods=["POST"])
def api_mission_start():
"""开始执行任务"""
"""开始执行任务V3: M×N Grid 蛇形路径)"""
if gs.state == State.RUNNING:
return jsonify({"ok": False, "error": "任务已在运行中"}), 400
data = request.json or {}
mission_data = {
"map": gs.map_config,
"points": gs.points_config,
}
def run():
from config import AGV_CONFIG, UPLOAD_CONFIG
executor_config = {
from config import AGV_CONFIG
config = {
"device": AGV_CONFIG.get("device", "/dev/agvpro_controller"),
"baudrate": AGV_CONFIG.get("baudrate", 1000000),
"arm": ARM_CONFIG,
"upload_url": UPLOAD_CONFIG["url"],
"upload_timeout": UPLOAD_CONFIG["timeout"],
"upload_retries": UPLOAD_CONFIG["max_retries"],
"camera_index": 0,
}
executor = MissionExecutor(executor_config)
executor = MissionExecutorV3(config)
# 连接
conn_results = executor.connect_all()
if not conn_results.get("arm") or not conn_results.get("camera"):
gs.mission_report = {"error": "连接失败", "details": conn_results}
conn = executor.connect_all()
if not conn.get("agv") or not conn.get("arm"):
gs.mission_report = {"error": "连接失败", "details": conn}
gs.state = State.IDLE
return
gs.state = State.RUNNING
report = executor.execute_mission(mission_data)
machines_list = gs.machines_config if isinstance(gs.machines_config, list) else gs.machines_config.get("machines", [])
models_list = gs.models_config if isinstance(gs.models_config, list) else gs.models_config.get("models", [])
report = executor.execute_mission(
mission_config=gs.mission_config,
machines=machines_list,
qr_configs=gs.qr_config,
models=models_list,
)
gs.mission_report = report
executor.disconnect_all()
gs.state = State.IDLE if report["failed"] == 0 else State.PAUSED
gs.state = State.IDLE if report.get("error") is None else State.PAUSED
thread = threading.Thread(target=run, daemon=True)
thread.start()
@@ -1284,23 +1282,62 @@ def api_mission_start():
@app.route("/api/mission/stop", methods=["POST"])
def api_mission_stop():
"""停止任务"""
if hasattr(MissionExecutor, "_instance"):
MissionExecutor._instance.stop()
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
MissionExecutorV3._instance.stop()
gs.state = State.IDLE
return jsonify({"ok": True})
@app.route("/api/mission/pause", methods=["POST"])
def api_mission_pause():
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
MissionExecutorV3._instance.pause()
gs.state = State.PAUSED
return jsonify({"ok": True})
@app.route("/api/mission/resume", methods=["POST"])
def api_mission_resume():
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
MissionExecutorV3._instance.resume()
gs.state = State.RUNNING
return jsonify({"ok": True})
@app.route("/api/mission/report", methods=["GET"])
def api_mission_report():
return jsonify({"report": gs.mission_report})
@app.route("/api/mission/state", methods=["GET"])
def api_mission_state():
return jsonify({"state": gs.state})
"""返回任务状态 + 执行器详情"""
result = {"state": gs.state}
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
ex = MissionExecutorV3._instance
result.update(ex.get_status())
else:
# 空闲时预生成任务列表(基于网格和机器配置)
mc = gs.mission_config
if mc:
result["tasks"] = MissionExecutorV3.pre_generate_tasks(mc)
return jsonify(result)
@app.route("/api/mission/log", methods=["GET"])
def api_mission_log():
"""返回实时日志"""
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
ex = MissionExecutorV3._instance
return jsonify(ex.get_logs())
return jsonify(gs.mission_report or {"log": []})
@app.route("/api/mission/manual-qr", methods=["POST"])
def api_mission_manual_qr():
"""手动输入二维码值"""
data = request.json or {}
qr = data.get("qr", "").strip()
if not qr:
return jsonify({"ok": False, "error": "二维码不能为空"}), 400
if hasattr(MissionExecutorV3, "_instance") and MissionExecutorV3._instance:
MissionExecutorV3._instance.set_manual_qr(qr)
return jsonify({"ok": True})
return jsonify({"ok": False, "error": "没有运行中的任务"}), 400
# ========== 二维码配置 API ==========