自动识别托盘取放货

来自MDCS wiki2
跳到导航 跳到搜索

概述 / Overview

"自动识别托盘取放货"是 自动识别工位并取放货 的特例:工位本身是一个独立的托盘(pallet)而非固定货架,车体到位后通过激光雷达识别托盘的 两个插孔(叉车场景)或 两个边缘特征(顶升 / 平板场景),完成对位 + 升降 + 离场。

"Auto-pallet pick & place" specialises station-aware pick & place to pallets. The "station" 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.

与货架取放的差异 / Difference from rack pick

项 / Item 货架(KIVA 类)/ Rack (KIVA) 托盘 / Pallet
特征点 / Features 4 条立腿 / 4 legs 2 个叉孔或 2 条边 / 2 fork pockets or 2 edges
进入方向 / Entry side 任意(钻入式)/ any (slide-under) 固定一侧(短边)/ fixed short edge
升降高度 / Lift travel 30–80 mm(顶升)/ 30–80 mm (jack) 100–1800 mm(叉齿)/ 100–1800 mm (forks)
误差容忍 / Tolerance ±30 mm / ±2° ±15 mm / ±1.5°(叉孔机械约束)
主用 Movement `AutoShelfFetching_ManyLegs` `AutoFetchGood`, `PutGood`
主用 Detector `LidarDetectTray` (3-腿) / 4-腿 `LidarDetectPallet`, `LidarBlobPairDetector`

托盘场景对车体姿态的容忍度比货架低,因为叉齿与叉孔的机械配合余量只有 10–15 mm;调试时务必先用 标定与校准 把外参打齐。

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 the calibration guide before tuning.

工作流程 / Pipeline

  1. 粗对位 / Coarse approach: SimpleComposer 把 AGV 派到托盘前的 anchor 站点,使用普通巡线 / 路径跟踪。
    SimpleComposer dispatches the AGV to the anchor site in front of the pallet; ordinary line / path follow.
  2. 粗检测 / Coarse detect: 启动 `LidarDetectPallet`,从前方激光帧中找出托盘的两个特征(叉孔中心 or 边缘中点)的近似位置。
    Start `LidarDetectPallet` to extract approximate centers of the two pallet features from one or two lidar frames.
  3. 精对位跟踪 / Fine alignment: 用检测出的两个点拟合托盘中轴线,`AutoFetchGood`(或 `PutGood`)开启跟踪,逼近期望停靠位姿。
    Fit the pallet's midline from the two feature points; `AutoFetchGood` (or `PutGood`) opens a tracking thread to drive toward the docking pose.
  4. 升降 / Lift: 到位后通过 `Medulla 上位 IO` 触发叉齿 / 顶升机构动作。
    On dock, fire the fork / jack actuator through Medulla upper-IO.
  5. 离场 / Withdraw: 倒车(叉车)或推车前进(顶升)退出托盘正前方区域。
    Reverse out (forklift) or roll forward (jack) to clear.
public void PickPallet(double approachX, double approachY, double palletX, double palletY)
{
    Queue(
      async () =>
      {
          // 1. Coarse approach
          DriveTask.WaitDriveTask(new SteeringLineFollowing
          {
              srcX = currentX, srcY = currentY,
              dstX = approachX, dstY = approachY,
              basespeed = 800
          }.Follow());
      },
      async () =>
      {
          // 2 + 3. Detect + fine alignment (encapsulated in AutoFetchGood)
          DriveTask.WaitDriveTask(new AutoFetchGood
          {
              aX = approachX, aY = approachY,
              bX = palletX,   bY = palletY,
              initSpeed   = 500,
              inShelfSpeed= 150,
              stopDist    = 80,           // tight: pocket / tine clearance
              width       = 800           // pallet pocket span
          }.Get());
      },
      async () =>
      {
          // 4. Lift via Medulla upper-IO (fork at 200 mm)
          MedullaAPI.SetUpperIO("forkHeight", 200);
          await WaitForUpperIO("forkAtTarget", timeoutMs: 5000);
      },
      async () =>
      {
          // 5. Withdraw 1.5 m
          DriveTask.WaitDriveTask(new SteeringLineFollowingReverse
          {
              srcX = palletX, srcY = palletY,
              dstX = approachX, dstY = approachY,
              basespeed = 400
          }.ReverseFollow());
      });
}

调试要点 / Tuning

  • 叉孔检测假阳性 / False positive on fork pockets: 缩窄 `LidarDetectPallet.widthMin/widthMax` 区间至 ±50 mm。
  • 托盘姿态偏 / Pallet pose drift: 检查激光雷达水平度,重做 外参标定
  • 叉齿与叉孔刮擦 / Tines scrape pocket walls: 适当增大 `stopDist`(保留 20–30 mm 余量),或把 `inShelfSpeed` 降到 100 mm/s。
  • 码垛环境光斑干扰 / Beam glints in stacking yards: 给托盘正面贴一段宽 50 mm 的吸光胶带可显著改善。

相关页面 / See also