news 2026/8/26 23:20:59

机器人重写“胜利时退出”:任务成功判定与状态机设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
机器人重写“胜利时退出”:任务成功判定与状态机设计

机器人控制程序里总有一个“什么时候结束”的问题。任务完成、夹爪到位、焊接轨迹走完、路径规划收敛,这些都是正常的结束条件。但在很多实际项目里,程序并不是按正常路径结束的:传感器抖动导致误判、通信超时导致状态丢失、上位机重复下发同一个任务、仿真环境里训练的回合始终停不下来。这些问题本质上是同一个工程技术点——机器人如何定义“胜利时退出”,以及这段退出逻辑能不能被安全地改写。

这次我们从“机器人改写‘胜利时退出’的定义”这个标题出发,把这个问题拆开讲清楚。这里的“胜利”对应机器人任务的成功判定,“退出”对应程序循环、状态机或运动脚本的终止条件。全文会围绕工业机器人和 ROS2 两条技术路线展开,覆盖概念、适用场景、状态机设计、PLC/机械臂代码示例、测试验证、接口与日志、性能观察和常见坑位。

1. 核心概念:什么是“胜利时退出”

“胜利时退出”不是某个机器人框架里的标准 API,也不是某本教科书严格定义的名词,它是一种工程模式的形象说法:机器人的任务循环只在“明确成功”的状态下退出,其他情况一律不退出、不静默结束、不重置状态。

很多刚接触机器人控制的人会把“程序跑完”当成“任务成功”。但从工程角度看,两者差别很大:

退出方式触发条件可能的结果
自然结束主程序指令全部执行完毕任务可能成功,也可能只是“没有报错”
条件退出某个传感器或逻辑变量满足条件需要确认条件本身是否可靠
胜利时退出任务被明确判定为成功状态、日志、反馈全部完整闭环
异常退出报警、超时、断连、急停状态机必须进入恢复流程

在工业机器人里,这个问题通常表现为“程序段该不该继续往下走”。在 ROS2 中,则表现为“节点生命周期如何从 active 切到 finalized”。在仿真训练场景下,它表现为“强化学习回合的 done 标志何时为 True”。

重新定义“胜利时退出”,本质上是在回答三层问题:

  1. 什么状态算真正的胜利?
  2. 胜利后系统应该做什么,不是做什么?
  3. 非胜利状态如何阻塞退出,避免误判?

2. 为什么要重写“胜利时退出”的定义

默认的退出定义往往太粗糙。常见默认策略是:执行到程序最后一行就退出,或者某个 DO 信号置位就退出。这种策略在简单演示里没问题,但放到真实产线和多机协作场景,问题很快暴露。

2.1 默认退出定义存在的问题

先看几个典型反例。

反例一:传感器瞬时误判。光电传感器检测工件到位,程序读到信号后立刻判定“任务完成”并退出,但传感器是被飞屑干扰触发的。此时机器人退出流程,工件实际没到位,后续设备空等。

反例二:通信超时导致任务状态丢失。机器人等待上位机下发“成功”指令,上位机网络抖动,机器人等不到信号直接超时退出。任务没有失败,但状态从等待变成了异常结束。

反例三:仿真回合不收敛。机器人路径规划在仿真环境里已经跑到目标附近,但因为距离阈值设置太严,回合始终不输出 done=True,训练进程卡住。

反例四:多机协作中的连锁误判。第一台机器人成功退出后,第二台机器人立刻启动,但第一台机器人实际还在回零位,碰撞风险极高。

这些问题都指向同一个结论:退出条件必须被“重写”,不能直接沿用系统默认的“走到末尾就退出”或“信号置位就退出”。

2.2 重写后的定义应该包含什么

重写“胜利时退出”的定义,不只是改一个判断条件,而是建立一套完整的成功判定协议:

  1. 条件聚合:把多个传感器、状态位、通信结果组合成“胜利条件”,避免单点误判。
  2. 超时语义:等待胜利条件时必须有超时上限,超时后走失败恢复而不是静默退出。
  3. 状态闭环:退出前必须把结果告知上位机、写入日志、复位必要信号。
  4. 可重入性:退出后任务可以再次启动,不残留旧状态。
  5. 人工确认通道:高风险场景必须保留人工确认机制。

这套协议才是“胜利时退出”的完整定义。本文后续的代码示例都围绕这五点展开。

3. 环境准备与前置条件

这里给出两套最常遇到的环境:工业机器人控制器侧和 ROS2 软件栈侧。具体品牌和版本可能不同,但检查思路通用。

3.1 工业机器人控制器侧

如果你用的是 ABB、KUKA、FANUC、埃夫特、法奥这类工业机械臂,需要确认以下前置条件:

检查项说明
控制器固件版本不同固件对 Bool/IO 信号刷新周期有差异
可用的数字量 IO用于接收传感器、光电、PLC 的胜利条件信号
PLC 通信协议Profinet、EtherCAT、EtherNet/IP 或 Modbus TCP
程序上传通道是否需要通过示教器或离线编程软件上传
安全 PLC 通道急停、门锁、干涉区信号必须独立于业务逻辑

注意:业务逻辑里的“胜利条件”信号和“安全信号”必须分开。胜利条件负责决定任务是否成功退出,安全信号负责决定机器人是否立即停止。两者不能混在一个判断里。

3.2 ROS2 软件侧

如果你在 ROS2 环境里做机器人导航、机械臂控制或仿真验证,建议按下面清单准备:

Ubuntu 22.04 / 20.04 ROS2 Humble 或更新版本 Python 3.8+ 机器人仿真平台(Gazebo 或 Webots) tf2 / nav2 相关依赖

不一定要有真实机器人,先用仿真平台把“胜利时退出”的状态机跑通,再迁移到真机更稳妥。

3.3 通用检查清单

无论走哪条路线,先做这些检查:

  1. 传感器或信号源能否稳定输出“成功”标志位。
  2. 控制器的循环扫描周期是多少,信号变化能否在 1-2 个周期内被读到。
  3. 是否有日志写入接口,方便定位退出逻辑的执行路径。
  4. 是否有看门狗或超时保护机制。
  5. 端口和通信链路是否会被防火墙或路由器阻断。

如果环境里存在多个机器人,建议先在一台设备上验证整套退出逻辑,再同步到其他设备。

4. 总体框架设计:从“退出”到“状态机”

把“胜利时退出”真正落地,推荐使用状态机而不是散落的 if 判断。原因是状态机让“什么状态下允许退出”变得可观测、可追溯。

4.1 基础状态划分

IDLE -> RUNNING -> SUCCEEDED -> EXIT -> FAILED -> RETRY / IDLE -> TIMEOUT -> FAILED

这里的关键在于:从 RUNNING 到 SUCCEEDED 的迁移条件,就是“胜利条件”。只有进入 SUCCEEDED 状态,才允许退出当前任务循环。

4.2 状态迁移表

当前状态事件下一状态动作
IDLEstart 指令RUNNING复位内部变量
RUNNING胜利条件满足SUCCEEDED记录成功标志,上传结果
RUNNING超时TIMEOUT记录超时原因,进入失败处理
RUNNING安全信号触发FAILED急停逻辑由安全 PLC 接管
SUCCEEDEDexit 指令EXIT退出任务循环
FAILEDretry 指令RUNNING计数器加一,重新执行

这个表本身就是“胜利时退出定义”的具象化表达。后面写代码时,只需要把这张表翻译成目标平台的语法。

4.3 胜利条件的组合策略

重写定义时,最需要下功夫的地方是“胜利条件”。

策略说明
单条件只判断一个信号或变量,简单但风险高
多条件与多个信号同时成立才算胜利
多条件或任一信号成立即算胜利,适合冗余冗余检测
条件+延时信号持续稳定 N 毫秒后才算有效
条件+计数连续 N 次采样都满足才算有效

对于传感器抖动明显的场景,推荐“条件+延时”或“条件+计数”。下面代码会重点演示这两种。

5. 工业机器人实现示例:RAPID 与结构化文本

工业机器人控制器的编程语言通常是厂商私有语法,但核心逻辑类似。这里给出两个层次的示例,实际使用时按控制器型号调整。

5.1 ABB RAPID 风格的“胜利条件 + 延时确认”

下面的思路适用于 ABB 机器人 RAPID 程序:收到任务开始信号后,等待光电传感器和夹爪到位信号同时满足,并持续 200ms,才判定为“胜利”,随后退出当前任务段。

MODULE WinExitDef ! 数字量输入 VAR signaldi di_workpiece_arrived; VAR signaldi di_gripper_closed; ! 数字量输出 VAR signaldo do_task_succeeded; VAR signaldo do_task_failed; VAR num n_confirm_count := 0; VAR num n_required_count := 10; VAR clock timer_clock; VAR bool b_win := FALSE; PROC MainTask() WHILE TRUE DO IF di_workpiece_arrived = 1 THEN WaitTime 0.02; ! 等待一个扫描周期 IF di_gripper_closed = 1 THEN n_confirm_count := n_confirm_count + 1; ELSE n_confirm_count := 0; ENDIF ELSE n_confirm_count := 0; ENDIF IF n_confirm_count >= n_required_count THEN b_win := TRUE; ENDIF IF b_win THEN SetDO do_task_succeeded, 1; ! 进入成功退出流程 ExitCycle; ENDIF ! 超时保护 IF ClkRead(timer_clock) > 30 THEN SetDO do_task_failed, 1; Stop; ENDIF ENDWHILE ENDPROC ENDMODULE

这里的关键不是 RAPID 语法本身,而是 n_confirm_count 计数器的用法:连续 10 次扫描周期都满足条件才置位胜利标志,能有效滤掉传感器毛刺。

5.2 结构化文本 ST 风格的 PLC 实现

如果你把“胜利时退出”放到 PLC 里做,例如配合 ABB/KUKA/FANUC 机器人使用,结构化文本的更贴近实际:

PROGRAM WinExitDefinition VAR bSensorIn : BOOL; bGripperOk : BOOL; bWin : BOOL; nCounter : INT := 0; nRequired : INT := 10; bTimeout : BOOL; tStart : TON; END_VAR // 胜利条件确认 IF bSensorIn AND bGripperOk THEN nCounter := nCounter + 1; ELSE nCounter := 0; END_IF IF nCounter >= nRequired THEN bWin := TRUE; END_IF // 超时保护 IF NOT bWin THEN tStart(IN := TRUE, PT := T#30S); IF tStart.Q THEN bTimeout := TRUE; END_IF END_IF // 胜利时退出到下一个任务段 IF bWin THEN bSensorIn := FALSE; bGripperOk := FALSE; nCounter := 0; // 通知机器人控制器可以退出当前任务 // 例如置位一个输出给机器人 DI END_IF

采集现场反馈时,重点看这几个点:

  1. 是否连续满足 N 个扫描周期才判定成功。
  2. 超时之后是否进入失败分支,而不是直接结束。
  3. 退出前是否复位了传感器标志和计数器。

6. ROS2 场景:Python 状态机实现“胜利时退出”

工业机器人之外,ROS2 场景同样需要重写“胜利时退出”的定义。以机器人导航为例,导航到目标点并停稳,才算“胜利”,此时节点才能退出目标任务。

这里用 Python 写一个基于类状态机的示例,不依赖特定 ROS2 节点库,方便直接迁移到自己的节点里。

import time import threading from enum import Enum class TaskState(Enum): IDLE = "idle" RUNNING = "running" SUCCEEDED = "succeeded" FAILED = "failed" TIMEOUT = "timeout" EXITED = "exited" class WinExitTask: def __init__(self, timeout_seconds=30.0, confirm_count=5, sample_interval=0.02): self.state = TaskState.IDLE self.timeout_seconds = timeout_seconds self.confirm_count = confirm_count self.sample_interval = sample_interval self._confirm_hits = 0 self._start_time = None self._lock = threading.Lock() def start(self): with self._lock: self.state = TaskState.RUNNING self._confirm_hits = 0 self._start_time = time.time() def update(self, sensor_ok: bool, gripper_ok: bool): if self.state != TaskState.RUNNING: return elapsed = time.time() - self._start_time if elapsed > self.timeout_seconds: with self._lock: self.state = TaskState.TIMEOUT return if sensor_ok and gripper_ok: self._confirm_hits += 1 else: self._confirm_hits = 0 if self._confirm_hits >= self.confirm_count: with self._lock: self.state = TaskState.SUCCEEDED def exit_task(self): with self._lock: if self.state == TaskState.SUCCEEDED: self.state = TaskState.EXITED return True return False @property def is_win(self) -> bool: return self.state == TaskState.SUCCEEDED or self.state == TaskState.EXITED

调用方式:

task = WinExitTask(timeout_seconds=30, confirm_count=10) task.start() while task.state == TaskState.RUNNING: # 从传感器或机器人话题读取状态 sensor_ok = read_sensor_topic() gripper_ok = read_gripper_topic() task.update(sensor_ok, gripper_ok) time.sleep(task.sample_interval) if task.is_win: task.exit_task() print("task win and exit") else: print(f"task failed, state={task.state}")

在 ROS2 节点里使用时,可以把 read_sensor_topic() 替换成订阅 SensorMsg 的回调,把 read_gripper_topic() 替换成订阅 GripperState 的回调。这样“胜利”的判断就从“话题收到一帧数据”变成了“连续 N 帧数据都满足条件”,误触发概率明显下降。

如果做机器人导航,也可以把传感器条件替换成:

def navigation_win_condition(pose, goal, distance_threshold=0.05): dx = pose.position.x - goal.position.x dy = pose.position.y - goal.position.y return (dx * dx + dy * dy) < (distance_threshold * distance_threshold)

注意,导航场景除了位置离目标足够近,还要判断速度是否接近零,否则机器人可能在目标点附近来回震荡,却被判定为“胜利”。

7. 功能测试与效果验证

重写退出定义后,不要直接上产线。先按下面的用例逐项验证。

7.1 测试用例设计

用例编号测试目的输入条件预期输出
TC01正常胜利退出传感器持续满足条件状态进入 SUCCEEDED,任务退出
TC02传感器毛刺条件瞬时满足后立即消失状态不变化,不退出
TC03超时保护条件一直不满足状态进入 TIMEOUT,触发失败流程
TC04多机连锁第一个任务胜出后第二个任务启动第二个任务能正常启动,无残留状态
TC05重入性任务退出后再次启动计数器清零,状态从 IDLE 开始

7.2 验证步骤

以 ROS2 导航为例:

  1. 启动仿真环境,加载地图和机器人模型。
  2. 配置一个目标点。
  3. 启动导航节点,机器人开始运动。
  4. 观察状态机日志:
    • RUNNING 状态
    • 到达目标后的 SUCCEEDED 状态
    • exit 之后进程退出
  5. 人为让机器人偏离目标,验证超时机制是否触发。

判断标准很简单:胜利标志只在条件连续满足 N 次后置位,其他情况一律保持 RUNNING 或进入 TIMEOUT。

7.3 如何主动制造异常

测试阶段要主动制造故障:

  • 用手遮挡传感器,再移开。
  • 关闭上位机通信端口。
  • 在目标点附近来回拖动机器人。
  • 直接把超时时间调成 2 秒,验证超时分支。
  • 在第一个任务退出后立刻下发第二个任务。

通过制造异常能判断退出定义是否真的把“非胜利状态”挡住了。

8. 接口与日志远程监控

重写退出定义之后,必须有接口和日志支撑,否则出问题很难定位。

8.1 状态查询接口

如果通过 HTTP 接口暴露任务状态,推荐返回 JSON:

{ "task_id": "task_001", "state": "SUCCEEDED", "win_condition_hits": 10, "required_hits": 10, "elapsed_seconds": 12.5, "last_error": "" }

Python 侧可以这样实现:

from flask import Flask, jsonify app = Flask(__name__) @app.route("/api/task/state", methods=["GET"]) def get_task_state(): return jsonify({ "state": task.state.value, "win_condition_hits": task._confirm_hits, "required_hits": task.confirm_count, "elapsed_seconds": round(time.time() - task._start_time, 2) })

8.2 日志写入

每次状态变化都要写入日志,推荐格式:

2025-05-20 10:00:00.123 [RUNNING] task_001 start 2025-05-20 10:00:05.456 [RUNNING] sensor_ok=1, gripper_ok=1, hits=3/10 2025-05-20 10:00:06.789 [RUNNING] sensor_ok=0, hits=0, reset counter 2025-05-20 10:00:12.000 [SUCCEEDED] win condition reached, hits=10/10 2025-05-20 10:00:12.100 [EXITED] task_001 exited

通过日志能判断退出定义的整个生命周期,遇到问题直接看日志回溯。

8.3 机器人控制器侧的信号监视

工业机器人控制器上,建议把胜利条件相关的 IO 信号映射到可视化面板,方便现场人员确认。如果是 ABB 机器人,可以在示教器上增加一个状态页面,显示:

  • 胜利条件计数
  • 超时剩余时间
  • 当前状态
  • 最近一次失败原因

9. 资源占用与性能观察

9.1 机器人控制器的扫描周期影响

工业机器人控制器和 PLC 的扫描周期通常在 4ms 到 20ms 之间。如果在“胜利时退出”判定里加入连续计数,实际判定延迟是:

判定延迟 = 扫描周期 × 连续满足次数

例如扫描周期 20ms,连续满足 10 次,判定延迟约 200ms。这在大多数场景下可以接受,但如果是高速运动场景,200ms 可能已经让机器人多走了一段距离。此时需要减小连续次数或直接用硬接线信号做判定。

9.2 ROS2 节点的 CPU 占用

在 ROS2 节点里加入状态机后,如果只做变量比较和计数器累加,CPU 占用增加非常小。但如果订阅了高频话题(例如激光雷达话题 10Hz 以上),并且每次回调都做条件判断,CPU 占用会明显上升。建议:

高频话题:只更新变量,不做复杂判断 独立线程:以 20-50Hz 的频率做胜利条件判定

这样能避免回调函数阻塞,也不会让状态机判断拖慢整个节点。

9.3 显存和内存占用

这个主题本身不涉及模型推理,显存占用不是主要指标。但如果你在仿真环境里跑视觉引导机器人,要注意:

  • 视觉模型推理时的显存占用可能达到数 GB。
  • 状态机判定逻辑本身只占用极少内存。
  • 如果同时运行多个仿真实例,内存占用按实例数量线性增长。

10. 常见问题与排查方法

问题现象可能原因排查方式解决方案
胜利条件总是无法满足传感器信号抖动,或信号源根本没置位查看原始信号波形/日志加入延时确认,检查传感器安装
任务误退出撤销条件判断,单次信号触发即判定成功查看状态机日志,确认命中次数改为连续计数,调高 required_count
超时后程序不退出超时分支没有实现退出动作检查状态机迁移表TIMEOUT 状态必须明确映射到失败处理
第二个任务启动后状态残留退出前没有复位计数器查看任务启动时的日志在 start() 中清零所有内部变量
机器人已到位但导航一直不退出位置阈值过严,或速度不为零打印当前位置和目标位置加入速度判断和更宽松的阈值
通信断开后任务卡死没有通信超时逻辑检查通信库的超时参数增加链路心跳和超时计数
日志看不到退出原因状态变化没有记录检查日志写入逻辑在每次状态迁移时强制写日志

排查时有个通用技巧:先看状态迁移日志,再对照状态迁移表。如果日志显示状态卡在 RUNNING,重点看胜利条件是否满足;如果日志显示已经进入 SUCCEEDED 但没有退出,重点看 exit_task 的调用条件。

11. 最佳实践与使用建议

11.1 代码层面的建议

  1. 退出逻辑收敛到状态机里,不要散落在各个回调函数。
  2. 胜利条件延迟确认:默认连续 5-10 次扫描周期满足才算成功。
  3. 超时必须有:无论任务多简单,都要设超时,否则故障时程序会永远卡住。
  4. 退出前复位所有状态:计数器、传感器标志、通信标志都必须复位。
  5. 日志完整:记录状态、命中次数、耗时、错误原因。

11.2 工程层面的建议

  1. 先仿真后真机:在仿真平台跑通状态机,再映射到真实机器人。
  2. 保留人工确认通道:高风险任务必须允许人工干预,不能完全依赖自动判定。
  3. 生产环境加看门狗:PLC 或控制器侧增加独立看门狗,防止程序跑飞。
  4. 视觉和传感器授权合规:如果“胜利条件”依赖视觉识别、人脸检测或声音识别,必须确认使用对象的授权与隐私合规。工业现场涉及人员识别时,要提前公示并取得授权。
  5. 多机协同要加互锁:第一个任务的“胜利退出”不能直接作为第二个任务的启动信号,最好通过 PLC 或调度系统统一管理。

11.3 最容易踩的坑

按实际工程经验排个优先级:

  1. 退出但不复位,导致第二次任务直接进入 SUCCEEDED。
  2. 传感器信号抖动导致误胜利。
  3. 超时后直接退出,没有失败恢复流程。
  4. 状态机没有覆盖通信断开场景。
  5. 只在真机上测试,没有在仿真里验证边界情况。

12. 总结

“机器人改写‘胜利时退出’的定义”这个题目,看起来像是在咬文嚼字,实际工程价值很大。只要机器人在执行任务,就一定会有“什么时候算成功,成功之后怎么退出”的问题。把这个问题从简单的 if 判断升级为完整的状态机判定,加上连续计数确认、超时保护、状态复位置位和日志记录,就能显著减少误触发和任务卡死。

建议读者先在自己的环境里做最小验证:把连续计数和超时保护加进去,跑几个异常用例,观察状态迁移日志。这一步能跑通,再推广到真实产线或复杂导航任务里。

整个方案不限制具体品牌:ABB、KUKA、FANUC、埃夫特、法奥、ROS2 导航、gazebo 仿真,都可以套用同一套状态机设计。关键不在于用哪家控制器,而在于定义清楚“什么才算胜利”,以及在“胜利”之前,系统有没有能力挡住所有非胜利状态。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/26 23:20:21

爬虫工程师的生存法则:从技术验证到合规运营的实战指南

1. 一个爬虫工程师的“潜规则”自白干了这么多年爬虫&#xff0c;从写第一行requests.get()到现在&#xff0c;我经手过的项目少说也有上百个。从公开的新闻聚合&#xff0c;到需要登录的电商比价&#xff0c;再到一些数据服务商的API逆向&#xff0c;可以说&#xff0c;爬虫这…

作者头像 李华
网站建设 2026/8/26 23:15:49

从零构建个人高效工作流:核心思路、工具链与自动化实践

1. 项目概述&#xff1a;为什么你需要一个属于自己的工作流&#xff1f; 如果你经常感觉一天忙忙碌碌&#xff0c;但到了晚上复盘时&#xff0c;却想不起来具体完成了什么&#xff1b;或者面对一个复杂项目时&#xff0c;不知从何下手&#xff0c;总在重复沟通和返工&#xff1…

作者头像 李华
网站建设 2026/8/26 23:15:46

Maya零基础入门:从搭建卡通治愈小屋学会完整建模流程

在实际 Maya 学习过程中&#xff0c;很多零基础用户最容易犯的错误不是工具记不住&#xff0c;而是打开软件后不知道该从哪里下手。卡通治愈小屋这个场景非常合适作为入门案例&#xff1a;它的形体大多是长方体、圆柱、圆锥和球体&#xff0c;不需要复杂雕刻&#xff0c;却能覆…

作者头像 李华
网站建设 2026/8/26 23:11:14

macOS启动台图标网格自定义:终端命令调整行列布局

1. 启动台图标排列&#xff1a;一个被忽视的桌面效率细节 如果你和我一样&#xff0c;是个对Mac桌面效率有“强迫症”的用户&#xff0c;那你一定也琢磨过启动台&#xff08;Launchpad&#xff09;里图标的排列问题。默认情况下&#xff0c;启动台会根据你安装的应用数量&#…

作者头像 李华
网站建设 2026/8/26 23:11:12

AI Agent协调工程与过程可观测:从概念到实战的工程化指南

1. 项目概述&#xff1a;从“玩具”到“工程”的Agent进化论如果你最近在关注AI领域&#xff0c;尤其是Agent&#xff08;智能体&#xff09;相关的动态&#xff0c;可能会感觉有点“信息过载”。各种新框架、新工具、新概念层出不穷&#xff0c;从Hermes Agent到DeepSeek Agen…

作者头像 李华
网站建设 2026/8/26 23:08:04

挖掘机检测数据集构建实战:4327张COCO标注与91%识别率

简介&#xff1a;目标检测作为计算机视觉的核心任务&#xff0c;在工程机械自动化监管中扮演着关键角色。高质量的数据集是训练可靠检测模型的基础&#xff0c;而COCO格式凭借其丰富的元信息和广泛的框架兼容性&#xff0c;成为主流选择。然而&#xff0c;通用数据集在挖掘机这…

作者头像 李华