<?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=%E5%8F%8C%E8%BD%A6%2F%E5%A4%9A%E8%BD%A6%E8%81%94%E5%8A%A8</id>
	<title>双车/多车联动 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E5%8F%8C%E8%BD%A6%2F%E5%A4%9A%E8%BD%A6%E8%81%94%E5%8A%A8"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E5%8F%8C%E8%BD%A6/%E5%A4%9A%E8%BD%A6%E8%81%94%E5%8A%A8&amp;action=history"/>
	<updated>2026-05-16T15:06:29Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E5%8F%8C%E8%BD%A6/%E5%A4%9A%E8%BD%A6%E8%81%94%E5%8A%A8&amp;diff=996&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=%E5%8F%8C%E8%BD%A6/%E5%A4%9A%E8%BD%A6%E8%81%94%E5%8A%A8&amp;diff=996&amp;oldid=prev"/>
		<updated>2026-05-16T11:15:15Z</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;
{{Note|status=design|本页描述的是 MDCS 双车 / 多车联动的设计与目标 API。当前 SimpleCore 中仅实现了 `AbstractCar.haveCoordination` 占位字段，运动控制与车间通讯仍按本页设计待实施。This page documents the design and target API for twin- / multi-car coordination in MDCS. As of writing, only the `AbstractCar.haveCoordination` placeholder field exists in SimpleCore; the motion control and inter-car telemetry described below are still being implemented.}}&lt;br /&gt;
&lt;br /&gt;
== 概述 / Overview ==&lt;br /&gt;
在重载、长货物或异构车队场景下，单台 AGV 无法独立完成搬运。MDCS 双车联动让两台或多台 AGV 在物理上协同抬升或装载同一件货物，同时在调度层把它们视为一个不可分割的执行单元。典型应用包括：&lt;br /&gt;
&lt;br /&gt;
* 重载贮箱 / 长板材搬运（两台 10 T 重载 AGV 头尾对接，浮动载货台承载货物）&lt;br /&gt;
* 大型构件总装线（多台全向 AGV 抬升航空件、风电叶片等）&lt;br /&gt;
* 异构联动（前车叉式取货 + 后车浮动平台跟随）&lt;br /&gt;
* 设备跟随联动（AGV 跟随手推叉车、卷料车等非 AGV 设备）&lt;br /&gt;
&lt;br /&gt;
Two or more AGVs jointly carry a single payload when no single vehicle can. MDCS exposes coordination both as a low-level motion contract (rear-lidar pose tracking + AP heartbeat) and as a scheduling constraint (`haveCoordination` flag → an inseparable execution unit). Typical scenarios are heavy tanks/long sheets carried by paired 10 T omni-AGVs, large assembly components lifted by a swarm of forklifts, heterogeneous master/follower pairs, and AGVs shadowing manually-driven vehicles.&lt;br /&gt;
&lt;br /&gt;
== 系统组成 / System composition ==&lt;br /&gt;
=== 重载双车联动参考方案 / Reference configuration: heavy-load twin-car ===&lt;br /&gt;
'''参数 / Parameters''':&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 项 / Item !! 取值 / Value !! 说明 / Notes&lt;br /&gt;
|-&lt;br /&gt;
| 单车规格 / Per-vehicle spec || 10 T 全向重载 AGV / 10 t omni-directional heavy-load AGV || 差动舵或四舵 / steer-differential or quad-steer&lt;br /&gt;
|-&lt;br /&gt;
| 极限联动距离 / Max inter-car distance || ~20 m || 假设车长 2 m + 货物长 17 m / vehicle length 2 m + cargo length 17 m&lt;br /&gt;
|-&lt;br /&gt;
| 极限带载速度 / Max loaded speed || 0.6 m/s || 全程激光雷达避障开启 / lidar obstacle avoidance always on&lt;br /&gt;
|-&lt;br /&gt;
| 工况坡度 / Slope || ≤ 7° || 浮动载货台吸收俯仰差 / floating platform absorbs pitch&lt;br /&gt;
|-&lt;br /&gt;
| 操作模式 / Operating mode || 操作工遥控前车，后车自动跟随 / Operator drives leader; follower auto-tracks || 半自主，符合搬运安全规范 / semi-autonomous, complies with handling safety codes&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''车尾传感器布局 / Tail sensor layout''':&lt;br /&gt;
两车车尾相对，每台车尾部安装一台水平观测激光雷达 + 一个 V 形特征槽。前车 V 形槽作为后车激光雷达的观测目标，宽高比小于 8（可凹可凸），目的是让 V 槽在 2D 激光点云中形成明显的角点特征，便于姿态解算。&lt;br /&gt;
&lt;br /&gt;
Cars line up tail-to-tail. Each tail carries a 2D lidar plus a V-shaped feature groove (concave or convex, W/H &amp;lt; 8). The leader's groove gives the follower's lidar a strong corner feature for relative-pose estimation.&lt;br /&gt;
&lt;br /&gt;
'''激光雷达选型 / Lidar selection''' （依分辨率 D = L · tan(δ · π/180), L=20 m）：&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 型号 / Model !! 角分辨率 δ !! 20 m 处空间分辨率 D !! 适用 / Suitable&lt;br /&gt;
|-&lt;br /&gt;
| SICK LMS1xx || 0.25° || 87 mm || 满足载货台 ±100 mm 浮动量&lt;br /&gt;
|-&lt;br /&gt;
| SICK LMS5xx || 0.167° || 58 mm || 推荐 / Recommended — 冗余更大 / better margin&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
'''浮动载货台 / Floating cargo platform''':&lt;br /&gt;
为吸收联动误差与坡度，每台车配浮动载货台，浮动能力如下；货物锁定在载货台后由载货台与车体的浮动机构吸收变形：&lt;br /&gt;
&lt;br /&gt;
To absorb coordination error and slope-induced misalignment, each car carries a floating cargo platform with the following compliance. Cargo is locked to the platform; deformation is taken up by the platform-vehicle interface, not transmitted to the cargo.&lt;br /&gt;
&lt;br /&gt;
* X / Y 方向 / X-Y translation: ±100 mm&lt;br /&gt;
* 绕 Z 轴旋转 / yaw: ±5°&lt;br /&gt;
* 绕 Y 轴俯仰 / pitch: ±7°&lt;br /&gt;
&lt;br /&gt;
=== 异构联动 / Heterogeneous coordination ===&lt;br /&gt;
异构联动指两台车型不同（例如叉车 + 顶升车，或 ClumsyCar + 自评估磁导航车）的联动。常见模式：&lt;br /&gt;
&lt;br /&gt;
* '''主从模式 / Master-Slave''': 主车规划完整路径，从车跟随主车位姿（同上）。&lt;br /&gt;
* '''分工模式 / Specialization''': 一台车做取货动作（如叉车叉起一端），另一台做支撑（如顶升车顶住另一端）。两车按动作序列分别下发任务，调度层保证时序。&lt;br /&gt;
&lt;br /&gt;
A heterogeneous pair couples different vehicle types (e.g. a forklift + a lift-AGV, or a ClumsyCar + a magnet-navigated self-evaluating car). Two common patterns: master/slave pose-following, and a specialization split where each car performs a distinct physical role and the scheduler enforces a temporal ordering.&lt;br /&gt;
&lt;br /&gt;
== 联动流程 / Coordination workflow ==&lt;br /&gt;
重载双车联动的典型流程（操作工在环 / operator-in-the-loop）：&lt;br /&gt;
&lt;br /&gt;
# 操作工遥控前车与后车到取货点。两车车尾相对，车间距与货物长度一致，车体中轴线对准。&amp;lt;br /&amp;gt;Operator brings both cars to the pickup point, tail-to-tail, with spacing matching the cargo length and center-lines aligned.&lt;br /&gt;
# 操作工在遥控手柄上启动 &amp;quot;联动 / Couple&amp;quot; 功能。&amp;lt;br /&amp;gt;Operator presses &amp;quot;Couple&amp;quot; on the handheld remote.&lt;br /&gt;
# 后车通过尾部激光雷达观测前车 V 槽，解算相对位姿，自动调整本车姿态，使后车中轴线与前车中轴线重合（车间距保持不变）。&amp;lt;br /&amp;gt;Follower's tail lidar locks onto the leader's V-groove; the follower auto-aligns so its centerline matches the leader's, while preserving the inter-car distance.&lt;br /&gt;
# 双车车灯切换颜色，提示联动已就绪。&amp;lt;br /&amp;gt;Both vehicles' indicator lights change colour to signal &amp;quot;coupled&amp;quot;.&lt;br /&gt;
# 操作工引导吊装工把货物落到双车的浮动载货台上，并把货物锁定在载货台上。&amp;lt;br /&amp;gt;Operator guides the rigging crew to lower the cargo onto the platforms and lock it.&lt;br /&gt;
# 操作工遥控前车（前车此刻作为联动的&amp;quot;领头车&amp;quot;）驶向终点。联动带载极限速度 0.6 m/s，全程激光雷达避障开启。&amp;lt;br /&amp;gt;Operator drives the leader to the destination at ≤ 0.6 m/s; obstacle-avoidance lidars stay active on both vehicles.&lt;br /&gt;
# 到达终点、吊装卸货完成后，操作工在手柄上结束联动。&amp;lt;br /&amp;gt;After unloading at the destination, operator presses &amp;quot;Decouple&amp;quot; on the handheld remote.&lt;br /&gt;
&lt;br /&gt;
== 运动控制原理 / Motion-control principle ==&lt;br /&gt;
浮动载货台允许吸收一定的横向、纵向与俯仰误差，且 AGV 本身相对货物较小，因此采用 '''后车观测前车 + 车间无刚性约束跟随''' 的策略，而不是用机械结构强制约束。&lt;br /&gt;
&lt;br /&gt;
The floating platform absorbs a bounded coordination error, and each AGV is small relative to the cargo. We therefore use '''follower-tracks-leader without a rigid mechanical link''', rather than a physical drawbar / chain. The follower closes a feedback loop on:&lt;br /&gt;
&lt;br /&gt;
* 测量量 / Measured: 前车 V 槽在后车激光坐标系下的 (距离, 横偏, 夹角) / leader-groove pose in follower-lidar frame: (range, lateral offset, heading)&lt;br /&gt;
* 期望量 / Target: 距离 = 联动启动时锁定的固定值；横偏 = 0；夹角 = 0 / range = locked initial value; lateral offset = 0; heading = 0&lt;br /&gt;
* 控制量 / Output: 后车差动舵或四舵的速度 + 转向角 / follower's steer-differential or quad-steer command&lt;br /&gt;
&lt;br /&gt;
车间心跳与控制信号通过车载 AP（Wi-Fi）传输：每台车广播自己的 `(execTick, x, y, th, batteryOK, eStopOK)`，并订阅伙伴车的同一通道。任一通道断流超过阈值（默认 200 ms）即触发联动解体保护。&lt;br /&gt;
&lt;br /&gt;
Inter-car heartbeat and command signals are exchanged via on-board Wi-Fi APs. Each vehicle broadcasts its own `(execTick, x, y, th, batteryOK, eStopOK)` and subscribes to its partner's identical channel. A 200 ms gap on either side triggers a coordinated graceful stop.&lt;br /&gt;
&lt;br /&gt;
'''角加速度约束 / Angular-acceleration bound''': 底盘的差动舵切换有响应滞后，为避免因突变指令导致路径偏移、进而把误差打到货物上，应在底盘运控层设置最大角加速度（建议 ≤ 0.25 rad/s²）。&lt;br /&gt;
&lt;br /&gt;
The follower's differential steer wheel has a finite response time. A bounded angular-acceleration set-point (≤ 0.25 rad/s² is a reasonable default) keeps the path smooth and prevents error from being transferred to the cargo.&lt;br /&gt;
&lt;br /&gt;
== 调度集成 / Scheduling integration ==&lt;br /&gt;
SimpleCore 把联动车队视为一个不可分割的调度单元。已经埋下的钩子：&lt;br /&gt;
&lt;br /&gt;
* `[[Special:MyLanguage/AGV任务运行逻辑|AGV任务运行逻辑]]` 中的 `AbstractCar.haveCoordination` 字段（`D:\src\Simple\SimpleCore\PropType\AbstractCar.cs:57`）。设为 `true` 后，调度内核会把同 `haveCoordination` 分组的车辆作为整体寻路、整体上锁。&lt;br /&gt;
* `Car.actualSendScript()` 仍按单车下发 TopazScript，但脚本中含 `WaitPartner(carId)` 同步原语，保证两车动作时序对齐。&lt;br /&gt;
&lt;br /&gt;
The scheduler treats a coordinated set as one unit. The currently-in-place hook is the `AbstractCar.haveCoordination` boolean field. Setting it on the relevant cars makes the scheduler co-pathfind and co-lock for the group. Mission scripts still dispatch per-car, but a `WaitPartner(carId)` primitive in the per-car TopazScript serialises across vehicles.&lt;br /&gt;
&lt;br /&gt;
=== 目标 API / Target API ===&lt;br /&gt;
设计中的（未实施）/ Designed (not yet implemented):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// In SimpleCore — group cars into a coordination set&lt;br /&gt;
var pair = new CoordinatedSet { Leader = carA, Followers = new[]{ carB } };&lt;br /&gt;
pair.LockingPolicy = LockingPolicy.AsUnit;        // lock route segments for the whole group&lt;br /&gt;
pair.MotionPolicy  = MotionPolicy.LeaderFollows;  // followers track leader via rear lidar&lt;br /&gt;
&lt;br /&gt;
// In a mission script (TopazScript)&lt;br /&gt;
agv.AcquireCoordination(partner=&amp;quot;CarB&amp;quot;, role=&amp;quot;Leader&amp;quot;);&lt;br /&gt;
agv.Go(srcX, srcY, srcid, dstX, dstY, dstid, speed: 600);&lt;br /&gt;
agv.WaitPartner(&amp;quot;CarB&amp;quot;);&lt;br /&gt;
agv.ReleaseCoordination();&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 当前实现状态 / Implementation status ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 模块 / Module !! 状态 / Status !! 文件 / File&lt;br /&gt;
|-&lt;br /&gt;
| `AbstractCar.haveCoordination` 字段 / flag || ✅ 已实施 / Implemented || `Simple\SimpleCore\PropType\AbstractCar.cs:57`&lt;br /&gt;
|-&lt;br /&gt;
| 调度整体寻路 / Group pathfinding || 🚧 设计中 / Designed || （计划在 SimpleCore 调度内核扩展 / pending SimpleCore extension）&lt;br /&gt;
|-&lt;br /&gt;
| `CoordinatedSet` 数据结构 || 🚧 设计中 / Designed || —&lt;br /&gt;
|-&lt;br /&gt;
| `WaitPartner(carId)` TopazScript 原语 || 🚧 设计中 / Designed || —&lt;br /&gt;
|-&lt;br /&gt;
| 后车 V 槽位姿解算 / Follower V-groove pose solver || 🚧 设计中 / Designed || 计划放入 Clumsy MovementDefinition / planned as a Clumsy Movement&lt;br /&gt;
|-&lt;br /&gt;
| 车间 AP 心跳通道 / Inter-car AP heartbeat || 🚧 设计中 / Designed || 复用 Medulla DObject 跨网/多机扩展 / extends Medulla DObject for inter-vehicle pub/sub&lt;br /&gt;
|-&lt;br /&gt;
| 浮动载货台机械方案 / Floating-platform mechanical design || 📐 已规范 / Specified || `D:\src\cookbook\双车联动技术方案.pdf` §2.3&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 参考 / References ==&lt;br /&gt;
* 技术方案文档 / Design spec: `D:\src\cookbook\双车联动技术方案.pdf` (4 pages, §2.1–§2.5)&lt;br /&gt;
* `[[Special:MyLanguage/调度内核运行原理|调度内核运行原理]]` — 调度内核如何把车组当作整体决策的算法基础。&lt;br /&gt;
* `[[Special:MyLanguage/DPS调度算法详解|DPS调度算法详解]]` — DPS 算法的多车死锁检测可作为联动组的前提。&lt;br /&gt;
* `[[Special:MyLanguage/AGV任务运行逻辑|AGV任务运行逻辑]]` — 任务下发流程，联动组扩展将复用同一通路。&lt;br /&gt;
&lt;br /&gt;
== 相关页面 / See also ==&lt;br /&gt;
* `[[Special:MyLanguage/设备跟随联动|设备跟随联动]]` — AGV 跟随非 AGV 设备（手推叉车、卷料车等）。&lt;br /&gt;
* `[[Special:MyLanguage/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]` — 多车联动 + 视觉天眼的装卸车应用。&lt;br /&gt;
&lt;br /&gt;
[[Category:特殊技术方案]]&lt;br /&gt;
[[Category:开发手册]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>