<?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=%E7%89%B5%E5%BC%95%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=%E7%89%B5%E5%BC%95%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=%E7%89%B5%E5%BC%95%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;action=history"/>
	<updated>2026-05-16T15:07:32Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E7%89%B5%E5%BC%95%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1010&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=%E7%89%B5%E5%BC%95%E8%BD%A6%E9%80%82%E9%85%8D%E6%A1%88%E4%BE%8B&amp;diff=1010&amp;oldid=prev"/>
		<updated>2026-05-16T11:26:53Z</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;
牵引车（也称双阿克曼车型、tow-truck、tractor）的关键特征是 ''有非完整约束''（不能瞬时横移），加上 ''后挂多节拖车''时存在 ''逆向跟踪难''与 ''折叠/失稳'' 风险。MDCS 通过专用 Movement 与额外的拖车包络处理这些问题。&lt;br /&gt;
&lt;br /&gt;
The tractor / double-Ackermann (tow-truck) vehicle has '''non-holonomic constraints''' (can't translate laterally) and, when towing trailers, the difficulties of reverse-tracking, jackknife avoidance, and trailer swing. MDCS handles these via dedicated Movements and trailer envelopes.&lt;br /&gt;
&lt;br /&gt;
参考：浙江中力 (`D:\src\cookbook\adaption-reference\浙江中力\`) 等拖车 / 牵引适配案例。&lt;br /&gt;
References: Zhejiang Zhongli (`adaption-reference\浙江中力\`) and similar.&lt;br /&gt;
&lt;br /&gt;
== 车型变体 / Variants ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 子型 / Sub-type !! 说明 / Description&lt;br /&gt;
|-&lt;br /&gt;
| 单阿克曼 / Single-Ackermann || 前轮转向，后轮驱动，无拖车 / Front-steer, rear-drive, no trailer&lt;br /&gt;
|-&lt;br /&gt;
| 双阿克曼 / Double-Ackermann || 前后都可转向（蟹行）/ Both axles steer (can crab-walk)&lt;br /&gt;
|-&lt;br /&gt;
| 牵引 + 1 挂 / Tractor + 1 trailer || 单个铰接点 / single hitch&lt;br /&gt;
|-&lt;br /&gt;
| 牵引 + N 挂 / Tractor + N trailers || 多铰接，每节带额外的运动学约束&lt;br /&gt;
|-&lt;br /&gt;
| 双向牵引 / Bidirectional tractor || 前后都能作为牵引头 / can lead from either end&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1. Medulla 适配 / Medulla side ==&lt;br /&gt;
关键 IO（以双阿克曼为例）：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public class TowCart : CartDefinition&lt;br /&gt;
{&lt;br /&gt;
    [AsInitParam] public string canIface = &amp;quot;can0&amp;quot;;&lt;br /&gt;
    [AsInitParam] public float  wheelBase = 1450;   // mm&lt;br /&gt;
    [AsInitParam] public float  trackFront = 1100;&lt;br /&gt;
    [AsInitParam] public float  trackRear  = 1100;&lt;br /&gt;
    [AsInitParam] public bool   doubleAckermann = true;&lt;br /&gt;
&lt;br /&gt;
    [AsUpperIO] public float vCmd;&lt;br /&gt;
    [AsUpperIO] public float steerFrontCmd;     // 前轮转角 / rad&lt;br /&gt;
    [AsUpperIO] public float steerRearCmd;      // 后轮转角 / rad  (sign for crab vs co-turn)&lt;br /&gt;
    [AsUpperIO] public bool  brakeOn;&lt;br /&gt;
    [AsUpperIO] public bool  hitchEngaged;      // 挂钩控制 / hitch control&lt;br /&gt;
&lt;br /&gt;
    [AsLowerIO] public float vEst;&lt;br /&gt;
    [AsLowerIO] public float steerFrontEst, steerRearEst;&lt;br /&gt;
    [AsLowerIO] public float hitchAngle1, hitchAngle2, hitchAngle3; // 每节拖车的折角&lt;br /&gt;
    [AsLowerIO] public bool  hitchOK;&lt;br /&gt;
    [AsLowerIO] public bool  eStop;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
铰接角 / Hitch angles：每节拖车与前一节的相对角度，是逆向跟踪与失稳预警的关键状态。`hitchAngleN` 用 IMU 双轴 或 单点编码器测。&lt;br /&gt;
&lt;br /&gt;
The hitch angle of each trailer relative to the one in front is the key state for reverse-tracking and jackknife warning. Measure via dual-axis IMUs or a hitch encoder.&lt;br /&gt;
&lt;br /&gt;
== 2. Clumsy 自动驾驶适配 / Clumsy side ==&lt;br /&gt;
=== 关键 Movement ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Movement !! 用途 / Use&lt;br /&gt;
|-&lt;br /&gt;
| `SteeringLineFollowing` || 正向行驶（单 / 双阿克曼通用）/ forward driving&lt;br /&gt;
|-&lt;br /&gt;
| `SteeringLineFollowingReverse` || 逆向行驶（带 trailer）/ reverse with trailer&lt;br /&gt;
|-&lt;br /&gt;
| `CrabLineFollowing` || 蟹行（仅双阿克曼）/ crab walk (double-Ackermann only)&lt;br /&gt;
|-&lt;br /&gt;
| `TractorTurnAround` || 调头动作（多段曲线）/ multi-segment U-turn&lt;br /&gt;
|-&lt;br /&gt;
| `JackknifeGuard` || 守护线程：检测 hitch 角度过大时刹停 / guard thread for excessive hitch angle&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 逆向跟踪（reverse-track with trailer）===&lt;br /&gt;
带 N 节拖车做逆向跟踪时，运动学是 ''非线性、不稳定''。MDCS 采用：&lt;br /&gt;
&lt;br /&gt;
Reverse-tracking with N trailers is nonlinear and unstable. MDCS uses:&lt;br /&gt;
&lt;br /&gt;
# 在路径规划时 ''禁止''带挂逆向超过 5 m。&lt;br /&gt;
# 仅允许在专用的 ''逆向缓冲区''做带挂倒车，且车速 ≤ 100 mm/s。&lt;br /&gt;
# 控制器：以 ''最后一节拖车''的姿态为状态，通过非线性逆向控制律解算前轴转角。&lt;br /&gt;
# 任何 hitch 角度 ≥ 30° 立即停车 + 报警。&lt;br /&gt;
&lt;br /&gt;
# Path planning forbids reverse-with-trailer &amp;gt; 5 m.&lt;br /&gt;
# Reverse-with-trailer only permitted in dedicated reverse buffer zones at ≤ 100 mm/s.&lt;br /&gt;
# Controller takes the rear-most trailer pose as the state and inverts to front-axle angle.&lt;br /&gt;
# Any hitch angle ≥ 30° → e-stop + alarm.&lt;br /&gt;
&lt;br /&gt;
=== 调头 / U-turn ===&lt;br /&gt;
不带挂的牵引车 ''必须用最小转弯半径以内的曲线段拼接''来调头，常见 K-turn 或 U-turn。MDCS 的 `TractorTurnAround` Movement 包含一个解析的多段 Dubin's 路径生成器，已考虑 wheelBase + minTurnRadius。&lt;br /&gt;
&lt;br /&gt;
A tractor without a trailer needs a multi-segment path within its minimum turning radius. The `TractorTurnAround` Movement uses an analytic Dubin's path generator parameterised by wheelBase and minTurnRadius.&lt;br /&gt;
&lt;br /&gt;
== 3. SimpleComposer 端 / SimpleComposer side ==&lt;br /&gt;
=== 拖车包络 / Trailer envelope ===&lt;br /&gt;
牵引 + N 挂的包络必须由 ''拖车折角''计算 —— 直行时是简单的长矩形，弯路时各节会摆向不同方向，整体包络变成 ''扇形''。&lt;br /&gt;
&lt;br /&gt;
The envelope of a tractor + N trailers is shaped by '''hitch angles'''. Straight-line travel gives a long rectangle; turning causes each segment to swing differently, producing a fan-shaped envelope. SimpleComposer dynamically recomputes this from hitch-angle readings.&lt;br /&gt;
&lt;br /&gt;
=== 调度约束 / Scheduling constraints ===&lt;br /&gt;
* ''最小转弯半径''声明在车型属性中，调度寻路时排除半径过小的弯。&lt;br /&gt;
* ''带挂''与 ''不带挂''是两种不同的可达性状态（[[Special:MyLanguage/可达性状态编程|可达性状态编程]]）。&lt;br /&gt;
* 拖车数量影响交管锁；多挂车一次锁连续多个站点。&lt;br /&gt;
&lt;br /&gt;
* Minimum turn radius declared in car props; pathfinder excludes tighter turns.&lt;br /&gt;
* Towing vs not-towing are two reachability states.&lt;br /&gt;
* Multi-trailer cars take multi-site locks at once.&lt;br /&gt;
&lt;br /&gt;
== 4. 标定与调试 / Calibration &amp;amp; tuning ==&lt;br /&gt;
# '''前轮 / 后轮转角极性''' / Steer polarity: 单独测各轴的左 / 右极性，确认与 IMU 一致。&lt;br /&gt;
# '''单阿克曼直线度''' / Single-Ackermann straight: 直行 10 m 后侧向偏差 &amp;lt; 30 mm。&lt;br /&gt;
# '''双阿克曼蟹行''' / Crab walk: 命令 30° 蟹行 5 m，实际方向偏差 &amp;lt; 1°。&lt;br /&gt;
# '''拖车铰接角度''' / Hitch zero: 静态直拖时 hitchAngle 应 = 0；偏 &amp;gt; 1° 必须重做 IMU 零点。&lt;br /&gt;
# '''极限工况''' / Boundary: 满载 + 满拖 + 最小半径转弯，确认无失稳。&lt;br /&gt;
&lt;br /&gt;
# Steer polarity per axle; confirm IMU sign agreement.&lt;br /&gt;
# Single-Ack straight-line: &amp;lt; 30 mm drift over 10 m.&lt;br /&gt;
# Double-Ack crab-walk: 30° crab × 5 m → heading drift &amp;lt; 1°.&lt;br /&gt;
# Hitch zero: static straight tow → hitchAngle = 0 ± 1°.&lt;br /&gt;
# Boundary: fully-loaded, full trailer train, min-radius turn → no jackknife.&lt;br /&gt;
&lt;br /&gt;
== 5. 常见问题 / Common pitfalls ==&lt;br /&gt;
* '''逆向失控''' / Reverse instability: 拖车超 2 节时控制律不收敛；改成 ''分段倒车''（每次只倒 0.5 m 复位）。&lt;br /&gt;
* '''弯道挂车摆动''' / Trailer swing on curves: 把 `basespeed` 在弯道前先降到 50%，并加大 ''弯道前提早转向''时间。&lt;br /&gt;
* '''hitch 编码器漂''' / Hitch encoder drift: 检查机械连接 + IMU 零点；每天上电后做一次自检。&lt;br /&gt;
* '''带挂掉头空间不足''' / Insufficient room for U-turn: 调度寻路前必须知道拖车节数，否则 `TractorTurnAround` 会规划出穿墙路径。&lt;br /&gt;
&lt;br /&gt;
== 6. 双向牵引 / Bidirectional tractor ==&lt;br /&gt;
双向牵引车前后都可拖挂；切换&amp;quot;主拉端&amp;quot;时，Detour 的车体坐标需要同步 ''翻转 180°''，并切换前向 / 后向激光雷达为 SLAM 主源。&lt;br /&gt;
&lt;br /&gt;
A bidirectional tractor can pull from either end. When swapping the &amp;quot;lead end&amp;quot;, flip the vehicle frame 180° in Detour and switch the primary SLAM lidar from front to rear.&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/潜伏顶升车(KIVA类小车)适配案例|潜伏顶升车(KIVA类小车)适配案例]]&lt;br /&gt;
* [[Special:MyLanguage/可达性状态编程|可达性状态编程]]&lt;br /&gt;
* [[Special:MyLanguage/使用手册 - Simple:包络如何定义|Simple:包络如何定义]]&lt;br /&gt;
&lt;br /&gt;
[[Category:开发手册]]&lt;/div&gt;</summary>
		<author><name>Artheru</name></author>
	</entry>
</feed>