<?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=%E6%BD%9C%E4%BC%8F%E9%A1%B6%E5%8D%87%E8%BD%A6%28KIVA%E7%B1%BB%E5%B0%8F%E8%BD%A6%29%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B</id>
	<title>潜伏顶升车(KIVA类小车)适配案例 - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki2.lessokaji.com/index.php?action=history&amp;feed=atom&amp;title=%E6%BD%9C%E4%BC%8F%E9%A1%B6%E5%8D%87%E8%BD%A6%28KIVA%E7%B1%BB%E5%B0%8F%E8%BD%A6%29%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E6%BD%9C%E4%BC%8F%E9%A1%B6%E5%8D%87%E8%BD%A6(KIVA%E7%B1%BB%E5%B0%8F%E8%BD%A6)%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;action=history"/>
	<updated>2026-05-16T15:17:11Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E6%BD%9C%E4%BC%8F%E9%A1%B6%E5%8D%87%E8%BD%A6(KIVA%E7%B1%BB%E5%B0%8F%E8%BD%A6)%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1009&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=%E6%BD%9C%E4%BC%8F%E9%A1%B6%E5%8D%87%E8%BD%A6(KIVA%E7%B1%BB%E5%B0%8F%E8%BD%A6)%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1009&amp;oldid=prev"/>
		<updated>2026-05-16T11:26:51Z</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;
潜伏顶升车（也称 KIVA 类小车、料架搬运车）是从料架下方钻入、顶升后整体搬运料架到目的地的低矮 AGV。结构最简，但对 ''Detour 定位精度''与 ''[[Special:MyLanguage/使用自动对准料架功能|自动对准料架]]'' 算法要求最高。&lt;br /&gt;
&lt;br /&gt;
The lift-AGV (also &amp;quot;KIVA-class&amp;quot; after Amazon's KIVA) is a low-profile AGV that slides under a rack, jacks it up, and carries it. Mechanically simplest, but most demanding on [[Special:MyLanguage/Detour简介|Detour]] precision and the [[Special:MyLanguage/使用自动对准料架功能|rack-alignment]] algorithm.&lt;br /&gt;
&lt;br /&gt;
参考：浙江迈睿 KIVA 适配（`D:\src\cookbook\adaption-reference\浙江迈睿\CartAdapters\kiva\`）以及苏州艾吉威的对应 ClumsyPilot 实现。&lt;br /&gt;
References: Zhejiang Mairui KIVA adapter (`D:\src\cookbook\adaption-reference\浙江迈睿\CartAdapters\kiva\`) plus Suzhou Eswei's ClumsyPilot.&lt;br /&gt;
&lt;br /&gt;
== 硬件清单 / Hardware ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 部件 / Part !! 典型规格 / Typical spec&lt;br /&gt;
|-&lt;br /&gt;
| 底盘 / Chassis || 双驱动差速（差速旋转） / Two-wheel differential&lt;br /&gt;
|-&lt;br /&gt;
| 驱动电机 / Drive motor || BLDC 200–600 W × 2&lt;br /&gt;
|-&lt;br /&gt;
| 顶升机构 / Jack || 电动丝杆 / liquid jack；行程 30–100 mm&lt;br /&gt;
|-&lt;br /&gt;
| 雷达 / Lidar || 顶面双向 2D（前后扫描）或单向 + 360° 反光板&lt;br /&gt;
|-&lt;br /&gt;
| IMU / IMU || 6-DoF，必备&lt;br /&gt;
|-&lt;br /&gt;
| 接近开关 / Proximity || 料架腿检测辅助 / aux for leg detection&lt;br /&gt;
|-&lt;br /&gt;
| 通讯 / Comm || 工控 PC 本体 + Wi-Fi 5&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
不需要叉齿 / 倾角 / 复杂 PLC，硬件 IO 极少；MDCS 适配的核心难度在 ''钻入精度''与 ''带架原地旋转''。&lt;br /&gt;
&lt;br /&gt;
No fork / tilt / complex PLC; minimal hardware IO. The MDCS adaptation difficulty is in ''slide-under accuracy'' and ''in-place rotation while carrying''.&lt;br /&gt;
&lt;br /&gt;
== 1. Medulla 适配 / Medulla side ==&lt;br /&gt;
最小 IO 表 / Minimal IO surface:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class KivaCart : CartDefinition&lt;br /&gt;
{&lt;br /&gt;
    [AsInitParam] public string motorPort = &amp;quot;COM3&amp;quot;;&lt;br /&gt;
    [AsInitParam] public float  wheelBase  = 460;      // mm, between drive wheels&lt;br /&gt;
    [AsInitParam] public float  jackStroke = 80;       // mm&lt;br /&gt;
&lt;br /&gt;
    [AsUpperIO] public float vLeft, vRight;   // 双驱差速指令 / per-wheel cmd&lt;br /&gt;
    [AsUpperIO] public float jackTarget;       // 0 = down, jackStroke = up&lt;br /&gt;
    [AsUpperIO] public bool  led;              // 顶部状态灯 / status LED&lt;br /&gt;
&lt;br /&gt;
    [AsLowerIO] public float vLeftEst, vRightEst;&lt;br /&gt;
    [AsLowerIO] public float jackHeight;&lt;br /&gt;
    [AsLowerIO] public bool  jackAtTarget;&lt;br /&gt;
    [AsLowerIO] public bool  eStop;&lt;br /&gt;
    [AsLowerIO] public int   batteryPercent;&lt;br /&gt;
    [AsLowerIO] public bool  legProx;          // 接近开关：腿在我下面 / leg under me&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
ladder logic 同样 50 ms 周期；KIVA 一般通过厂商 USB-CAN 或 RS485 与轮控板通讯（具体协议见厂商手册）。&lt;br /&gt;
&lt;br /&gt;
The ladder logic runs at 50 ms; talk to the wheel controllers over the vendor's USB-CAN or RS485 channel.&lt;br /&gt;
&lt;br /&gt;
== 2. Clumsy 自动驾驶适配 / Clumsy side ==&lt;br /&gt;
关键 Movement / Key movements:&lt;br /&gt;
&lt;br /&gt;
* `SteeringLineFollowing` — 巡线到 ''料架前 anchor''&lt;br /&gt;
* `AutoShelfFetching_ManyLegs` — 自动钻入并对准料架（见 [[Special:MyLanguage/使用自动对准料架功能|使用自动对准料架功能]]）&lt;br /&gt;
* `JackUp(targetHeight)` — 顶升包封，等待 `jackAtTarget` 为 true&lt;br /&gt;
* `InPlaceRotate(angle)` — 带架原地差速旋转（必须在 jack-up 后启用 ''带载包络''）&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class AGV : SimpleAgvInterface&lt;br /&gt;
{&lt;br /&gt;
    public void PickRack(double anchorX, double anchorY, double rackX, double rackY)&lt;br /&gt;
    {&lt;br /&gt;
        Queue(&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              DriveTask.WaitDriveTask(new SteeringLineFollowing&lt;br /&gt;
              {&lt;br /&gt;
                  srcX = currentX, srcY = currentY,&lt;br /&gt;
                  dstX = anchorX,  dstY = anchorY,&lt;br /&gt;
                  basespeed = 800&lt;br /&gt;
              }.Follow());&lt;br /&gt;
          },&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              // Slide under + auto-align (从 anchor 切到 rack centre)&lt;br /&gt;
              DriveTask.WaitDriveTask(new AutoShelfFetching_ManyLegs&lt;br /&gt;
              {&lt;br /&gt;
                  aX = anchorX, aY = anchorY,&lt;br /&gt;
                  bX = rackX,   bY = rackY,&lt;br /&gt;
                  initSpeed = 600, inShelfSpeed = 200,&lt;br /&gt;
                  stopDist = 30, width = Configuration.conf.rackLegSpan,&lt;br /&gt;
                  startingSlot = 10&lt;br /&gt;
              }.Get());&lt;br /&gt;
          },&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              // Jack up&lt;br /&gt;
              SetUpperIO(&amp;quot;jackTarget&amp;quot;, Configuration.conf.jackStroke);&lt;br /&gt;
              await WaitForLowerIO(&amp;quot;jackAtTarget&amp;quot;, 4000);&lt;br /&gt;
              carryingRack = true;&lt;br /&gt;
          });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    public void DropRack(double targetX, double targetY)&lt;br /&gt;
    {&lt;br /&gt;
        Queue(&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              DriveTask.WaitDriveTask(new SteeringLineFollowing&lt;br /&gt;
              {&lt;br /&gt;
                  srcX = currentX, srcY = currentY,&lt;br /&gt;
                  dstX = targetX, dstY = targetY,&lt;br /&gt;
                  basespeed = 500    // 带载减速 / slow when loaded&lt;br /&gt;
              }.Follow());&lt;br /&gt;
          },&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              SetUpperIO(&amp;quot;jackTarget&amp;quot;, 0);&lt;br /&gt;
              await WaitForLowerIO(&amp;quot;jackAtTarget&amp;quot;, 4000);&lt;br /&gt;
              carryingRack = false;&lt;br /&gt;
          },&lt;br /&gt;
          async () =&amp;gt;&lt;br /&gt;
          {&lt;br /&gt;
              // 后退 200 mm 退出料架 / withdraw 200 mm&lt;br /&gt;
              DriveTask.WaitDriveTask(new SteeringLineFollowingReverse&lt;br /&gt;
              {&lt;br /&gt;
                  srcX = targetX, srcY = targetY,&lt;br /&gt;
                  dstX = targetX - 0.2 * Math.Cos(currentTh),&lt;br /&gt;
                  dstY = targetY - 0.2 * Math.Sin(currentTh),&lt;br /&gt;
                  basespeed = 200&lt;br /&gt;
              }.ReverseFollow());&lt;br /&gt;
          });&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 3. SimpleComposer 端 / SimpleComposer side ==&lt;br /&gt;
顶升车 ClumsyCar 子类需要 ''携带料架时的扩展包络''（料架长宽通常大于车体）：&lt;br /&gt;
&lt;br /&gt;
The ClumsyCar subclass needs an alternate ''carried-rack envelope'' (rack is wider/longer than the AGV):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
[CarType(Name = &amp;quot;KivaCart&amp;quot;, Title = &amp;quot;KIVA 顶升车 / KIVA lift-AGV&amp;quot;)]&lt;br /&gt;
public class KivaCar : ClumsyCar&lt;br /&gt;
{&lt;br /&gt;
    public bool carryingRack =&amp;gt; /* 从车上心跳读 / from heartbeat */;&lt;br /&gt;
&lt;br /&gt;
    public override Envelope GetActiveEnvelope()&lt;br /&gt;
    {&lt;br /&gt;
        return carryingRack ? carriedRackEnvelope : base.GetActiveEnvelope();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 4. 标定与调试 / Calibration &amp;amp; tuning ==&lt;br /&gt;
# '''轮距与轮径标定''' / Track + wheel diameter: 做正反 5 m 直线，比较 Detour 估的位移与实际，差异 &amp;gt; 2% 必须改 wheel radius 配置。&lt;br /&gt;
# '''差速旋转误差''' / Rotation error: 原地转 360° × 10，累计偏差 &amp;lt; 5°。误差大 → 轮距错。&lt;br /&gt;
# '''料架腿检测先验''' / Leg priors: 真测料架腿距，写入 `width`。&lt;br /&gt;
# '''顶升时长''' / Jack timing: `inshelfMillis` 比顶升时长长 1 s，避免还没顶完就开走。&lt;br /&gt;
# '''反光板 / SLAM 切换''' / Reflector / SLAM switch: 反光板辅助定位时务必检查 KIVA 顶面雷达视野，料架钻入后是否仍能看到反光板。&lt;br /&gt;
&lt;br /&gt;
# Wheel-track + diameter cal: drive 5 m fwd/back; if Detour pose differs &amp;gt; 2%, fix the radius.&lt;br /&gt;
# Rotation error: spin 360° ×10 in place; cumulative drift &amp;lt; 5° is acceptable.&lt;br /&gt;
# Leg priors: write real measured leg span into the `width` field.&lt;br /&gt;
# Jack timing: `inshelfMillis` should be 1 s longer than the jack-up time.&lt;br /&gt;
# SLAM vs reflector: confirm the top-mounted lidar still sees reflectors after the rack is on top.&lt;br /&gt;
&lt;br /&gt;
== 5. 常见问题 / Common pitfalls ==&lt;br /&gt;
* '''钻入时撞腿''' / Hits leg on entry: 检测器 `blobDist` 太大或 anchor 站点离料架太近。&lt;br /&gt;
* '''顶升后偏摆''' / Sway after jack: 料架重心偏，或 jack 行程未完全到位；查 `jackAtTarget` 信号。&lt;br /&gt;
* '''带架转弯失败''' / Rotation fails with rack: 带载包络未启用，调度允许了无法通过的窄通道。&lt;br /&gt;
* '''返回原料架放回失败''' / Re-dock to same rack fails: anchor 与 rack 站点坐标在 SLAM 漂移后不一致；定期 [[Special:MyLanguage/标定与校准|重标定]]。&lt;br /&gt;
&lt;br /&gt;
== 6. 通讯与节拍 / Comm &amp;amp; throughput ==&lt;br /&gt;
* 控制周期：50 ms（Medulla LadderLogic）/ Control cycle: 50 ms.&lt;br /&gt;
* 心跳：100 ms（向 SimpleComposer 报位置 + jackHeight）/ Heartbeat: 100 ms.&lt;br /&gt;
* 取放节拍参考：单次（取-搬-放）约 35–50 s（含 anchor 站到 anchor 站直线 8 m）。&lt;br /&gt;
&lt;br /&gt;
== 相关页面 / See also ==&lt;br /&gt;
* [[Special:MyLanguage/MDCS引擎适配机器人入门教学|MDCS引擎适配机器人入门教学]]&lt;br /&gt;
* [[Special:MyLanguage/叉车适配案例|叉车适配案例]]&lt;br /&gt;
* [[Special:MyLanguage/全向车适配案例|全向车适配案例]]&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>