任务执行
This commit is contained in:
+61
-24
@@ -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 ==========
|
||||
|
||||
Reference in New Issue
Block a user