从状态快照到控制目标

状态读取。 Scene、Frame、Geometry 与 Control Context 返回带 run、generation、revision 或 tick 的稳定值对象。调用者读取的是某个提交边界上的快照,而不是后端正在修改的可变容器。

控制目标。 control.targets() 公开当前授权的 actor、resource group、axis、command space 和 controller 能力。控制源先发现目标,再按稳定 joint/track 身份构造命令;它不应猜测后端自由度顺序。

Chunk、Operation 与仲裁

控制源提交的是带时间与目标含义的 Chunk。Runtime 验证 generation、资源、单位、时序和权限,并在控制 tick 边界调度到 UniRoboSim。Rule-based、Model、Teleop 或远程 Server 最终使用同一执行器。

Operation。 异步提交返回 Operation。它有独立 ID、状态、结果、取消与释放语义:

  • 调用等待超时不表示 Operation 已取消;
  • cancel 是显式请求,并返回是否被接受;
  • result 给出成功、失败或取消等终态;
  • reset 或 close 会使旧 generation 的操作失效并完成清理。

仲裁。 当多个控制源覆盖同一资源时,Runtime 根据已编译的 authority 与优先级执行准入和抢占。仲裁发生在公共控制边界,而不是由插件彼此调用或直接覆盖最后一帧命令。

规划边界。 规划算法不属于 Core。插件可以捕获一致的 scene/frame/geometry/control-target 数据,在自己的 worker 中计算轨迹,再把物理 Chunk 交给 Runtime。重新校验保证长时间计算后的结果不会落到已变化的世界。

具体方法见Application API 指南与Python SDK。

完整闭环

FastSim 从提交态世界、稳定查询到控制准入、Operation 和 Provider 的闭环
FastSim 从提交态世界、稳定查询到控制准入、Operation 和 Provider 的闭环放大查看

控制源先在同一提交边界读取 Scene/Frame/Geometry 与 control.targets(),随后在 Core 外计算命令。提交 Chunk 时,Runtime 检查 generation、目标、关节/轨道身份、逐轴单位、时间序列、容量和 authority;通过后才创建 Operation 并在控制 tick 调度给 Provider。

Target discovery。 同一机器人在不同组件版本或 Provider 上可能具有不同 group、command space 与控制器能力。Targets 是当前 Plan 与运行状态的交集,调用方不能只凭 README 假设 arm 或某个关节一定存在。

Target 中的有序 axis 和 unit 也是命令解释依据。不要把 Provider 原生 DOF 数组直接当作跨后端顺序;应按稳定 joint/track ID 构造命令,并让适配层完成映射。

Chunk 表达什么。 Chunk 是一段有时间含义的物理控制数据,不是任意 Python callback。它明确 actor/resource group、command space、采样间隔或时间戳、目标序列以及当前 generation。长轨迹可按有界片段提交,以便背压、取消和抢占。

提交成功只表示 Runtime 接受了工作,不表示物理目标已经达成。执行成功与任务语义成功是两个层级:Operation 可以完成,而 Mission 的后置条件仍失败;上层插件应分别记录。

Operation 的所有权。 调用方保留 Operation,读取状态或等待 result,在需要时请求 cancel,并最终 release。等待超时仅结束本次等待;只有 cancel 被接受且 Operation 进入相应终态,才能认为动作不再继续。

Reset、stop 和 close 会使旧 generation 的 Operation 收敛。客户端不应在断线后假设远端操作自动消失,Server 客户端也应通过 operation ID 重新查询事实。

长时间计算与安全停机

规划器应原子捕获需要的 scene/frame/geometry/target 数据和 revision,在 worker 中计算,再在提交前检查 generation 与相关 revision。若世界已变化,策略可以重算、重新验证或拒绝;不能把过期轨迹悄悄发送。

Kinematics 服务只求解,不执行。求解成功后仍由调用方决定是否转换为控制 Chunk;这保持“数学可行”与“当前 authority 允许执行”的边界。

背压与安全停机。 控制队列、在途 Operation 和孤儿工作都有容量边界。来源过快时应收到明确容量或时序错误,而不是无限堆积。Stop 先阻止新提交,再让已接收工作完成、取消或失败;Provider 关闭发生在控制服务不再可能写入之后。

排障时按顺序检查 targets、generation/revision、单位与轴顺序、authority/precedence、Operation 终态和 Provider 映射。画面没有运动并不自动意味着控制未提交,画面运动也不证明任务后置条件成功。