<?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%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB%E6%89%98%E7%9B%98%E5%8F%96%E6%94%BE%E8%B4%A7</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%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB%E6%89%98%E7%9B%98%E5%8F%96%E6%94%BE%E8%B4%A7"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E8%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB%E6%89%98%E7%9B%98%E5%8F%96%E6%94%BE%E8%B4%A7&amp;action=history"/>
	<updated>2026-05-16T15:09:53Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E8%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB%E6%89%98%E7%9B%98%E5%8F%96%E6%94%BE%E8%B4%A7&amp;diff=1002&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%87%AA%E5%8A%A8%E8%AF%86%E5%88%AB%E6%89%98%E7%9B%98%E5%8F%96%E6%94%BE%E8%B4%A7&amp;diff=1002&amp;oldid=prev"/>
		<updated>2026-05-16T11:15:20Z</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;
== 概述 / Overview ==&lt;br /&gt;
&amp;quot;自动识别托盘取放货&amp;quot;是 [[Special:MyLanguage/自动识别工位并取放货|自动识别工位并取放货]] 的特例：工位本身是一个独立的托盘（pallet）而非固定货架，车体到位后通过激光雷达识别托盘的 ''两个插孔''（叉车场景）或 ''两个边缘特征''（顶升 / 平板场景），完成对位 + 升降 + 离场。&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Auto-pallet pick &amp;amp; place&amp;quot; specialises [[Special:MyLanguage/自动识别工位并取放货|station-aware pick &amp;amp; place]] to pallets. The &amp;quot;station&amp;quot; is the pallet itself, not a fixed rack. Once the vehicle is roughly in front, the lidar locates the pallet's '''two fork-pockets''' (forklifts) or its '''two side edges''' (lift / flat-bed vehicles), then the car runs the alignment / lift / withdraw sequence.&lt;br /&gt;
&lt;br /&gt;
== 与货架取放的差异 / Difference from rack pick ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 项 / Item !! 货架（KIVA 类）/ Rack (KIVA) !! 托盘 / Pallet&lt;br /&gt;
|-&lt;br /&gt;
| 特征点 / Features || 4 条立腿 / 4 legs || 2 个叉孔或 2 条边 / 2 fork pockets or 2 edges&lt;br /&gt;
|-&lt;br /&gt;
| 进入方向 / Entry side || 任意（钻入式）/ any (slide-under) || 固定一侧（短边）/ fixed short edge&lt;br /&gt;
|-&lt;br /&gt;
| 升降高度 / Lift travel || 30–80 mm（顶升）/ 30–80 mm (jack) || 100–1800 mm（叉齿）/ 100–1800 mm (forks)&lt;br /&gt;
|-&lt;br /&gt;
| 误差容忍 / Tolerance || ±30 mm / ±2° || ±15 mm / ±1.5°（叉孔机械约束）&lt;br /&gt;
|-&lt;br /&gt;
| 主用 Movement || `AutoShelfFetching_ManyLegs` || `AutoFetchGood`, `PutGood`&lt;br /&gt;
|-&lt;br /&gt;
| 主用 Detector || `LidarDetectTray` (3-腿) / 4-腿 || `LidarDetectPallet`, `LidarBlobPairDetector`&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
托盘场景对车体姿态的容忍度比货架低，因为叉齿与叉孔的机械配合余量只有 10–15 mm；调试时务必先用 [[Special:MyLanguage/标定与校准|标定与校准]] 把外参打齐。&lt;br /&gt;
&lt;br /&gt;
Pallet pickup tolerates less pose error than rack pickup because the fork-pocket/fork-tine clearance is only 10–15 mm. Always level the lidar and verify extrinsics via [[Special:MyLanguage/标定与校准|the calibration guide]] before tuning.&lt;br /&gt;
&lt;br /&gt;
== 工作流程 / Pipeline ==&lt;br /&gt;
# '''粗对位 / Coarse approach''': SimpleComposer 把 AGV 派到托盘前的 ''anchor 站点''，使用普通巡线 / 路径跟踪。&amp;lt;br /&amp;gt;SimpleComposer dispatches the AGV to the anchor site in front of the pallet; ordinary line / path follow.&lt;br /&gt;
# '''粗检测 / Coarse detect''': 启动 `LidarDetectPallet`，从前方激光帧中找出托盘的两个特征（叉孔中心 or 边缘中点）的近似位置。&amp;lt;br /&amp;gt;Start `LidarDetectPallet` to extract approximate centers of the two pallet features from one or two lidar frames.&lt;br /&gt;
# '''精对位跟踪 / Fine alignment''': 用检测出的两个点拟合托盘中轴线，`AutoFetchGood`（或 `PutGood`）开启跟踪，逼近期望停靠位姿。&amp;lt;br /&amp;gt;Fit the pallet's midline from the two feature points; `AutoFetchGood` (or `PutGood`) opens a tracking thread to drive toward the docking pose.&lt;br /&gt;
# '''升降 / Lift''': 到位后通过 `[[Special:MyLanguage/Medulla-API|Medulla 上位 IO]]` 触发叉齿 / 顶升机构动作。&amp;lt;br /&amp;gt;On dock, fire the fork / jack actuator through Medulla upper-IO.&lt;br /&gt;
# '''离场 / Withdraw''': 倒车（叉车）或推车前进（顶升）退出托盘正前方区域。&amp;lt;br /&amp;gt;Reverse out (forklift) or roll forward (jack) to clear.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public void PickPallet(double approachX, double approachY, double palletX, double palletY)&lt;br /&gt;
{&lt;br /&gt;
    Queue(&lt;br /&gt;
      async () =&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
          // 1. Coarse approach&lt;br /&gt;
          DriveTask.WaitDriveTask(new SteeringLineFollowing&lt;br /&gt;
          {&lt;br /&gt;
              srcX = currentX, srcY = currentY,&lt;br /&gt;
              dstX = approachX, dstY = approachY,&lt;br /&gt;
              basespeed = 800&lt;br /&gt;
          }.Follow());&lt;br /&gt;
      },&lt;br /&gt;
      async () =&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
          // 2 + 3. Detect + fine alignment (encapsulated in AutoFetchGood)&lt;br /&gt;
          DriveTask.WaitDriveTask(new AutoFetchGood&lt;br /&gt;
          {&lt;br /&gt;
              aX = approachX, aY = approachY,&lt;br /&gt;
              bX = palletX,   bY = palletY,&lt;br /&gt;
              initSpeed   = 500,&lt;br /&gt;
              inShelfSpeed= 150,&lt;br /&gt;
              stopDist    = 80,           // tight: pocket / tine clearance&lt;br /&gt;
              width       = 800           // pallet pocket span&lt;br /&gt;
          }.Get());&lt;br /&gt;
      },&lt;br /&gt;
      async () =&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
          // 4. Lift via Medulla upper-IO (fork at 200 mm)&lt;br /&gt;
          MedullaAPI.SetUpperIO(&amp;quot;forkHeight&amp;quot;, 200);&lt;br /&gt;
          await WaitForUpperIO(&amp;quot;forkAtTarget&amp;quot;, timeoutMs: 5000);&lt;br /&gt;
      },&lt;br /&gt;
      async () =&amp;gt;&lt;br /&gt;
      {&lt;br /&gt;
          // 5. Withdraw 1.5 m&lt;br /&gt;
          DriveTask.WaitDriveTask(new SteeringLineFollowingReverse&lt;br /&gt;
          {&lt;br /&gt;
              srcX = palletX, srcY = palletY,&lt;br /&gt;
              dstX = approachX, dstY = approachY,&lt;br /&gt;
              basespeed = 400&lt;br /&gt;
          }.ReverseFollow());&lt;br /&gt;
      });&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 调试要点 / Tuning ==&lt;br /&gt;
* '''叉孔检测假阳性 / False positive on fork pockets''': 缩窄 `LidarDetectPallet.widthMin/widthMax` 区间至 ±50 mm。&lt;br /&gt;
* '''托盘姿态偏 / Pallet pose drift''': 检查激光雷达水平度，重做 [[Special:MyLanguage/标定激光雷达外参|外参标定]]。&lt;br /&gt;
* '''叉齿与叉孔刮擦 / Tines scrape pocket walls''': 适当增大 `stopDist`（保留 20–30 mm 余量），或把 `inShelfSpeed` 降到 100 mm/s。&lt;br /&gt;
* '''码垛环境光斑干扰 / Beam glints in stacking yards''': 给托盘正面贴一段宽 50 mm 的吸光胶带可显著改善。&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;
* [[Special:MyLanguage/识别料框并堆垛拆垛|识别料框并堆垛拆垛]]&lt;br /&gt;
&lt;br /&gt;
[[Category:运动控制使用手册]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>