<?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%85%A8%E5%90%91%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B</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%85%A8%E5%90%91%E8%BD%A6%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=%E5%85%A8%E5%90%91%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&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%85%A8%E5%90%91%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1005&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%85%A8%E5%90%91%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1005&amp;oldid=prev"/>
		<updated>2026-05-16T11:26:44Z</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;
全向车（mecanum 麦克纳姆轮 或 4 独立舵轮）能 ''任意方向平移 + 独立旋转''，无非完整约束，适合狭窄场景。MDCS 中典型全向车是大重载（10 T+）平板搬运车，常出现在 [[Special:MyLanguage/双车/多车联动|双车联动]] 场景。&lt;br /&gt;
&lt;br /&gt;
Omni vehicles (mecanum-wheel or 4-independent-steered-wheel) can ''translate in any direction + rotate independently'' — no non-holonomic constraints, ideal for tight spaces. The typical MDCS omni is a 10 t+ heavy-load flat-bed for [[Special:MyLanguage/双车/多车联动|twin-car]] operations.&lt;br /&gt;
&lt;br /&gt;
参考：浙江联核（`D:\src\cookbook\adaption-reference\浙江联核\new\`）、卓一全向叉车（`D:\src\cookbook\adaption-reference\卓一\zhuoyiomniforklift\`）。&lt;br /&gt;
References: Zhejiang Lianhe (`adaption-reference\浙江联核\new\`), Zhuoyi omni-forklift.&lt;br /&gt;
&lt;br /&gt;
== 硬件清单 / Hardware ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 部件 / Part !! 麦克纳姆 / Mecanum !! 四舵轮 / 4-steered&lt;br /&gt;
|-&lt;br /&gt;
| 驱动轮数 / Drive wheels || 4 (左前 / 右前 / 左后 / 右后 全独立)  || 4 独立驱动 + 4 独立转向&lt;br /&gt;
|-&lt;br /&gt;
| 编码器 / Encoders || 每轮一个 / 1 per wheel || 每轮 2 个（驱 + 转）&lt;br /&gt;
|-&lt;br /&gt;
| IMU || 必备 / required || 必备 / required&lt;br /&gt;
|-&lt;br /&gt;
| 控制板 / Controller || 单板可控 4 路 BLDC || 通常每对驱 / 转一对一块板&lt;br /&gt;
|-&lt;br /&gt;
| 重载承重 / Payload || 0.3–3 T || 5–20 T&lt;br /&gt;
|-&lt;br /&gt;
| 适用场景 / Use case || 中等重量、清洁机器人 || 重载、长货物&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1. Medulla 适配 / Medulla side ==&lt;br /&gt;
全向车的关键是 ''速度合成''：把 `(vx, vy, omega)` 拆成 4 路轮速 / 转向角，下发到电机。这通常在 LadderLogic 内做：&lt;br /&gt;
&lt;br /&gt;
The crux is ''velocity synthesis'': decompose `(vx, vy, omega)` into 4-wheel speeds / steer angles. Do it inside the LadderLogic loop:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class OmniCart : CartDefinition&lt;br /&gt;
{&lt;br /&gt;
    [AsInitParam] public string canDevice = &amp;quot;USBCAN0&amp;quot;;&lt;br /&gt;
    [AsInitParam] public float  wheelBase = 1600; // mm (front-rear distance)&lt;br /&gt;
    [AsInitParam] public float  trackWidth = 1200; // mm&lt;br /&gt;
    [AsInitParam] public float  wheelRadius = 100; // mm&lt;br /&gt;
&lt;br /&gt;
    // 上位 IO — 三轴速度&lt;br /&gt;
    [AsUpperIO] public float vxCmd;        // 前向 / forward&lt;br /&gt;
    [AsUpperIO] public float vyCmd;        // 横向 / lateral (left positive)&lt;br /&gt;
    [AsUpperIO] public float omegaCmd;     // 转向角速度 / yaw rate&lt;br /&gt;
&lt;br /&gt;
    // 下位 IO — 4 路状态&lt;br /&gt;
    [AsLowerIO] public float vEstW1, vEstW2, vEstW3, vEstW4;&lt;br /&gt;
    [AsLowerIO] public bool  eStop;&lt;br /&gt;
&lt;br /&gt;
    [UseLadderLogic(IntervalMs = 50)]&lt;br /&gt;
    public class Loop : LadderLogic&amp;lt;OmniCart&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        public override void Run(OmniCart s)&lt;br /&gt;
        {&lt;br /&gt;
            // 麦克纳姆轮 inverse kinematics（标准 4 轮，X 型布局）&lt;br /&gt;
            var L = (s.wheelBase + s.trackWidth) / 2f;&lt;br /&gt;
            var w1 = s.vxCmd - s.vyCmd - L * s.omegaCmd;   // 左前&lt;br /&gt;
            var w2 = s.vxCmd + s.vyCmd + L * s.omegaCmd;   // 右前&lt;br /&gt;
            var w3 = s.vxCmd + s.vyCmd - L * s.omegaCmd;   // 左后&lt;br /&gt;
            var w4 = s.vxCmd - s.vyCmd + L * s.omegaCmd;   // 右后&lt;br /&gt;
&lt;br /&gt;
            // 转换到 RPM 并下发&lt;br /&gt;
            s.can.SendWheelRPM(&lt;br /&gt;
                w1 / s.wheelRadius,&lt;br /&gt;
                w2 / s.wheelRadius,&lt;br /&gt;
                w3 / s.wheelRadius,&lt;br /&gt;
                w4 / s.wheelRadius);&lt;br /&gt;
&lt;br /&gt;
            // 读回 4 路速度&lt;br /&gt;
            var status = s.can.ReadStatus();&lt;br /&gt;
            s.vEstW1 = status.w1; s.vEstW2 = status.w2;&lt;br /&gt;
            s.vEstW3 = status.w3; s.vEstW4 = status.w4;&lt;br /&gt;
            s.eStop  = status.eStop;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
四舵轮变体在上述基础上再加 4 路 steer angle，并把 (vx, vy, omega) → (4 个轮速 + 4 个转向角) 的解算改为 ''每个轮的方向''指向行驶切线 + ''每个轮的轮速'' 等于切线速率。&lt;br /&gt;
&lt;br /&gt;
The 4-steered variant adds 4 steer-angle outputs and solves so each wheel's direction points tangent to its instantaneous motion arc.&lt;br /&gt;
&lt;br /&gt;
== 2. Clumsy 自动驾驶适配 / Clumsy side ==&lt;br /&gt;
全向车需要 ''全向版本''的 Movement —— 不能直接用 `SteeringLineFollowing`（它假设阿克曼 / 差速）。建议家族：&lt;br /&gt;
&lt;br /&gt;
Omni vehicles need ''omni variants'' of the Movements — `SteeringLineFollowing` assumes Ackermann / differential. The recommended family:&lt;br /&gt;
&lt;br /&gt;
* `OmniLineFollowing` — 直线，可指定 ''移动朝向''与 ''车头朝向''独立&lt;br /&gt;
* `OmniArcFollowing` — 圆弧&lt;br /&gt;
* `OmniInPlaceRotate` — 不动平移、原地旋转&lt;br /&gt;
* `OmniSlotFollowing` — 替代 `SlotFollowing` 用于料架跟随&lt;br /&gt;
&lt;br /&gt;
差异点：全向车可以 ''横向接近'' 工位（车头不变向，车身横向移动到工位），常用于狭窄取料场景。&lt;br /&gt;
&lt;br /&gt;
The signature feature: omni can ''side-approach'' a station (car heading fixed, body slides sideways onto target), useful in narrow pick aisles.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public void SideApproachShelf(double sx, double sy, double tx, double ty)&lt;br /&gt;
{&lt;br /&gt;
    Queue(async () =&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        DriveTask.WaitDriveTask(new OmniLineFollowing&lt;br /&gt;
        {&lt;br /&gt;
            srcX = sx, srcY = sy, dstX = tx, dstY = ty,&lt;br /&gt;
            holdHeading = currentTh,   // 保持车头方向&lt;br /&gt;
            basespeed = 300&lt;br /&gt;
        }.Follow());&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;
全向车的包络是 ''圆盘形''（旋转无差异），调度需要的可达性比阿克曼车型多很多。建议在 SimpleComposer 中给全向车型设置：&lt;br /&gt;
* 较小的包络半径（无前后偏置）&lt;br /&gt;
* 更宽松的可达性（无需考虑转向半径）&lt;br /&gt;
&lt;br /&gt;
The omni envelope is a disk (rotation symmetric); reachability is much more permissive than Ackermann. Configure: small disk envelope, no turning-radius constraint in pathfinding.&lt;br /&gt;
&lt;br /&gt;
== 4. 标定与调试 / Calibration &amp;amp; tuning ==&lt;br /&gt;
# '''轮间距与轮径''' / Track + wheel radius —— 每轮独立测，麦克纳姆轮的 ''滚轴角度''（45° 或 -45°）必须配对正确。&lt;br /&gt;
# '''轮间打滑''' / Slip: 同向运行时四轮速差应 &amp;lt; 2%。&lt;br /&gt;
# '''横向移动直线度''' / Sideway straightness: 横移 5 m，偏离 &amp;lt; 50 mm。否则有一轮打滑或方向错。&lt;br /&gt;
# '''带载性能''' / Loaded behaviour: 满载时麦克纳姆轮容易&amp;quot;挤压&amp;quot;地面，横向速度损耗严重，要建立载重-补偿表。&lt;br /&gt;
&lt;br /&gt;
# Per-wheel track + radius — for mecanum the ''roller angle'' (±45°) sign must be correct per corner.&lt;br /&gt;
# Slip: in straight-fwd motion, the 4-wheel speed spread &amp;lt; 2%.&lt;br /&gt;
# Side-shift straightness: 5 m of pure lateral; lateral deviation &amp;lt; 50 mm.&lt;br /&gt;
# Loaded behaviour: heavy loads cause mecanum rollers to scrub; build a load → speed-compensation table.&lt;br /&gt;
&lt;br /&gt;
== 5. 常见问题 / Common pitfalls ==&lt;br /&gt;
* '''横向移动不直''' / Side motion drifts: 通常是滚轴角度对应错（左前 / 右前 / 左后 / 右后 4 个角的滚轴角应为 -45° / +45° / +45° / -45° X 型布局）。&lt;br /&gt;
* '''重载时减速过快''' / Decelerates too fast loaded: 载重 → 加速度上限映射需重做。&lt;br /&gt;
* '''原地旋转有平移''' / In-place rotation drifts: 轮径 / 轮间距标定不准。&lt;br /&gt;
* '''麦克纳姆滚轴磨损快''' / Mecanum rollers wear quickly: 改 4 舵轮设计或限制带载横移用例。&lt;br /&gt;
&lt;br /&gt;
== 6. 在双车联动中作为成员 / In twin-car coordination ==&lt;br /&gt;
[[Special:MyLanguage/双车/多车联动|重载双车联动]] 默认全向车作为主从两台。全向车的 V 形特征槽通常装在车体侧面（联动时两车横向并排，槽侧对槽侧）。&lt;br /&gt;
&lt;br /&gt;
The default twin-car coordination configuration uses two omni AGVs side-by-side, with V-grooves on the lateral faces (side-to-side, not tail-to-tail) so each can observe the other while moving.&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/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]&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>