<?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%BB%95%E9%9A%9C%E8%A1%8C%E8%B5%B0</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%BB%95%E9%9A%9C%E8%A1%8C%E8%B5%B0"/>
	<link rel="alternate" type="text/html" href="https://wiki2.lessokaji.com/index.php?title=%E7%BB%95%E9%9A%9C%E8%A1%8C%E8%B5%B0&amp;action=history"/>
	<updated>2026-05-16T14:59:34Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki2.lessokaji.com/index.php?title=%E7%BB%95%E9%9A%9C%E8%A1%8C%E8%B5%B0&amp;diff=1011&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%BB%95%E9%9A%9C%E8%A1%8C%E8%B5%B0&amp;diff=1011&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;
&amp;quot;绕障行走&amp;quot;指 AGV 在 [[Special:MyLanguage/巡线行走|巡线行走]] 的基础上叠加 ''局部障碍感知与降速 / 短距偏避''能力。MDCS 中的绕障 ''不是动态重规划''（那是调度层 SimpleCore 的工作），而是 ''线段内的安全反应''：当前向激光检测到障碍时，先减速到停，必要时小幅横向避让；如果障碍持续存在 &amp;gt; 阈值时间，调度会接管做全局重路径。&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Obstacle-aware line following&amp;quot; adds ''local obstacle perception with deceleration and small lateral avoidance'' on top of [[Special:MyLanguage/巡线行走|line following]]. MDCS does '''not''' do dynamic global re-planning here — that's SimpleCore's job. The Movement-level logic is ''in-segment safety reaction'': decelerate-to-stop on a detected obstacle, optionally small lateral nudge; if the obstacle persists beyond a threshold, the scheduler takes over with a full reroute.&lt;br /&gt;
&lt;br /&gt;
== 与全局重规划的分工 / Division with global replanning ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 层 / Layer !! 触发 / Trigger !! 反应 / Reaction&lt;br /&gt;
|-&lt;br /&gt;
| Clumsy Movement (本页) || 前向激光 ROI 内有点 / Front lidar ROI has points || 减速 / 停车 / 小幅横向避让&lt;br /&gt;
|-&lt;br /&gt;
| SimpleCore 调度 || 障碍持续 &amp;gt; T_obstacle_stale (默认 8 s) || 重新规划该车的路径段&lt;br /&gt;
|-&lt;br /&gt;
| 全局地图重建 || 障碍很久不消失（&amp;gt; T_map_invalid） || 标记地图段为永久不可达&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The split is deliberate: Movement-level responses must be ≤ tens of milliseconds; scheduler-level replanning is hundreds of milliseconds and global. They cooperate via the per-segment &amp;quot;stuck&amp;quot; flag.&lt;br /&gt;
&lt;br /&gt;
== 关键参数 / Key parameters ==&lt;br /&gt;
绕障字段附加在 `SteeringLineFollowing` 之上（或它的&amp;quot;绕障变体&amp;quot;`SteeringLineFollowingWithAvoid`）：&lt;br /&gt;
&lt;br /&gt;
These fields are layered on top of `SteeringLineFollowing` (or its avoidance-aware sibling `SteeringLineFollowingWithAvoid`):&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! 字段 / Field !! 默认 / Default !! 含义 / Meaning&lt;br /&gt;
|-&lt;br /&gt;
| `obstacleROIStart` / `obstacleROIEnd` || 视场前向 ±15° || 障碍检测的角度区间 / FOV slice for obstacle detection&lt;br /&gt;
|-&lt;br /&gt;
| `obstacleROILength` || 1500 mm || 检测距离上限 / max distance considered&lt;br /&gt;
|-&lt;br /&gt;
| `obstacleSlowDist` || 1500 mm || 进入此距离开始降速 / start decelerating&lt;br /&gt;
|-&lt;br /&gt;
| `obstacleStopDist` || 400 mm || 在此距离停车 / hard stop&lt;br /&gt;
|-&lt;br /&gt;
| `obstacleMinPoints` || 4 || 多少个点视为&amp;quot;真障碍&amp;quot;（去抗 ghost）&lt;br /&gt;
|-&lt;br /&gt;
| `lateralAvoid` || `false` || 是否允许小幅横向偏避（仅全向车 / 双阿克曼蟹行可用）&lt;br /&gt;
|-&lt;br /&gt;
| `lateralAvoidMax` || 250 mm || 横向最大偏移 / max lateral nudge&lt;br /&gt;
|-&lt;br /&gt;
| `stuckTimeoutMs` || 8000 || 持续受阻多久后向调度告警 / report-stuck timeout&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 工作机制 / How it works ==&lt;br /&gt;
1. 每个 tick 读最新激光点云 `cachedLidar`（参见 [[Special:MyLanguage/2D激光雷达适配|2D 激光适配]]）。&lt;br /&gt;
2. 用 ROI 过滤：只关心角度在 `[obstacleROIStart, obstacleROIEnd]`、距离在 `[0, obstacleROILength]` 的点。&lt;br /&gt;
3. 统计 ROI 内点数 ≥ `obstacleMinPoints` 时认定&amp;quot;有障碍&amp;quot;，记录 ''最近距离'' d_obs。&lt;br /&gt;
4. 计算速度上限：&lt;br /&gt;
   - d_obs ≥ obstacleSlowDist  → basespeed&lt;br /&gt;
   - obstacleStopDist &amp;lt; d_obs &amp;lt; obstacleSlowDist → 线性插值降速&lt;br /&gt;
   - d_obs ≤ obstacleStopDist → 0（停车）&lt;br /&gt;
5. 如果 `lateralAvoid = true` 且持续受阻 &amp;gt; 500 ms，启用 ''小幅横向偏避''：把虚拟前瞻点向无障碍一侧偏 `lateralAvoidMax`，重新做纯跟踪。&lt;br /&gt;
6. 如果连续受阻 &amp;gt; `stuckTimeoutMs`，把 ''segment stuck'' 标志置 true → SimpleCore 调度立即重新寻路。&lt;br /&gt;
&lt;br /&gt;
1. Each tick read `cachedLidar` from the front lidar.&lt;br /&gt;
2. ROI filter on the angle/distance slice.&lt;br /&gt;
3. Points ≥ `obstacleMinPoints` → mark obstacle, record nearest distance d_obs.&lt;br /&gt;
4. Speed cap: linear ramp between `obstacleStopDist` (0) and `obstacleSlowDist` (basespeed).&lt;br /&gt;
5. If `lateralAvoid` is on, after 500 ms of blockage shift the look-ahead point sideways.&lt;br /&gt;
6. After `stuckTimeoutMs` continuous blockage, flag the segment as stuck → scheduler replans.&lt;br /&gt;
&lt;br /&gt;
== 调用样例 / Example ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
public void DriveAvoiding(double sx, double sy, double dx, double dy)&lt;br /&gt;
{&lt;br /&gt;
    Queue(async () =&amp;gt;&lt;br /&gt;
    {&lt;br /&gt;
        DriveTask.WaitDriveTask(new SteeringLineFollowingWithAvoid&lt;br /&gt;
        {&lt;br /&gt;
            srcX = sx, srcY = sy, dstX = dx, dstY = dy,&lt;br /&gt;
            basespeed = 800,&lt;br /&gt;
&lt;br /&gt;
            obstacleSlowDist  = 1500,&lt;br /&gt;
            obstacleStopDist  = 400,&lt;br /&gt;
            obstacleMinPoints = 4,&lt;br /&gt;
            lateralAvoid      = false,   // 普通阿克曼车关闭&lt;br /&gt;
            stuckTimeoutMs    = 8000&lt;br /&gt;
        }.Follow());&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 positives → 增大 `obstacleMinPoints`（地面反射或飞虫的少量点会被忽略）。&lt;br /&gt;
* '''反应迟钝''' / Slow to react → 减小 `obstacleSlowDist` 接近 `obstacleStopDist`，但太接近会跌停（无平滑减速）。&lt;br /&gt;
* '''横向避让撞两侧''' / Lateral nudge into walls → 减小 `lateralAvoidMax`；或在调度可达性中声明 ''两侧不可避''。&lt;br /&gt;
* '''反复 stuck / replan 抖动''' / Flap between stuck / unstuck → 增大 `stuckTimeoutMs`，避免短暂遮挡引发重路径。&lt;br /&gt;
&lt;br /&gt;
== 全向车与 蟹行避让 / Omni &amp;amp; crab avoidance ==&lt;br /&gt;
全向车与双阿克曼车型可以 ''真'' 横向避让（不改变车头朝向就能侧移）。对应 Movement 是 `OmniLineFollowingWithAvoid` 与 `CrabLineFollowingWithAvoid`，它们的 `lateralAvoidMax` 可以放宽到 600 mm。&lt;br /&gt;
&lt;br /&gt;
Omni and double-Ackermann vehicles can truly translate laterally without yawing. Use `OmniLineFollowingWithAvoid` / `CrabLineFollowingWithAvoid`; `lateralAvoidMax` can be opened up to 600 mm safely.&lt;br /&gt;
&lt;br /&gt;
== 安全 / Safety ==&lt;br /&gt;
绕障 Movement '''不是安全 e-stop''' —— 它的反应时间是 50 ms 量级（Movement tick），而安全 e-stop 必须 &amp;lt; 10 ms 并 ''独立于 Movement 逻辑''。`obstacleStopDist` 之外还必须有：&lt;br /&gt;
&lt;br /&gt;
The Movement is '''not''' a safety e-stop — its reaction is at the ~50 ms tick. Always provide:&lt;br /&gt;
&lt;br /&gt;
* 激光雷达紧急停止区（&amp;lt; 300 mm 内任何点）—— 接到 Medulla 上位 `eStop` 信号上。&lt;br /&gt;
* 物理安全条 / 急停按钮。&lt;br /&gt;
* SIL-2 / PL-d 的功能安全设备（重载场景）。&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>