<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E8%BD%A6%E4%BD%93%E6%8A%BD%E8%B1%A1%E5%8E%9F%E7%90%86</id>
	<title>车体抽象原理 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E8%BD%A6%E4%BD%93%E6%8A%BD%E8%B1%A1%E5%8E%9F%E7%90%86"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E8%BD%A6%E4%BD%93%E6%8A%BD%E8%B1%A1%E5%8E%9F%E7%90%86&amp;action=history"/>
	<updated>2026-05-16T15:07:31Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E8%BD%A6%E4%BD%93%E6%8A%BD%E8%B1%A1%E5%8E%9F%E7%90%86&amp;diff=1013&amp;oldid=prev</id>
		<title>Artheru：​Initial bilingual draft (auto-published)</title>
		<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E8%BD%A6%E4%BD%93%E6%8A%BD%E8%B1%A1%E5%8E%9F%E7%90%86&amp;diff=1013&amp;oldid=prev"/>
		<updated>2026-05-16T11:26:59Z</updated>

		<summary type="html">&lt;p&gt;Initial bilingual draft (auto-published)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;languages/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 概述 / Overview ==&lt;br /&gt;
MDCS 把&amp;quot;一台 AGV&amp;quot;抽象为三个层次的协作：'''Medulla'''（硬件层 / IO 平台），'''Clumsy'''（车体行为层 / 自动驾驶），'''Simple'''（车队层 / 调度与交管）。每层各自定义&amp;quot;车&amp;quot;的一个侧面，通过明确的数据契约串联。理解这套分层是开发 MDCS 插件、写适配代码与调试问题的前提。&lt;br /&gt;
&lt;br /&gt;
MDCS abstracts &amp;quot;an AGV&amp;quot; through three cooperating layers: '''Medulla''' (hardware / IO), '''Clumsy''' (vehicle behaviour / autopilot), '''Simple''' (fleet / scheduling). Each layer defines one facet of the vehicle and they connect through well-defined data contracts. Understanding this stack is foundational for any plugin / adaptation work.&lt;br /&gt;
&lt;br /&gt;
== 三层结构 / Three-layer view ==&lt;br /&gt;
&lt;br /&gt;
  ┌─────────────────────────────────────────────────────────────┐&lt;br /&gt;
  │  Simple  (Fleet plane)                                      │&lt;br /&gt;
  │  • SimpleComposer.RCS.Car / ClumsyCar / 自评估车 subclass    │&lt;br /&gt;
  │  • SimpleCore — DPS 交管 / 寻路 / 包络 / 可达性                │&lt;br /&gt;
  │  • TopazScript 任务脚本                                       │&lt;br /&gt;
  └────────────────┬────────────────────────────────────────────┘&lt;br /&gt;
                   │ 任务 / TopazScript / mission script&lt;br /&gt;
                   │ 上报 / Status (x,y,th,siteId,batt,...)&lt;br /&gt;
  ┌────────────────▼────────────────────────────────────────────┐&lt;br /&gt;
  │  Clumsy  (Vehicle behaviour plane)                          │&lt;br /&gt;
  │  • SimpleAgvInterface.Queue(...)                            │&lt;br /&gt;
  │  • MovementDefinition: SteeringLineFollowing,               │&lt;br /&gt;
  │    AutoFetchGood, AutoShelfFetching, ...                    │&lt;br /&gt;
  │  • DriveTask.WaitDriveTask(IEnumerable&amp;lt;bool&amp;gt;)                │&lt;br /&gt;
  │  • PilotDefinition&amp;lt;T&amp;gt; 自动驾驶宿主                            │&lt;br /&gt;
  └────────────────┬────────────────────────────────────────────┘&lt;br /&gt;
                   │ UpperIO 意图（vCmd, steerCmd, forkTgt, ...）&lt;br /&gt;
                   │ LowerIO 反馈（vEst, sensors, e-stop, ...）&lt;br /&gt;
  ┌────────────────▼────────────────────────────────────────────┐&lt;br /&gt;
  │  Medulla  (Hardware plane)                                  │&lt;br /&gt;
  │  • CartDefinition + [AsUpperIO]/[AsLowerIO]/[AsInitParam]    │&lt;br /&gt;
  │  • LadderLogic 周期性控制循环 (~50 ms)                        │&lt;br /&gt;
  │  • IOObject 体系（Lidar, Camera, Cart 都是）                  │&lt;br /&gt;
  │  • DObject 跨进程共享内存                                     │&lt;br /&gt;
  └─────────────────────────────────────────────────────────────┘&lt;br /&gt;
&lt;br /&gt;
== 各层的责任 / Layer responsibilities ==&lt;br /&gt;
=== Medulla — 硬件层 / Hardware plane ===&lt;br /&gt;
- 抽象具体硬件（CAN / Modbus / S7 / RS485 / USB）成 ''IO 字段''。&lt;br /&gt;
- 同步把上位指令写到硬件，把硬件状态读到字段。&lt;br /&gt;
- 不做&amp;quot;决策&amp;quot;，不知道&amp;quot;任务&amp;quot;。&lt;br /&gt;
- 关键文件：`D:\src\M2\OfficialPlugins\CartActivator\CartDefinition.cs`、`Attrs.cs`。&lt;br /&gt;
- 关键属性：`[AsUpperIO]`（命令向下流）、`[AsLowerIO]`（状态向上流）、`[AsInitParam]`（启动配置）、`[UseLadderLogic]`（周期循环）。&lt;br /&gt;
&lt;br /&gt;
- Abstracts hardware (CAN / Modbus / S7 / RS485 / USB) into ''IO fields''.&lt;br /&gt;
- Writes commands down, reads state up, on a fixed tick.&lt;br /&gt;
- Makes no &amp;quot;decisions&amp;quot; and is unaware of tasks.&lt;br /&gt;
- Source: `D:\src\M2\OfficialPlugins\CartActivator\CartDefinition.cs` / `Attrs.cs`.&lt;br /&gt;
&lt;br /&gt;
=== Clumsy — 车体行为层 / Vehicle behaviour plane ===&lt;br /&gt;
- 把&amp;quot;动作&amp;quot;（直行、原地转、自动取货、绕障）封装为 `MovementDefinition` 子类。&lt;br /&gt;
- 把 Movement 组合成&amp;quot;业务动作&amp;quot;如 `Fetch / Put / ExitSite`，挂在 `SimpleAgvInterface` 上。&lt;br /&gt;
- 不知道车队全局，只看到本车的位置、速度、IO。&lt;br /&gt;
- 任务通过 `SimpleAgvInterface.Queue(...)` 流水线执行。&lt;br /&gt;
- 关键文件：`D:\src\Clumsy\ClumsyCore\Pilot\MovementDefinition.cs:41`、`D:\src\Clumsy\ClumsyCore\Pilot\PilotDefinition.cs:91-122`、`D:\src\Clumsy\ClumsyCore\Interfaces\SimpleAgvInterface.cs`。&lt;br /&gt;
&lt;br /&gt;
- Packages a motion primitive as a `MovementDefinition` subclass with `IEnumerable&amp;lt;bool&amp;gt; Get()` ticked at `DriveTaskInterval` ms.&lt;br /&gt;
- Composes business actions (`Fetch / Put / ExitSite`) on top of `SimpleAgvInterface`.&lt;br /&gt;
- Sees only this vehicle's state.&lt;br /&gt;
&lt;br /&gt;
=== Simple — 车队层 / Fleet plane ===&lt;br /&gt;
- SimpleCore 提供调度内核：[[Special:MyLanguage/DPS调度算法详解|DPS]] 交管、寻路、包络、可达性、[[Special:MyLanguage/流场规划|流场]]。&lt;br /&gt;
- SimpleComposer 提供 UI 壳与车型 / 业务插件接口。&lt;br /&gt;
- 给单车下发的是 TopazScript（高层意图脚本），由 ClumsyCar 转给车载 Clumsy，或由自评估车在本地翻译为 RFID / Modbus。&lt;br /&gt;
- 关键文件：`D:\src\Simple\SimpleComposer\RCS\Car.cs:33` / `ClumsyCar.cs:34`、`D:\src\Simple\SimpleCore\PropType\AbstractCar.cs:346`、`BasicProps\AGVInterface.cs`。&lt;br /&gt;
&lt;br /&gt;
- SimpleCore: scheduling kernel (DPS traffic, pathfinding, envelopes, reachability, flow-field).&lt;br /&gt;
- SimpleComposer: UI shell + plugin host for car types and business scripts.&lt;br /&gt;
- Dispatches TopazScript mission scripts; ClumsyCar HTTP-posts to the on-board Clumsy adapter, while self-evaluating cars run `SelfEvaluating(agv, script)` locally and translate to vendor commands.&lt;br /&gt;
&lt;br /&gt;
== 上下位 IO 数据流 / Upper / Lower IO data flow ==&lt;br /&gt;
=== UpperIO（命令下行）/ Upper IO (commands going down) ===&lt;br /&gt;
'''上位''' = 调度 / Clumsy → 车体。典型上位字段：&lt;br /&gt;
&lt;br /&gt;
* `vCmd`, `steerCmd` — 速度 / 转向&lt;br /&gt;
* `forkHeightTgt`, `forkTiltTgt` — 叉齿&lt;br /&gt;
* `brakeOn`, `hornOn`, `ledColor`&lt;br /&gt;
* `jackTarget` — 顶升机构&lt;br /&gt;
&lt;br /&gt;
=== LowerIO（状态上行）/ Lower IO (status going up) ===&lt;br /&gt;
'''下位''' = 车体 → Clumsy / 调度。典型下位字段：&lt;br /&gt;
&lt;br /&gt;
* `vEst`, `steerEst` — 实测速度 / 转向&lt;br /&gt;
* `forkHeight`, `forkAtTarget`&lt;br /&gt;
* `batteryPercent`, `eStop`, `loadKg`&lt;br /&gt;
* 各类传感器（接近开关、负载、温度等）&lt;br /&gt;
&lt;br /&gt;
=== 为什么要分上下位 / Why split upper vs lower ===&lt;br /&gt;
MDCS 强制 ''命令 / 状态''解耦，使得：&lt;br /&gt;
* Clumsy 可以在上位写完命令后 ''立即向上汇报已下发''，不必等硬件确认；&lt;br /&gt;
* Medulla 的硬件层故障（如 PLC 通讯断）不会污染上层任务状态；&lt;br /&gt;
* 测试时可把整车换成模拟器，只要 IO 字段一致，上层代码无感知。&lt;br /&gt;
&lt;br /&gt;
The split enforces command/state decoupling: Clumsy reports &amp;quot;issued&amp;quot; immediately without waiting for hardware ack; Medulla failures don't poison higher-layer mission state; in simulation a vehicle can be swapped for a simulator as long as the IO fields match — the upper stack is unaware.&lt;br /&gt;
&lt;br /&gt;
== 任务下发完整链路 / Full mission-dispatch path ==&lt;br /&gt;
&lt;br /&gt;
# SimpleComposer 把业务任务 ''编译''为 TopazScript（路径分段 + 可执行动作）。&amp;lt;br /&amp;gt;SimpleComposer compiles a business job into TopazScript (path segments + executable actions).&lt;br /&gt;
# `Car.actualSendScript(script)` 被调度调用。&amp;lt;br /&amp;gt;The scheduler calls `Car.actualSendScript(script)`.&lt;br /&gt;
# '''ClumsyCar 分支''': HTTP POST 到车载 Clumsy；车载 `SelfEvaluating(agv, script)` 解释脚本 → 调 `AGV.Fetch / Put / Go` → `Queue(...)` → `Movement.Get()` → `DriveTask` → Medulla UpperIO。&amp;lt;br /&amp;gt;''ClumsyCar branch'': HTTP-POST to the on-board adapter; on-board `SelfEvaluating` interprets the script, calls AGV methods, queues Movements, drives Medulla IO.&lt;br /&gt;
# '''自评估车分支''': 调度本地运行 `SelfEvaluating(agv, script)`；nested `AGV : AGVInterface` 把 `agv.Go(...)` 翻译为 RFID / Modbus 命令发给车体 PLC。&amp;lt;br /&amp;gt;''Self-eval branch'': scheduler runs `SelfEvaluating` locally; the nested `AGV : AGVInterface` translates calls to vendor commands.&lt;br /&gt;
# 任意时刻车体心跳上报 `(x, y, th, siteId, ...)`；调度据此更新地图、推进任务。&amp;lt;br /&amp;gt;Heartbeat from the vehicle continuously reports pose + state; the scheduler updates and advances.&lt;br /&gt;
&lt;br /&gt;
== 实施建议 / Practical guidance ==&lt;br /&gt;
* '''先 Medulla''': 没硬件，上层一切免谈。先让 IO 表跑通（手动 set `vCmd=200` 看车动）。&lt;br /&gt;
* '''再 Clumsy''': IO 跑通后写 1 个 `SimpleAgvInterface` 子类、跑直线巡线。&lt;br /&gt;
* '''最后 Simple''': Clumsy 单车可控之后接入 SimpleComposer，做调度。&lt;br /&gt;
* '''测试每层''': Medulla 可以独立测；Clumsy 可以用 IO 模拟器（脚本里直接 set / get 字段）；SimpleCore 有单机调度仿真。&lt;br /&gt;
&lt;br /&gt;
* Order: Medulla → Clumsy → Simple. Don't write Simple-side code if Medulla isn't proven yet.&lt;br /&gt;
* Test each layer in isolation: Medulla via manual IO sets, Clumsy with an IO simulator, SimpleCore in standalone simulation.&lt;br /&gt;
&lt;br /&gt;
== 相关页面 / See also ==&lt;br /&gt;
* [[Special:MyLanguage/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]&lt;br /&gt;
* [[Special:MyLanguage/Medulla|Medulla]] / [[Special:MyLanguage/Medulla-API|Medulla-API]]&lt;br /&gt;
* [[Special:MyLanguage/Clumsy-API|Clumsy-API]]&lt;br /&gt;
* [[Special:MyLanguage/Simple-API|Simple-API]]&lt;br /&gt;
* [[Special:MyLanguage/DObject|DObject]]&lt;br /&gt;
* [[Special:MyLanguage/AGV任务运行逻辑|AGV任务运行逻辑]]&lt;br /&gt;
* [[Special:MyLanguage/如何基于SimpleCore核心库进行调度系统开发|如何基于SimpleCore核心库进行调度系统开发]]&lt;br /&gt;
&lt;br /&gt;
[[Category:通识和入门教学]]&lt;br /&gt;
[[Category:开发手册]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>