<?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%AE%BE%E5%A4%87%E8%B7%9F%E9%9A%8F%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=%E8%AE%BE%E5%A4%87%E8%B7%9F%E9%9A%8F%E8%81%94%E5%8A%A8"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E8%AE%BE%E5%A4%87%E8%B7%9F%E9%9A%8F%E8%81%94%E5%8A%A8&amp;action=history"/>
	<updated>2026-05-16T16:08:24Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E8%AE%BE%E5%A4%87%E8%B7%9F%E9%9A%8F%E8%81%94%E5%8A%A8&amp;diff=1003&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%AE%BE%E5%A4%87%E8%B7%9F%E9%9A%8F%E8%81%94%E5%8A%A8&amp;diff=1003&amp;oldid=prev"/>
		<updated>2026-05-16T11:15:21Z</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;
&amp;quot;设备跟随联动&amp;quot;指 AGV 跟随 ''非 AGV 设备''（手推叉车、人工拖车、卷料车、料箱等）协同移动的功能。与 [[Special:MyLanguage/双车/多车联动|双车 / 多车联动]] 的区别：本场景中 ''领头是设备 / 人''，不属于 MDCS 调度网络，没有可控信号；跟随车只能依靠 ''视觉 + 激光''观测领头物体并跟随。&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Device-following coordination&amp;quot; lets an AGV shadow a '''non-AGV device''' (manual trolley, hand-pushed forklift, coil cart, kit-box, …). Compared to [[Special:MyLanguage/双车/多车联动|twin-car coordination]], the leader here is a piece of equipment or a person — it's outside the MDCS scheduling network and has no controllable signal. The follower can only ''observe'' the leader via vision / lidar and respond.&lt;br /&gt;
&lt;br /&gt;
== 应用场景 / Scenarios ==&lt;br /&gt;
* '''人工卸车 + AGV 接驳''': 工人在卡车上把货物推到边沿，AGV 在地面跟随接货位。&lt;br /&gt;
* '''卷料车跟随 / Coil-cart shadowing''': 操作工推卷料车从一道工序到下一道，AGV 跟随承担载货。&lt;br /&gt;
* '''跨工序流转 / Inter-process transfer''': 装配线上的料箱由工艺人员沿不规则路径推动，AGV 自动跟随至工位。&lt;br /&gt;
* '''拖车协同 / Trailer-tow assist''': 牵引车前牵，AGV 在后段加推支撑（适用于长拖车）。&lt;br /&gt;
&lt;br /&gt;
== 与已有联动方案的差异 / What makes it different ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 项 / Item !! 双车联动 / Twin-car !! 设备跟随联动 / Device-follow&lt;br /&gt;
|-&lt;br /&gt;
| 领头 / Leader || 同样是 MDCS AGV / Another MDCS AGV || 任意非 AGV 设备 / 人 / Any device / human&lt;br /&gt;
|-&lt;br /&gt;
| 通讯 / Comms || AP Wi-Fi 心跳 / AP heartbeat || 无通讯，纯视觉 + 激光 / None — vision / lidar only&lt;br /&gt;
|-&lt;br /&gt;
| 任务下发 / Task dispatch || 调度直接派单 / Scheduler dispatches both || 领头无法接收任务；调度只能管跟随车&lt;br /&gt;
|-&lt;br /&gt;
| 路径 / Path || 调度规划 / Scheduler-planned || 领头自由路径 / Leader free-form&lt;br /&gt;
|-&lt;br /&gt;
| 速度 / Speed || 调度约束 / Scheduler-bounded || 跟随者跟领头实时速度（带上限）/ Follower matches leader (with cap)&lt;br /&gt;
|-&lt;br /&gt;
| 失联处理 / Lost-leader || 联动解体 / Decouple || 跟随者就地停 / Stop in place&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 实现方案 / Implementation ==&lt;br /&gt;
=== 感知 / Perception ===&lt;br /&gt;
跟随车需要在领头设备上识别一个稳定的 ''视觉锚点'' — 几种可选：&lt;br /&gt;
The follower needs a stable ''visual anchor'' on the leader. Options:&lt;br /&gt;
&lt;br /&gt;
* '''V 槽 / V-groove''' — 在设备背面装 1 个 V 槽（同 [[Special:MyLanguage/双车/多车联动|双车联动]]）。2D 激光检测，最便宜可靠。&lt;br /&gt;
* '''AprilTag / ArUco''' — 在设备背面贴一个易识别 fiducial；前向相机检测。&lt;br /&gt;
* '''3D 模板''' — 用 3D 点云模板匹配（领头形状已知，如标准卷料车）。&lt;br /&gt;
* '''腿对检测 / Leg-pair''' — 领头有两条立柱（如标准托盘车），用 `LidarDetectTray` 检测。&lt;br /&gt;
&lt;br /&gt;
推荐组合：V 槽 + AprilTag 冗余；任一可识别即继续，两者全丢 ≥ 2 s 则停车。&lt;br /&gt;
&lt;br /&gt;
Recommended combination: V-groove + AprilTag redundancy. If either is found, continue. If both lose lock for ≥ 2 s, stop.&lt;br /&gt;
&lt;br /&gt;
=== 跟随控制器 / Follow controller ===&lt;br /&gt;
跟随车的运动控制本质是一个 ''常距点对点跟踪器''，目标点 = 领头锚点 - (固定偏移)。&lt;br /&gt;
The follower's motion control is essentially a constant-distance point tracker, with the target = leader anchor − fixed offset.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class DeviceFollow : MovementDefinition&lt;br /&gt;
{&lt;br /&gt;
    public float standoff = 1500;        // 距领头多远 / standoff (mm)&lt;br /&gt;
    public float maxSpeed = 600;&lt;br /&gt;
    public float ahesionGain = 0.8f;     // 横向 / 朝向校正强度&lt;br /&gt;
&lt;br /&gt;
    public override IEnumerable&amp;lt;bool&amp;gt; Get()&lt;br /&gt;
    {&lt;br /&gt;
        var detector = new LidarDetectTray&lt;br /&gt;
        {&lt;br /&gt;
            blobDist = 100,&lt;br /&gt;
            BlobPtCount = 3&lt;br /&gt;
        };&lt;br /&gt;
&lt;br /&gt;
        var lostFrames = 0;&lt;br /&gt;
        while (true)&lt;br /&gt;
        {&lt;br /&gt;
            var lead = detector.DetectLeader();   // 领头锚点&lt;br /&gt;
            if (lead == null)&lt;br /&gt;
            {&lt;br /&gt;
                if (++lostFrames &amp;gt; 50)   // 50 ticks ≈ 2 s&lt;br /&gt;
                {&lt;br /&gt;
                    DriveStop();&lt;br /&gt;
                    yield break;&lt;br /&gt;
                }&lt;br /&gt;
                yield return true;&lt;br /&gt;
                continue;&lt;br /&gt;
            }&lt;br /&gt;
            lostFrames = 0;&lt;br /&gt;
&lt;br /&gt;
            var dist = lead.Range;&lt;br /&gt;
            var lateral = lead.Lateral;&lt;br /&gt;
            var theta  = lead.Heading;&lt;br /&gt;
&lt;br /&gt;
            // 控制律 / control law&lt;br /&gt;
            var fwd = MathF.Min(maxSpeed, (dist - standoff) * 1.2f);&lt;br /&gt;
            var turn = -(lateral * ahesionGain + theta * 0.5f);&lt;br /&gt;
&lt;br /&gt;
            SetDriveCommand(fwd, turn);&lt;br /&gt;
            yield return true;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 安全与边界 / Safety guards ===&lt;br /&gt;
* '''跟随距离上下限 / Standoff bounds''': 太近会撞领头，太远会丢锁；推荐 1.0–2.5 m。&lt;br /&gt;
* '''加速度上限 / Accel bound''': 领头突然提速时跟随车不能瞬时跟上；加上 0.5 m/s² 上限。&lt;br /&gt;
* '''转向角速度上限 / Angular vel bound''': 领头急转 → 跟随车保持不超过 0.5 rad/s。&lt;br /&gt;
* '''与人接触 / Contact with humans''': 跟随车的紧急停止线必须独立于跟随逻辑；激光雷达 1 m 内有任何障碍物立即触发 e-stop。&lt;br /&gt;
&lt;br /&gt;
== 调度集成 / Scheduling integration ==&lt;br /&gt;
* SimpleComposer 把&amp;quot;跟随设备&amp;quot; 状态视为一个特殊 mission：调度不规划跟随车的路径，只是 ''把跟随车锁定''在跟随状态。&lt;br /&gt;
* `Car.CurrentMission = Following(&amp;quot;DeviceXX&amp;quot;)`；调度看到这个状态时不会派其它任务给该 AGV。&lt;br /&gt;
* 跟随过程中跟随车汇报自己的实时位姿；调度可视化展示 ''领头-跟随'' 链路。&lt;br /&gt;
&lt;br /&gt;
SimpleComposer treats &amp;quot;follow-device&amp;quot; as a special mission state. The scheduler does not plan a path; it just locks the AGV into following mode and won't dispatch other tasks until the follow ends.&lt;br /&gt;
&lt;br /&gt;
== 启动 / 结束 / Start &amp;amp; end ==&lt;br /&gt;
* '''启动 / Start''': 通过 SimpleComposer 上的&amp;quot;启动设备跟随&amp;quot;按钮；选定要跟随的设备类型；车开始尝试识别。&lt;br /&gt;
* '''确认 / Confirm''': 识别到锚点后车体调整姿态并停在 standoff 距离上；车灯绿色提示。&lt;br /&gt;
* '''结束 / End''': 操作工通过手柄按&amp;quot;结束跟随&amp;quot;，或跟随车到达预设终点站点（参数化）。&lt;br /&gt;
&lt;br /&gt;
== 调试要点 / Tuning ==&lt;br /&gt;
* '''跟随抖动 / Jitter''': 调低 `ahesionGain`，或在检测端加 EWMA 滤波。&lt;br /&gt;
* '''领头突然消失 / Sudden lost-lock''': 缩短 `lostFrames` 阈值（默认 50 ticks ≈ 2 s）。&lt;br /&gt;
* '''拐弯时甩出 / Slips on turn''': 把 `maxSpeed` 降到 400 mm/s，或在领头加 AprilTag 增强检测稳定性。&lt;br /&gt;
&lt;br /&gt;
== 相关页面 / See also ==&lt;br /&gt;
* [[Special:MyLanguage/双车/多车联动|双车 / 多车联动]]&lt;br /&gt;
* [[Special:MyLanguage/联动天眼系统进行装卸车|联动天眼系统进行装卸车]]&lt;br /&gt;
* [[Special:MyLanguage/巡线行走|巡线行走]] — 跟随的退化情况&lt;br /&gt;
&lt;br /&gt;
[[Category:特殊技术方案]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>