迁移到dhxdl
This commit is contained in:
+10
@@ -0,0 +1,10 @@
|
|||||||
|
*.aux
|
||||||
|
*.fdb_latexmk
|
||||||
|
*.fls
|
||||||
|
*.log
|
||||||
|
*.pdf
|
||||||
|
*.synctex.gz
|
||||||
|
*.xdv
|
||||||
|
*.bbl
|
||||||
|
*.blg
|
||||||
|
!figs/*.pdf
|
||||||
+6343
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
|||||||
|
# MotionPlan
|
||||||
|
|
||||||
|
main.tex是文本
|
||||||
|
|
||||||
|
输入下述命令,就能编译tex文件了
|
||||||
|
`sudo apt install texlive-full`
|
||||||
|
|
||||||
|
在vsocde里搜索*LaTex Workshop*插件,就能编辑和查看了,甚至还可以使用git来管理版本。
|
||||||
|
|
||||||
|
这不比word方便?
|
||||||
|
|
||||||
@@ -0,0 +1,506 @@
|
|||||||
|
# TVT 投稿修改计划
|
||||||
|
|
||||||
|
目标期刊:IEEE Transactions on Vehicular Technology
|
||||||
|
当前状态:理论四章 + 两附录已完成(中文注释 2.39 万字,97 个公式,PDF 5 页);实验章、结论、摘要为空
|
||||||
|
制定日期:2026-08-21
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 阶段划分与依据
|
||||||
|
|
||||||
|
分四个阶段,顺序不可交换:
|
||||||
|
|
||||||
|
1. **P0 冻结公式** — 后续所有文字都建立在公式之上,公式未定则文字可能作废
|
||||||
|
2. **P1 结构瘦身** — 只做不需要逐句权衡的机械迁移,趁写作记忆新鲜时做
|
||||||
|
3. **P2 补齐实验** — 带篇幅预算写,避免写完再砍
|
||||||
|
4. **P3 包装与收尾** — 新颖性表述、文献、图、润色
|
||||||
|
|
||||||
|
篇幅预算(IEEEtran 双栏,目标 12 页内):
|
||||||
|
|
||||||
|
| 部分 | 页数 | 当前中文字数 | 目标降幅 |
|
||||||
|
|---|---|---|---|
|
||||||
|
| I Introduction + Related Work | 1.5 | 3239 | -15% |
|
||||||
|
| II Problem Formulation | 2.0 | 5759 | -30% |
|
||||||
|
| III IGF | 1.5 | 5139 | -40% |
|
||||||
|
| IV Search | 1.0 | 3718 | -35% |
|
||||||
|
| V Optimization | 1.5 | 4716 | -35% |
|
||||||
|
| VI Experiments | 3.0 | 0 | 新写,上限约 5000 字 |
|
||||||
|
| VII Conclusion | 0.4 | 0 | 新写 |
|
||||||
|
| Appendix(正文内保留) | 0.6 | 1163 | -50%(其余入补充材料) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P0 冻结公式(先做,不写正文文字)
|
||||||
|
|
||||||
|
**状态:P0 全部 9 项已完成**(2026-08-24)。main.tex 与 supplement.tex 均编译通过、无未定义引用。
|
||||||
|
标记约定:`[x]` 已改入正文;`[~]` 公式与论述已就位,实测数值待 P2 填入。
|
||||||
|
|
||||||
|
### P0-1 交互项引入时序权重 ★核心
|
||||||
|
|
||||||
|
**问题**:`J_Psi`(main.tex:248)是全弧长上的无权重对称二重积分,不是 `T_wait` 的单调代理。
|
||||||
|
`T_wait` 对冲突位置高度不对称——冲突在装载位附近则空载车几乎要等满载车跑完全程,
|
||||||
|
冲突在入口附近则几乎不用等。当前核积分对两者计费相同。
|
||||||
|
更关键的是:场地单出入口(main.tex:45)+ 装载位共享位姿(main.tex:337)使
|
||||||
|
**两个端点区域的重叠都是结构性不可消除的**,而 `J_Psi` 数值恰被这两块支配,
|
||||||
|
优化器把力气花在改不动的地方。
|
||||||
|
|
||||||
|
**改法**:按驶离路径的剩余弧长加权
|
||||||
|
|
||||||
|
```
|
||||||
|
J_Psi = (w_Psi / v_0) ∫_{Γ_park} ∫_{Γ_exit} φ(s_exit) · K(d_ε; ρ_Psi, m_Psi) ds_exit ds_park
|
||||||
|
φ(s_exit) = (s_exit^total − s_exit) / v_0
|
||||||
|
```
|
||||||
|
|
||||||
|
物理含义直接是"该处重叠所诱导的等待时长"。
|
||||||
|
|
||||||
|
**连带收益**:非对称性从此有物理来源,不再依赖 main.tex:286 那段
|
||||||
|
"交互项天然对称 → 非对称只能塞进 J_U → 但 w_U^exit/w_U^park 与位移分配无解析对应关系"
|
||||||
|
的辩解。该段从"辩解"改写为"设计"。
|
||||||
|
|
||||||
|
**影响范围**:
|
||||||
|
- [x] 改 main.tex:248-253(eq:cost_interaction)
|
||||||
|
- [x] 改 main.tex:266-268(二重积分性质说明——对称性论述需重写,现在是加权对称)
|
||||||
|
- [x] 重写 main.tex:286-293(非对称加权那一整段)
|
||||||
|
- [x] 改 main.tex:795-803(Psi_exit 交互场定义,加 φ)
|
||||||
|
- [x] 改 main.tex:846-856(eq:joint_psi_discrete 离散形式)
|
||||||
|
- [x] 检查 main.tex:129-136 的代理论证链条是否因此闭合(应当闭合)
|
||||||
|
- [x] 注意:φ 依赖 s_exit^total = (M_exit−1)·Δs_exit,是决策变量。
|
||||||
|
按 P0-4 的处理方式一并冻结为粗解常值,或说明其梯度贡献。
|
||||||
|
|
||||||
|
### P0-2 虚拟道路中线剥离装载位支路 ★核心
|
||||||
|
|
||||||
|
**问题**:两处直接矛盾——
|
||||||
|
- main.tex:363 称装载位变更时引导场**无需重建**(理由:场地边界未变)
|
||||||
|
- main.tex:394 中线是在骨架图上用 A* 连接**入口点、装载点、离开点**得到
|
||||||
|
|
||||||
|
装载点一变,`Λ_center` 就变,两条引导线随之变,场必须重建。审稿人一眼可见。
|
||||||
|
|
||||||
|
**改法**:中线只在**入口—出口主通道**上提取,不含装载位支路;
|
||||||
|
装载位以支路形式在搜索阶段由边界条件(eq:cons_boundary)承担。
|
||||||
|
这样场对装载位变更确实不变,main.tex:363 的主张才站得住。
|
||||||
|
|
||||||
|
**影响范围**:
|
||||||
|
- [x] 改 main.tex:394(中线提取的 A* 连接端点)
|
||||||
|
- [x] 改 main.tex:363(第一阶段框架论述)
|
||||||
|
- [x] 检查 main.tex:588("两条路径独立并行搜索"的论证是否仍成立——应仍成立)
|
||||||
|
- [x] 检查 main.tex:723("越靠近停靠点路径越应从主路径分叉"——与新设定更一致了)
|
||||||
|
|
||||||
|
### P0-3 拓扑一致性:给出定义与度量
|
||||||
|
|
||||||
|
**问题**:Challenge 2 通篇讲"拓扑稳定",但"拓扑"全文无定义,也无任何保证或度量。
|
||||||
|
`U` 只是软代价,Hybrid A* 完全可能在装载位挪到中线另一侧时翻边。
|
||||||
|
三个贡献中这一条目前论证最弱。
|
||||||
|
|
||||||
|
**改法**:
|
||||||
|
- [x] 在 II 章给出形式化定义:路径相对 `Λ_center` 的带符号横向偏移在共享通道段内保持同号
|
||||||
|
- [~] 在实验章给出跨装载位序列的**拓扑一致率**指标(见 P2-2)
|
||||||
|
- [x] 明确说明这是软先验下的经验性质,不声称硬保证(避免被追问反证)
|
||||||
|
|
||||||
|
### P0-4 J_Psi 的量纲与正文声明不符
|
||||||
|
|
||||||
|
**问题**:main.tex:810 称"`J_Psi` 与 `J_U` 同为势能沿路径的弧长积分除以 v_0,
|
||||||
|
故 `w_Psi` 与 `w_U` 具有相同量纲与可比的物理含义"。
|
||||||
|
但 `Ψ_exit = ∫ K ds` 本身带长度单位(K 无量纲),`J_Psi` 因此比 `J_U` 多一个长度量纲,
|
||||||
|
`w_Psi` 与 `w_U^•` 不可比。
|
||||||
|
|
||||||
|
**改法**:择一
|
||||||
|
- (a) 交互核除以一个特征长度(如 `ρ_Psi` 或 `L_v`)使 `Ψ` 无量纲
|
||||||
|
- (b) 保留现状但删掉"同量纲可比"的声明,明确 `w_Psi` 单独标定
|
||||||
|
|
||||||
|
推荐 (a),与全文"统一折算为等效耗时"的口径一致。
|
||||||
|
注意 P0-1 引入 φ(单位:秒)后量纲再变一次,两处需一并算清。
|
||||||
|
|
||||||
|
- [x] 定下处理方式并改 main.tex:805-810
|
||||||
|
- [x] 同步改 Nomenclature 表(main.tex:220 的 w 说明)
|
||||||
|
|
||||||
|
### P0-5 J_ℓ 的存在理由与实际公式不符
|
||||||
|
|
||||||
|
**问题**:main.tex:278 用弹性带经典论证说明 `J_ℓ` 是 `J_κ` 的必要配重
|
||||||
|
("若无长度项,优化器将持续外扩弯道以降低 J_κ")。
|
||||||
|
但离散化后(main.tex:828)`M_•` 由粗解固定、`Δs_•` 是唯一长度自由度,
|
||||||
|
且被 main.tex:750 的信赖域锁在 `±Δ_slide/(M_•−1)` 内。于是
|
||||||
|
`J_ℓ = [(M_park−1)Δs_park + (M_exit−1)Δs_exit]/v_0` 只是两个标量的线性函数,
|
||||||
|
总变动不超过 `2Δ_slide/v_0`。路径长度已被参数化钉死,弹性带论证在此不成立。
|
||||||
|
|
||||||
|
**连带**:
|
||||||
|
- main.tex:162 称"自由终端最优控制问题",实际是准固定长度
|
||||||
|
- main.tex:756 称信赖域取等的外循环"实际触发极少",但粗解长度若偏大 5–10%,
|
||||||
|
单次求解修不回来,与"极少触发"是张力关系
|
||||||
|
|
||||||
|
**改法:已定 —— 采用 (b)**
|
||||||
|
保留现有参数化(`M_•` 固定、`Δs_•` 为唯一长度自由度),
|
||||||
|
把 `J_ℓ` 的作用重新表述为"在固定配置点数下抑制步长膨胀",删掉弹性带论证。
|
||||||
|
|
||||||
|
理由:改动局部,不触碰 P0-1 刚定下的稀疏结构;代价是需要用实测数据支撑
|
||||||
|
"信赖域够宽"这一前提(见下方 checklist 第 4 项)。
|
||||||
|
|
||||||
|
- [x] 改 main.tex:278:删掉弹性带外扩论证(含 `∫κ²ds = Δθ/R` 那句),
|
||||||
|
改为"在 `M_•` 固定的参数化下,`J_ℓ` 抑制 `Δs_•` 膨胀,
|
||||||
|
与 `J_κ` 共同确定弯道的展开程度"
|
||||||
|
- [x] 保留 main.tex:278 末尾对 quinlan 弹性带文献的引用,但改为"同类做法"的弱引用,
|
||||||
|
不再作为本文 `J_ℓ` 的论证依据
|
||||||
|
- [~] 实验中给出 `Δ_slide` 取值与外循环触发率实测(P2-2),
|
||||||
|
用以支撑"信赖域不构成实质限制"
|
||||||
|
- [x] 改 main.tex:162 的"自由终端"表述
|
||||||
|
- [~] main.tex:756 的"触发极少"改为待实测(P2-2 报告)
|
||||||
|
|
||||||
|
### P0-6 避碰约束的表述强度
|
||||||
|
|
||||||
|
**问题**:main.tex:779 称 eq:cons_collision "被**完全替换**为线性不等式组"。
|
||||||
|
实际只在配置点上成立,配置点之间车辆仍可切角。矿卡 `L_v` 十几米、`Δs≈1m` 且伴随转向,
|
||||||
|
切入量不可忽略。
|
||||||
|
|
||||||
|
**改法:已定 —— 走廊内缩余量,不加中点约束**
|
||||||
|
|
||||||
|
余量的解析形式:两个配置点之间车辆绕瞬心转过 `Δθ = Δs/R`,
|
||||||
|
车体某顶点到瞬心距离为 `ρ_c` 时,其轨迹弦的最大矢高(sagitta)为
|
||||||
|
|
||||||
|
```
|
||||||
|
Δ_cut = max_r ρ_c^(r) · (1 − cos(Δs·κ_max / 2)),
|
||||||
|
ρ_c^(r) = ‖ [a_r, b_r]^T − [0, R_min]^T ‖
|
||||||
|
```
|
||||||
|
|
||||||
|
即取四个顶点中离瞬心最远者。走廊生成时统一内缩 `Δ_cut` 即可覆盖点间切角。
|
||||||
|
|
||||||
|
按矿卡尺度实算(`R_min=12m`、`L_v=12m`、`B_v=3m`,最远顶点 `ρ_c≈17.7m`):
|
||||||
|
|
||||||
|
| `Δs` | 最大切入量 |
|
||||||
|
|---|---|
|
||||||
|
| 0.5 m | 0.4 cm |
|
||||||
|
| 1.0 m | 1.6 cm |
|
||||||
|
| 1.5 m | 3.5 cm |
|
||||||
|
| 2.0 m | 6.3 cm |
|
||||||
|
| 3.0 m | 14.1 cm |
|
||||||
|
|
||||||
|
**结论:在 `Δs ≤ 1.5m` 时切入量 ≤ 3.5cm,一次性内缩即可覆盖,中点约束确无必要。**
|
||||||
|
这也反过来给 `Δs` 定了上界——`Δs = 3m` 时 14cm 已接近矿区常用安全余量的量级,
|
||||||
|
故配置步长不宜再放大。此项同时为 P2 的 `Δs` 取值提供依据。
|
||||||
|
|
||||||
|
- [x] 改 main.tex:779:措辞从"完全替换"改为
|
||||||
|
"离散配置点上的**充分条件**,配置点之间的切角由走廊内缩 `Δ_cut` 覆盖"
|
||||||
|
- [x] 走廊构造中加入内缩步骤(与 `Δ_slide` 的种子延伸是两个独立余量,勿混淆:
|
||||||
|
`Δ_slide` 处理**纵向**滑移,`Δ_cut` 处理**横向**切角)
|
||||||
|
- [x] 上式推导 + 数值表入补充材料 S-IV-E(占位已建)
|
||||||
|
- [~] 正文声明所采用的 `Δs` 及对应 `Δ_cut` 实际值(P2-2 一并报告)
|
||||||
|
|
||||||
|
### P0-7 σ_max 的量纲转换
|
||||||
|
|
||||||
|
**问题**:物理限制是 `ψ̇`(时间导数),main.tex:328 约束的是弧长导数,相差 `v`。
|
||||||
|
以 `v_0` 折算意味着在装载位附近低速段**过度保守**——恰是空间最紧的地方。
|
||||||
|
|
||||||
|
**改法**:
|
||||||
|
- [x] 至少显式说明该保守性及其来源
|
||||||
|
- [~] 或按分段速度剖面给分段 `σ_max`(更严谨,改动小)
|
||||||
|
|
||||||
|
### P0-8 归一化场值可超出 [0,1]
|
||||||
|
|
||||||
|
**问题**:main.tex:526 自承 `U_e^max` 在凹角处只是估计而非上界,
|
||||||
|
故 main.tex:580 归一化后 `Û` 可能 > 1。下界安全(`U ≥ −U_g^max` 严格成立,A* 非负性无碍),
|
||||||
|
但全文把 `U∈[0,1]` 当作"等效减速因子"来解释 `w_U` 的物理含义。
|
||||||
|
|
||||||
|
**改法**:
|
||||||
|
- [x] 加一句截断说明(`Û ← min(Û, 1)`),或明确 `Û∈[0,1]` 为典型范围而非严格值域
|
||||||
|
|
||||||
|
### P0-9 冻结求积权重的理由改写
|
||||||
|
|
||||||
|
**问题**:main.tex:858 称不冻结会在 Hessian 里形成"两整行稠密结构"。
|
||||||
|
但那是 10^4 量级问题里的 2 行,稀疏内点法完全吃得下。理由偏弱,易被质疑。
|
||||||
|
|
||||||
|
**改法**:
|
||||||
|
- [x] 改为"实现简化 + 误差有界可忽略"(误差界你已经给了,照这个说更可信),
|
||||||
|
删掉把稀疏性当主因的表述
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P1 结构瘦身(与 P0 并行,只做机械迁移)
|
||||||
|
|
||||||
|
已建 `supplement.tex`(S 前缀独立编号,已编译通过)。以下内容迁入,正文只留结论 + 指针。
|
||||||
|
|
||||||
|
### P1-1 已在 supplement 建好占位,待迁正文原文
|
||||||
|
|
||||||
|
- [x] **S-I** 引导场上界推导与场强系数标定 ← main.tex:510-533, 566-577
|
||||||
|
正文保留:`U_g^max`/`U_e^max` 表达式、eq:alpha_dominance 标定条件
|
||||||
|
- [x] **S-II** 栅格场连续化表示(B 样条 vs 双线性) ← main.tex:560-563
|
||||||
|
正文保留:一句"以张量积三次 B 样条查询,核衰减阶数取 m≥3"
|
||||||
|
- [x] **S-III** 联立 vs 交替优化论证 ← main.tex:888-896
|
||||||
|
正文保留:一句结论 + 指针
|
||||||
|
- [x] **S-IV** 凸走廊构造完整推导 ← main.tex:970-1008(原附录 B 整节)
|
||||||
|
正文保留:凸多面体最终形式 + "半空间由局部边界点分布自适应确定"
|
||||||
|
|
||||||
|
### P1-2 元论述段落精简
|
||||||
|
|
||||||
|
**状态:已完成**(2026-08-24)。14 处压缩全部落地,另加 main.tex:958-959 的 $\tau_{ij}$ 两段合并;三处影响正确性的论述按计划保留。
|
||||||
|
|
||||||
|
全文 22 处"需要说明/需要强调/需要指出/此处作一点说明"式防御性论述。
|
||||||
|
**保留三处**(影响正确性):
|
||||||
|
- `J_U` 与 `J_Psi` 不重复计费(main.tex:283)
|
||||||
|
- 与传统 APF 的本质区别(main.tex:564)
|
||||||
|
- 启发函数不可采纳性(main.tex:725)
|
||||||
|
|
||||||
|
其余压缩到一两句或删除:
|
||||||
|
- [x] main.tex:172-173, 258(符号约定说明 → 已有 Nomenclature 表,删重复)
|
||||||
|
- [x] main.tex:319(换挡点曲率可跳变 → 压成半句)
|
||||||
|
- [x] main.tex:347(装载位共享位姿的解释 → 保留结论,删"可理解为一条更长路径被切分")
|
||||||
|
- [x] main.tex:445(QCQP 凸性 + OSQP 接口说明 → 压成两句)
|
||||||
|
- [x] main.tex:511, 526-527(上界前提与凹角例外 → 入 S-I)
|
||||||
|
- [x] main.tex:575, 577(支配条件的逐点/上界之辨、线性叠加理由 → 入 S-I)
|
||||||
|
- [x] main.tex:586(归一化标度一致性 → 压成一句)
|
||||||
|
- [x] main.tex:631-632(状态格仅作判重键 → 压成一句)
|
||||||
|
- [x] main.tex:667(分辨率完备性 + 碰撞检测细分 → 保留后半,前半压缩)
|
||||||
|
- [x] main.tex:674(解析段与两点设定的关系 → 压成两句)
|
||||||
|
- [x] main.tex:701(弧长加权而非节点计数 → 与 main.tex:812 重复,合并保留一处)
|
||||||
|
- [x] main.tex:786(两阶段两种解耦机制 → 压缩,与 main.tex:283 有重叠)
|
||||||
|
- [x] main.tex:898(初值处交互项非零的性质 → 压成一句脚注)
|
||||||
|
|
||||||
|
### P1-3 公式数量压缩
|
||||||
|
|
||||||
|
**状态:已达标**(2026-08-24)。正文编号式 53 个(`main.aux` 计数,含 subequations 子项),
|
||||||
|
远低于 65 的目标;`\label{eq:` 计数 91 → 其中含 14 组 subequations 的父/子标签。
|
||||||
|
|
||||||
|
- [x] 内联的简单定义:`eq:qp_delta_s`($\ell_i$ 平均段长)、`eq:field_source_sets`(三个势源集合)、
|
||||||
|
`eq:field_grid`(栅格点集 $\Xi$)、`eq:corner_transform`(角点刚体变换 2 式)
|
||||||
|
- [x] 附录 A「曲率二阶差分离散化」整节 6 式迁入 **S-V**,正文只留换算关系 + 误差量级一句
|
||||||
|
($R_\text{min}=12$ m、$\ell=1$ m 时 $0.06\%$,且偏保守)+ 指针
|
||||||
|
- [x] `\appendices` 环境连同 `\counterwithin` / `\theHequation` 锚点设置一并删除
|
||||||
|
(附录 A 入 S-V、附录 B 已于 P1-1 入 S-IV,正文再无附录)
|
||||||
|
- [x] 补充材料章节序重排:新增 S-V,原「实现细节与补充结果」顺延为 **S-VI**;
|
||||||
|
main.tex 中指向消融表的 S-V 指针已同步改为 S-VI
|
||||||
|
- 保留未内联:`eq:tangent_normal`(被 2 处 `\eqref` 引用)、`eq:reference_offset`(被 3 处引用),
|
||||||
|
内联会使这些交叉引用失去锚点,收益不抵可读性损失
|
||||||
|
|
||||||
|
**遗留(P3 校对时一并处理)**:24 个 `\label{eq:...}` 目前零引用,多为 subequations 内的
|
||||||
|
子式标签(`eq:qp_obj1`–`4`、`eq:joint_obj/eq/ineq`、`eq:cons_bc_park/exit` 等)。
|
||||||
|
草稿阶段正文为注释,去掉注释后部分会被引用;投稿前清一次真正无用的标签。
|
||||||
|
|
||||||
|
### P1-4 写作纪律(从现在起)
|
||||||
|
|
||||||
|
- [x] 凡判断为"脚注级但有价值"的段落,**直接写入 supplement.tex**,不进主文
|
||||||
|
- [x] 决定放哪里的成本在写的当下最低,不要留到最后挑
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P2 补齐实验(P0 完成后开始,带预算写)
|
||||||
|
|
||||||
|
### P2-1 修掉悬空引用
|
||||||
|
|
||||||
|
- [x] 已建第 VI 章 Experiments 骨架,8 个小节标签全部定义:
|
||||||
|
`sec:exp`、`subsec:exp_setup`、`subsec:exp_baselines`、`subsec:exp_throughput`、
|
||||||
|
`subsec:exp_geometry`、`subsec:exp_topology`、`subsec:exp_efficiency`、
|
||||||
|
`subsec:exp_ablation`、`subsec:exp_realvehicle`。
|
||||||
|
各小节内以注释形式列明待填指标,无未定义引用。
|
||||||
|
|
||||||
|
### P2-2 基线与指标(最低配置)
|
||||||
|
|
||||||
|
**状态:实验设计已定稿写入正文**(2026-08-24,`subsec:exp_baselines`)。
|
||||||
|
五类基线各自"只回答一个问题"的定位、九项指标的分组与判定方式均已落在 main.tex;
|
||||||
|
下列勾选表示**设计已写定**,实测数据待补。
|
||||||
|
|
||||||
|
**基线**(每项只剥离一处设计选择):
|
||||||
|
- [x] ① 双路径独立 Hybrid A* + 优化(无场、无交互项)→ 回答"是否需要双向先验"
|
||||||
|
- [x] ② 固定渠化规则(预设双向参考路线)→ 回答"自动提取 vs 人工预设"
|
||||||
|
- [x] ③ 交替优化而非联立 → 为 S-III 的论证提供实证
|
||||||
|
- [x] ④ 同索引点距惩罚 → subsec:objective 已论证其不适用,此处给实证
|
||||||
|
- [x] ⑤ 时间维协同调度作为性能上界 → **代理关系的唯一直接检验,不可省**
|
||||||
|
|
||||||
|
**指标**(三组):
|
||||||
|
- [x] 组一(代理目标有效性):`T_wait` 相对基线①的压缩幅度;离散事件仿真吞吐量(趟/小时),
|
||||||
|
须与基线⑤的上界对照
|
||||||
|
- [x] 组二(几何与拓扑):扫掠域重叠面积、两路径最小间距分布、
|
||||||
|
按 `eq:topology_consistency` 判定的拓扑一致率
|
||||||
|
- [x] 组三(计算性质):求解时间与成功率(≥100 组随机装载位)、
|
||||||
|
搜索阶段**墙钟时间与扩展节点数并列**(每次扩展多 6 次基元积分 + 6 次场查询,
|
||||||
|
节点数降但单节点变贵,只报节点数会被打回)、走廊半空间数 `m_k` 分布与最大值、
|
||||||
|
信赖域外循环触发率、热启动 vs 冷启动迭代数对照
|
||||||
|
- [ ] 全部实测数据(待实验)
|
||||||
|
|
||||||
|
### P2-2c 消融设计(已写入 `subsec:exp_ablation`)
|
||||||
|
|
||||||
|
- [x] 四项逐一剥离:`tau_d ≡ 1`、去 `J_Psi`、去场自适应步长、`w_U` 对称化
|
||||||
|
- [x] 正文只报 (1)(2) 主要指标,完整表入 S-VI
|
||||||
|
- [ ] 实测数据(待实验)
|
||||||
|
|
||||||
|
### P2-2b 实车验证(★ 本文最硬的一块,单独成小节)
|
||||||
|
|
||||||
|
**状态:小节结构与论证分工已写入正文**(2026-08-24,`subsec:exp_realvehicle`)。
|
||||||
|
定位已明确写为"不是可行性演示,而是检验前文两处以标称值作出的解析论断"。
|
||||||
|
|
||||||
|
**必须交代的试验条件**(已在正文列明待填):
|
||||||
|
- [x] 矿卡型号与关键参数(`L_v`、`B_v`、`L_w`、`R_min`、实测 `ψ̇_max`)
|
||||||
|
- [x] 场地规模、边界感知方式(激光雷达型号/点云分辨率 → `bar_ell_e` 实际取值)
|
||||||
|
- [x] 试验规模:装载循环次数、覆盖的装载位数量、总里程/时长
|
||||||
|
- [x] 定位方案与精度(须与所报误差量级一并给出,否则误差数据不可信)
|
||||||
|
|
||||||
|
**承担两项独立论证**(分工已写定):
|
||||||
|
1. **跟踪可行性**(检验 `eq:sigma_time_conversion` 的折算与 `σ_max` 取值)
|
||||||
|
- [x] 横向误差沿弧长分布,尤其换向段与装载位邻域
|
||||||
|
- [x] 实测前轮转角速率是否触顶 —— 正文已如实写明不利可能:低速段大量触顶
|
||||||
|
则说明以 `v_0` 折算偏松而非偏保守,`σ_max` 应改由分段速度剖面给出
|
||||||
|
- [x] 实测车体轮廓到边界最小间隙,与 `eq:corner_cut_margin` 的 `Δ_cut` 对照
|
||||||
|
2. **吞吐量增益**(与离散事件仿真互为验证)
|
||||||
|
- [x] 实测 `T_wait`/`T_park`/`T_exit` 与仿真预测对照
|
||||||
|
- [x] 与现行作业方式的趟/小时对比
|
||||||
|
- [ ] 全部实测数据(待实验)
|
||||||
|
|
||||||
|
**对照组安排**:已写定实车只跑①与本文方法两组。
|
||||||
|
- [x] 理由已明确写出:基线②--⑤或需改动既有作业规则、或需放开时间维调度权限,
|
||||||
|
生产矿区不具备实施条件。如实说明以免被理解为回避不利对比。
|
||||||
|
|
||||||
|
### P2-3 T_wait 下界的论证
|
||||||
|
|
||||||
|
**状态:已完成**(2026-08-24),按推荐方案降级为实测值。
|
||||||
|
- [x] main.tex:138 不再断言存在下界,改为:给出会车所需通道净宽的几何条件
|
||||||
|
(`W + B_v` 加两侧安全间隔,且 `W` 自身受 `eq:interaction_radius` 约束),
|
||||||
|
指出该条件在最窄处不成立时 `T_wait` 必为正;
|
||||||
|
并**明确声明不给出闭式下界**——它取决于最窄区段长度与两车速度剖面,
|
||||||
|
构造性推导须引入本文有意排除的时间维决策量。改以实测值与压缩幅度报告。
|
||||||
|
|
||||||
|
### P2-4 实时性与刷新频次
|
||||||
|
|
||||||
|
**状态:已完成**(2026-08-24),在 `subsec:igf_build` 末尾新增两段。
|
||||||
|
- [x] 以**时间尺度分离**回应:IGF 输入只有边界点集 `S_e`,中线不过装载位、
|
||||||
|
故场对装载位变更不敏感;重建只由边界几何实质变化触发,典型为**班次级**
|
||||||
|
(爆破或一段推进之后),远长于装载循环的分钟级节拍。
|
||||||
|
两次重建之间装载位变更只重解路径、场不变 —— 即镜像构造的工程收益:
|
||||||
|
拓扑先验的有效期由边界而非装载位决定。
|
||||||
|
- [x] 移动障碍(挖掘机、其他车辆)**不纳入 `S_e`**,理由是重建代价与其运动时间尺度
|
||||||
|
不匹配;由凸走廊在每次重规划时以当次感知快照施加硬约束避让。
|
||||||
|
并据此界定适用边界:IGF 承担随边界缓变的**通行拓扑**,非随车流快变的**瞬时占据**。
|
||||||
|
- [ ] 场重建耗时与重规划频次的实测值(待实验,已在 `subsec:exp_setup` 挂钩)
|
||||||
|
|
||||||
|
### P2-5 结论与摘要
|
||||||
|
|
||||||
|
**状态:已写定,留数字占位**(2026-08-24)。
|
||||||
|
|
||||||
|
- [x] Abstract(原为 `yes`):按 P3-1 的要求,**第二句即点出三点新颖性**
|
||||||
|
(离线镜像场固化拓扑 / 时延加权核积分交互代价 / 非对称引导权重),
|
||||||
|
随后三句方法、一句验证规模(五基线 + 实车 N 次循环)、一句结果。
|
||||||
|
**数字以 `($x$)`、`($y$)`、`($z$)`、`($N$)` 占位**,待实测替换。
|
||||||
|
- [x] IEEEkeywords:Autonomous mining vehicles / path planning / open-pit mine /
|
||||||
|
spatial decoupling / guidance field / joint optimization / convex corridor
|
||||||
|
- [x] Conclusion:三点结论对应三点新颖性;第二段主动交代适用边界
|
||||||
|
(IGF 管缓变拓扑非瞬时占据、优化的是吞吐量必要条件、拓扑一致性为软先验),
|
||||||
|
并给出两个后续方向。末尾留 TODO:补量化结论句,与 Abstract 占位数字同步替换。
|
||||||
|
- [ ] Conclusion(main.tex:900 空)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## P3 包装与收尾
|
||||||
|
|
||||||
|
### P3-1 新颖性表述重做 ★
|
||||||
|
|
||||||
|
**风险**:按模块拆解,全部是现成件——EVG-thin 骨架 + Apollo FEM-pos 平滑 + Hybrid A*
|
||||||
|
+ 椭球凸分解走廊(safe flight corridor 那条线)+ APF 式核场 + Ipopt。
|
||||||
|
审稿人给 "engineering integration, insufficient novelty" 的概率高。
|
||||||
|
|
||||||
|
**真正新的只有三点**,必须顶到 Abstract 第二句和 Contributions 最前:
|
||||||
|
1. 镜像方向性场把双向拓扑**前置固化到离线**(拓扑要求从在线约束变为离线先验)
|
||||||
|
2. 核积分式交互代价(不依赖采样点配对,适配两条路径的弧长/分段非对称)
|
||||||
|
3. 非对称引导权重(满载优先的工程语义)
|
||||||
|
|
||||||
|
- [ ] 重写 Contributions 三段,每段明确"与最接近工作的差别是什么"
|
||||||
|
- [ ] **主动引单向交通组织文献**:矿区运输道路单向流设计、AGV 单向流网络是成熟做法,
|
||||||
|
不引会让"空间解耦"看起来像重新发明单行道。
|
||||||
|
差异点:非结构化、边界随开采变化、含换向段的运动学可行路径、双路径联合优化
|
||||||
|
|
||||||
|
### P3-2 参考文献
|
||||||
|
|
||||||
|
当前 29 条,TVT 常规 40–60。质量分布也偏弱:6 条 arXiv 预印本、
|
||||||
|
5 条 MDPI 刊(Applied Sciences / Symmetry / Electronics / Machines / Aerospace),
|
||||||
|
仅 1 条 TVT/T-IV。
|
||||||
|
|
||||||
|
- [ ] 补到 40+,优先补 TVT / T-ITS / T-ASE / RA-L 正式发表文献
|
||||||
|
- [x] arXiv 条目尽量替换为已发表版本
|
||||||
|
- [x] **正面讨论已在 bib 但全文未引的三条**(审稿人必问的对照方法):
|
||||||
|
- `zhang2021obca`(OBCA — 避碰约束的对偶形式,与本文凸走廊直接可比)
|
||||||
|
- ~~`li2022narrowparking`~~ → 已替换为 `lian2023valetparking` + `li2022parkingcorridor`
|
||||||
|
- `dolgov2010voronoi`(Voronoi 场 — 与 IGF 最接近的先前工作,**必须明确差异**)
|
||||||
|
|
||||||
|
**2026-08-24 进展**:refs.bib 29 → 33 条,`bibtex` 零警告(此前 15 条 empty-author)。
|
||||||
|
|
||||||
|
清理内容:
|
||||||
|
- `li2022narrowparking` 是凭记忆写的占位条目,该标题在 Crossref 查无此文,**实际不存在**。
|
||||||
|
已替换为两篇真实文献:`lian2023valetparking`(T-IV 2023, 8(6):3723–3734)与
|
||||||
|
`li2022parkingcorridor`(Bai Li, T-ITS 2022, 23(8):11970–11981)。main.tex:98
|
||||||
|
相应改写为"粗解引导 + 走廊化避碰",该说法已核对两篇摘要确认。
|
||||||
|
- 4 条 arXiv 预印本查到正式发表版并替换:`mine2024unstructured`(LNEE 2025 章节,
|
||||||
|
作者含 Guizhen Yu)、`ramp2024spatiotemporal`(ICTLE 2024)、
|
||||||
|
`apf2024globalrepulsive`(ICARM 2024)、`apf2024wallfollower`(ICRA 2025)、
|
||||||
|
`corridor2024convexcover`(RA-L 2025, 10(5):4762–4769)。
|
||||||
|
- `apf2024globalrepulsive` 的真实内容是 subharmonic APF,与原占位标题
|
||||||
|
"Improved APF Addressing Local Minimum and Goal Unreachability" 不符。
|
||||||
|
main.tex:103 与 474 两处原写"目标不可达",已按两篇实际论点改为
|
||||||
|
"局部极小致停滞"(wallfollower)+ "贴近障碍处势场导数急剧增大"(globalrepulsive)。
|
||||||
|
- `apollo2020qp` 作者列表原先整个写错(Zhou/He/Wang… ),Crossref 实为
|
||||||
|
Yajia Zhang, Hongyi Sun, Jinyun Zhou, Jiacheng Pan, Jiangtao Hu, Jinghao Miao。
|
||||||
|
- `fan2018apolloem` 确无正式发表版,保留 arXiv 但补 eprint/archivePrefix/primaryClass。
|
||||||
|
|
||||||
|
仍待办:补到 40+(当前 33)。MDPI 占比偏高的问题未解决,宜在补引时用
|
||||||
|
TVT/T-ITS/T-ASE/RA-L 正式文献替换部分 MDPI 条目。
|
||||||
|
|
||||||
|
方法学教训:文献必须经 Crossref/arXiv 核实,不可凭记忆重建。
|
||||||
|
`api.crossref.org` 与 `export.arxiv.org`(须用 https)可 curl;
|
||||||
|
`link.springer.com`、`pubsonline.informs.org`、`www.mdpi.com` 在本环境被 WebFetch 拦截。
|
||||||
|
|
||||||
|
### P3-3 图与算法
|
||||||
|
|
||||||
|
全部图已画好并接入正文(`\graphicspath{{figs/}}`,均按原生尺寸 `\includegraphics` 引入、不缩放):
|
||||||
|
- [x] `fig_scenario`(装载场景)— TikZ,251.6×121.9 pt
|
||||||
|
- [x] `fig_conflict`(时空冲突与解耦,(a)-(d) 四联图)— TikZ,251.2×143.7 pt
|
||||||
|
- [x] `fig_bicycle`(车辆模型与几何参数)— TikZ,251.8×238.5 pt
|
||||||
|
- [x] `fig_framework`(三阶段框架)— TikZ,198.8×231.1 pt
|
||||||
|
- [x] IGF 可视化(`make_igf.py`,三联板:势源 / $\hat U_\text{park}$ / $\hat U_\text{exit}$)— 515.5×126.0 pt,`figure*`
|
||||||
|
- [x] 骨架+搜索、走廊+平滑后对比(`make_center.py`,三联板:距离场+骨架+A\* / 局部走廊+QP / 曲率剖面)— 515.5×140.4 pt,`figure*`
|
||||||
|
- [x] 6 探测点方位与步长调制示意(`fig_probe.tex`)— 152.4×287.0 pt
|
||||||
|
- [x] 凸分解几何示意(`fig_convex_decomp.tex`,接入 supplement S-IV)— 250.0×97.2 pt
|
||||||
|
- [x] 整体流程伪代码(`alg:overall`,algorithm2e,三阶段 17 行)
|
||||||
|
|
||||||
|
#### 2026-08-24 进展(P3-3 完成)
|
||||||
|
|
||||||
|
**图的生成方式分两类**,这一区分必须在投稿时保持:
|
||||||
|
- 纯示意图(scenario / conflict / bicycle / framework / probe / convex_decomp)用 TikZ 按正文定义直接画,坐标凡涉及运动学或几何的一律先用 Python 算准再写入 `.tex`(`calc_convex.py` 就是为凸分解图算椭球半轴、半空间法向与多面体顶点的)。
|
||||||
|
- 算法产物图(`fig_igf` / `fig_center`)由 Python **按正文公式在合成场地上真算**,图注已明确写 "illustrates the construction and is not an experimental result",避免被误读为实验结果。
|
||||||
|
|
||||||
|
**共享模块**:
|
||||||
|
- `figs/figstyle.tex` — TikZ 图共用前言,`mathptmx` 对齐 IEEEtran 的 Times;颜色 `parkc/exitc/sitec/fillc/corrc/centc/confc`。
|
||||||
|
- `figs/sitegeom.py` — 合成场地几何与 stage-1 全流程(`rasterize` / `clearance` / `skeleton` / `astar` / `qp_smooth` / `build_centerline`),`fig_igf` 与 `fig_center` 共用,保证两图的中线与引导线完全一致。
|
||||||
|
|
||||||
|
**数值自检(全部通过,改动 sitegeom/make_* 后须重跑确认)**:
|
||||||
|
- 中线曲率 `|κ|max = 0.0832 → R = 12.01 m ≥ R_min = 12 m`;粗解为 `0.6278 → R = 1.59 m`,即 `fig_center(c)` 的对比是真实的。
|
||||||
|
- IGF 镜像恒等式残差 `|(U_park+U_exit) − 2U_e| = 1.8e-15`。
|
||||||
|
- 方向性验证:`Û_park` 在 $\Lambda_\text{park}$ 上均值 0.033、在 $\Lambda_\text{exit}$ 上 0.159;`Û_exit` 为 0.155 / 0.037,即两个场确实互为镜像。
|
||||||
|
- 凸分解:14 个障碍点剪到 7 个半空间、多面体 7 顶点且封闭;障碍点二次型最小值 = 1.000000(恰好相切),线段二次型最大值 = 1.000000(完整包裹)。
|
||||||
|
|
||||||
|
**踩过的坑(同类图再画时直接照搬结论)**:
|
||||||
|
- `qp_smooth` 的曲率投影必须放在走廊投影**之后**,否则被走廊投影撤销;且二阶差分上界 `ell_i²/R_min` 必须在**每轮迭代按当前折线自身间距**重算,用参考折线的间距会导致"约束满足但验证不过"(前后差 1.0 m vs 0.953 m,够把 R 从 12.6 m 拉到 10.9 m)。
|
||||||
|
- 归一化场只落在 0–0.34(`U_e^max = 17` 这个解析上界很保守,正文亦承认它只是量级估计),配色范围必须取实际跨度而非 [0,1],否则两个面板几乎全黑;两个面板共用一个色标,镜像关系才看得出来。
|
||||||
|
- 凸多面体在轴向两端不会自动封口——线段延长线方向若无障碍点,`|u| > 1` 的点不约束短轴但**决定纵向封口**,必须补端部障碍点。
|
||||||
|
- 三张 TikZ 图原本略超 252 pt 单栏宽(bicycle/scenario/conflict),已通过下调 `scale` 原生适配,而不是靠 `\includegraphics[width=...]` 缩放——后者会把 `\tiny`/`\scriptsize` 标注压到不可读。
|
||||||
|
|
||||||
|
**顺带修掉的两处 overfull**(均为公式超单栏宽,非图的问题):
|
||||||
|
- `eq:corner_cut_margin` 超 35.9 pt → 改为 `aligned` 两行。
|
||||||
|
- `eq:interaction_field` 超 12.6 pt → 改为 `multline`。
|
||||||
|
- 余下 5 处 overfull 均 ≤1.5 pt,是图注段落的正常挤压,不处理。
|
||||||
|
|
||||||
|
**当前编译状态**:main 7 页、supplement 2 页,两者 exit=0,无 error、无未定义引用/引文。7 张图 + 1 个算法环境均已在正文有 `\ref` 提及(IEEE 要求),补充材料的 `fig:sup_convex_decomp` 亦已在 S-IV 开头引用。
|
||||||
|
|
||||||
|
**注意**:`.gitignore` 含 `*.pdf`,图的 PDF 产物当前不入库。投稿前需决定是 `git add -f figs/*.pdf`,还是在 `.gitignore` 里对 `figs/` 开例外(推荐后者,`!figs/*.pdf`),否则 clone 出来编译不过。
|
||||||
|
|
||||||
|
### P3-4 投稿前检查
|
||||||
|
|
||||||
|
- [ ] 删 main.tex:1012 与 supplement.tex 末尾的 `\nocite{*}`
|
||||||
|
- [ ] 确认无未定义引用(`grep` 检查 label/ref 配对)
|
||||||
|
- [ ] 更新致谢中的基金号(main.tex:26 标注"需更新")
|
||||||
|
- [ ] 页数核对,超页则从 supplement 迁移策略再走一轮
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 备注:期刊选择 —— 已定 TVT
|
||||||
|
|
||||||
|
有实车验证,期刊选择不再是取舍项,投 TVT。
|
||||||
|
|
||||||
|
实车数据是本文相对同类工作最硬的一块,务必用足:
|
||||||
|
- 在 Abstract 与 Introduction 末尾**明确点出实车验证**(矿卡型号/场地规模/试验规模),
|
||||||
|
这是 TVT 审稿人最先找的信息
|
||||||
|
- 实车部分不要只作为"可行性演示"附在最后,应作为独立小节承担
|
||||||
|
**跟踪可行性**(曲率连续性、`σ_max` 是否真的够用)与**吞吐量增益**两项论证
|
||||||
|
- 详见 P2-2 的实车指标清单
|
||||||
@@ -0,0 +1,559 @@
|
|||||||
|
# `main.tex` 第 841--843 行详解
|
||||||
|
|
||||||
|
本文档解释 `eq:joint_psi_discrete` 为什么能同时影响两条路径、有限支撑核为什么会产生稀疏 Hessian,以及第 843 行所谓“块对角结构”到底是什么意思。
|
||||||
|
|
||||||
|
## 1. 先把决策变量拆开
|
||||||
|
|
||||||
|
联合优化变量写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf z=
|
||||||
|
\begin{bmatrix}
|
||||||
|
\mathbf z_{\mathrm{park}}\\
|
||||||
|
\mathbf z_{\mathrm{exit}}
|
||||||
|
\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
其中,$\mathbf z_{\mathrm{park}}$ 包含泊入路径的全部配置点状态、区间控制量和弧长步长,$\mathbf z_{\mathrm{exit}}$ 同理。每条路径的变量维数为
|
||||||
|
|
||||||
|
$$
|
||||||
|
n_{\mathrm{park}}=5M_{\mathrm{park}},
|
||||||
|
\qquad
|
||||||
|
n_{\mathrm{exit}}=5M_{\mathrm{exit}},
|
||||||
|
$$
|
||||||
|
|
||||||
|
所以 $\mathbf z\in\mathbb R^{n_z}$,其中
|
||||||
|
|
||||||
|
$$
|
||||||
|
n_z=n_{\mathrm{park}}+n_{\mathrm{exit}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
这里的 $5M_\bullet$ 来自 $M_\bullet$ 个四维状态、$M_\bullet-1$ 个控制量以及一个弧长步长。
|
||||||
|
|
||||||
|
第 $i$ 个泊入路径位置是
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf p_i^{\mathrm{park}}
|
||||||
|
=
|
||||||
|
\begin{bmatrix}x_i^{\mathrm{park}}\\y_i^{\mathrm{park}}\end{bmatrix},
|
||||||
|
$$
|
||||||
|
|
||||||
|
它只是 $\mathbf z_{\mathrm{park}}$ 中第 $i$ 个状态的位置分量,并不是额外的决策变量。定义状态到位置的选择矩阵
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf S_p=
|
||||||
|
\begin{bmatrix}
|
||||||
|
1&0&0&0\\
|
||||||
|
0&1&0&0
|
||||||
|
\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
再定义作用于整个联合变量 $\mathbf z$ 的常数选择矩阵
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf E_i^{\mathrm{park}}\in\mathbb R^{2\times n_z},
|
||||||
|
\qquad
|
||||||
|
\mathbf E_j^{\mathrm{exit}}\in\mathbb R^{2\times n_z}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
$\mathbf E_i^{\mathrm{park}}$ 在泊入路径第 $i$ 个四维状态对应的列上放置 $\mathbf S_p$,其余元素均为零;$\mathbf E_j^{\mathrm{exit}}$ 在驶离路径第 $j$ 个四维状态对应的列上放置 $\mathbf S_p$,其余元素均为零。因此
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boxed{
|
||||||
|
\mathbf p_i^{\mathrm{park}}
|
||||||
|
=\mathbf E_i^{\mathrm{park}}\mathbf z,
|
||||||
|
\qquad
|
||||||
|
\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=\mathbf E_j^{\mathrm{exit}}\mathbf z.}
|
||||||
|
$$
|
||||||
|
|
||||||
|
若用从 1 开始的元素下标表示,则 $\mathbf E_i^{\mathrm{park}}$ 选取 $\mathbf z$ 的第 $4(i-1)+1$、$4(i-1)+2$ 个元素;$\mathbf E_j^{\mathrm{exit}}$ 选取第
|
||||||
|
|
||||||
|
$$
|
||||||
|
n_{\mathrm{park}}+4(j-1)+1,
|
||||||
|
\qquad
|
||||||
|
n_{\mathrm{park}}+4(j-1)+2
|
||||||
|
$$
|
||||||
|
|
||||||
|
个元素。
|
||||||
|
|
||||||
|
因此,只要目标函数同时包含 $\mathbf p_i^{\mathrm{park}}$ 和 $\mathbf p_j^{\mathrm{exit}}$,它就是整个 $\mathbf z$ 的函数。
|
||||||
|
|
||||||
|
## 2. 将交互项显式写成 $\mathbf z$ 的函数
|
||||||
|
|
||||||
|
为简化记号,定义点对选择矩阵
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf D_{ij}
|
||||||
|
=\mathbf E_i^{\mathrm{park}}-\mathbf E_j^{\mathrm{exit}}
|
||||||
|
\in\mathbb R^{2\times n_z}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
于是两个配置点的相对位置和距离分别为
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf r_{ij}(\mathbf z)
|
||||||
|
=\mathbf p_i^{\mathrm{park}}-\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=\mathbf D_{ij}\mathbf z,
|
||||||
|
$$
|
||||||
|
|
||||||
|
$$
|
||||||
|
d_{ij}(\mathbf z)
|
||||||
|
=\|\mathbf D_{ij}\mathbf z\|.
|
||||||
|
$$
|
||||||
|
|
||||||
|
正文实现将两个弧长步长冻结为粗解给出的常数。记
|
||||||
|
|
||||||
|
$$
|
||||||
|
c_0=\frac{w_\varPsi}{v_0}
|
||||||
|
\Delta s_{\mathrm{park}}^{(0)}
|
||||||
|
\Delta s_{\mathrm{exit}}^{(0)},
|
||||||
|
$$
|
||||||
|
|
||||||
|
其中上标 $(0)$ 表示粗解值。离散交互项便可以显式写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boxed{
|
||||||
|
J_\varPsi(\mathbf z)
|
||||||
|
=c_0\sum_{i=1}^{M_{\mathrm{park}}}
|
||||||
|
\sum_{j=1}^{M_{\mathrm{exit}}}
|
||||||
|
K\!\left(
|
||||||
|
\|\mathbf D_{ij}\mathbf z\|;
|
||||||
|
\rho_\varPsi,m_\varPsi
|
||||||
|
\right).}
|
||||||
|
$$
|
||||||
|
|
||||||
|
把核函数的分段定义代入后,还可以完全展开为
|
||||||
|
|
||||||
|
$$
|
||||||
|
J_\varPsi(\mathbf z)
|
||||||
|
=c_0\sum_{i=1}^{M_{\mathrm{park}}}
|
||||||
|
\sum_{j=1}^{M_{\mathrm{exit}}}
|
||||||
|
\begin{cases}
|
||||||
|
\displaystyle
|
||||||
|
\left(
|
||||||
|
1-\frac{\|\mathbf D_{ij}\mathbf z\|}{\rho_\varPsi}
|
||||||
|
\right)^{m_\varPsi},
|
||||||
|
& \|\mathbf D_{ij}\mathbf z\|<\rho_\varPsi,\\[8pt]
|
||||||
|
0,
|
||||||
|
& \|\mathbf D_{ij}\mathbf z\|\geq\rho_\varPsi.
|
||||||
|
\end{cases}
|
||||||
|
$$
|
||||||
|
|
||||||
|
至此,表达式右侧只剩下决策变量 $\mathbf z$、常数选择矩阵 $\mathbf D_{ij}$ 以及固定参数,不再把 $\mathbf p_i^{\mathrm{park}}$ 和 $\mathbf p_j^{\mathrm{exit}}$ 当成独立符号。这里使用 $\mathbf D_{ij}$ 而不使用 $\mathbf A_{ij}$,是为了避免和正文凸走廊约束中的 $\mathbf A_k$ 混淆。
|
||||||
|
|
||||||
|
对于每个点对 $(i,j)$,定义
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf r_{ij}(\mathbf z)
|
||||||
|
=\mathbf D_{ij}\mathbf z,
|
||||||
|
\qquad
|
||||||
|
d_{ij}(\mathbf z)=\|\mathbf D_{ij}\mathbf z\|.
|
||||||
|
$$
|
||||||
|
|
||||||
|
当 $0<d_{ij}(\mathbf z)<\rho_\varPsi$ 时,核函数为
|
||||||
|
|
||||||
|
$$
|
||||||
|
K(d_{ij}(\mathbf z))=
|
||||||
|
\left(1-\frac{d_{ij}(\mathbf z)}{\rho_\varPsi}\right)^{m_\varPsi},
|
||||||
|
$$
|
||||||
|
|
||||||
|
它随距离增大而减小。因此,最小化 $J_\varPsi$ 会倾向于增大两条路径之间的距离。
|
||||||
|
|
||||||
|
## 3. 为什么两条路径会“同时被推开”
|
||||||
|
|
||||||
|
对一个有效点对 $(i,j)$,有
|
||||||
|
|
||||||
|
$$
|
||||||
|
K'(d)
|
||||||
|
=-\frac{m_\varPsi}{\rho_\varPsi}
|
||||||
|
\left(1-\frac{d}{\rho_\varPsi}\right)^{m_\varPsi-1}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
### 3.1 先求距离对位置的导数
|
||||||
|
|
||||||
|
令
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf p_i^{\mathrm{park}}
|
||||||
|
=\begin{bmatrix}x_i\\y_i\end{bmatrix},
|
||||||
|
\qquad
|
||||||
|
\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=\begin{bmatrix}\bar x_j\\\bar y_j\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
则相对位置为
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf r_{ij}
|
||||||
|
=\mathbf p_i^{\mathrm{park}}-\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=\begin{bmatrix}
|
||||||
|
x_i-\bar x_j\\
|
||||||
|
y_i-\bar y_j
|
||||||
|
\end{bmatrix},
|
||||||
|
$$
|
||||||
|
|
||||||
|
距离为
|
||||||
|
|
||||||
|
$$
|
||||||
|
d_{ij}=\|\mathbf r_{ij}\|
|
||||||
|
=\sqrt{(x_i-\bar x_j)^2+(y_i-\bar y_j)^2}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
对泊入点的两个坐标分别求偏导:
|
||||||
|
|
||||||
|
$$
|
||||||
|
\frac{\partial d_{ij}}{\partial x_i}
|
||||||
|
=\frac{x_i-\bar x_j}{d_{ij}},
|
||||||
|
\qquad
|
||||||
|
\frac{\partial d_{ij}}{\partial y_i}
|
||||||
|
=\frac{y_i-\bar y_j}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
将两个分量写成列向量,就是
|
||||||
|
|
||||||
|
$$
|
||||||
|
\nabla_{\mathbf p_i^{\mathrm{park}}}d_{ij}
|
||||||
|
=
|
||||||
|
\begin{bmatrix}
|
||||||
|
\partial d_{ij}/\partial x_i\\
|
||||||
|
\partial d_{ij}/\partial y_i
|
||||||
|
\end{bmatrix}
|
||||||
|
=\frac{1}{d_{ij}}
|
||||||
|
\begin{bmatrix}
|
||||||
|
x_i-\bar x_j\\
|
||||||
|
y_i-\bar y_j
|
||||||
|
\end{bmatrix}
|
||||||
|
=\frac{\mathbf r_{ij}}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
几何上,$\mathbf r_{ij}/d_{ij}$ 是从驶离点指向泊入点的单位方向向量:泊入点沿这个方向移动会增大两点距离,沿相反方向移动会减小距离。
|
||||||
|
|
||||||
|
### 3.2 再使用链式法则
|
||||||
|
|
||||||
|
核函数不是直接以 $\mathbf p_i^{\mathrm{park}}$ 为自变量,而是通过标量距离 $d_{ij}$ 依赖位置:
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf p_i^{\mathrm{park}}
|
||||||
|
\longrightarrow
|
||||||
|
d_{ij}
|
||||||
|
\longrightarrow
|
||||||
|
K(d_{ij}).
|
||||||
|
$$
|
||||||
|
|
||||||
|
因此多元链式法则给出
|
||||||
|
|
||||||
|
$$
|
||||||
|
\frac{\partial K(d_{ij})}
|
||||||
|
{\partial \mathbf p_i^{\mathrm{park}}}
|
||||||
|
=\frac{\mathrm dK}{\mathrm dd}(d_{ij})
|
||||||
|
\nabla_{\mathbf p_i^{\mathrm{park}}}d_{ij}
|
||||||
|
=K'(d_{ij})\frac{\mathbf r_{ij}}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
这就是文档中的目标公式。它由两部分相乘得到:
|
||||||
|
|
||||||
|
$$
|
||||||
|
\underbrace{K'(d_{ij})}_{\text{距离增大时核代价的变化率}}
|
||||||
|
\quad\times\quad
|
||||||
|
\underbrace{\frac{\mathbf r_{ij}}{d_{ij}}}_{\text{距离对泊入位置的方向导数}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
而
|
||||||
|
|
||||||
|
$$
|
||||||
|
\frac{\partial K(d_{ij})}
|
||||||
|
{\partial \mathbf p_j^{\mathrm{exit}}}
|
||||||
|
=-K'(d_{ij})\frac{\mathbf r_{ij}}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
驶离点前面的负号来自相对位置向量的定义。对每一对泊入点和驶离点,定义
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf r_{ij}
|
||||||
|
=\mathbf p_i^{\mathrm{park}}-\mathbf p_j^{\mathrm{exit}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
为了看清这个偏导,令两个二维位置分别写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf p_i^{\mathrm{park}}
|
||||||
|
=\begin{bmatrix}x_i\\y_i\end{bmatrix},
|
||||||
|
\qquad
|
||||||
|
\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=\begin{bmatrix}\bar x_j\\\bar y_j\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
于是
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf r_{ij}
|
||||||
|
=\begin{bmatrix}
|
||||||
|
x_i-\bar x_j\\
|
||||||
|
y_i-\bar y_j
|
||||||
|
\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
这里的“对向量求偏导”严格来说是 Jacobian 矩阵,因此逐分量计算可得
|
||||||
|
|
||||||
|
$$
|
||||||
|
\begin{aligned}
|
||||||
|
\frac{\partial \mathbf r_{ij}}
|
||||||
|
{\partial \mathbf p_j^{\mathrm{exit}}}
|
||||||
|
&=
|
||||||
|
\begin{bmatrix}
|
||||||
|
\dfrac{\partial(x_i-\bar x_j)}{\partial \bar x_j}
|
||||||
|
&\dfrac{\partial(x_i-\bar x_j)}{\partial \bar y_j}\\[6pt]
|
||||||
|
\dfrac{\partial(y_i-\bar y_j)}{\partial \bar x_j}
|
||||||
|
&\dfrac{\partial(y_i-\bar y_j)}{\partial \bar y_j}
|
||||||
|
\end{bmatrix}\\[4pt]
|
||||||
|
&=
|
||||||
|
\begin{bmatrix}-1&0\\0&-1\end{bmatrix}
|
||||||
|
=-\mathbf I_2.
|
||||||
|
\end{aligned}
|
||||||
|
$$
|
||||||
|
|
||||||
|
其中 $\mathbf I_2$ 是二维单位矩阵。这个结果也可以用增量来理解:若驶离点发生一个小位移 $\Delta\mathbf p_j^{\mathrm{exit}}$,而泊入点保持不变,则
|
||||||
|
|
||||||
|
$$
|
||||||
|
\Delta\mathbf r_{ij}
|
||||||
|
=\Delta\mathbf p_i^{\mathrm{park}}
|
||||||
|
-\Delta\mathbf p_j^{\mathrm{exit}}
|
||||||
|
=-\Delta\mathbf p_j^{\mathrm{exit}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
由于这里固定泊入点,$\Delta\mathbf p_i^{\mathrm{park}}=\mathbf 0$。也就是说,驶离点沿某个方向移动时,从驶离点指向泊入点的相对向量沿相反方向变化,这正是 Jacobian 中出现负号的原因。将它代入链式法则,就得到
|
||||||
|
|
||||||
|
$$
|
||||||
|
\frac{\partial K(d_{ij})}
|
||||||
|
{\partial \mathbf p_j^{\mathrm{exit}}}
|
||||||
|
=-K'(d_{ij})\frac{\mathbf r_{ij}}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
上述距离梯度推导要求 $d_{ij}>0$;当两个点精确重合时,$\|\mathbf r_{ij}\|$ 在零点没有唯一梯度,需要使用平滑距离或在实现中单独处理该点对。
|
||||||
|
|
||||||
|
直接对联合变量 $\mathbf z$ 求导,则一个有效点对的梯度为
|
||||||
|
|
||||||
|
$$
|
||||||
|
\nabla_{\mathbf z}
|
||||||
|
K\!\left(\|\mathbf D_{ij}\mathbf z\|\right)
|
||||||
|
=K'(d_{ij})
|
||||||
|
\frac{\mathbf D_{ij}^{\mathsf T}\mathbf D_{ij}\mathbf z}{d_{ij}}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
定义当前有限支撑域内的有效点对集合
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathcal I(\mathbf z)=
|
||||||
|
\left\{(i,j)\ \middle|\
|
||||||
|
0<\|\mathbf D_{ij}\mathbf z\|<\rho_\varPsi
|
||||||
|
\right\},
|
||||||
|
$$
|
||||||
|
|
||||||
|
便得到完整交互项关于联合决策变量的梯度:
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boxed{
|
||||||
|
\nabla_{\mathbf z}J_\varPsi(\mathbf z)
|
||||||
|
=c_0\sum_{(i,j)\in\mathcal I(\mathbf z)}
|
||||||
|
K'\!\left(\|\mathbf D_{ij}\mathbf z\|\right)
|
||||||
|
\frac{\mathbf D_{ij}^{\mathsf T}\mathbf D_{ij}\mathbf z}
|
||||||
|
{\|\mathbf D_{ij}\mathbf z\|}.}
|
||||||
|
$$
|
||||||
|
|
||||||
|
由于
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf D_{ij}
|
||||||
|
=\mathbf E_i^{\mathrm{park}}-\mathbf E_j^{\mathrm{exit}},
|
||||||
|
$$
|
||||||
|
|
||||||
|
$\mathbf D_{ij}^{\mathsf T}$ 会把同一个二维点对梯度以相反符号写回 $\mathbf z_{\mathrm{park}}$ 和 $\mathbf z_{\mathrm{exit}}$ 对应的位置分量。这就是 $J_\varPsi(\mathbf z)$ 在一次联合求解中同时更新两条路径的代数原因。
|
||||||
|
|
||||||
|
两个梯度大小相等、方向相反。因为 $K'(d)<0$,梯度下降时:
|
||||||
|
|
||||||
|
- 泊入点 $\mathbf p_i^{\mathrm{park}}$ 沿远离驶离点的方向移动;
|
||||||
|
- 驶离点 $\mathbf p_j^{\mathrm{exit}}$ 沿远离泊入点的方向移动。
|
||||||
|
|
||||||
|
这就是第 841 行所说的“两条路径可在同一次求解中相互推离”。它并不是先固定一条路径再移动另一条,而是同一个目标函数对两组决策变量同时提供梯度。
|
||||||
|
|
||||||
|
需要注意,梯度形式是对称的,不代表最终位移一定相等。两条路径还分别受到引导场、长度、平滑性和走廊约束的作用;哪条路径更容易移动,取决于这些项共同形成的“刚度”。
|
||||||
|
|
||||||
|
## 4. Hessian 的“跨路径耦合块”是什么
|
||||||
|
|
||||||
|
将联合变量按两条路径分块后,目标函数 Hessian 的结构可以概念性地写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\nabla^2_{\mathbf z\mathbf z}J=
|
||||||
|
\begin{bmatrix}
|
||||||
|
H_{\mathrm{pp}} & H_{\mathrm{pe}}\\
|
||||||
|
H_{\mathrm{ep}} & H_{\mathrm{ee}}
|
||||||
|
\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
这里:
|
||||||
|
|
||||||
|
- $H_{\mathrm{pp}}$ 描述泊入变量之间的二阶关系;
|
||||||
|
- $H_{\mathrm{ee}}$ 描述驶离变量之间的二阶关系;
|
||||||
|
- $H_{\mathrm{pe}}$ 和 $H_{\mathrm{ep}}$ 描述泊入变量与驶离变量之间的二阶关系,称为跨路径耦合块。
|
||||||
|
|
||||||
|
若目标函数可以完全分离为
|
||||||
|
|
||||||
|
$$
|
||||||
|
J(\mathbf z)=J_{\mathrm{park}}(\mathbf z_{\mathrm{park}})
|
||||||
|
+J_{\mathrm{exit}}(\mathbf z_{\mathrm{exit}}),
|
||||||
|
$$
|
||||||
|
|
||||||
|
那么
|
||||||
|
|
||||||
|
$$
|
||||||
|
H_{\mathrm{pe}}=H_{\mathrm{ep}}=0,
|
||||||
|
$$
|
||||||
|
|
||||||
|
整个 Hessian 按两条路径呈块对角结构。加入 $J_\varPsi$ 后,一个核项同时依赖 $\mathbf p_i^{\mathrm{park}}$ 和 $\mathbf p_j^{\mathrm{exit}}$,所以相应的跨路径二阶导数一般不为零。
|
||||||
|
|
||||||
|
对于单个点对,可以把它的 Hessian 贡献写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\begin{bmatrix}
|
||||||
|
G_{ij} & -G_{ij}\\
|
||||||
|
-G_{ij} & G_{ij}
|
||||||
|
\end{bmatrix},
|
||||||
|
$$
|
||||||
|
|
||||||
|
其中 $G_{ij}$ 是关于二维相对位置 $\mathbf r_{ij}$ 的 $2\times2$ 二阶导数矩阵。非对角位置的 $-G_{ij}$ 正是该点对造成的跨路径耦合。
|
||||||
|
|
||||||
|
## 5. 为什么有限支撑核会让跨路径块稀疏
|
||||||
|
|
||||||
|
核函数满足
|
||||||
|
|
||||||
|
$$
|
||||||
|
K(d)=0,\qquad d\geq\rho_\varPsi.
|
||||||
|
$$
|
||||||
|
|
||||||
|
在严格满足 $d_{ij}>\rho_\varPsi$ 的区域内,$K(d_{ij})$ 是常数零,因此它的梯度和 Hessian 也都是零。于是:
|
||||||
|
|
||||||
|
- 若点对 $(i,j)$ 的距离小于 $\rho_\varPsi$,它在跨路径块中产生非零项;
|
||||||
|
- 若点对 $(i,j)$ 的距离大于 $\rho_\varPsi$,它不产生任何导数项。
|
||||||
|
|
||||||
|
例如,两条路径各有 4 个点,理论上共有 $4\times4=16$ 个点对。假设只有
|
||||||
|
|
||||||
|
$$
|
||||||
|
(1,1),\ (2,2),\ (2,3),\ (3,3),\ (4,4)
|
||||||
|
$$
|
||||||
|
|
||||||
|
这 5 对点的距离小于作用半径,那么跨路径块中只有与这 5 对点有关的位置非零,其余 11 对均为零。这就是第 841 行所说的“并非稠密的 $M_{\mathrm{park}}\times M_{\mathrm{exit}}$ 块”。
|
||||||
|
|
||||||
|
这里的 $M_{\mathrm{park}}\times M_{\mathrm{exit}}$ 是按“配置点对”描述的概念尺寸。由于每个位置点有 $x,y$ 两个分量,实际位置 Hessian 的跨路径块尺寸是
|
||||||
|
|
||||||
|
$$
|
||||||
|
2M_{\mathrm{park}}\times2M_{\mathrm{exit}},
|
||||||
|
$$
|
||||||
|
|
||||||
|
每个有效点对通常对应一个 $2\times2$ 小块。
|
||||||
|
|
||||||
|
## 6. “其余部分均为块对角结构”是什么意思
|
||||||
|
|
||||||
|
第 843 行的“块对角”是按两条路径分成两个大块而言,并不是说单条路径内部的矩阵是对角矩阵。
|
||||||
|
|
||||||
|
### 6.1 单条路径内部仍然存在耦合
|
||||||
|
|
||||||
|
配置约束
|
||||||
|
|
||||||
|
$$
|
||||||
|
\mathbf x_{k+1}=\mathbf x_k+
|
||||||
|
\frac{\Delta s}{2}
|
||||||
|
\left[\mathbf f(\mathbf x_k,\sigma_k)
|
||||||
|
+\mathbf f(\mathbf x_{k+1},\sigma_k)\right]
|
||||||
|
$$
|
||||||
|
|
||||||
|
同时依赖 $\mathbf x_k$、$\mathbf x_{k+1}$ 和 $\sigma_k$。所以,单条路径内部相邻配置点之间存在耦合,其 Jacobian/Hessian 通常是带状矩阵,而不是对角矩阵。
|
||||||
|
|
||||||
|
### 6.2 但这些约束不连接两条路径
|
||||||
|
|
||||||
|
泊入路径的配置约束只包含 $\mathbf z_{\mathrm{park}}$,驶离路径的配置约束只包含 $\mathbf z_{\mathrm{exit}}$。因此按两条路径分块后,约束 Jacobian 具有如下形式:
|
||||||
|
|
||||||
|
$$
|
||||||
|
J_{\mathrm{independent}}=
|
||||||
|
\begin{bmatrix}
|
||||||
|
B_{\mathrm{park}}&0\\
|
||||||
|
0&B_{\mathrm{exit}}
|
||||||
|
\end{bmatrix}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
其中 $B_{\mathrm{park}}$、$B_{\mathrm{exit}}$ 内部可以是带状的,并不要求是对角的。
|
||||||
|
|
||||||
|
同样地:
|
||||||
|
|
||||||
|
- 曲率与曲率变化率上界只约束各自路径;
|
||||||
|
- 泊入走廊约束只作用于泊入路径;
|
||||||
|
- 驶离走廊约束只作用于驶离路径;
|
||||||
|
- $J_\ell$、$J_U$ 和 $J_\kappa$ 都可以分别写成泊入部分与驶离部分之和。
|
||||||
|
|
||||||
|
所以,在不考虑 $J_\varPsi$ 时,两条路径的数值结构基本可以分开处理。
|
||||||
|
|
||||||
|
## 7. 关于装载位约束的一处重要问题
|
||||||
|
|
||||||
|
第 843 行称:“唯一的另一处跨路径耦合来自装载位处共享同一位姿”。结合当前论文第 335--347 行的定义,这句话并不严格准确。
|
||||||
|
|
||||||
|
当前边界条件写成
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boldsymbol\eta^{\mathrm{park}}(s_{\mathrm{park}})
|
||||||
|
=\boldsymbol\eta_{\mathrm{load}},
|
||||||
|
$$
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boldsymbol\eta^{\mathrm{exit}}(0)
|
||||||
|
=\boldsymbol\eta_{\mathrm{load}},
|
||||||
|
$$
|
||||||
|
|
||||||
|
而正文明确说明 $\boldsymbol\eta_{\mathrm{load}}$ 是由上层系统给出的固定值。若它确实是常量,那么这只是两组分别等于同一常量的边界约束:
|
||||||
|
|
||||||
|
$$
|
||||||
|
h_{\mathrm{park}}(\mathbf z_{\mathrm{park}})=0,
|
||||||
|
\qquad
|
||||||
|
h_{\mathrm{exit}}(\mathbf z_{\mathrm{exit}})=0.
|
||||||
|
$$
|
||||||
|
|
||||||
|
第一组不含 $\mathbf z_{\mathrm{exit}}$,第二组不含 $\mathbf z_{\mathrm{park}}$,所以它们不会在 Jacobian 或 Hessian 中产生跨路径非零块。两条路径在几何上共享同一个已知端点,但在导数结构上没有直接耦合。
|
||||||
|
|
||||||
|
在当前问题定义下,固定的 $\boldsymbol\eta_{\mathrm{load}}$ 不会形成跨路径导数耦合。只有在另外重新定义约束时,才可能形成真正的跨路径约束,例如:
|
||||||
|
|
||||||
|
1. 直接施加
|
||||||
|
|
||||||
|
$$
|
||||||
|
\boldsymbol\eta^{\mathrm{park}}(s_{\mathrm{park}})
|
||||||
|
-\boldsymbol\eta^{\mathrm{exit}}(0)=0;
|
||||||
|
$$
|
||||||
|
|
||||||
|
2. 由上层模型额外引入一个待优化的共享位姿变量,并让两条路径的边界条件同时依赖该变量。这个做法已经改变了当前论文中“装载位姿由上层系统给定”的问题定义。
|
||||||
|
|
||||||
|
因此,按照论文当前“装载位姿固定”的问题定义,真正的跨路径导数耦合只来自 $J_\varPsi$。第 843 行建议相应修改。
|
||||||
|
|
||||||
|
## 8. 可微性表述还需要哪些条件
|
||||||
|
|
||||||
|
第 841 行称 $J_\varPsi$ 对 $\mathbf z$ 整体可微,这需要附加条件:
|
||||||
|
|
||||||
|
- 当两个路径点完全重合,即 $d_{ij}=0$ 时,欧氏范数 $\|\mathbf r_{ij}\|$ 的梯度没有唯一方向;当前核函数在 $d=0$ 处的径向导数通常又不为零,因此复合函数在重合点处不可微。
|
||||||
|
- 在截断点 $d=\rho_\varPsi$ 处,若 $m_\varPsi>1$,一阶导数可连续衔接到零;若还希望二阶导数连续,通常需要 $m_\varPsi>2$。
|
||||||
|
|
||||||
|
这不一定造成实际求解失败,因为车辆路径点通常不会精确重合,且参数可以选择足够高的 $m_\varPsi$。但论文若要声称“整体可微”,最好明确参数条件,并对 $d=0$ 使用平滑距离,例如
|
||||||
|
|
||||||
|
$$
|
||||||
|
d_\varepsilon=\sqrt{\|\mathbf r\|^2+\varepsilon^2}.
|
||||||
|
$$
|
||||||
|
|
||||||
|
## 9. 用一句话重新理解第 841--843 行
|
||||||
|
|
||||||
|
这几行的核心意思是:
|
||||||
|
|
||||||
|
> 大部分目标项和约束都只在各自路径内部产生带状导数结构;交互项 $J_\varPsi$ 同时依赖两条路径,因此能在一次 NLP 求解中推动双方分离。由于核函数只作用于距离小于 $\rho_\varPsi$ 的点对,交互项产生的跨路径 Hessian 块通常是稀疏的。
|
||||||
|
|
||||||
|
按照当前“装载位姿为固定常量”的定义,不应再把装载位边界条件称为跨路径导数耦合。
|
||||||
|
|
||||||
|
## 10. 建议替换原文的表述
|
||||||
|
|
||||||
|
可以将第 841--843 行改写为:
|
||||||
|
|
||||||
|
> 式 (joint\_psi\_discrete) 同时依赖泊入与驶离路径的位置变量,故其关于两组变量的梯度均非零,两条路径可在同一次求解中相互推离。由有限支撑核的定义,仅当配置点对的距离小于 $\rho_\varPsi$ 时,该点对才对梯度及 Hessian 产生贡献;因此,交互项所形成的跨路径 Hessian 块仅在空间上相近的配置点对处非零。除 $J_\varPsi$ 外,其余目标项与约束均只作用于单条路径内部:配置约束在各自路径内耦合相邻配置点,形成带状结构;物理上界及走廊约束也不连接两条路径。由于 $\boldsymbol\eta_\mathrm{load}$ 是给定常量,两条路径分别等于该位姿的边界条件不产生跨路径导数耦合。因此,联合问题仅通过稀疏的 $J_\varPsi$ 块发生跨路径耦合。
|
||||||
Binary file not shown.
@@ -0,0 +1,176 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Compute exact coordinates for the convex-decomposition schematic.
|
||||||
|
|
||||||
|
Follows supplement.tex S-IV verbatim:
|
||||||
|
|
||||||
|
eq:sup_ellipsoid_quadratic E = { p | (p-d)^T (C C^T)^{-1} (p-d) <= 1 },
|
||||||
|
o_i not in int(E)
|
||||||
|
eq:sup_halfspace_normal atil_i = (C C^T)^{-1} (o_i - d), a_i = atil/|atil|,
|
||||||
|
b_i = a_i^T o_i
|
||||||
|
|
||||||
|
Construction: d is the segment midpoint, the major axis is the segment
|
||||||
|
direction with semi-axis equal to the segment half-length, and the minor
|
||||||
|
semi-axis is shrunk until the boundary first touches an obstacle point.
|
||||||
|
Redundant obstacles are pruned greedily: after each half-space is emitted,
|
||||||
|
every obstacle it already excludes is dropped.
|
||||||
|
|
||||||
|
Prints TikZ-ready numbers; nothing is drawn here.
|
||||||
|
"""
|
||||||
|
import numpy as np
|
||||||
|
|
||||||
|
# --- segment (figure units = cm in the TikZ picture) ------------------------
|
||||||
|
P0 = np.array([0.0, 0.0])
|
||||||
|
P1 = np.array([5.2, 0.0])
|
||||||
|
D = 0.5 * (P0 + P1)
|
||||||
|
A_AX = 0.5 * np.linalg.norm(P1 - P0) # semi-major, along the segment
|
||||||
|
|
||||||
|
# --- obstacle points (site-boundary / ore-pile samples) --------------------
|
||||||
|
OBST = np.array([
|
||||||
|
[0.30, 1.42], [1.35, 1.05], [2.55, 1.28], [3.75, 1.62], [4.85, 1.35],
|
||||||
|
[0.65, -1.30], [1.90, -1.62], [3.10, -1.12], [4.35, -1.45], [5.35, -1.02],
|
||||||
|
[-0.55, 0.85], [5.75, 0.62],
|
||||||
|
# points beyond the segment ends: they do not constrain the minor axis
|
||||||
|
# (|u| > 1) but they do cap the polytope longitudinally
|
||||||
|
[-1.05, 0.12], [6.35, -0.18],
|
||||||
|
])
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
# ---- minor semi-axis: shrink until the boundary touches an obstacle ----
|
||||||
|
u = (OBST[:, 0] - D[0]) / A_AX
|
||||||
|
live = np.abs(u) < 1.0 - 1e-9
|
||||||
|
b_req = np.abs(OBST[live, 1]) / np.sqrt(1.0 - u[live] ** 2)
|
||||||
|
B_AX = float(b_req.min())
|
||||||
|
touch = int(np.nonzero(live)[0][int(np.argmin(b_req))])
|
||||||
|
print("semi-axes: a = %.4f, b = %.4f center d = (%.3f, %.3f)"
|
||||||
|
% (A_AX, B_AX, D[0], D[1]))
|
||||||
|
print("touching obstacle index %d at (%.3f, %.3f)"
|
||||||
|
% (touch, OBST[touch, 0], OBST[touch, 1]))
|
||||||
|
|
||||||
|
C = np.diag([A_AX, B_AX])
|
||||||
|
Minv = np.linalg.inv(C @ C.T)
|
||||||
|
|
||||||
|
def qform(P):
|
||||||
|
dv = P - D
|
||||||
|
return np.einsum("ij,jk,ik->i", dv, Minv, dv)
|
||||||
|
|
||||||
|
q = qform(OBST)
|
||||||
|
print("min obstacle quadratic form = %.6f (must be >= 1)" % q.min())
|
||||||
|
assert q.min() >= 1.0 - 1e-9, "eq:sup_ellipsoid_quadratic violated"
|
||||||
|
# the segment must lie inside the ellipsoid
|
||||||
|
seg = P0 + np.linspace(0, 1, 201)[:, None] * (P1 - P0)
|
||||||
|
print("max segment quadratic form = %.6f (must be <= 1)" % qform(seg).max())
|
||||||
|
assert qform(seg).max() <= 1.0 + 1e-9
|
||||||
|
|
||||||
|
# ---- greedy half-space generation with redundancy pruning --------------
|
||||||
|
remaining = list(range(len(OBST)))
|
||||||
|
planes = []
|
||||||
|
while remaining:
|
||||||
|
# process the obstacle closest in the ellipsoid metric first
|
||||||
|
qi = qform(OBST[remaining])
|
||||||
|
k = remaining[int(np.argmin(qi))]
|
||||||
|
o = OBST[k]
|
||||||
|
at = Minv @ (o - D)
|
||||||
|
a = at / np.linalg.norm(at)
|
||||||
|
b = float(a @ o)
|
||||||
|
planes.append((k, a, b))
|
||||||
|
# the ellipsoid (hence the segment) must be on the safe side
|
||||||
|
sup = float(a @ D + np.sqrt((a @ (C @ C.T)) @ a))
|
||||||
|
assert sup <= b + 1e-9, "ellipsoid crosses the half-space"
|
||||||
|
remaining = [j for j in remaining if float(a @ OBST[j]) < b - 1e-9]
|
||||||
|
|
||||||
|
print("\n%d half-spaces retained out of %d obstacles"
|
||||||
|
% (len(planes), len(OBST)))
|
||||||
|
for k, a, b in planes:
|
||||||
|
print(" o_%-2d (%6.3f,%6.3f) a = (%7.4f,%7.4f) b = %7.4f"
|
||||||
|
% (k, OBST[k, 0], OBST[k, 1], a[0], a[1], b))
|
||||||
|
|
||||||
|
# ---- polytope vertices, for drawing ------------------------------------
|
||||||
|
A = np.array([p[1] for p in planes])
|
||||||
|
bb = np.array([p[2] for p in planes])
|
||||||
|
verts = []
|
||||||
|
for i in range(len(planes)):
|
||||||
|
for j in range(i + 1, len(planes)):
|
||||||
|
M = np.array([A[i], A[j]])
|
||||||
|
if abs(np.linalg.det(M)) < 1e-9:
|
||||||
|
continue
|
||||||
|
v = np.linalg.solve(M, [bb[i], bb[j]])
|
||||||
|
if np.all(A @ v <= bb + 1e-7):
|
||||||
|
verts.append(v)
|
||||||
|
V = np.array(verts)
|
||||||
|
ctr = V.mean(axis=0)
|
||||||
|
V = V[np.argsort(np.arctan2(V[:, 1] - ctr[1], V[:, 0] - ctr[0]))]
|
||||||
|
print("\npolytope P: %d vertices" % len(V))
|
||||||
|
print(" tikz path: " + " -- ".join("(%.3f,%.3f)" % (x, y) for x, y in V)
|
||||||
|
+ " -- cycle")
|
||||||
|
|
||||||
|
# ---- ellipse as a TikZ primitive ---------------------------------------
|
||||||
|
print("\n tikz ellipse: (%.3f,%.3f) ellipse [x radius=%.4f, "
|
||||||
|
"y radius=%.4f]" % (D[0], D[1], A_AX, B_AX))
|
||||||
|
print(" tikz obstacles: " + " ".join("(%.2f,%.2f)" % (x, y)
|
||||||
|
for x, y in OBST))
|
||||||
|
kept = " ".join("o%d" % p[0] for p in planes)
|
||||||
|
print(" retained: " + kept)
|
||||||
|
|
||||||
|
# ---- support points: where each half-space touches the ellipsoid -------
|
||||||
|
# The boundary point whose outward normal is parallel to a_i is
|
||||||
|
# p = d + (C C^T) a / sqrt(a^T (C C^T) a).
|
||||||
|
M = C @ C.T
|
||||||
|
print("\n ellipsoid support points (tangency anchors of a_i):")
|
||||||
|
for k, a, b in planes:
|
||||||
|
p = D + (M @ a) / np.sqrt(a @ M @ a)
|
||||||
|
assert abs(qform(p[None, :])[0] - 1.0) < 1e-9, "anchor off the boundary"
|
||||||
|
print(" o_%-2d: anchor (%.3f,%.3f) gap to o_i = %.3f"
|
||||||
|
% (k, p[0], p[1], float(a @ OBST[k]) - float(a @ p)))
|
||||||
|
|
||||||
|
# ---- pruned (redundant) obstacles, drawn hollow in the figure ----------
|
||||||
|
kept_idx = {p[0] for p in planes}
|
||||||
|
pruned = [i for i in range(len(OBST)) if i not in kept_idx]
|
||||||
|
print("\n pruned as redundant: " +
|
||||||
|
" ".join("(%.2f,%.2f)" % (OBST[i, 0], OBST[i, 1]) for i in pruned))
|
||||||
|
print(" retained points: " +
|
||||||
|
" ".join("(%.2f,%.2f)" % (OBST[p[0], 0], OBST[p[0], 1])
|
||||||
|
for p in planes))
|
||||||
|
|
||||||
|
# ---- initial sphere before the minor-axis shrink ------------------------
|
||||||
|
inside_sphere = [i for i in range(len(OBST))
|
||||||
|
if np.linalg.norm(OBST[i] - D) < A_AX]
|
||||||
|
print("\n initial sphere radius %.3f encloses %d obstacle(s)"
|
||||||
|
% (A_AX, len(inside_sphere)))
|
||||||
|
|
||||||
|
# ---- ready-to-paste TikZ for the half-space boundaries -----------------
|
||||||
|
# Each line a^T p = b is drawn through a*b along t = (-a_y, a_x) and left
|
||||||
|
# for the picture's own \clip to trim.
|
||||||
|
print("\n TikZ half-space boundaries (draw long, clip in the picture):")
|
||||||
|
for k, a, b in planes:
|
||||||
|
p_on = a * b
|
||||||
|
t = np.array([-a[1], a[0]])
|
||||||
|
q0, q1 = p_on - 9.0 * t, p_on + 9.0 * t
|
||||||
|
print(" \\draw[hsp] (%.3f,%.3f) -- (%.3f,%.3f); %% o_%d"
|
||||||
|
% (q0[0], q0[1], q1[0], q1[1], k))
|
||||||
|
|
||||||
|
# ---- half-space boundary segments clipped to the drawing box ----------
|
||||||
|
print("\n half-space boundary lines (clipped to x in [-1.2, 6.4]):")
|
||||||
|
for k, a, b in planes:
|
||||||
|
# parameterize the line a^T p = b
|
||||||
|
t = np.array([-a[1], a[0]])
|
||||||
|
p_on = a * b # closest point of the line to the origin
|
||||||
|
ts = []
|
||||||
|
for xlim in (-1.2, 6.4):
|
||||||
|
if abs(t[0]) > 1e-9:
|
||||||
|
ts.append((xlim - p_on[0]) / t[0])
|
||||||
|
for ylim in (-2.3, 2.3):
|
||||||
|
if abs(t[1]) > 1e-9:
|
||||||
|
ts.append((ylim - p_on[1]) / t[1])
|
||||||
|
pts = [p_on + tv * t for tv in ts]
|
||||||
|
pts = [p for p in pts
|
||||||
|
if -1.2 - 1e-6 <= p[0] <= 6.4 + 1e-6
|
||||||
|
and -2.3 - 1e-6 <= p[1] <= 2.3 + 1e-6]
|
||||||
|
if len(pts) >= 2:
|
||||||
|
pts = sorted(pts, key=lambda p: (p[0], p[1]))
|
||||||
|
print(" o_%-2d: (%.3f,%.3f) -- (%.3f,%.3f)"
|
||||||
|
% (k, pts[0][0], pts[0][1], pts[-1][0], pts[-1][1]))
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
Binary file not shown.
@@ -0,0 +1,79 @@
|
|||||||
|
% Kinematic bicycle model and geometric parameters of the mining truck.
|
||||||
|
% Drawn to scale in metres with L_v = 12, B_v = 3, L_w = 6.5, rear overhang 1.5,
|
||||||
|
% steering at psi_max = arctan(L_w / R_min) so that the ICR sits at R_min = 12 m.
|
||||||
|
\documentclass[border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[scale=0.53]
|
||||||
|
|
||||||
|
% ---------- global frame ------------------------------------------------
|
||||||
|
\draw[->, thin@] (-4.8,-2.8) -- (-2.6,-2.8) node[ann, right] {$x$};
|
||||||
|
\draw[->, thin@] (-4.8,-2.8) -- (-4.8,-0.6) node[ann, above] {$y$};
|
||||||
|
|
||||||
|
% horizontal reference through the rear-axle centre, for the heading angle
|
||||||
|
\draw[thin@, sitec, dash pattern=on 1.6pt off 1.2pt] (0,0) -- (5.6,0);
|
||||||
|
\draw[thin@] (4.2,0) arc[start angle=0, end angle=18, radius=4.2];
|
||||||
|
\node[ann] at (5.05,0.72) {$\theta$};
|
||||||
|
|
||||||
|
\begin{scope}[rotate=18]
|
||||||
|
|
||||||
|
% ---------- vehicle body ---------------------------------------------
|
||||||
|
\draw[veh, sitec, fill=fillc, fill opacity=0.6]
|
||||||
|
(-1.5,-1.5) rectangle (10.5,1.5);
|
||||||
|
\draw[thin@, sitec, dash pattern=on 1.4pt off 1pt] (-1.5,0) -- (11.6,0);
|
||||||
|
|
||||||
|
% ---------- wheels ----------------------------------------------------
|
||||||
|
% rear wheels, aligned with the body
|
||||||
|
\foreach \sy in {-1.5,1.5}{
|
||||||
|
\draw[veh, fill=sitec] (-0.9,\sy-0.22) rectangle (0.9,\sy+0.22);
|
||||||
|
}
|
||||||
|
% front wheels, steered by psi_max = 28 deg
|
||||||
|
\foreach \sy in {-1.5,1.5}{
|
||||||
|
\begin{scope}[shift={(6.5,\sy)}, rotate=28]
|
||||||
|
\draw[veh, fill=parkc, fill opacity=0.85]
|
||||||
|
(-0.9,-0.22) rectangle (0.9,0.22);
|
||||||
|
\end{scope}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ---------- steering angle -------------------------------------------
|
||||||
|
\draw[thin@, parkc] (6.5,0) -- ++(28:3.1);
|
||||||
|
\draw[thin@] (8.7,0) arc[start angle=0, end angle=28, radius=2.2];
|
||||||
|
\node[ann] at (9.35,0.66) {$\psi$};
|
||||||
|
\node[annt, parkc] at (9.9,1.95) {$\dot\psi$};
|
||||||
|
\draw[->, thin@, parkc] (9.05,1.55) arc[start angle=32, end angle=52,
|
||||||
|
radius=3.0];
|
||||||
|
|
||||||
|
% ---------- instantaneous centre of rotation --------------------------
|
||||||
|
\draw[thin@, sitec, dash pattern=on 1.6pt off 1.2pt] (0,0) -- (0,12.2);
|
||||||
|
\draw[thin@, sitec, dash pattern=on 1.6pt off 1.2pt] (6.5,0) -- (0,12.2);
|
||||||
|
\fill[sitec] (0,12.2) circle (0.22);
|
||||||
|
\node[ann, above] at (0,12.45) {ICR};
|
||||||
|
\node[ann, left] at (-0.25,7.0) {$R_\text{min}=1/\kappa_\text{max}$};
|
||||||
|
|
||||||
|
% ---------- rear-axle centre = path reference point -------------------
|
||||||
|
\fill[parkc] (0,0) circle (0.26);
|
||||||
|
\node[ann, parkc] at (-2.35,-1.05)
|
||||||
|
{$\mathbf{p}=[x,y]^\top$};
|
||||||
|
|
||||||
|
% ---------- dimensions -----------------------------------------------
|
||||||
|
% wheelbase
|
||||||
|
\draw[dimline] (0,-0.75) -- (6.5,-0.75);
|
||||||
|
\node[annt, fill=fillc, inner sep=0.4pt] at (3.25,-0.75) {$L_\text{w}$};
|
||||||
|
% overall length
|
||||||
|
\draw[dimline] (-1.5,-2.55) -- (10.5,-2.55);
|
||||||
|
\node[annt, fill=white, inner sep=0.4pt] at (4.5,-2.55) {$L_\text{v}$};
|
||||||
|
\draw[thin@] (-1.5,-1.6) -- (-1.5,-2.75);
|
||||||
|
\draw[thin@] (10.5,-1.6) -- (10.5,-2.75);
|
||||||
|
% width
|
||||||
|
\draw[dimline] (-2.9,-1.5) -- (-2.9,1.5);
|
||||||
|
\node[annt, rotate=90, fill=white, inner sep=0.4pt]
|
||||||
|
at (-2.9,0) {$B_\text{v}$};
|
||||||
|
\draw[thin@] (-1.65,-1.5) -- (-3.1,-1.5);
|
||||||
|
\draw[thin@] (-1.65,1.5) -- (-3.1,1.5);
|
||||||
|
|
||||||
|
% swept rectangle annotation
|
||||||
|
\node[annt, sitec] at (7.4,-0.95) {$\mathcal{V}(\boldsymbol{\eta})$};
|
||||||
|
|
||||||
|
\end{scope}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,118 @@
|
|||||||
|
% Spatiotemporal conflict and its resolution by spatial decoupling.
|
||||||
|
% (a)(c) coupled single-channel paths -> the empty truck must wait;
|
||||||
|
% (b)(d) decoupled dual-channel paths -> both maneuvers proceed in parallel.
|
||||||
|
\documentclass[border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[scale=0.0872]
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
% geometry shared by the two spatial panels
|
||||||
|
% ======================================================================
|
||||||
|
\def\sitebnd{
|
||||||
|
(2,6) -- (14,3.5) -- (30,3) -- (40,6) -- (45,13) -- (41,22)
|
||||||
|
-- (28,25) -- (14,22) -- (2,17)
|
||||||
|
}
|
||||||
|
% channel spine from the entrance to the loading bay
|
||||||
|
\def\spine{(2,11.5) .. controls (14,10.5) and (24,11.5) .. (34,15.5)}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------- panel a
|
||||||
|
\begin{scope}[shift={(0,0)}]
|
||||||
|
\fill[fillc, opacity=0.55] \sitebnd -- cycle;
|
||||||
|
\fill[white] \sitebnd -- cycle;
|
||||||
|
\draw[siteline] \sitebnd;
|
||||||
|
|
||||||
|
% conflict zone: both paths occupy the same channel
|
||||||
|
\fill[confc, opacity=0.16]
|
||||||
|
(4,8.6) .. controls (14,7.6) and (24,8.6) .. (33,12.6)
|
||||||
|
-- (35,18.4) .. controls (24,14.4) and (14,13.4) .. (4,14.4) -- cycle;
|
||||||
|
|
||||||
|
% the two paths coincide on the spine
|
||||||
|
\draw[parkpath] \spine;
|
||||||
|
\draw[exitpath, dash pattern=on 2.4pt off 1.6pt]
|
||||||
|
(34,15.5) .. controls (24,11.5) and (14,10.5) .. (2,11.5);
|
||||||
|
|
||||||
|
% loading pose
|
||||||
|
\fill[sitec] (34,15.5) circle (0.7);
|
||||||
|
\node[annt, sitec, above right] at (34.2,15.9) {$\boldsymbol{\eta}_\text{load}$};
|
||||||
|
|
||||||
|
\node[annt, confc] at (18,17.4) {conflict zone};
|
||||||
|
\node[panel] at (23.5,-1.8) {(a) coupled};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------- panel b
|
||||||
|
\begin{scope}[shift={(52,0)}]
|
||||||
|
\fill[fillc, opacity=0.55] \sitebnd -- cycle;
|
||||||
|
\fill[white] \sitebnd -- cycle;
|
||||||
|
\draw[siteline] \sitebnd;
|
||||||
|
|
||||||
|
% virtual centerline and the two offset guidance lines
|
||||||
|
\draw[ctrline] \spine;
|
||||||
|
\draw[parkpath] (2,8.6) .. controls (14,7.6) and (24,8.6) .. (33.4,13.0);
|
||||||
|
\draw[exitpath] (34.6,18.0) .. controls (24,14.4) and (14,13.4) .. (2,14.4);
|
||||||
|
|
||||||
|
% channel width W between the two guidance lines
|
||||||
|
\draw[dimline] (16,8.0) -- (16,13.8);
|
||||||
|
\node[annt, fill=white, inner sep=0.3pt] at (16,10.9) {$W$};
|
||||||
|
|
||||||
|
\fill[sitec] (34,15.5) circle (0.7);
|
||||||
|
\node[annt, sitec, above right] at (34.2,15.9) {$\boldsymbol{\eta}_\text{load}$};
|
||||||
|
\node[annt, centc] at (7.5,19.3) {$\varLambda_\text{center}$};
|
||||||
|
\node[panel] at (23.5,-1.8) {(b) decoupled};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
% ======================================================================
|
||||||
|
% time-line panels
|
||||||
|
% ======================================================================
|
||||||
|
\def\tlen{40}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------- panel c
|
||||||
|
\begin{scope}[shift={(0,-24)}]
|
||||||
|
\draw[->, thin@] (2,0) -- (2+\tlen+3,0) node[annt, right] {$t$};
|
||||||
|
\draw[thin@] (2,0) -- (2,10.5);
|
||||||
|
|
||||||
|
% loaded truck leaves
|
||||||
|
\fill[exitc, opacity=0.75] (4,6.2) rectangle (18,8.6);
|
||||||
|
\node[annt, white] at (11,7.4) {outbound};
|
||||||
|
% empty truck waits, then parks
|
||||||
|
\fill[sitec, opacity=0.28] (4,2.6) rectangle (18,5.0);
|
||||||
|
\node[annt, sitec] at (11,3.8) {waiting};
|
||||||
|
\fill[parkc, opacity=0.75] (18,2.6) rectangle (32,5.0);
|
||||||
|
\node[annt, white] at (25,3.8) {inbound};
|
||||||
|
|
||||||
|
% excavator idle window
|
||||||
|
\draw[decorate, decoration={brace, amplitude=1.6pt, raise=0.6pt},
|
||||||
|
line width=0.4pt, confc] (18,1.9) -- (4,1.9);
|
||||||
|
\node[annt, confc] at (11,-1.2) {$T_\text{wait}>0$};
|
||||||
|
|
||||||
|
\node[annt, exitc, left] at (3.6,7.4) {L};
|
||||||
|
\node[annt, parkc, left] at (3.6,3.8) {E};
|
||||||
|
\node[panel] at (23.5,-5.4) {(c) coupled timing};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
% ---------------------------------------------------------------- panel d
|
||||||
|
\begin{scope}[shift={(52,-24)}]
|
||||||
|
\draw[->, thin@] (2,0) -- (2+\tlen+3,0) node[annt, right] {$t$};
|
||||||
|
\draw[thin@] (2,0) -- (2,10.5);
|
||||||
|
|
||||||
|
\fill[exitc, opacity=0.75] (4,6.2) rectangle (18,8.6);
|
||||||
|
\node[annt, white] at (11,7.4) {outbound};
|
||||||
|
\fill[parkc, opacity=0.75] (4,2.6) rectangle (18,5.0);
|
||||||
|
\node[annt, white] at (11,3.8) {inbound};
|
||||||
|
|
||||||
|
\draw[decorate, decoration={brace, amplitude=1.6pt, raise=0.6pt},
|
||||||
|
line width=0.4pt, corrc] (18,1.9) -- (4,1.9);
|
||||||
|
\node[annt, corrc] at (11,-1.2) {in parallel};
|
||||||
|
|
||||||
|
% the cycle ends earlier by the eliminated waiting time
|
||||||
|
\draw[thin@, sitec, dash pattern=on 1.4pt off 1.2pt] (32,1.9) -- (32,9.4);
|
||||||
|
\draw[dimline, confc] (18,9.8) -- (32,9.8);
|
||||||
|
\node[annt, confc, fill=white, inner sep=0.3pt] at (25,9.8) {saved};
|
||||||
|
|
||||||
|
\node[annt, exitc, left] at (3.6,7.4) {L};
|
||||||
|
\node[annt, parkc, left] at (3.6,3.8) {E};
|
||||||
|
\node[panel] at (23.5,-5.4) {(d) decoupled timing};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
@@ -0,0 +1,100 @@
|
|||||||
|
% Geometric intuition of the convex decomposition (supplement S-IV).
|
||||||
|
% All coordinates are computed by calc_convex.py from
|
||||||
|
% eq:sup_ellipsoid_quadratic and eq:sup_halfspace_normal
|
||||||
|
% and pasted here verbatim; do not hand-edit the numbers.
|
||||||
|
\documentclass[tikz,border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
|
||||||
|
\tikzset{
|
||||||
|
obst/.style={circle, fill=sitec, inner sep=0pt, minimum size=1.7pt},
|
||||||
|
obstx/.style={circle, draw=sitec, line width=0.3pt, fill=white,
|
||||||
|
inner sep=0pt, minimum size=1.7pt},
|
||||||
|
hsp/.style={corrc, line width=0.35pt, dash pattern=on 1.4pt off 1.0pt},
|
||||||
|
ell/.style={parkc, line width=0.6pt},
|
||||||
|
sph/.style={sitec, line width=0.35pt, dash pattern=on 1.0pt off 1.0pt},
|
||||||
|
segl/.style={exitc, line width=1.0pt},
|
||||||
|
}
|
||||||
|
\newcommand{\allobst}{%
|
||||||
|
\foreach \x/\y in {0.30/1.42, 3.75/1.62, 4.85/1.35, 1.90/-1.62,
|
||||||
|
4.35/-1.45, 5.35/-1.02, -0.55/0.85}
|
||||||
|
{\node[obst] at (\x,\y) {};}%
|
||||||
|
\foreach \x/\y in {3.10/-1.12, 1.35/1.05, 2.55/1.28, 5.75/0.62,
|
||||||
|
0.65/-1.30, -1.05/0.12, 6.35/-0.18}
|
||||||
|
{\node[obst] at (\x,\y) {};}%
|
||||||
|
}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[scale=0.50]
|
||||||
|
|
||||||
|
% ============================ panel (a) ==================================
|
||||||
|
\begin{scope}
|
||||||
|
\begin{scope}
|
||||||
|
\clip (-1.45,-2.80) rectangle (6.65,2.80);
|
||||||
|
% initial sphere: radius = segment half-length, before the minor-axis shrink
|
||||||
|
\draw[sph] (2.600,0) circle [radius=2.6000];
|
||||||
|
% collision-free ellipsoid after shrinking along the minor axis
|
||||||
|
\draw[ell, fill=parkc, fill opacity=0.10] (2.600,0)
|
||||||
|
ellipse [x radius=2.6000, y radius=1.1413];
|
||||||
|
\end{scope}
|
||||||
|
% shrink direction along the minor axis
|
||||||
|
\foreach \s in {1,-1}
|
||||||
|
{\draw[line width=0.35pt, ->, >={Latex[length=1.0mm,width=0.8mm]}]
|
||||||
|
(2.600,\s*2.45) -- (2.600,\s*1.30);}
|
||||||
|
% the path segment, fully enclosed by the ellipsoid
|
||||||
|
\draw[segl] (0,0) -- (5.200,0);
|
||||||
|
\node[obst, fill=exitc] at (0,0) {};
|
||||||
|
\node[obst, fill=exitc] at (5.200,0) {};
|
||||||
|
\node[obst, fill=black] at (2.600,0) {};
|
||||||
|
\allobst
|
||||||
|
% the obstacle that stops the shrink lies exactly on the boundary
|
||||||
|
\draw[confc, line width=0.45pt] (3.100,-1.120) circle [radius=0.19];
|
||||||
|
\node[annt, anchor=north] at (0.00,-0.10) {$\mathbf{p}_0$};
|
||||||
|
\node[annt, anchor=north] at (5.20,-0.10) {$\mathbf{p}_1$};
|
||||||
|
\node[annt, anchor=south west] at (2.62,0.04) {$\mathbf{d}$};
|
||||||
|
\node[annt, parkc, anchor=south] at (2.60,1.20) {$\mathcal{E}$};
|
||||||
|
\node[annt, confc, anchor=north west] at (3.28,-1.22) {$\mathbf{o}_i$};
|
||||||
|
\node[annt, sitec, anchor=south east] at (4.60,1.95) {initial sphere};
|
||||||
|
\node[panel, anchor=north] at (2.60,-2.95) {(a)};
|
||||||
|
\end{scope}
|
||||||
|
% ============================ panel (b) ==================================
|
||||||
|
\begin{scope}[shift={(9.4,0)}]
|
||||||
|
% convex polytope P = { p | A p <= b }, 7 retained half-spaces
|
||||||
|
\fill[corrc, fill opacity=0.13]
|
||||||
|
(-1.201,-0.765) -- (0.732,-1.324) -- (6.182,-0.855) --
|
||||||
|
(6.393,-0.009) -- (5.057,1.299) -- (2.346,1.278) --
|
||||||
|
(-0.983,0.515) -- cycle;
|
||||||
|
\draw[corrc, line width=0.6pt]
|
||||||
|
(-1.201,-0.765) -- (0.732,-1.324) -- (6.182,-0.855) --
|
||||||
|
(6.393,-0.009) -- (5.057,1.299) -- (2.346,1.278) --
|
||||||
|
(-0.983,0.515) -- cycle;
|
||||||
|
\begin{scope}
|
||||||
|
\clip (-1.45,-2.80) rectangle (6.65,2.80);
|
||||||
|
% supporting half-space boundaries, tangent to the ellipsoid metric
|
||||||
|
\draw[hsp] (-8.848,-2.148) -- (9.085,-0.605); % o_7
|
||||||
|
\draw[hsp] (8.611,2.716) -- (-8.933,-1.309); % o_1
|
||||||
|
\draw[hsp] (8.990,1.328) -- (-9.009,1.193); % o_2
|
||||||
|
\draw[hsp] (9.555,-3.105) -- (-3.307,9.487); % o_11
|
||||||
|
\draw[hsp] (-8.943,1.473) -- (8.349,-3.525); % o_5
|
||||||
|
\draw[hsp] (0.474,9.049) -- (-2.554,-8.694); % o_12
|
||||||
|
\draw[hsp] (3.846,-10.233) -- (8.197,7.233); % o_13
|
||||||
|
\draw[ell, dash pattern=on 1.2pt off 1.0pt] (2.600,0)
|
||||||
|
ellipse [x radius=2.6000, y radius=1.1413];
|
||||||
|
\end{scope}
|
||||||
|
\draw[segl] (0,0) -- (5.200,0);
|
||||||
|
% retained obstacles: solid; pruned as redundant: hollow
|
||||||
|
\foreach \x/\y in {0.30/1.42, 3.75/1.62, 4.85/1.35, 1.90/-1.62,
|
||||||
|
4.35/-1.45, 5.35/-1.02, -0.55/0.85}
|
||||||
|
{\node[obstx] at (\x,\y) {};}
|
||||||
|
\foreach \x/\y in {3.10/-1.12, 1.35/1.05, 2.55/1.28, 5.75/0.62,
|
||||||
|
0.65/-1.30, -1.05/0.12, 6.35/-0.18}
|
||||||
|
{\node[obst] at (\x,\y) {};}
|
||||||
|
% one normal drawn from its tangency anchor to the generating obstacle
|
||||||
|
\draw[line width=0.35pt, ->, >={Latex[length=1.0mm,width=0.8mm]}]
|
||||||
|
(2.555,1.141) -- (2.55,1.28);
|
||||||
|
\node[annt, anchor=west] at (2.70,1.62)
|
||||||
|
{$\mathbf{a}_i^{\!\top}\mathbf{p}=b_i$};
|
||||||
|
\node[annt, corrc, anchor=north east] at (6.30,-0.95) {$\mathcal{P}$};
|
||||||
|
\node[panel, anchor=north] at (2.60,-2.95) {(b)};
|
||||||
|
\end{scope}
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
@@ -0,0 +1,92 @@
|
|||||||
|
% Overall three-stage framework: offline field prior -> parallel coarse search
|
||||||
|
% -> joint numerical optimization. Laid out to fit one IEEE column (252 pt)
|
||||||
|
% at full size, so no scaling is applied when included. Section numbers are
|
||||||
|
% plain text so the standalone figure compiles independently of main.tex.
|
||||||
|
\documentclass[border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[
|
||||||
|
blk/.style={draw=sitec, line width=0.5pt, rounded corners=1.2pt,
|
||||||
|
align=center, inner sep=2.2pt, font=\tiny,
|
||||||
|
text width=23mm, minimum height=5.4mm},
|
||||||
|
io/.style={blk, fill=fillc, text width=20mm},
|
||||||
|
offb/.style={blk, fill=centc!10, draw=centc!70},
|
||||||
|
parkb/.style={blk, fill=parkc!10, draw=parkc!70, text width=21mm},
|
||||||
|
exitb/.style={blk, fill=exitc!10, draw=exitc!70, text width=21mm},
|
||||||
|
optb/.style={blk, fill=corrc!10, draw=corrc!70, text width=52mm},
|
||||||
|
stage/.style={draw=sitec!45, line width=0.4pt,
|
||||||
|
dash pattern=on 1.4pt off 1.2pt, rounded corners=2pt},
|
||||||
|
lbl/.style={font=\tiny\itshape, sitec},
|
||||||
|
ar/.style={->, line width=0.45pt, sitec,
|
||||||
|
>={Latex[length=1.3mm,width=1.0mm]}},
|
||||||
|
note/.style={font=\tiny, sitec, align=left},
|
||||||
|
]
|
||||||
|
|
||||||
|
% =====================================================================
|
||||||
|
% Stage 1 -- offline construction of the guidance-field prior
|
||||||
|
% =====================================================================
|
||||||
|
\node[io] (bnd) at (0,0) {site boundary point cloud};
|
||||||
|
\node[offb] (skel) at (0,-0.98) {EVG skeleton $+$ QP smoothing
|
||||||
|
$\rightarrow \varLambda_\text{center}$};
|
||||||
|
\node[offb] (guid) at (0,-1.96) {normal offset $\pm W/2$
|
||||||
|
$\rightarrow \varLambda_\text{park},
|
||||||
|
\varLambda_\text{exit}$};
|
||||||
|
\node[offb] (fld) at (0,-3.05) {kernel superposition
|
||||||
|
$\rightarrow U_\text{park}, U_\text{exit}$
|
||||||
|
(mirrored about $\varLambda_\text{center}$)};
|
||||||
|
|
||||||
|
\foreach \a/\b in {bnd/skel, skel/guid, guid/fld}{ \draw[ar] (\a) -- (\b); }
|
||||||
|
|
||||||
|
\node[stage, fit=(bnd)(fld), inner sep=3pt] (s1) {};
|
||||||
|
\node[lbl, above=0.8pt of s1.north] {Stage 1: offline (Sec.~III)};
|
||||||
|
|
||||||
|
% =====================================================================
|
||||||
|
% Stage 2 -- two coarse paths searched independently and in parallel
|
||||||
|
% =====================================================================
|
||||||
|
\node[parkb] (hap) at (3.72,-0.82) {field-adaptive Hybrid A*
|
||||||
|
on $U_\text{park}$};
|
||||||
|
\node[exitb] (hax) at (3.72,-2.24) {field-adaptive Hybrid A*
|
||||||
|
on $U_\text{exit}$};
|
||||||
|
|
||||||
|
\node[stage, fit=(hap)(hax), inner sep=3pt] (s2) {};
|
||||||
|
\node[lbl, above=0.8pt of s2.north, align=center]
|
||||||
|
{Stage 2: online, parallel (Sec.~IV)};
|
||||||
|
|
||||||
|
\draw[ar] (fld.east) -- ++(0.22,0) |- (hap.west);
|
||||||
|
\draw[ar] (fld.east) -- ++(0.22,0) |- (hax.west);
|
||||||
|
|
||||||
|
% =====================================================================
|
||||||
|
% Stage 3 -- joint optimization of the two coarse paths
|
||||||
|
% =====================================================================
|
||||||
|
\node[optb] (corr) at (1.86,-4.35)
|
||||||
|
{convex corridors $\mathcal{P}_k$ from the perception snapshot
|
||||||
|
(ellipsoid proxy, inset by $\Delta_\text{cut}$)};
|
||||||
|
\node[optb] (nlp) at (1.86,-5.45)
|
||||||
|
{joint NLP:
|
||||||
|
$\mathbf{z}=[\mathbf{z}_\text{park};\mathbf{z}_\text{exit}]$,
|
||||||
|
interaction cost $J_\varPsi$, solved by Ipopt};
|
||||||
|
\node[io, text width=28mm] (out) at (1.86,-6.45)
|
||||||
|
{$\varGamma_\text{park}^\star,\ \varGamma_\text{exit}^\star$};
|
||||||
|
|
||||||
|
\node[stage, fit=(corr)(out), inner sep=3pt] (s3) {};
|
||||||
|
\node[lbl, below=0.8pt of s3.south]
|
||||||
|
{Stage 3: joint optimization (Sec.~V)};
|
||||||
|
|
||||||
|
\draw[ar] (hap.east) -- ++(0.20,0) |- ([yshift=1.1mm]corr.east);
|
||||||
|
\draw[ar] (hax.south) -- ++(0,-0.30) -| ([xshift=8mm]corr.north);
|
||||||
|
\draw[ar] (corr) -- (nlp);
|
||||||
|
\draw[ar] (nlp) -- (out);
|
||||||
|
|
||||||
|
% ---------- what each stage fixes ------------------------------------
|
||||||
|
\node[note] at (0.30,-3.72) {\textbf{fixes} topology};
|
||||||
|
\node[note] at (3.30,-3.00) {\textbf{fixes} $N,\{\delta_j\}$};
|
||||||
|
\node[note] at (-0.62,-5.45) {\textbf{fixes}\\shape,\\$\kappa$ cont.};
|
||||||
|
|
||||||
|
% ---------- rebuild trigger -------------------------------------------
|
||||||
|
\draw[ar, densely dotted, centc, >={Latex[length=1.3mm,width=1.0mm]}]
|
||||||
|
(out.west) -- ++(-0.42,0) |- (skel.west);
|
||||||
|
\node[font=\tiny, centc, align=center] at (-1.32,-2.55)
|
||||||
|
{rebuild only\\on boundary\\change};
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,118 @@
|
|||||||
|
% Field-adaptive expansion step.
|
||||||
|
% (a) the six probe poses D(eta_i) reached with psi in {-psi_max, 0, +psi_max}
|
||||||
|
% and delta in {+1,-1} at the baseline step mu_0;
|
||||||
|
% (b) the resulting per-direction steps mu_j^delta after modulation.
|
||||||
|
%
|
||||||
|
% All arcs are drawn with the true geometry of the paper's numbers:
|
||||||
|
% L_w = 6.5 m, R_min = 12 m, psi_max = arctan(L_w/R_min) = 28.44 deg,
|
||||||
|
% so a constant-psi_max arc of length mu turns mu/R_min rad.
|
||||||
|
% mu_0 = 4 m -> 19.10 deg; modulated steps use
|
||||||
|
% mu = mu_0 [w_min + (w_max-w_min)(1-Utilde)], [w_min,w_max] = [0.6,1.4].
|
||||||
|
\documentclass[border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[
|
||||||
|
scale=0.30,
|
||||||
|
probe/.style={line width=0.7pt},
|
||||||
|
pnode/.style={circle, draw, line width=0.4pt, inner sep=0pt,
|
||||||
|
minimum size=1.5mm},
|
||||||
|
lo/.style={corrc}, % low potential -> long step
|
||||||
|
hi/.style={confc}, % high potential -> short step
|
||||||
|
panel/.style={font=\footnotesize},
|
||||||
|
]
|
||||||
|
|
||||||
|
% =====================================================================
|
||||||
|
% (a) six probe poses at the baseline step mu_0
|
||||||
|
% =====================================================================
|
||||||
|
\begin{scope}
|
||||||
|
|
||||||
|
% boundary that the vehicle is heading towards (source of high U)
|
||||||
|
\draw[siteline] (-7.4,7.0) -- (9.0,7.0);
|
||||||
|
\draw[pattern=north east lines, pattern color=sitec!45, draw=none]
|
||||||
|
(-7.4,7.0) rectangle (9.0,8.6);
|
||||||
|
\node[annt, sitec] at (6.2,7.9) {$\mathcal{S}_\text{e}$};
|
||||||
|
|
||||||
|
% current node eta_i
|
||||||
|
\fill[parkc] (0,0) circle (0.30);
|
||||||
|
\node[annt, parkc, below left] at (0.15,-0.25) {$\boldsymbol{\eta}_i$};
|
||||||
|
\draw[->, thin@, parkc] (0,0) -- (2.1,0);
|
||||||
|
\node[annt, parkc] at (2.55,-0.55) {$\theta$};
|
||||||
|
|
||||||
|
% --- forward arcs (delta = +1), sweep 19.0986 deg over mu_0 = 4 m ---
|
||||||
|
% left: centre at (0, +R), arc from angle -90 to -90+19.0986
|
||||||
|
\draw[probe, hi] (0,0) arc[start angle=-90, end angle=-70.9014, radius=12];
|
||||||
|
% straight
|
||||||
|
\draw[probe, sitec] (0,0) -- (4,0);
|
||||||
|
% right: centre at (0, -R)
|
||||||
|
\draw[probe, sitec] (0,0) arc[start angle=90, end angle=70.9014, radius=12];
|
||||||
|
|
||||||
|
% --- reverse arcs (delta = -1) --------------------------------------
|
||||||
|
\draw[probe, lo] (0,0) arc[start angle=-90, end angle=-109.0986, radius=12];
|
||||||
|
\draw[probe, lo] (0,0) -- (-4,0);
|
||||||
|
\draw[probe, sitec] (0,0) arc[start angle=90, end angle=109.0986, radius=12];
|
||||||
|
|
||||||
|
% --- probe nodes (computed endpoints) -------------------------------
|
||||||
|
\node[pnode, hi, fill=confc!25] at ( 3.927, 0.659) {};
|
||||||
|
\node[pnode, sitec, fill=fillc] at ( 4.000, 0.000) {};
|
||||||
|
\node[pnode, sitec, fill=fillc] at ( 3.927,-0.659) {};
|
||||||
|
\node[pnode, lo, fill=corrc!25] at (-3.927, 0.659) {};
|
||||||
|
\node[pnode, lo, fill=corrc!25] at (-4.000, 0.000) {};
|
||||||
|
\node[pnode, sitec, fill=fillc] at (-3.927,-0.659) {};
|
||||||
|
|
||||||
|
\node[annt, hi] at (6.3,1.9) {high $U$};
|
||||||
|
\node[annt, lo] at (-6.4,2.2) {low $U$};
|
||||||
|
|
||||||
|
% baseline step annotation
|
||||||
|
\draw[dimline] (0,-2.5) -- (4,-2.5);
|
||||||
|
\node[annt, fill=white, inner sep=0.3pt] at (2,-2.5) {$\mu_0$};
|
||||||
|
|
||||||
|
\node[annt, sitec] at (0,-4.6)
|
||||||
|
{$\psi\in\{-\psi_\text{max},0,\psi_\text{max}\},\ \delta=\pm1$};
|
||||||
|
\node[panel] at (0,-6.6) {(a) six probes $\mathcal{D}(\boldsymbol{\eta}_i)$};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
% =====================================================================
|
||||||
|
% (b) modulated steps -- same six directions, lengths from eq (step)
|
||||||
|
% =====================================================================
|
||||||
|
\begin{scope}[shift={(0,-17.5)}]
|
||||||
|
|
||||||
|
\draw[siteline] (-8.6,7.0) -- (9.0,7.0);
|
||||||
|
\draw[pattern=north east lines, pattern color=sitec!45, draw=none]
|
||||||
|
(-8.6,7.0) rectangle (9.0,8.6);
|
||||||
|
|
||||||
|
\fill[parkc] (0,0) circle (0.30);
|
||||||
|
\node[annt, parkc, below left] at (0.15,-0.25) {$\boldsymbol{\eta}_i$};
|
||||||
|
|
||||||
|
% fwd-left : Utilde = 1.00 -> w = 0.60, mu = 2.400 m, sweep 11.4592 deg
|
||||||
|
\draw[probe, hi] (0,0) arc[start angle=-90, end angle=-78.5408, radius=12];
|
||||||
|
\node[pnode, hi, fill=confc!25] at (2.383,0.238) {};
|
||||||
|
% fwd-straight : Utilde = 0.72 -> w = 0.824, mu = 3.296 m
|
||||||
|
\draw[probe, sitec] (0,0) -- (3.296,0);
|
||||||
|
\node[pnode, sitec, fill=fillc] at (3.296,0) {};
|
||||||
|
% fwd-right : Utilde = 0.48 -> w = 1.016, mu = 4.064 m, sweep 19.4042
|
||||||
|
\draw[probe, sitec] (0,0) arc[start angle=90, end angle=70.5958, radius=12];
|
||||||
|
\node[pnode, sitec, fill=fillc] at (3.988,-0.680) {};
|
||||||
|
% rev-left : Utilde = 0.30 -> w = 1.160, mu = 4.640 m, sweep 22.1544
|
||||||
|
\draw[probe, lo] (0,0) arc[start angle=-90, end angle=-112.1544, radius=12];
|
||||||
|
\node[pnode, lo, fill=corrc!25] at (-4.525,0.884) {};
|
||||||
|
% rev-straight : Utilde = 0.08 -> w = 1.336, mu = 5.344 m
|
||||||
|
\draw[probe, lo] (0,0) -- (-5.344,0);
|
||||||
|
\node[pnode, lo, fill=corrc!25] at (-5.344,0) {};
|
||||||
|
% rev-right : Utilde = 0.00 -> w = 1.400, mu = 5.600 m, sweep 26.7380
|
||||||
|
\draw[probe, lo] (0,0) arc[start angle=90, end angle=116.7380, radius=12];
|
||||||
|
\node[pnode, lo, fill=corrc!25] at (-5.399,-1.283) {};
|
||||||
|
|
||||||
|
% shortest / longest annotations
|
||||||
|
\node[annt, hi] at (4.9,1.75) {$w_\text{min}\mu_0$};
|
||||||
|
\draw[->, line width=0.4pt, hi] (3.7,1.35) -- (2.6,0.55);
|
||||||
|
\node[annt, lo] at (-6.9,-2.7) {$w_\text{max}\mu_0$};
|
||||||
|
\draw[->, line width=0.4pt, lo] (-6.3,-2.15) -- (-5.4,-1.35);
|
||||||
|
|
||||||
|
\node[annt, sitec, align=center] at (0,-4.6)
|
||||||
|
{$\mu_j^\delta=\mu_0\bigl[w_\text{min}
|
||||||
|
+(w_\text{max}-w_\text{min})(1-\tilde U_j^\delta)\bigr]$};
|
||||||
|
\node[panel] at (0,-6.6) {(b) modulated steps};
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
Binary file not shown.
@@ -0,0 +1,73 @@
|
|||||||
|
% Loading operation in an open-pit mine loading area.
|
||||||
|
% Semi-enclosed drivable region with a single entrance, an excavator working
|
||||||
|
% against the bench face, and a truck at the designated loading pose.
|
||||||
|
\documentclass[border=1pt]{standalone}
|
||||||
|
\input{figstyle}
|
||||||
|
\begin{document}
|
||||||
|
\begin{tikzpicture}[scale=0.094]
|
||||||
|
|
||||||
|
% ---------- terrain / non-drivable surroundings -------------------------
|
||||||
|
\begin{scope}
|
||||||
|
\clip (-3,-1) rectangle (79,44);
|
||||||
|
\fill[fillc] (-3,-1) rectangle (79,44);
|
||||||
|
\draw[pattern=north east lines, pattern color=sitec!55, draw=none]
|
||||||
|
(-3,-1) rectangle (79,44);
|
||||||
|
\end{scope}
|
||||||
|
|
||||||
|
% ---------- drivable loading area (Omega_free) --------------------------
|
||||||
|
\def\sitepath{
|
||||||
|
(0,10) -- (16,6.5) -- (33,5) -- (50,6.5) -- (63,11) -- (70,19)
|
||||||
|
-- (66,30) -- (52,36) -- (36,35) -- (21,30) -- (8,24) -- (0,20)
|
||||||
|
}
|
||||||
|
\fill[white] \sitepath -- cycle;
|
||||||
|
\draw[siteline] \sitepath;
|
||||||
|
|
||||||
|
% ---------- entrance ----------------------------------------------------
|
||||||
|
\draw[white, line width=1.4pt] (0.2,10.4) -- (0.2,19.6);
|
||||||
|
\draw[->, line width=0.7pt, sitec] (-9,15) -- (-1.2,15);
|
||||||
|
\node[ann, sitec, align=center] at (-9,20.5) {single\\entrance};
|
||||||
|
|
||||||
|
% ---------- bench face / ore pile --------------------------------------
|
||||||
|
% jagged toe line along the upper-right boundary
|
||||||
|
\draw[siteline, sitec]
|
||||||
|
(70,19) -- (72.5,22) -- (69.5,25) -- (72,28) -- (68,31)
|
||||||
|
-- (70,34) -- (65,35.5) -- (66,38.5) -- (60,38) -- (55,40);
|
||||||
|
\node[ann, sitec, align=center] at (60,25.5) {bench face\\/ ore pile};
|
||||||
|
\node[ann, sitec] at (12,38) {$\Omega_\text{obs}$};
|
||||||
|
\node[ann] at (20,15) {$\Omega_\text{free}$};
|
||||||
|
|
||||||
|
% ---------- excavator ---------------------------------------------------
|
||||||
|
\begin{scope}[shift={(57,31)}, rotate=-155]
|
||||||
|
\draw[veh, fill=sitec!35] (-3.2,-2.0) rectangle (3.2,2.0); % tracks
|
||||||
|
\draw[veh, fill=sitec!70] (-1.8,-1.5) rectangle (1.4,1.5); % house
|
||||||
|
\draw[line width=0.9pt, sitec] (1.2,0.6) -- (5.6,2.6); % boom
|
||||||
|
\draw[line width=0.9pt, sitec] (5.6,2.6) -- (7.4,-0.6); % stick
|
||||||
|
\draw[veh, fill=sitec!45] (7.4,-0.6) -- (8.9,-1.9) -- (7.4,-2.9)
|
||||||
|
-- (6.4,-1.5) -- cycle; % bucket
|
||||||
|
\end{scope}
|
||||||
|
\node[ann, sitec] at (57,36.5) {excavator};
|
||||||
|
|
||||||
|
% ---------- truck at the loading pose ----------------------------------
|
||||||
|
% rear-axle centre at (44,24), heading 205 deg, L_v = 12 m, B_v = 3 m,
|
||||||
|
% rear overhang 1.5 m (body spans a in [-1.5, 10.5] in body frame)
|
||||||
|
\begin{scope}[shift={(44,24)}, rotate=205]
|
||||||
|
\draw[veh, parkc, fill=parkc!12] (-1.5,-1.5) rectangle (10.5,1.5);
|
||||||
|
\draw[veh, parkc, fill=parkc!30] (6.6,-1.5) rectangle (10.5,1.5); % cab
|
||||||
|
\foreach \sx in {0,6.5}{
|
||||||
|
\foreach \sy in {-1.5,1.5}{
|
||||||
|
\draw[line width=0.4pt, parkc, fill=parkc!60]
|
||||||
|
(\sx-0.9,\sy-0.28) rectangle (\sx+0.9,\sy+0.28);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
\fill[parkc] (0,0) circle (0.42);
|
||||||
|
\end{scope}
|
||||||
|
\node[ann, parkc, align=center] at (34,20)
|
||||||
|
{loading pose\\$\boldsymbol{\eta}_\text{load}$};
|
||||||
|
\draw[->, line width=0.5pt, parkc] (37.5,22.6) -- (42,23.4);
|
||||||
|
|
||||||
|
% ---------- shared channel ---------------------------------------------
|
||||||
|
\draw[<->, line width=0.5pt, sitec] (6,14.2) -- (16.5,11.3);
|
||||||
|
\node[annt, sitec, align=center] at (12.5,7.6) {shared\\channel};
|
||||||
|
|
||||||
|
\end{tikzpicture}
|
||||||
|
\end{document}
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
% Shared style for the standalone figures of the mine-planning paper.
|
||||||
|
% Each figure compiles on its own: pdflatex -interaction=nonstopmode fig_*.tex
|
||||||
|
% Fonts follow IEEEtran (Times) so that included figures match the body text.
|
||||||
|
\usepackage{mathptmx}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{tikz}
|
||||||
|
\usepackage{pgfplots}
|
||||||
|
\pgfplotsset{compat=1.18}
|
||||||
|
\usetikzlibrary{arrows.meta,positioning,calc,decorations.pathreplacing,
|
||||||
|
decorations.markings,patterns,fit,shapes.geometric,
|
||||||
|
backgrounds,intersections}
|
||||||
|
|
||||||
|
\definecolor{parkc}{RGB}{0,84,159} % inbound / parking-in path
|
||||||
|
\definecolor{exitc}{RGB}{196,78,10} % outbound / exit path
|
||||||
|
\definecolor{sitec}{RGB}{88,88,88} % site boundary, neutral linework
|
||||||
|
\definecolor{fillc}{RGB}{228,228,228} % obstacle / terrain fill
|
||||||
|
\definecolor{corrc}{RGB}{0,124,76} % convex corridor
|
||||||
|
\definecolor{centc}{RGB}{112,58,148} % virtual road centerline
|
||||||
|
\definecolor{confc}{RGB}{198,32,44} % conflict zone
|
||||||
|
|
||||||
|
\tikzset{
|
||||||
|
>={Latex[length=1.6mm,width=1.2mm]},
|
||||||
|
siteline/.style={sitec, line width=0.7pt},
|
||||||
|
parkpath/.style={parkc, line width=1.0pt},
|
||||||
|
exitpath/.style={exitc, line width=1.0pt},
|
||||||
|
ctrline/.style={centc, line width=0.7pt, dash pattern=on 2pt off 1.2pt},
|
||||||
|
guide/.style={line width=0.6pt, dash pattern=on 1.6pt off 1.2pt},
|
||||||
|
veh/.style={line width=0.5pt},
|
||||||
|
thin@/.style={line width=0.4pt},
|
||||||
|
ann/.style={font=\scriptsize},
|
||||||
|
annt/.style={font=\tiny},
|
||||||
|
dimline/.style={line width=0.4pt, <->,
|
||||||
|
>={Latex[length=1.2mm,width=0.9mm]}},
|
||||||
|
panel/.style={font=\footnotesize},
|
||||||
|
}
|
||||||
@@ -0,0 +1,162 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Build the virtual-centerline construction figure (fig_center.pdf).
|
||||||
|
|
||||||
|
Three panels, following subsec:centerline of the paper:
|
||||||
|
|
||||||
|
(a) clearance field of the free space (distance transform), the EVG-thin
|
||||||
|
skeleton ridge extracted from it, and the coarse A* path on the skeleton
|
||||||
|
graph from the entrance to the loading bay.
|
||||||
|
(b) the local tangent--normal rectangular corridors of
|
||||||
|
eq:local_corridor_tangent / eq:local_corridor_normal built around each
|
||||||
|
resampled reference point, and the centerline returned by the FEM-pos QP
|
||||||
|
smoother of eq:qp_problem, overlaid on the coarse path.
|
||||||
|
(c) the discrete curvature profile before and after smoothing, obtained from
|
||||||
|
the second difference ||d_i|| = ell^2 kappa_i + O(ell^4), against the
|
||||||
|
bound kappa_max = 1 / R_min imposed by eq:qp_curvature.
|
||||||
|
|
||||||
|
Construction illustration on a synthetic site -- not an experimental result.
|
||||||
|
"""
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib
|
||||||
|
matplotlib.use("Agg")
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib.patches import Polygon as MplPolygon, Rectangle
|
||||||
|
|
||||||
|
import sitegeom as sg
|
||||||
|
|
||||||
|
R_MIN = 12.0
|
||||||
|
KAP_MAX = 1.0 / R_MIN
|
||||||
|
HALF_W = 1.6 # lateral corridor half-width used by qp_smooth
|
||||||
|
S_HALF = 0.5 # tangential corridor half-length, for illustration
|
||||||
|
|
||||||
|
|
||||||
|
def curvature(P):
|
||||||
|
"""Discrete curvature via second differences, on P's own spacing."""
|
||||||
|
seg = np.hypot(*np.diff(P, axis=0).T)
|
||||||
|
ell = 0.5 * (seg[:-1] + seg[1:])
|
||||||
|
d2 = P[:-2] - 2.0 * P[1:-1] + P[2:]
|
||||||
|
kap = np.hypot(d2[:, 0], d2[:, 1]) / ell ** 2
|
||||||
|
s = np.concatenate([[0.0], np.cumsum(seg)])
|
||||||
|
return s[1:-1], kap
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
g = sg.build_centerline()
|
||||||
|
xs, ys, inside, dist = g["xs"], g["ys"], g["inside"], g["dist"]
|
||||||
|
skel, raw, center = g["skel"], g["raw"], g["center"]
|
||||||
|
|
||||||
|
coarse = sg.resample(raw, 1.0)
|
||||||
|
t_c, n_c = sg.tangent_normal(coarse)
|
||||||
|
|
||||||
|
s_raw, k_raw = curvature(coarse)
|
||||||
|
s_sm, k_sm = curvature(center)
|
||||||
|
print("coarse |kappa| max %.4f -> R %.2f m" % (k_raw.max(), 1 / k_raw.max()))
|
||||||
|
print("smooth |kappa| max %.4f -> R %.2f m" % (k_sm.max(), 1 / k_sm.max()))
|
||||||
|
print("bound kappa_max %.4f -> R %.2f m" % (KAP_MAX, R_MIN))
|
||||||
|
print("smoothed violates bound: %s" % bool((k_sm > KAP_MAX + 1e-9).any()))
|
||||||
|
print("coarse length %.2f m / smoothed length %.2f m"
|
||||||
|
% (np.hypot(*np.diff(coarse, axis=0).T).sum(),
|
||||||
|
np.hypot(*np.diff(center, axis=0).T).sum()))
|
||||||
|
print("max lateral deviation from coarse %.2f m"
|
||||||
|
% np.abs(((center - coarse) * n_c).sum(axis=1)).max())
|
||||||
|
|
||||||
|
plt.rcParams.update({
|
||||||
|
"font.family": "serif",
|
||||||
|
"font.serif": ["Nimbus Roman", "Times New Roman", "DejaVu Serif"],
|
||||||
|
"font.size": 7,
|
||||||
|
"mathtext.fontset": "stix",
|
||||||
|
"axes.linewidth": 0.5,
|
||||||
|
"pdf.fonttype": 42,
|
||||||
|
})
|
||||||
|
fig = plt.figure(figsize=(7.16, 1.95), constrained_layout=True)
|
||||||
|
gs = fig.add_gridspec(1, 3, width_ratios=[1.0, 1.0, 0.72])
|
||||||
|
ax0, ax1, ax2 = (fig.add_subplot(gs[0]), fig.add_subplot(gs[1]),
|
||||||
|
fig.add_subplot(gs[2]))
|
||||||
|
|
||||||
|
# ---- (a) clearance field, skeleton, coarse A* --------------------------
|
||||||
|
dm = np.ma.array(dist, mask=~inside)
|
||||||
|
im = ax0.pcolormesh(xs, ys, dm, cmap="Blues", shading="auto",
|
||||||
|
rasterized=True, vmin=0.0, vmax=dist.max())
|
||||||
|
rr, cc = np.nonzero(skel)
|
||||||
|
ax0.plot(xs[cc], ys[rr], ls="none", marker="s", ms=0.55,
|
||||||
|
color="#4A4A4A", label="EVG skeleton", zorder=3)
|
||||||
|
ax0.plot(raw[:, 0], raw[:, 1], color="#C44E0A", lw=0.9,
|
||||||
|
label=r"coarse A$^\ast$", zorder=4)
|
||||||
|
ax0.plot(*sg.ENTRANCE, marker=">", ms=3.2, color="#111111", zorder=5)
|
||||||
|
ax0.plot(*sg.LOAD_POSE, marker="o", ms=3.0, color="#111111", zorder=5)
|
||||||
|
ax0.annotate("entrance", sg.ENTRANCE, textcoords="offset points",
|
||||||
|
xytext=(3, -6), fontsize=5.6)
|
||||||
|
ax0.annotate("loading bay", sg.LOAD_POSE, textcoords="offset points",
|
||||||
|
xytext=(-13, 4), fontsize=5.6)
|
||||||
|
ax0.legend(loc="lower right", fontsize=5.2, frameon=False,
|
||||||
|
handlelength=1.4, borderaxespad=0.1, labelspacing=0.25,
|
||||||
|
markerscale=3.0)
|
||||||
|
ax0.set_title("(a) clearance field and skeleton", fontsize=6.6, pad=2)
|
||||||
|
cb = fig.colorbar(im, ax=ax0, fraction=0.040, pad=0.015)
|
||||||
|
cb.set_ticks([0.0, dist.max()])
|
||||||
|
cb.set_ticklabels(["0", "%.0f m" % dist.max()])
|
||||||
|
cb.ax.tick_params(labelsize=5.2, width=0.4, length=1.8)
|
||||||
|
cb.outline.set_linewidth(0.4)
|
||||||
|
|
||||||
|
# ---- (b) local corridors and the smoothed centerline -------------------
|
||||||
|
ax1.add_patch(MplPolygon(sg.SITE, closed=True, facecolor="#F4F4F4",
|
||||||
|
edgecolor="#585858", lw=0.7, zorder=1))
|
||||||
|
for i in range(0, len(coarse), 3):
|
||||||
|
ang = np.degrees(np.arctan2(t_c[i, 1], t_c[i, 0]))
|
||||||
|
r = Rectangle((-S_HALF, -HALF_W), 2 * S_HALF, 2 * HALF_W,
|
||||||
|
facecolor="#BBD7EE", edgecolor="#4A87BE",
|
||||||
|
lw=0.25, alpha=0.75, zorder=2)
|
||||||
|
tr = (matplotlib.transforms.Affine2D()
|
||||||
|
.rotate_deg(ang).translate(*coarse[i]) + ax1.transData)
|
||||||
|
r.set_transform(tr)
|
||||||
|
ax1.add_patch(r)
|
||||||
|
ax1.plot(coarse[:, 0], coarse[:, 1], color="#C44E0A", lw=0.7,
|
||||||
|
ls=(0, (2.0, 1.3)), label=r"coarse A$^\ast$", zorder=4)
|
||||||
|
ax1.plot(center[:, 0], center[:, 1], color="#703A94", lw=1.2,
|
||||||
|
label=r"$\Lambda_{\mathrm{center}}$ (QP)", zorder=5)
|
||||||
|
# annotate one corridor with its four bounds
|
||||||
|
i0 = len(coarse) // 2
|
||||||
|
p0 = coarse[i0]
|
||||||
|
ax1.annotate(r"$s_i^\pm,\ l_i^\pm$", p0, textcoords="offset points",
|
||||||
|
xytext=(6, 7), fontsize=5.8,
|
||||||
|
arrowprops=dict(arrowstyle="-", lw=0.4, color="#333333",
|
||||||
|
shrinkA=0, shrinkB=1))
|
||||||
|
ax1.legend(loc="lower right", fontsize=5.2, frameon=False,
|
||||||
|
handlelength=1.5, borderaxespad=0.1, labelspacing=0.25)
|
||||||
|
ax1.set_title("(b) local corridors and QP smoothing", fontsize=6.6, pad=2)
|
||||||
|
|
||||||
|
for ax in (ax0, ax1):
|
||||||
|
ax.set_aspect("equal")
|
||||||
|
ax.set_xlim(sg.SITE[:, 0].min() - 1, sg.SITE[:, 0].max() + 1)
|
||||||
|
ax.set_ylim(sg.SITE[:, 1].min() - 1, sg.SITE[:, 1].max() + 1)
|
||||||
|
ax.set_xticks([])
|
||||||
|
ax.set_yticks([])
|
||||||
|
for sp in ax.spines.values():
|
||||||
|
sp.set_visible(False)
|
||||||
|
|
||||||
|
# ---- (c) curvature profile --------------------------------------------
|
||||||
|
ax2.plot(s_raw, k_raw, color="#C44E0A", lw=0.7, ls=(0, (2.0, 1.3)),
|
||||||
|
label=r"coarse A$^\ast$")
|
||||||
|
ax2.plot(s_sm, k_sm, color="#703A94", lw=1.0,
|
||||||
|
label=r"$\Lambda_{\mathrm{center}}$")
|
||||||
|
ax2.axhline(KAP_MAX, color="#111111", lw=0.6, ls=(0, (4.0, 1.6)))
|
||||||
|
ax2.annotate(r"$\kappa_{\max}=1/R_{\min}$", (s_sm[-1], KAP_MAX),
|
||||||
|
textcoords="offset points", xytext=(-2, 3), fontsize=5.6,
|
||||||
|
ha="right")
|
||||||
|
ax2.set_xlabel("arc length $s$ (m)", fontsize=6.2, labelpad=1.5)
|
||||||
|
ax2.set_ylabel(r"$\kappa$ (m$^{-1}$)", fontsize=6.2, labelpad=1.5)
|
||||||
|
ax2.set_title("(c) curvature profile", fontsize=6.6, pad=2)
|
||||||
|
ax2.tick_params(labelsize=5.6, width=0.4, length=2.0, pad=1.5)
|
||||||
|
ax2.set_xlim(0, max(s_raw[-1], s_sm[-1]))
|
||||||
|
ax2.set_ylim(0, max(k_raw.max(), KAP_MAX) * 1.18)
|
||||||
|
ax2.legend(loc="upper left", fontsize=5.2, frameon=False,
|
||||||
|
handlelength=1.5, borderaxespad=0.2, labelspacing=0.25)
|
||||||
|
for sp in ("top", "right"):
|
||||||
|
ax2.spines[sp].set_visible(False)
|
||||||
|
|
||||||
|
fig.savefig("fig_center.pdf", dpi=600)
|
||||||
|
print("wrote fig_center.pdf")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,183 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Build the IGF illustration figure (fig_igf.pdf).
|
||||||
|
|
||||||
|
Implements the paper's equations verbatim on the synthetic site of sitegeom.py:
|
||||||
|
|
||||||
|
eq:compact_kernel K(d; rho, m) = (1 - d/rho)^m for d < rho, else 0
|
||||||
|
eq:source_field U_S(z) = alpha_S * sum_{xi in S} K(|z-xi|; rho_S, m_S) ds_xi
|
||||||
|
eq:field_park U_park = U_e - U_p + U_x
|
||||||
|
eq:field_exit U_exit = U_e + U_p - U_x
|
||||||
|
eq:field_bounds U_g^max = 2 alpha_g rho_g / (m_g + 1)
|
||||||
|
U_e^max = alpha_e (2 rho_e / lbar_e + 1)
|
||||||
|
eq:field_normalize Uhat = (U + U_g^max) / (U_e^max + 2 U_g^max), clipped [0,1]
|
||||||
|
|
||||||
|
For S_e the paper takes ds_xi == 1 (vertex counting); S_p and S_x are
|
||||||
|
equal-arc-length samples carrying their true line element. Both are reproduced.
|
||||||
|
|
||||||
|
Construction illustration on a synthetic site -- not an experimental result.
|
||||||
|
"""
|
||||||
|
import numpy as np
|
||||||
|
import matplotlib
|
||||||
|
matplotlib.use("Agg")
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from matplotlib.patches import Polygon as MplPolygon
|
||||||
|
from matplotlib.path import Path
|
||||||
|
|
||||||
|
import sitegeom as sg
|
||||||
|
|
||||||
|
# Field parameters; alpha_e is set so that eq:alpha_dominance holds.
|
||||||
|
RHO_E, M_E, ALPHA_E = 8.0, 3.0, 1.00
|
||||||
|
RHO_G, M_G, ALPHA_G = 9.0, 3.0, 0.28
|
||||||
|
LBAR_E = 1.0 # mean boundary-vertex spacing, enters U_e^max
|
||||||
|
DS_G = 0.5 # arc-length element of the guidance-line samples
|
||||||
|
DELTA = 0.25 # field grid resolution
|
||||||
|
|
||||||
|
|
||||||
|
def kernel(d, rho, m):
|
||||||
|
out = np.zeros_like(d)
|
||||||
|
ins = d < rho
|
||||||
|
out[ins] = (1.0 - d[ins] / rho) ** m
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def source_field(Z, S, alpha, rho, m, ds):
|
||||||
|
U = np.zeros(Z.shape[0])
|
||||||
|
for i in range(0, S.shape[0], 256):
|
||||||
|
blk = S[i:i + 256]
|
||||||
|
d = np.linalg.norm(Z[:, None, :] - blk[None, :, :], axis=2)
|
||||||
|
U += (kernel(d, rho, m) * ds).sum(axis=1)
|
||||||
|
return alpha * U
|
||||||
|
|
||||||
|
|
||||||
|
def resample_closed(poly, step):
|
||||||
|
pts = np.vstack([poly, poly[:1]])
|
||||||
|
seg = np.diff(pts, axis=0)
|
||||||
|
L = np.hypot(seg[:, 0], seg[:, 1])
|
||||||
|
cum = np.concatenate([[0.0], np.cumsum(L)])
|
||||||
|
s = np.arange(0.0, cum[-1], step)
|
||||||
|
out = np.empty((s.size, 2))
|
||||||
|
for i, si in enumerate(s):
|
||||||
|
k = min(np.searchsorted(cum, si, side="right") - 1, len(seg) - 1)
|
||||||
|
t = (si - cum[k]) / L[k]
|
||||||
|
out[i] = pts[k] + t * seg[k]
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
g = sg.build_centerline()
|
||||||
|
center, park_line, exit_line = g["center"], g["park_line"], g["exit_line"]
|
||||||
|
|
||||||
|
# ---- source sets -------------------------------------------------------
|
||||||
|
S_e = resample_closed(sg.SITE, LBAR_E)
|
||||||
|
S_p = sg.resample(park_line, DS_G)
|
||||||
|
S_x = sg.resample(exit_line, DS_G)
|
||||||
|
|
||||||
|
# ---- grid --------------------------------------------------------------
|
||||||
|
x0, x1 = sg.SITE[:, 0].min() - 1.0, sg.SITE[:, 0].max() + 1.0
|
||||||
|
y0, y1 = sg.SITE[:, 1].min() - 1.0, sg.SITE[:, 1].max() + 1.0
|
||||||
|
xs = np.arange(x0, x1, DELTA)
|
||||||
|
ys = np.arange(y0, y1, DELTA)
|
||||||
|
XX, YY = np.meshgrid(xs, ys)
|
||||||
|
Z = np.column_stack([XX.ravel(), YY.ravel()])
|
||||||
|
|
||||||
|
U_e = source_field(Z, S_e, ALPHA_E, RHO_E, M_E, 1.0)
|
||||||
|
U_p = source_field(Z, S_p, ALPHA_G, RHO_G, M_G, DS_G)
|
||||||
|
U_x = source_field(Z, S_x, ALPHA_G, RHO_G, M_G, DS_G)
|
||||||
|
|
||||||
|
Ug_max = 2.0 * ALPHA_G * RHO_G / (M_G + 1.0)
|
||||||
|
Ue_max = ALPHA_E * (2.0 * RHO_E / LBAR_E + 1.0)
|
||||||
|
assert Ue_max > Ug_max, "eq:alpha_dominance violated"
|
||||||
|
|
||||||
|
def norm(U):
|
||||||
|
return np.clip((U + Ug_max) / (Ue_max + 2.0 * Ug_max), 0.0, 1.0)
|
||||||
|
|
||||||
|
Up_raw, Ux_raw = U_e - U_p + U_x, U_e + U_p - U_x
|
||||||
|
U_park = norm(Up_raw).reshape(XX.shape)
|
||||||
|
U_exit = norm(Ux_raw).reshape(XX.shape)
|
||||||
|
|
||||||
|
inside = Path(sg.SITE).contains_points(Z).reshape(XX.shape)
|
||||||
|
U_parkm = np.ma.array(U_park, mask=~inside)
|
||||||
|
U_exitm = np.ma.array(U_exit, mask=~inside)
|
||||||
|
|
||||||
|
# ---- numeric checks reported to stdout ---------------------------------
|
||||||
|
print("U_g^max = %.4f U_e^max = %.4f" % (Ug_max, Ue_max))
|
||||||
|
print("Uhat_park in [%.4f, %.4f]" % (U_parkm.min(), U_parkm.max()))
|
||||||
|
print("Uhat_exit in [%.4f, %.4f]" % (U_exitm.min(), U_exitm.max()))
|
||||||
|
print("mirror residual |(U_park+U_exit) - 2 U_e| = %.2e"
|
||||||
|
% np.abs(Up_raw + Ux_raw - 2 * U_e).max())
|
||||||
|
# the park field must be lower on the park line than on the exit line
|
||||||
|
def sample(F, P):
|
||||||
|
ii = np.clip(((P[:, 0] - x0) / DELTA).astype(int), 0, len(xs) - 1)
|
||||||
|
jj = np.clip(((P[:, 1] - y0) / DELTA).astype(int), 0, len(ys) - 1)
|
||||||
|
return F[jj, ii]
|
||||||
|
print("mean Uhat_park on Lambda_park = %.4f, on Lambda_exit = %.4f"
|
||||||
|
% (sample(U_park, park_line).mean(), sample(U_park, exit_line).mean()))
|
||||||
|
print("mean Uhat_exit on Lambda_park = %.4f, on Lambda_exit = %.4f"
|
||||||
|
% (sample(U_exit, park_line).mean(), sample(U_exit, exit_line).mean()))
|
||||||
|
|
||||||
|
# A common display ceiling for both panels: the analytic bound U_e^max is a
|
||||||
|
# worst-case estimate, so the realized field only reaches ~0.34. Both
|
||||||
|
# panels share one scale, which is what makes the mirror relation visible;
|
||||||
|
# the colorbar is annotated with the true values, not rescaled to [0,1].
|
||||||
|
vmax = float(max(U_parkm.max(), U_exitm.max()))
|
||||||
|
|
||||||
|
# ---- plot --------------------------------------------------------------
|
||||||
|
plt.rcParams.update({
|
||||||
|
"font.family": "serif",
|
||||||
|
"font.serif": ["Nimbus Roman", "Times New Roman", "DejaVu Serif"],
|
||||||
|
"font.size": 7,
|
||||||
|
"mathtext.fontset": "stix",
|
||||||
|
"axes.linewidth": 0.5,
|
||||||
|
"pdf.fonttype": 42,
|
||||||
|
})
|
||||||
|
fig, axes = plt.subplots(1, 3, figsize=(7.16, 1.75),
|
||||||
|
constrained_layout=True)
|
||||||
|
|
||||||
|
ax = axes[0]
|
||||||
|
ax.add_patch(MplPolygon(sg.SITE, closed=True, facecolor="white",
|
||||||
|
edgecolor="#585858", lw=0.7, zorder=1))
|
||||||
|
ax.plot(center[:, 0], center[:, 1], color="#703A94", lw=0.9,
|
||||||
|
ls=(0, (2.2, 1.2)), label=r"$\Lambda_{\mathrm{center}}$", zorder=3)
|
||||||
|
ax.plot(park_line[:, 0], park_line[:, 1], color="#00549F", lw=1.0,
|
||||||
|
label=r"$\Lambda_{\mathrm{park}}$", zorder=3)
|
||||||
|
ax.plot(exit_line[:, 0], exit_line[:, 1], color="#C44E0A", lw=1.0,
|
||||||
|
label=r"$\Lambda_{\mathrm{exit}}$", zorder=3)
|
||||||
|
ax.plot(*sg.LOAD_POSE, marker="o", ms=2.8, color="#222222", zorder=4)
|
||||||
|
ax.annotate(r"$\boldsymbol{\eta}_{\mathrm{load}}$", sg.LOAD_POSE,
|
||||||
|
textcoords="offset points", xytext=(2.5, 2.5), fontsize=6)
|
||||||
|
ax.legend(loc="lower right", fontsize=5.2, frameon=False,
|
||||||
|
handlelength=1.4, borderaxespad=0.1, labelspacing=0.2)
|
||||||
|
ax.set_title(r"(a) boundary and guidance sources", fontsize=6.6, pad=2)
|
||||||
|
|
||||||
|
for ax, U, name in ((axes[1], U_parkm, r"(b) $\hat U_{\mathrm{park}}$"),
|
||||||
|
(axes[2], U_exitm, r"(c) $\hat U_{\mathrm{exit}}$")):
|
||||||
|
im = ax.pcolormesh(XX, YY, U, cmap="viridis", vmin=0.0, vmax=vmax,
|
||||||
|
shading="auto", rasterized=True)
|
||||||
|
ax.contour(XX, YY, U.filled(np.nan),
|
||||||
|
levels=np.linspace(0.06, vmax * 0.92, 5),
|
||||||
|
colors="white", linewidths=0.25, alpha=0.7)
|
||||||
|
ax.add_patch(MplPolygon(sg.SITE, closed=True, facecolor="none",
|
||||||
|
edgecolor="#585858", lw=0.7))
|
||||||
|
ax.set_title(name, fontsize=6.6, pad=2)
|
||||||
|
|
||||||
|
cb = fig.colorbar(im, ax=axes[2], fraction=0.046, pad=0.02)
|
||||||
|
cb.set_ticks([0.0, vmax / 2.0, vmax])
|
||||||
|
cb.set_ticklabels(["0", "%.2f" % (vmax / 2.0), "%.2f" % vmax])
|
||||||
|
cb.ax.tick_params(labelsize=5.4, width=0.4, length=1.8)
|
||||||
|
cb.outline.set_linewidth(0.4)
|
||||||
|
|
||||||
|
for ax in axes:
|
||||||
|
ax.set_aspect("equal")
|
||||||
|
ax.set_xlim(x0, x1)
|
||||||
|
ax.set_ylim(y0, y1)
|
||||||
|
ax.set_xticks([])
|
||||||
|
ax.set_yticks([])
|
||||||
|
for sp in ax.spines.values():
|
||||||
|
sp.set_visible(False)
|
||||||
|
|
||||||
|
fig.savefig("fig_igf.pdf", dpi=600)
|
||||||
|
print("wrote fig_igf.pdf")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,252 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""Shared synthetic loading-area geometry for the paper's illustration figures.
|
||||||
|
|
||||||
|
Reproduces the pipeline of subsec:centerline / subsec:guide_route as faithfully
|
||||||
|
as the available toolchain allows:
|
||||||
|
|
||||||
|
1. rasterize the site polygon, compute the Euclidean distance transform
|
||||||
|
(clearance field) -- this is the quantity the extended Voronoi graph
|
||||||
|
partitions space by;
|
||||||
|
2. extract the clearance ridge (EVG skeleton approximation) by non-maximum
|
||||||
|
suppression of the distance transform;
|
||||||
|
3. connect entrance to loading bay by A* over the skeleton cells, with the
|
||||||
|
edge cost penalizing low clearance;
|
||||||
|
4. smooth the resulting polyline with the paper's QP model -- minimize the
|
||||||
|
second-difference (smoothness) plus reference-deviation cost subject to a
|
||||||
|
tangential/normal box corridor, solved as a projected linear system
|
||||||
|
(the paper uses OSQP; here the same objective is solved by direct
|
||||||
|
factorization with projection onto the corridor box, which is adequate
|
||||||
|
for an illustration);
|
||||||
|
5. offset by +-W/2 along the local normal to obtain the two guidance lines.
|
||||||
|
|
||||||
|
Everything here is a *construction illustration* on a synthetic site, not an
|
||||||
|
experimental result.
|
||||||
|
"""
|
||||||
|
import numpy as np
|
||||||
|
from scipy import ndimage
|
||||||
|
from matplotlib.path import Path
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------ site plan
|
||||||
|
SITE = np.array([
|
||||||
|
[0.0, 10.0], [16.0, 6.5], [33.0, 5.0], [50.0, 6.5], [63.0, 11.0],
|
||||||
|
[70.0, 19.0], [66.0, 30.0], [52.0, 36.0], [36.0, 35.0], [21.0, 30.0],
|
||||||
|
[8.0, 24.0], [0.0, 20.0],
|
||||||
|
])
|
||||||
|
ENTRANCE = np.array([0.6, 15.0]) # on the open left edge
|
||||||
|
LOAD_POSE = np.array([44.0, 24.0]) # loading position inside the bay
|
||||||
|
W = 9.0 # channel width
|
||||||
|
RES = 0.25 # raster resolution for the DT/skeleton
|
||||||
|
|
||||||
|
|
||||||
|
def rasterize(res=RES, pad=1.0):
|
||||||
|
x0, x1 = SITE[:, 0].min() - pad, SITE[:, 0].max() + pad
|
||||||
|
y0, y1 = SITE[:, 1].min() - pad, SITE[:, 1].max() + pad
|
||||||
|
xs = np.arange(x0, x1, res)
|
||||||
|
ys = np.arange(y0, y1, res)
|
||||||
|
XX, YY = np.meshgrid(xs, ys)
|
||||||
|
pts = np.column_stack([XX.ravel(), YY.ravel()])
|
||||||
|
inside = Path(SITE).contains_points(pts).reshape(XX.shape)
|
||||||
|
return xs, ys, XX, YY, inside
|
||||||
|
|
||||||
|
|
||||||
|
def clearance(inside, res=RES):
|
||||||
|
"""Euclidean distance to the nearest boundary/obstacle cell, in metres."""
|
||||||
|
return ndimage.distance_transform_edt(inside) * res
|
||||||
|
|
||||||
|
|
||||||
|
def skeleton(dist, inside):
|
||||||
|
"""Clearance ridge: cells whose distance value is a local maximum along at
|
||||||
|
least one of the four axes. A cheap stand-in for EVG-thin thinning that
|
||||||
|
needs no extra dependency."""
|
||||||
|
d = dist
|
||||||
|
ridge = np.zeros_like(inside, dtype=bool)
|
||||||
|
for ax, sh in ((0, 1), (1, 1)):
|
||||||
|
a = np.roll(d, sh, axis=ax)
|
||||||
|
b = np.roll(d, -sh, axis=ax)
|
||||||
|
ridge |= (d >= a) & (d >= b)
|
||||||
|
# a genuine ridge needs some clearance; drop the noisy skin near the wall
|
||||||
|
return ridge & inside & (d > 1.5 * RES)
|
||||||
|
|
||||||
|
|
||||||
|
def astar(dist, inside, start_rc, goal_rc, clear_w=6.0):
|
||||||
|
"""8-connected A* over cells. Step cost = geometric length times a factor
|
||||||
|
that grows as clearance drops, so the path hugs the clearance ridge."""
|
||||||
|
import heapq
|
||||||
|
nr, nc = dist.shape
|
||||||
|
dmax = dist.max()
|
||||||
|
inf = float("inf")
|
||||||
|
g = np.full(dist.shape, inf)
|
||||||
|
came = {}
|
||||||
|
sr, sc = start_rc
|
||||||
|
gr, gc = goal_rc
|
||||||
|
g[sr, sc] = 0.0
|
||||||
|
|
||||||
|
def h(r, c):
|
||||||
|
return np.hypot(r - gr, c - gc) * RES
|
||||||
|
|
||||||
|
openq = [(h(sr, sc), sr, sc)]
|
||||||
|
nbrs = [(-1, 0, 1.0), (1, 0, 1.0), (0, -1, 1.0), (0, 1, 1.0),
|
||||||
|
(-1, -1, 1.4142), (-1, 1, 1.4142), (1, -1, 1.4142), (1, 1, 1.4142)]
|
||||||
|
seen = np.zeros(dist.shape, dtype=bool)
|
||||||
|
while openq:
|
||||||
|
_, r, c = heapq.heappop(openq)
|
||||||
|
if seen[r, c]:
|
||||||
|
continue
|
||||||
|
seen[r, c] = True
|
||||||
|
if (r, c) == (gr, gc):
|
||||||
|
break
|
||||||
|
for dr, dc, w in nbrs:
|
||||||
|
rr, cc = r + dr, c + dc
|
||||||
|
if not (0 <= rr < nr and 0 <= cc < nc) or not inside[rr, cc]:
|
||||||
|
continue
|
||||||
|
# penalty in [1, 1+clear_w]; lowest where clearance is largest
|
||||||
|
pen = 1.0 + clear_w * (1.0 - dist[rr, cc] / dmax)
|
||||||
|
ng = g[r, c] + w * RES * pen
|
||||||
|
if ng < g[rr, cc]:
|
||||||
|
g[rr, cc] = ng
|
||||||
|
came[(rr, cc)] = (r, c)
|
||||||
|
heapq.heappush(openq, (ng + h(rr, cc), rr, cc))
|
||||||
|
if (gr, gc) not in came and (gr, gc) != (sr, sc):
|
||||||
|
raise RuntimeError("A* failed to reach the goal")
|
||||||
|
path = [(gr, gc)]
|
||||||
|
while path[-1] != (sr, sc):
|
||||||
|
path.append(came[path[-1]])
|
||||||
|
return np.array(path[::-1])
|
||||||
|
|
||||||
|
|
||||||
|
def to_xy(rc, xs, ys):
|
||||||
|
return np.column_stack([xs[rc[:, 1]], ys[rc[:, 0]]])
|
||||||
|
|
||||||
|
|
||||||
|
def resample(poly, step):
|
||||||
|
seg = np.diff(poly, axis=0)
|
||||||
|
L = np.hypot(seg[:, 0], seg[:, 1])
|
||||||
|
cum = np.concatenate([[0.0], np.cumsum(L)])
|
||||||
|
s = np.arange(0.0, cum[-1] + 1e-9, step)
|
||||||
|
out = np.empty((s.size, 2))
|
||||||
|
for i, si in enumerate(s):
|
||||||
|
k = min(np.searchsorted(cum, si, side="right") - 1, len(seg) - 1)
|
||||||
|
k = max(k, 0)
|
||||||
|
t = (si - cum[k]) / L[k]
|
||||||
|
out[i] = poly[k] + t * seg[k]
|
||||||
|
return out
|
||||||
|
|
||||||
|
|
||||||
|
def qp_smooth(ref, half_width, w_smooth=12.0, w_ref=1.0, iters=400,
|
||||||
|
r_min=12.0):
|
||||||
|
"""Minimize w_smooth * sum |p_{i-1} - 2 p_i + p_{i+1}|^2
|
||||||
|
+ w_ref * sum |p_i - p_i^ref|^2
|
||||||
|
s.t. |p_i - p_i^ref| <= half_width (isotropic proxy for the
|
||||||
|
tangential/normal box corridor)
|
||||||
|
|p_{i-1} - 2 p_i + p_{i+1}| <= ell^2 / r_min
|
||||||
|
(curvature bound, subsec:centerline:
|
||||||
|
||d_i|| = ell^2 kappa_i + O(ell^4))
|
||||||
|
with the endpoints fixed.
|
||||||
|
|
||||||
|
Solved by projected gradient iterations; the paper solves the same objective
|
||||||
|
with OSQP under linear constraints. The curvature projection is applied as
|
||||||
|
a Gauss-Seidel sweep: where the second difference exceeds its bound, the
|
||||||
|
point is pulled toward the midpoint of its neighbours, which reduces |d_i|
|
||||||
|
monotonically.
|
||||||
|
"""
|
||||||
|
P = ref.copy()
|
||||||
|
# Per-point step length: the second-difference bound ||d_i|| <= ell_i^2/r_min
|
||||||
|
# is local, so use the local spacing rather than the mean (the mean would
|
||||||
|
# under-constrain the segments that are longer than average).
|
||||||
|
|
||||||
|
def cap_of(Q):
|
||||||
|
"""Local second-difference cap ell_i^2 / r_min, evaluated on Q's own
|
||||||
|
spacing so that the enforced bound matches the curvature actually
|
||||||
|
measured on the returned polyline."""
|
||||||
|
seg = np.hypot(*np.diff(Q, axis=0).T)
|
||||||
|
ell_i = np.minimum(seg[:-1], seg[1:])
|
||||||
|
return ell_i ** 2 / r_min
|
||||||
|
for _ in range(iters):
|
||||||
|
lap = np.zeros_like(P)
|
||||||
|
lap[1:-1] = P[:-2] - 2.0 * P[1:-1] + P[2:]
|
||||||
|
grad = np.zeros_like(P)
|
||||||
|
grad[1:-1] += 2.0 * w_smooth * (-2.0) * lap[1:-1]
|
||||||
|
grad[2:-1] += 2.0 * w_smooth * lap[1:-2]
|
||||||
|
grad[1:-2] += 2.0 * w_smooth * lap[2:-1]
|
||||||
|
grad += 2.0 * w_ref * (P - ref)
|
||||||
|
step = 0.02 / (w_smooth + w_ref)
|
||||||
|
P[1:-1] = P[1:-1] - step * grad[1:-1]
|
||||||
|
|
||||||
|
# --- corridor projection -------------------------------------------
|
||||||
|
off = P - ref
|
||||||
|
r = np.hypot(off[:, 0], off[:, 1])
|
||||||
|
bad = r > half_width
|
||||||
|
if bad.any():
|
||||||
|
P[bad] = ref[bad] + off[bad] * (half_width / r[bad])[:, None]
|
||||||
|
P[0], P[-1] = ref[0], ref[-1]
|
||||||
|
|
||||||
|
# --- curvature projection, applied last so that it is the binding
|
||||||
|
# constraint on the returned polyline ---------------------------
|
||||||
|
for _ in range(60):
|
||||||
|
d_cap = cap_of(P)
|
||||||
|
d = P[:-2] - 2.0 * P[1:-1] + P[2:]
|
||||||
|
mag = np.hypot(d[:, 0], d[:, 1])
|
||||||
|
over = mag > d_cap
|
||||||
|
if not over.any():
|
||||||
|
break
|
||||||
|
# shift p_i along +d to shrink |d_i| toward the cap
|
||||||
|
shrink = np.zeros_like(mag)
|
||||||
|
shrink[over] = 0.5 * (mag[over] - d_cap[over]) / mag[over]
|
||||||
|
P[1:-1] += d * shrink[:, None]
|
||||||
|
P[0], P[-1] = ref[0], ref[-1]
|
||||||
|
return P
|
||||||
|
|
||||||
|
|
||||||
|
def tangent_normal(P):
|
||||||
|
t = np.gradient(P, axis=0)
|
||||||
|
t /= np.linalg.norm(t, axis=1)[:, None]
|
||||||
|
n = np.stack([-t[:, 1], t[:, 0]], axis=1)
|
||||||
|
return t, n
|
||||||
|
|
||||||
|
|
||||||
|
def build_centerline(verbose=False):
|
||||||
|
"""Full stage-1 geometry. Returns a dict of everything the figures need."""
|
||||||
|
xs, ys, XX, YY, inside = rasterize()
|
||||||
|
dist = clearance(inside)
|
||||||
|
skel = skeleton(dist, inside)
|
||||||
|
|
||||||
|
def nearest_cell(pt, mask):
|
||||||
|
rr, cc = np.nonzero(mask)
|
||||||
|
d = np.hypot(xs[cc] - pt[0], ys[rr] - pt[1])
|
||||||
|
i = int(np.argmin(d))
|
||||||
|
return (rr[i], cc[i])
|
||||||
|
|
||||||
|
start = nearest_cell(ENTRANCE, inside)
|
||||||
|
goal = nearest_cell(LOAD_POSE, inside)
|
||||||
|
raw_rc = astar(dist, inside, start, goal)
|
||||||
|
raw = to_xy(raw_rc, xs, ys)
|
||||||
|
|
||||||
|
# the centerline covers the entrance->bay main channel; resample then smooth
|
||||||
|
coarse = resample(raw, 1.0)
|
||||||
|
center = qp_smooth(coarse, half_width=1.6)
|
||||||
|
|
||||||
|
t, n = tangent_normal(center)
|
||||||
|
park_line = center + (W / 2.0) * n
|
||||||
|
exit_line = center - (W / 2.0) * n
|
||||||
|
|
||||||
|
if verbose:
|
||||||
|
print("grid %d x %d, res %.2f m" % (XX.shape[1], XX.shape[0], RES))
|
||||||
|
print("max clearance %.2f m" % dist.max())
|
||||||
|
print("A* raw length %.2f m, %d cells" %
|
||||||
|
(np.hypot(*np.diff(raw, axis=0).T).sum(), len(raw)))
|
||||||
|
print("centerline length %.2f m, %d points" %
|
||||||
|
(np.hypot(*np.diff(center, axis=0).T).sum(), len(center)))
|
||||||
|
# curvature of the smoothed centerline via second differences
|
||||||
|
d2 = center[:-2] - 2 * center[1:-1] + center[2:]
|
||||||
|
ell = np.hypot(*np.diff(center, axis=0).T).mean()
|
||||||
|
kap = np.hypot(d2[:, 0], d2[:, 1]) / ell ** 2
|
||||||
|
print("centerline |kappa| max %.4f (1/m) -> R_min %.2f m"
|
||||||
|
% (kap.max(), 1.0 / max(kap.max(), 1e-9)))
|
||||||
|
|
||||||
|
return dict(xs=xs, ys=ys, XX=XX, YY=YY, inside=inside, dist=dist,
|
||||||
|
skel=skel, raw=raw, center=center,
|
||||||
|
park_line=park_line, exit_line=exit_line, tang=t, nrm=n)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
build_centerline(verbose=True)
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
%%
|
||||||
|
%% This is file `orcidlink.sty',
|
||||||
|
%% generated with the docstrip utility.
|
||||||
|
%%
|
||||||
|
%% The original source files were:
|
||||||
|
%%
|
||||||
|
%% orcidlink.dtx (with options: `package')
|
||||||
|
%%
|
||||||
|
%% This is a generated file.
|
||||||
|
%%
|
||||||
|
%% Copyright (C) 2019-2024 by Leo C. Stein <leo.stein@gmail.com>
|
||||||
|
%% --------------------------------------------------------------------------
|
||||||
|
%% This work may be distributed and/or modified under the
|
||||||
|
%% conditions of the LaTeX Project Public License, either version 1.3
|
||||||
|
%% of this license or (at your option) any later version.
|
||||||
|
%% The latest version of this license is in
|
||||||
|
%% http://www.latex-project.org/lppl.txt
|
||||||
|
%% and version 1.3 or later is part of all distributions of LaTeX
|
||||||
|
%% version 2005/12/01 or later.
|
||||||
|
%%
|
||||||
|
\NeedsTeXFormat{LaTeX2e}[1994/06/01]
|
||||||
|
\ProvidesPackage{orcidlink}
|
||||||
|
[2024/06/26 v1.1.0 Support ORCID's three different ID formats.]
|
||||||
|
|
||||||
|
%% This started out as Milo's code on TeX.SE,
|
||||||
|
%% see https://tex.stackexchange.com/a/445583/34063.
|
||||||
|
%% It has since been expanded with more commands.
|
||||||
|
\RequirePackage{hyperref}
|
||||||
|
\RequirePackage{tikz}
|
||||||
|
|
||||||
|
\ProcessOptions\relax
|
||||||
|
|
||||||
|
\usetikzlibrary{svg.path}
|
||||||
|
|
||||||
|
\definecolor{orcidlogocol}{HTML}{A6CE39}
|
||||||
|
\tikzset{
|
||||||
|
orcidlogo/.pic={
|
||||||
|
\fill[orcidlogocol] svg{M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z};
|
||||||
|
\fill[white] svg{M86.3,186.2H70.9V79.1h15.4v48.4V186.2z}
|
||||||
|
svg{M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z}
|
||||||
|
svg{M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
%% Reciprocal of the height of the svg whose source is above. The
|
||||||
|
%% original generates a 256pt high graphic; this macro holds 1/256.
|
||||||
|
\newcommand{\@OrigHeightRecip}{0.00390625}
|
||||||
|
|
||||||
|
%% We will compute the current X height to make the logo the right height
|
||||||
|
\newlength{\@curXheight}
|
||||||
|
|
||||||
|
%% Prevent externalization of the ORCiD logo.
|
||||||
|
\newcommand{\@preventExternalization}{%
|
||||||
|
\ifcsname tikz@library@external@loaded\endcsname%
|
||||||
|
\tikzset{external/export next=false}\else\fi%
|
||||||
|
}
|
||||||
|
|
||||||
|
\newcommand{\orcidlogo}{%
|
||||||
|
\texorpdfstring{%
|
||||||
|
\setlength{\@curXheight}{\fontcharht\font`X}%
|
||||||
|
\XeTeXLinkBox{%
|
||||||
|
\@preventExternalization%
|
||||||
|
\begin{tikzpicture}[yscale=-\@OrigHeightRecip*\@curXheight,
|
||||||
|
xscale=\@OrigHeightRecip*\@curXheight,transform shape]
|
||||||
|
\pic{orcidlogo};
|
||||||
|
\end{tikzpicture}%
|
||||||
|
}}{}}
|
||||||
|
|
||||||
|
\DeclareRobustCommand\orcidlinkX[3]{\href{https://orcid.org/#2}{%
|
||||||
|
\ifstrempty{#1}{}{#1\,}\orcidlogo\ifstrempty{#3}{}{\,#3}}}
|
||||||
|
\newcommand{\orcidlinkf}[1]{\orcidlinkX{}{#1}{https://orcid.org/#1}}
|
||||||
|
\newcommand{\orcidlinkc}[1]{\orcidlinkX{}{#1}{#1}}
|
||||||
|
\newcommand{\orcidlinki}[2]{\orcidlinkX{#1}{#2}{}}
|
||||||
|
\newcommand{\orcidlink}[1]{\orcidlinkX{}{#1}{}}
|
||||||
|
|
||||||
|
\endinput
|
||||||
|
%%
|
||||||
|
%% End of file `orcidlink.sty'.
|
||||||
@@ -0,0 +1,382 @@
|
|||||||
|
% ---------------------------------------------------------------
|
||||||
|
% Bibliography
|
||||||
|
% All entries below correspond to real, locatable publications.
|
||||||
|
% All entries verified against Crossref / arXiv metadata (last checked 2026-08-24).
|
||||||
|
% ---------------------------------------------------------------
|
||||||
|
|
||||||
|
% ===== Hybrid A* and unstructured-environment search =====
|
||||||
|
@inproceedings{dolgov2008practical,
|
||||||
|
author = {Dolgov, Dmitri and Thrun, Sebastian and Montemerlo, Michael and Diebel, James},
|
||||||
|
title = {Practical Search Techniques in Path Planning for Autonomous Driving},
|
||||||
|
booktitle = {Proc. 1st Int. Symp. Search Techniques in Artificial Intelligence
|
||||||
|
and Robotics (STAIR), AAAI Workshop},
|
||||||
|
year = {2008},
|
||||||
|
address = {Chicago, IL, USA}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{reedsshepp1990,
|
||||||
|
author = {Reeds, J. A. and Shepp, L. A.},
|
||||||
|
title = {Optimal Paths for a Car That Goes Both Forwards and Backwards},
|
||||||
|
journal = {Pacific Journal of Mathematics},
|
||||||
|
volume = {145},
|
||||||
|
number = {2},
|
||||||
|
pages = {367--393},
|
||||||
|
year = {1990},
|
||||||
|
doi = {10.2140/pjm.1990.145.367}
|
||||||
|
}
|
||||||
|
|
||||||
|
% NOTE: 以下三条为 Section V 新增基线 B4/B5 所需,投稿前须补全作者与卷期页信息。
|
||||||
|
@article{dolgov2010voronoi,
|
||||||
|
author = {Dolgov, Dmitri and Thrun, Sebastian and Montemerlo, Michael and Diebel, James},
|
||||||
|
title = {Path Planning for Autonomous Vehicles in Unknown Semi-structured Environments},
|
||||||
|
journal = {International Journal of Robotics Research},
|
||||||
|
volume = {29},
|
||||||
|
number = {5},
|
||||||
|
pages = {485--501},
|
||||||
|
year = {2010},
|
||||||
|
doi = {10.1177/0278364909359210}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{zhang2021obca,
|
||||||
|
author = {Zhang, Xiaojing and Liniger, Alexander and Borrelli, Francesco},
|
||||||
|
title = {Optimization-Based Collision Avoidance},
|
||||||
|
journal = {IEEE Transactions on Control Systems Technology},
|
||||||
|
volume = {29},
|
||||||
|
number = {3},
|
||||||
|
pages = {972--983},
|
||||||
|
year = {2021},
|
||||||
|
doi = {10.1109/TCST.2019.2949540}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{lian2023valetparking,
|
||||||
|
author = {Lian, Jing and Ren, Weiwei and Yang, Dongfang and Li, Linhui and Yu, Fengning},
|
||||||
|
title = {Trajectory Planning for Autonomous Valet Parking in Narrow
|
||||||
|
Environments with Enhanced Hybrid {A*} Search and Nonlinear
|
||||||
|
Optimization},
|
||||||
|
journal = {IEEE Transactions on Intelligent Vehicles},
|
||||||
|
volume = {8},
|
||||||
|
number = {6},
|
||||||
|
pages = {3723--3734},
|
||||||
|
year = {2023},
|
||||||
|
doi = {10.1109/TIV.2023.3268088}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{li2022parkingcorridor,
|
||||||
|
author = {Li, Bai and Acarman, Tankut and Zhang, Youmin and Ouyang, Yakun and Yaman, Cagdas and Kong, Qi and Zhong, Xiang and Peng, Xiaoyan},
|
||||||
|
title = {Optimization-Based Trajectory Planning for Autonomous Parking
|
||||||
|
with Irregularly Placed Obstacles: A Lightweight Iterative
|
||||||
|
Framework},
|
||||||
|
journal = {IEEE Transactions on Intelligent Transportation Systems},
|
||||||
|
volume = {23},
|
||||||
|
number = {8},
|
||||||
|
pages = {11970--11981},
|
||||||
|
year = {2022},
|
||||||
|
doi = {10.1109/TITS.2021.3109011}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{sedighi2023hybridastar,
|
||||||
|
author = {Wang, Qi and Li, Guang and Ding, Shuai},
|
||||||
|
title = {High-Efficiency Navigation of Nonholonomic Mobile Robots
|
||||||
|
Based on Improved Hybrid {A*} Algorithm},
|
||||||
|
journal = {Applied Sciences},
|
||||||
|
volume = {13},
|
||||||
|
number = {10},
|
||||||
|
pages = {6141},
|
||||||
|
year = {2023},
|
||||||
|
doi = {10.3390/app13106141}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Open-pit mine path/trajectory planning =====
|
||||||
|
@article{mine2020lastsection,
|
||||||
|
author = {Zhao, Ziyu and Bi, Lin},
|
||||||
|
title = {Path Planning for Autonomous Truck of Open-Pit Mines
|
||||||
|
in The Last Transport Section},
|
||||||
|
journal = {Applied Sciences},
|
||||||
|
volume = {10},
|
||||||
|
number = {18},
|
||||||
|
pages = {6622},
|
||||||
|
year = {2020},
|
||||||
|
doi = {10.3390/app10186622}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{mine2025humanlikeparking,
|
||||||
|
author = {Li, Han and Yu, Guizhen and Chen, Peng and Li, Yiming and Xia, Qi},
|
||||||
|
title = {A Human-Like Parking Trajectory Planning Approach for
|
||||||
|
Autonomous Vehicle Load Tasks in Mining Site},
|
||||||
|
journal = {Automotive Innovation},
|
||||||
|
year = {2025},
|
||||||
|
doi = {10.1007/s42154-025-00358-8},
|
||||||
|
volume = {8},
|
||||||
|
number = {4},
|
||||||
|
pages = {913--934}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{mine2023secure,
|
||||||
|
author = {Li, Han and Li, Yiming and Chen, Peng and Yu, Guizhen and Liao, Yaping},
|
||||||
|
title = {A Secure Trajectory Planning Method for Connected
|
||||||
|
Autonomous Vehicles at Mining Site},
|
||||||
|
journal = {Symmetry},
|
||||||
|
volume = {15},
|
||||||
|
number = {11},
|
||||||
|
pages = {1973},
|
||||||
|
year = {2023},
|
||||||
|
doi = {10.3390/sym15111973}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inproceedings{mine2024unstructured,
|
||||||
|
author = {Li, Lei and Chen, Zhifa and Wang, Jian and Zhou, Bin and Yu, Guizhen and Chen, Xiaoxuan},
|
||||||
|
title = {Multimodal Trajectory Prediction for Autonomous Driving on
|
||||||
|
Unstructured Roads Using Deep Convolutional Network},
|
||||||
|
booktitle = {Proceedings of the 2024 International Conference on Artificial
|
||||||
|
Intelligence and Autonomous Transportation},
|
||||||
|
series = {Lecture Notes in Electrical Engineering},
|
||||||
|
pages = {32--42},
|
||||||
|
publisher = {Springer Nature Singapore},
|
||||||
|
year = {2025},
|
||||||
|
doi = {10.1007/978-981-96-3957-1{\_}3}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{mine2024truckreversing,
|
||||||
|
author = {Aydemir, Eren and Unel, Mustafa},
|
||||||
|
title = {Motion Planning and Path Following for Autonomous Navigation
|
||||||
|
and Reversing of a Full-Scale Mining Truck and Trailer System},
|
||||||
|
journal = {International Journal of Automotive Technology},
|
||||||
|
year = {2024},
|
||||||
|
doi = {10.1007/s12239-024-00174-9},
|
||||||
|
volume = {26},
|
||||||
|
number = {3},
|
||||||
|
pages = {595--606}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Multi-vehicle coordination and conflict resolution =====
|
||||||
|
@inproceedings{ramp2024spatiotemporal,
|
||||||
|
author = {Xu, Xiaoxue and Lai, Maokai and Zhang, Haitao and Dong, Xiang and Li, Tao and Wu, Jie and Li, Yuan and Peng, Ting},
|
||||||
|
title = {Spatio-Temporal Cooperative Control Method of Highway Ramp
|
||||||
|
Merge Based on Vehicle-Road Coordination},
|
||||||
|
booktitle = {2024 12th International Conference on Traffic and Logistic
|
||||||
|
Engineering (ICTLE)},
|
||||||
|
pages = {93--98},
|
||||||
|
year = {2024},
|
||||||
|
doi = {10.1109/ICTLE62418.2024.10703891}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{ramp2026distributed,
|
||||||
|
author = {Nie, Linhua and Zhang, Tingyang and Zhao, Yunqing and Li, Yaqiu and Li, Haoran and Yang, Junru},
|
||||||
|
title = {Distributed Multi-Vehicle Cooperative Trajectory Planning and
|
||||||
|
Control for Ramp Merging and Diverging Based on Deep Neural
|
||||||
|
Networks and {MPC}},
|
||||||
|
journal = {Machines},
|
||||||
|
volume = {14},
|
||||||
|
number = {3},
|
||||||
|
pages = {262},
|
||||||
|
year = {2026},
|
||||||
|
doi = {10.3390/machines14030262}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{mine2025rightofway,
|
||||||
|
author = {Sun, Rentao and Yu, Guizhen and Chen, Peng and Ni, Haoyuan and Zhou, Bin},
|
||||||
|
title = {Cooperative Right-of-Way Assignment for Autonomous Mining
|
||||||
|
Trucks at Multiple Open-Pit Mine Intersections},
|
||||||
|
journal = {Automotive Innovation},
|
||||||
|
year = {2026},
|
||||||
|
doi = {10.1007/s42154-025-00368-6},
|
||||||
|
volume = {9},
|
||||||
|
number = {1},
|
||||||
|
pages = {16--30}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{mine2023scheduling,
|
||||||
|
author = {Fang, Yong and Peng, Xiaoyan},
|
||||||
|
title = {Micro-Factors-Aware Scheduling of Multiple Autonomous Trucks
|
||||||
|
in Open-Pit Mining via Enhanced Metaheuristics},
|
||||||
|
journal = {Electronics},
|
||||||
|
volume = {12},
|
||||||
|
number = {18},
|
||||||
|
pages = {3793},
|
||||||
|
year = {2023},
|
||||||
|
doi = {10.3390/electronics12183793}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Artificial potential field and its limitations =====
|
||||||
|
@inproceedings{apf2024globalrepulsive,
|
||||||
|
author = {Peng, Bo and Zhang, Lingke and Xiong, Rong},
|
||||||
|
title = {Smooth Path Planning with Subharmonic Artificial Potential
|
||||||
|
Field},
|
||||||
|
booktitle = {2024 International Conference on Advanced Robotics and
|
||||||
|
Mechatronics (ICARM)},
|
||||||
|
pages = {1027--1031},
|
||||||
|
year = {2024},
|
||||||
|
doi = {10.1109/ICARM62033.2024.10715803}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inproceedings{apf2024wallfollower,
|
||||||
|
author = {Kim, Joonkyung and Park, Sangjin and Lee, Wonjong and Kim, Woojun and Choi, Hyunga and Doh, Nakju and Nam, Changjoo},
|
||||||
|
title = {Escaping Local Minima: Hybrid Artificial Potential Field with
|
||||||
|
Wall-Follower for Decentralized Multi-Robot Navigation},
|
||||||
|
booktitle = {2025 IEEE International Conference on Robotics and Automation
|
||||||
|
(ICRA)},
|
||||||
|
pages = {6616--6622},
|
||||||
|
year = {2025},
|
||||||
|
doi = {10.1109/ICRA55743.2025.11128765}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Convex-decomposition safe corridors =====
|
||||||
|
@article{corridor2022voxelgrid,
|
||||||
|
author = {Toumieh, Charbel and Lambert, Alain},
|
||||||
|
title = {Voxel-Grid Based Convex Decomposition of 3D Space for
|
||||||
|
Safe Corridor Generation},
|
||||||
|
journal = {Journal of Intelligent \& Robotic Systems},
|
||||||
|
year = {2022},
|
||||||
|
doi = {10.1007/s10846-022-01708-y},
|
||||||
|
volume = {105},
|
||||||
|
number = {4}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{corridor2024convexcover,
|
||||||
|
author = {Wu, Yuwei and Spasojevic, Igor and Chaudhari, Pratik and Kumar, Vijay},
|
||||||
|
title = {Towards Optimizing a Convex Cover of Collision-Free Space
|
||||||
|
for Trajectory Generation},
|
||||||
|
journal = {IEEE Robotics and Automation Letters},
|
||||||
|
volume = {10},
|
||||||
|
number = {5},
|
||||||
|
pages = {4762--4769},
|
||||||
|
year = {2025},
|
||||||
|
doi = {10.1109/LRA.2025.3553416}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{corridor2023rover,
|
||||||
|
author = {Li, Yiqun and Liang, Shaoqiang and Gao, Jiahui and Chen, Zong and Qiao, Siyuan and Yin, Zhouping},
|
||||||
|
title = {Trajectory Optimization for the Nonholonomic Space Rover in
|
||||||
|
Cluttered Environments Using Safe Convex Corridors},
|
||||||
|
journal = {Aerospace},
|
||||||
|
volume = {10},
|
||||||
|
number = {8},
|
||||||
|
pages = {705},
|
||||||
|
year = {2023},
|
||||||
|
doi = {10.3390/aerospace10080705}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Skeleton / centerline extraction =====
|
||||||
|
@inproceedings{beeson2005evg,
|
||||||
|
author = {Beeson, Patrick and Jong, Nicholas K. and Kuipers, Benjamin},
|
||||||
|
title = {Towards Autonomous Topological Place Detection Using the
|
||||||
|
Extended {Voronoi} Graph},
|
||||||
|
booktitle = {Proc. IEEE Int. Conf. Robotics and Automation (ICRA)},
|
||||||
|
pages = {4373--4379},
|
||||||
|
year = {2005},
|
||||||
|
address = {Barcelona, Spain}
|
||||||
|
}
|
||||||
|
|
||||||
|
@misc{evgthin,
|
||||||
|
title = {{EVG-Thin}: A Thinning-Based Approximation of the
|
||||||
|
Extended {Voronoi} Graph},
|
||||||
|
howpublished = {Software, The University of Texas at Austin},
|
||||||
|
year = {2005},
|
||||||
|
url = {http://www.cs.utexas.edu/users/qr/software/evg-thin.html}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Reference-line smoothing (Apollo) =====
|
||||||
|
@inproceedings{zhou2020apolloqp,
|
||||||
|
author = {Zhang, Yajia and Sun, Hongyi and Zhou, Jinyun and Pan, Jiacheng
|
||||||
|
and Hu, Jiangtao and Miao, Jinghao},
|
||||||
|
title = {Optimal Vehicle Path Planning Using Quadratic Optimization for
|
||||||
|
{Baidu} {Apollo} Open Platform},
|
||||||
|
booktitle = {Proc. IEEE Intelligent Vehicles Symposium (IV)},
|
||||||
|
pages = {978--984},
|
||||||
|
year = {2020},
|
||||||
|
doi = {10.1109/IV47402.2020.9304787}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{fan2018apolloem,
|
||||||
|
author = {Fan, Haoyang and Zhu, Fan and Liu, Changchun and Zhang, Liangliang
|
||||||
|
and Zhuang, Li and Li, Dong and Zhu, Weicheng and Hu, Jiangtao
|
||||||
|
and Li, Hongye and Kong, Qi},
|
||||||
|
title = {Baidu {Apollo} {EM} Motion Planner},
|
||||||
|
journal = {arXiv preprint arXiv:1807.08048},
|
||||||
|
year = {2018},
|
||||||
|
eprint = {1807.08048},
|
||||||
|
archivePrefix = {arXiv},
|
||||||
|
primaryClass = {cs.RO}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Elastic band path deformation =====
|
||||||
|
@inproceedings{quinlan1991elastic,
|
||||||
|
author = {Quinlan, Sean and Khatib, Oussama},
|
||||||
|
title = {Towards Real-Time Execution of Motion Tasks},
|
||||||
|
booktitle = {Proc. 2nd Int. Symp. Experimental Robotics (ISER)},
|
||||||
|
year = {1991}
|
||||||
|
}
|
||||||
|
|
||||||
|
@phdthesis{quinlan1994thesis,
|
||||||
|
author = {Quinlan, Sean},
|
||||||
|
title = {Real-Time Modification of Collision-Free Paths},
|
||||||
|
school = {Stanford University},
|
||||||
|
year = {1994},
|
||||||
|
note = {Technical Report STAN-CS-TR-95-1537}
|
||||||
|
}
|
||||||
|
|
||||||
|
% ===== Numerical optimization solvers =====
|
||||||
|
@article{wachter2006ipopt,
|
||||||
|
author = {W{\"a}chter, Andreas and Biegler, Lorenz T.},
|
||||||
|
title = {On the Implementation of an Interior-Point Filter Line-Search
|
||||||
|
Algorithm for Large-Scale Nonlinear Programming},
|
||||||
|
journal = {Mathematical Programming},
|
||||||
|
volume = {106},
|
||||||
|
number = {1},
|
||||||
|
pages = {25--57},
|
||||||
|
year = {2006},
|
||||||
|
doi = {10.1007/s10107-004-0559-y}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{nocedal2006numerical,
|
||||||
|
author = {Nocedal, Jorge and Wright, Stephen J.},
|
||||||
|
title = {Numerical Optimization},
|
||||||
|
edition = {2nd},
|
||||||
|
publisher = {Springer},
|
||||||
|
year = {2006}
|
||||||
|
}
|
||||||
|
|
||||||
|
@book{docarmo2016curves,
|
||||||
|
author = {do Carmo, Manfredo P.},
|
||||||
|
title = {Differential Geometry of Curves and Surfaces},
|
||||||
|
edition = {2nd},
|
||||||
|
publisher = {Dover Publications},
|
||||||
|
address = {Mineola, NY, USA},
|
||||||
|
year = {2016}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{kouvelis1992unidirectional,
|
||||||
|
author = {Kouvelis, Panagiotis and Kim, Michael W.},
|
||||||
|
title = {Unidirectional Loop Network Layout Problem in Automated
|
||||||
|
Manufacturing Systems},
|
||||||
|
journal = {Operations Research},
|
||||||
|
volume = {40},
|
||||||
|
number = {3},
|
||||||
|
pages = {533--550},
|
||||||
|
year = {1992},
|
||||||
|
doi = {10.1287/opre.40.3.533}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{seo2006flowpath,
|
||||||
|
author = {Seo, Yoonho and Lee, Chulung and Moon, Chiung},
|
||||||
|
title = {Tabu Search Algorithm for Flexible Flow Path Design of
|
||||||
|
Unidirectional Automated-Guided Vehicle Systems},
|
||||||
|
journal = {OR Spectrum},
|
||||||
|
volume = {29},
|
||||||
|
number = {3},
|
||||||
|
pages = {471--487},
|
||||||
|
year = {2006},
|
||||||
|
doi = {10.1007/s00291-006-0047-2}
|
||||||
|
}
|
||||||
|
|
||||||
|
@article{baek2017haulroad,
|
||||||
|
author = {Baek, Jieun and Choi, Yosoon},
|
||||||
|
title = {A New Method for Haul Road Design in Open-Pit Mines to Support
|
||||||
|
Efficient Truck Haulage Operations},
|
||||||
|
journal = {Applied Sciences},
|
||||||
|
volume = {7},
|
||||||
|
number = {7},
|
||||||
|
pages = {747},
|
||||||
|
year = {2017},
|
||||||
|
doi = {10.3390/app7070747}
|
||||||
|
}
|
||||||
+398
@@ -0,0 +1,398 @@
|
|||||||
|
\documentclass[journal]{IEEEtran}
|
||||||
|
\usepackage{etoolbox}
|
||||||
|
\usepackage{orcidlink}
|
||||||
|
\usepackage{bookmark}
|
||||||
|
\usepackage{amsmath}
|
||||||
|
\usepackage{amsfonts}
|
||||||
|
\usepackage{amssymb}
|
||||||
|
\usepackage{booktabs}
|
||||||
|
\usepackage{multirow}
|
||||||
|
\usepackage{graphicx}
|
||||||
|
\graphicspath{{figs/}}
|
||||||
|
\hypersetup{hidelinks}
|
||||||
|
|
||||||
|
% 补充材料内的公式、图、表统一加 S 前缀独立编号,避免与正文编号混淆。
|
||||||
|
% 正文引用本材料时写作 "see Section S-I of the supplementary material"。
|
||||||
|
\renewcommand{\theequation}{S\arabic{equation}}
|
||||||
|
\renewcommand{\thefigure}{S\arabic{figure}}
|
||||||
|
\renewcommand{\thetable}{S\arabic{table}}
|
||||||
|
\renewcommand{\thesection}{S-\Roman{section}}
|
||||||
|
|
||||||
|
\begin{document}
|
||||||
|
|
||||||
|
\title{Supplementary Material for ``Spatially Decoupled Inbound and Outbound
|
||||||
|
Path Planning for Open-Pit Mine Loading Areas via Integrated Guidance Fields
|
||||||
|
and Joint Optimization''}
|
||||||
|
|
||||||
|
\author{
|
||||||
|
Chuang Wang\orcidlink{0009-0003-5795-2504},
|
||||||
|
Peng Chen\orcidlink{0000-0002-8076-8989},~\IEEEmembership{Member,~IEEE,}
|
||||||
|
Yiming Li\orcidlink{0009-0007-7859-4987},
|
||||||
|
Han Li\orcidlink{0000-0001-5136-7396},
|
||||||
|
Guizhen Yu\orcidlink{0000-0001-8374-7422}
|
||||||
|
}
|
||||||
|
|
||||||
|
\maketitle
|
||||||
|
|
||||||
|
% 本补充材料收录正文因篇幅所限而未展开的推导过程、参数标定依据与实现细节。
|
||||||
|
% 正文中仅保留结论性结果(各上界的表达式、标定条件、最终约束形式),其来由见本材料对应各节。
|
||||||
|
% 组织如下:S-I 给出引导场取值上界的推导与场强系数标定依据;S-II 说明栅格场的连续化表示;
|
||||||
|
% S-III 论证联立求解相对交替优化的取舍;S-IV 给出凸走廊构造的完整推导;
|
||||||
|
% S-V 给出曲率约束二阶差分离散化的推导与误差量级;S-VI 汇总实现参数与补充实验结果。
|
||||||
|
|
||||||
|
\section{Bounds of the Guidance Field and Gain Calibration}
|
||||||
|
\label{sup:field_bounds}
|
||||||
|
|
||||||
|
% 【来源:正文 III-C,原 main.tex 510--533、566--577】
|
||||||
|
% 正文保留 U_g^max、U_e^max 的表达式与 (eq:alpha_dominance) 的标定条件,此处给出其推导。
|
||||||
|
|
||||||
|
\subsection{Upper Bound of the Guidance-Line Field}
|
||||||
|
% 由有限支撑核的非负性,各分场下界平凡地为 0,即势源影响半径之外场值恒为零。
|
||||||
|
% 对于上界,考察一条折线穿过查询点的 rho 邻域的情形。假定 rho_S 不超过引导线的最小曲率半径
|
||||||
|
% (该曲率上界已由正文中线平滑的曲率约束保证),从而折线至多穿越该邻域一次、不会在邻域内盘绕
|
||||||
|
% 而使支撑域内弧长超出弦长;此时落在支撑域内的折线段总长不超过其穿越邻域的路径长度,
|
||||||
|
% 当折线沿直径方向直线穿过时取到最大值。对采用弧长权重的引导线场,其上界即为核函数沿该直径的积分:
|
||||||
|
% 以查询点在折线上的投影点为弧长原点,此时 d = |t|、t 属于 [-rho_g, rho_g],
|
||||||
|
% 代入核函数积分即得引导线场的上界:
|
||||||
|
\begin{equation}
|
||||||
|
0 \le U_\text{g} \le
|
||||||
|
\alpha_\text{g} \int_{-\rho_\text{g}}^{\rho_\text{g}}
|
||||||
|
\left( 1 - \frac{|t|}{\rho_\text{g}} \right)^{m_\text{g}} \mathrm{d}t
|
||||||
|
= \frac{2\alpha_\text{g} \rho_\text{g}}{m_\text{g} + 1}
|
||||||
|
\triangleq U_\text{g}^\text{max} .
|
||||||
|
\label{eq:sup_bound_guide}
|
||||||
|
\end{equation}
|
||||||
|
% 该式即正文 \eqref{eq:bound_guide}。需注意其成立依赖前述"至多穿越一次"的前提:
|
||||||
|
% 若 rho_g 超过引导线的最小曲率半径,折线可在支撑域内盘绕,支撑域内弧长将超出弦长,
|
||||||
|
% 此时 \eqref{eq:sup_bound_guide} 不再是上界。本文对 rho_g 的取值即按此约束选定。
|
||||||
|
|
||||||
|
\subsection{Counting Bound of the Boundary Field}
|
||||||
|
% 场地边界顶点由感知模块直接给出、相邻间距不均匀且不具备明确弧长语义,故取线元权重恒为 1,
|
||||||
|
% 即以顶点计数的形式累积边界排斥作用。核的支撑域为直径 2 rho_e 的圆,故边界局部近似为直线时,
|
||||||
|
% 落入其中的顶点数约为 2 rho_e / bar_ell_e,计入端点得
|
||||||
|
\begin{equation}
|
||||||
|
0 \le U_\text{e} \le
|
||||||
|
\alpha_\text{e} \left( \frac{2\rho_\text{e}}{\bar\ell_\text{e}} + 1 \right)
|
||||||
|
\triangleq U_\text{e}^\text{max} ,
|
||||||
|
\label{eq:sup_bound_edge}
|
||||||
|
\end{equation}
|
||||||
|
% 即正文 \eqref{eq:bound_edge}。该式取核函数在支撑域内的最大值 1 作为每个顶点的贡献,
|
||||||
|
% 因而在计数正确的前提下是上界。
|
||||||
|
|
||||||
|
% 但计数本身只是估计。在凹形拐角处,两侧边界同时进入支撑域,
|
||||||
|
% 落入的顶点数可高于 2 rho_e / bar_ell_e,故 \eqref{eq:sup_bound_edge} 严格意义上并非全局上界。
|
||||||
|
% 若需严格上界,可按场地边界的最小内角 theta_e^min 将顶点计数放大 ceil(2 pi / theta_e^min) 倍
|
||||||
|
% 得到最坏情形;代价是该上界在绝大多数栅格上过分保守,用于归一化会压缩场值的有效动态范围。
|
||||||
|
% 正文因此取 \eqref{eq:sup_bound_edge} 的估计形式用于归一化标定,因该处所需的是场值的典型量级,
|
||||||
|
% 并在栅格场构建后对归一化结果施加截断 min{hat_U, 1} 使值域严格化(见正文归一化处的说明)。
|
||||||
|
% 这一取舍不影响支配条件所要保证的性质:该条件本身留有裕度,
|
||||||
|
% 且凹角处边界场的局部增大只会强化边界排斥作用,与该条件的意图同向。
|
||||||
|
|
||||||
|
\subsection{Dimensional Mismatch and Recalibration}
|
||||||
|
% 引导线场的上界仅由 alpha_g、rho_g 与 m_g 决定,与采样密度无关;
|
||||||
|
% 而边界场的上界与顶点密度成反比地依赖于平均顶点间距。这一差异要求在更换感知配置
|
||||||
|
% 或边界提取分辨率时对 alpha_e 作相应标定;若将边界顶点同样赋以等效弧长权重,
|
||||||
|
% 边界场的上界即可化为与引导线场一致的形式。
|
||||||
|
|
||||||
|
\subsection{Choice of Linear Superposition}
|
||||||
|
% 叠加方式采用线性组合而非取极值或乘性组合,主要出于场的光滑性考虑:
|
||||||
|
% 核函数在支撑域内为 C^{m-1} 连续,线性组合保持该光滑性。两种替代方式各自破坏光滑性:
|
||||||
|
% 取极值 max{U_e, U_p, U_x} 会在各分场取值相等的等值面上引入梯度不连续的折痕,
|
||||||
|
% 该折痕位置随场地几何而变、无法预先规避,且恰可能落在通道中部即路径的必经之处;
|
||||||
|
% 乘性组合则会在任一分场取零时抹去其余分场的信息——由有限支撑性,
|
||||||
|
% 支撑域之外分场恒为零,故乘性组合在大部分工作空间中恒为零、方向先验完全失效。
|
||||||
|
% 光滑性对本文是必要的:引导场不仅用于搜索代价,还参与联合优化阶段的连续优化,
|
||||||
|
% 后者要求代价项具备良好的数值可微性。
|
||||||
|
% 此外,连续意义下的这一光滑性还须由场的离散化表示予以保持,
|
||||||
|
% 这正是采用三次 B 样条而非双线性插值查询栅格场的原因,见 Section \ref{sup:spline}。
|
||||||
|
|
||||||
|
\section{Continuous Representation of the Discretized Field}
|
||||||
|
\label{sup:spline}
|
||||||
|
|
||||||
|
% 【来源:正文 III-C,原 main.tex 560--563】
|
||||||
|
% 正文只保留结论:"以张量积三次 B 样条查询预计算栅格场,核函数衰减阶数取 m >= 3。"
|
||||||
|
|
||||||
|
% 最直接的双线性插值虽已避免最近邻查询的阶跃不连续,但其仅为 C^0 连续:
|
||||||
|
% 一阶导数在栅格单元的公共边上跳变,而单元内部虽有非零的混合二阶导数、
|
||||||
|
% 二阶纯偏导却恒为零。以其表达的场代价项因此不满足联合优化所要求的二阶连续可微性。
|
||||||
|
|
||||||
|
% 本文因此以张量积三次 B 样条作为场的连续化表示:由栅格场值经预滤波(prefiltering)解出样条系数,
|
||||||
|
% 该步骤与场的构建一并在离线阶段完成;在线查询时场值及其一阶、二阶导数均由样条基函数解析给出,
|
||||||
|
% 单次查询在二维情形下涉及 4x4 个系数,仍为常数时间。
|
||||||
|
|
||||||
|
% 相应地,核函数的衰减阶数须取 m_e、m_g >= 3,使连续意义下的场本身即为 C^2;
|
||||||
|
% 否则样条虽在形式上给出连续二阶导数,其所逼近的对象在截断半径处并不具备该光滑性。
|
||||||
|
% 该取值与交互核所要求的 m_Psi >= 3 同源。
|
||||||
|
|
||||||
|
% 还需说明两阶段为何统一采用同一表示。搜索阶段仅以场的函数值参与评价、并不求导,
|
||||||
|
% 故该阶段本可采用更廉价的双线性查询。两阶段统一采用样条表示,是为避免搜索与优化
|
||||||
|
% 所依据的代价在数值上不一致——若两阶段查询同一栅格场却得到不同的插值值,
|
||||||
|
% 粗解相对优化阶段目标函数的"良好初值"性质便失去严格依据。
|
||||||
|
|
||||||
|
% TODO: 若篇幅允许,补一张双线性与三次 B 样条在同一栅格上的一阶导数对比图,
|
||||||
|
% 直观展示前者在单元边界处的跳变。
|
||||||
|
|
||||||
|
\section{Rationale for Joint Rather Than Alternating Optimization}
|
||||||
|
\label{sup:joint_vs_alternating}
|
||||||
|
|
||||||
|
% 【来源:正文 V-C,原 main.tex 888--896】
|
||||||
|
% 正文只保留一句结论 + 指向本节。
|
||||||
|
|
||||||
|
% 相比交替优化(固定一条、优化另一条,逐次迭代至收敛),联立求解有三点实质优势。
|
||||||
|
|
||||||
|
% 其一,装载位共享位姿是一条真正的等式约束;交替方案中它在每个子问题内被固定为
|
||||||
|
% 对向路径的当前值,等于将一条约束降格为轮流赋值,而联立形式下它被一次性精确满足。
|
||||||
|
|
||||||
|
% 其二,交替优化的收敛性在本问题上难以给出有意义的保证:交互项与各子问题均非凸,
|
||||||
|
% 块坐标下降的标准收敛结论所要求的块凸性或子问题唯一解在此都不成立,
|
||||||
|
% 可断言的仅有目标单调不增且有下界这一较弱性质;而联立问题是一个标准 NLP,
|
||||||
|
% 可直接沿用求解器的局部收敛性结论。
|
||||||
|
|
||||||
|
% 其三,本文的非对称性由两处机制共同承担:交互项自带的时延权重 tau_d(决定排斥作用
|
||||||
|
% 沿弧长施加在何处)与两条路径引导权重 w_U 的差异(决定各自让开多少)。
|
||||||
|
% 二者均不依赖求解方式,在联立求解下同样成立,因此放弃交替更新并不损失
|
||||||
|
% "非对称双通道"的设计取向。
|
||||||
|
|
||||||
|
% 联立的代价是决策变量规模翻倍。但跨路径耦合仅存在于稀疏的交互项块
|
||||||
|
% (正文已给出该块的规模量级),稀疏内点法求解器可充分利用这一结构;
|
||||||
|
% 且双路径生成在车辆抵达装载场地前离线完成,其耗时相对采装作业周期可忽略。
|
||||||
|
|
||||||
|
% 【待补】交替优化 vs 联立求解的实测对照(迭代数、墙钟时间、最终目标值、共享位姿的约束违反量),
|
||||||
|
% 与正文实验章的基线 3 共用同一组数据。
|
||||||
|
|
||||||
|
\section{Ellipsoid-Based Convex Corridor Construction}
|
||||||
|
\label{sup:convex_decomp}
|
||||||
|
|
||||||
|
% 【来源:正文原附录 B,main.tex 970--1008,整节迁入】
|
||||||
|
% 正文只保留凸多面体的最终形式与"由局部边界点分布自适应确定半空间"这一性质。
|
||||||
|
|
||||||
|
% 本节给出凸分解方法的详细数学推导。其目标是在离散障碍点集合约束下,
|
||||||
|
% 围绕初始路径的每一段线段,求解一个包裹该线段的无碰撞凸多面体。
|
||||||
|
% 将初始路径逐段处理并令相邻走廊保持重叠,即可得到覆盖整条路径的凸走廊序列。
|
||||||
|
% 整个构造的几何直观见图 \ref{fig:sup_convex_decomp}。
|
||||||
|
|
||||||
|
\subsection{Problem Setup and Notation}
|
||||||
|
% 沿用正文约定,记 p = [x, y]^T 为工作空间中的几何点。设当前路径段的两个端点为 p_0、p_1,
|
||||||
|
% 障碍点集合为 O = {o_i},则目标是围绕线段
|
||||||
|
% L = {(1-t) p_0 + t p_1 | t 属于 [0,1]}
|
||||||
|
% 求一个无碰撞凸多面体 P = {p | A p <= b}。
|
||||||
|
% 方法引入一个包裹线段 L 的辅助椭球 E 作为几何代理,其定义为
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal{E} = \left\{ \mathbf{C}\mathbf{u} + \mathbf{d}
|
||||||
|
\;\middle|\; \left\lVert \mathbf{u} \right\rVert \le 1 \right\} ,
|
||||||
|
\label{eq:sup_ellipsoid_param}
|
||||||
|
\end{equation}
|
||||||
|
% 其中 C 属于 R^{2x2} 为形状矩阵,d 属于 R^2 为椭球中心,u 表示单位球中的点。
|
||||||
|
% 椭球 E 的面积与 det(C) 成正比。
|
||||||
|
|
||||||
|
\subsection{Collision-Free Ellipsoid Construction}
|
||||||
|
% 以线段中点为椭球中心,取线段方向为椭球长轴,初始将椭球设为半径等于线段半长的球,
|
||||||
|
% 再沿垂直于线段的短轴方向收缩,直到椭球边界恰好触及最近的障碍点,
|
||||||
|
% 从而得到一个不含任何障碍点、且完整包裹线段的椭球,其二次型表达为
|
||||||
|
\begin{equation}
|
||||||
|
\mathcal{E} = \left\{ \mathbf{p} \;\middle|\;
|
||||||
|
(\mathbf{p} - \mathbf{d})^\top
|
||||||
|
\left( \mathbf{C}\mathbf{C}^\top \right)^{-1}
|
||||||
|
(\mathbf{p} - \mathbf{d}) \le 1 \right\} ,
|
||||||
|
\quad
|
||||||
|
\mathbf{o}_i \notin \mathrm{int}(\mathcal{E}) \ \ \forall i .
|
||||||
|
\label{eq:sup_ellipsoid_quadratic}
|
||||||
|
\end{equation}
|
||||||
|
% 以线段中点 d = (p_0 + p_1)/2 为椭球中心。
|
||||||
|
|
||||||
|
\subsection{Supporting Half-Space Generation}
|
||||||
|
% 给定避障椭球,逐个为障碍点生成一个将其与线段分离的超平面。
|
||||||
|
% 法向量取椭球边界上距该障碍点最近点处的外法线方向,即由椭球度量确定;
|
||||||
|
% 偏置项使障碍点位于对应半空间边界上,而椭球(及其内部的线段)位于安全一侧。
|
||||||
|
% 为避免冗余约束,每生成一个半空间即剔除被其排除的障碍点,
|
||||||
|
% 仅对剩余障碍点继续生成超平面,直到所有障碍点均被分离。
|
||||||
|
% 具体地,为障碍点 o_i 生成分离超平面 a_i^T p = b_i,其法向量由椭球度量确定:
|
||||||
|
\begin{equation}
|
||||||
|
\tilde{\mathbf{a}}_i
|
||||||
|
= \left( \mathbf{C}\mathbf{C}^\top \right)^{-1}
|
||||||
|
\left( \mathbf{o}_i - \mathbf{d} \right) ,
|
||||||
|
\qquad
|
||||||
|
\mathbf{a}_i = \frac{\tilde{\mathbf{a}}_i}
|
||||||
|
{\left\lVert \tilde{\mathbf{a}}_i \right\rVert} ,
|
||||||
|
\label{eq:sup_halfspace_normal}
|
||||||
|
\end{equation}
|
||||||
|
% 即取椭球边界上距 o_i 最近点处的外法线方向;偏置项由 b_i = a_i^T o_i 给出,
|
||||||
|
% 从而保证障碍点位于对应半空间边界上,而椭球(及其内部的线段)位于安全一侧。
|
||||||
|
% 将保留的约束堆叠得 A = [a_1, ..., a_m]^T、b = [b_1, ..., b_m]^T,
|
||||||
|
% 即得包裹线段的凸多面体 P。半空间的数量 m 与方向均由局部障碍点分布自适应确定,
|
||||||
|
% 不需预设走廊形状。
|
||||||
|
|
||||||
|
\subsection{Seed Extension and Corridor Overlap}
|
||||||
|
% 【新增】生成走廊时将种子沿粗解折线向两端各延伸弧长 Delta_slide 后再作凸分解,
|
||||||
|
% 使相邻走廊在一段有限弧长上重叠、而非仅交于一点,从而容纳配置点的纵向滑移。
|
||||||
|
% TODO: 补 Delta_slide 取值、走廊半空间数 m_k 的实测分布、以及外循环触发率。
|
||||||
|
|
||||||
|
\begin{figure}[htbp]
|
||||||
|
\centering
|
||||||
|
\includegraphics{fig_convex_decomp}
|
||||||
|
\caption{Geometric intuition of the convex decomposition.
|
||||||
|
(a) The initial sphere centered at the segment midpoint
|
||||||
|
$\mathbf{d}$ is shrunk along the minor axis until the boundary
|
||||||
|
of $\mathcal{E}$ first touches an obstacle point
|
||||||
|
$\mathbf{o}_i$, giving a collision-free ellipsoid that fully
|
||||||
|
encloses the segment $\mathbf{p}_0\mathbf{p}_1$.
|
||||||
|
(b) Each retained obstacle (solid) generates one supporting
|
||||||
|
half-space $\mathbf{a}_i^{\!\top}\mathbf{p}=b_i$ whose normal
|
||||||
|
is set by the ellipsoid metric of
|
||||||
|
\eqref{eq:sup_halfspace_normal}; obstacles already excluded by
|
||||||
|
an emitted half-space are pruned as redundant (hollow), and the
|
||||||
|
retained half-spaces clip the free space into the convex
|
||||||
|
polytope $\mathcal{P}$.}
|
||||||
|
\label{fig:sup_convex_decomp}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\subsection{Sufficiency and Safety Margin of the Discretized Constraint}
|
||||||
|
\label{sup:corner_cut}
|
||||||
|
% 本节给出正文 \eqref{eq:corner_cut_margin} 所用走廊内缩余量的推导,并量化矿卡尺度下的实际切入量。
|
||||||
|
% 正文的顶点约束仅在配置点上成立:顶点落入凸多面体 P_k 是该配置点处整车无碰的充分条件,
|
||||||
|
% 但相邻两个配置点之间车体仍可切出走廊之外。以下证明该切入量存在一个仅依赖 Delta_s 与
|
||||||
|
% kappa_max 的解析上界,故可由走廊的一次性内缩完全覆盖。
|
||||||
|
|
||||||
|
% 考察相邻配置点 k 与 k+1 之间的一段路径。由正文的曲率约束,该段的曲率满足
|
||||||
|
% |kappa| <= kappa_max = 1/R_min。在最坏情形下该段为定曲率圆弧、且取到曲率上界:
|
||||||
|
% 此时车辆绕瞬时转向中心(ICR)作纯滚动,车体为刚体,故其上任一点亦作圆周运动。
|
||||||
|
% 设车体坐标系下顶点 r 的坐标为 [a_r, b_r]^T,ICR 位于后轴延长线上距后轴中心 R_min 处,
|
||||||
|
% 即车体坐标 [0, R_min]^T,则该顶点到 ICR 的距离为
|
||||||
|
\begin{equation}
|
||||||
|
\rho_\text{c}^{(r)} = \left\lVert
|
||||||
|
\begin{bmatrix} a_r \\ b_r \end{bmatrix}
|
||||||
|
- \begin{bmatrix} 0 \\ R_\text{min} \end{bmatrix}
|
||||||
|
\right\rVert .
|
||||||
|
\label{eq:sup_rho_c}
|
||||||
|
\end{equation}
|
||||||
|
% 该段上后轴中心转过的航向增量为 Delta_theta = Delta_s * kappa_max,而刚体上所有点转过
|
||||||
|
% 相同的角度 Delta_theta(绕同一 ICR),故顶点 r 走过一段半径 rho_c^(r)、圆心角 Delta_theta 的圆弧。
|
||||||
|
% 该圆弧偏离其弦的最大距离即弓形的矢高(sagitta),在弧中点处取到:
|
||||||
|
\begin{equation}
|
||||||
|
\Delta_\text{cut}^{(r)}
|
||||||
|
= \rho_\text{c}^{(r)} \left[ 1 - \cos\!\left( \frac{\Delta\theta}{2} \right) \right]
|
||||||
|
= \rho_\text{c}^{(r)} \left[ 1 - \cos\!\left( \frac{\Delta s\, \kappa_\text{max}}{2} \right) \right] .
|
||||||
|
\label{eq:sup_sagitta}
|
||||||
|
\end{equation}
|
||||||
|
% 取四个顶点中最大者,即得正文 \eqref{eq:corner_cut_margin} 的 Delta_cut。
|
||||||
|
% 该值是上界而非估计:它同时取到了曲率上界与弧中点位置,且顶点集合已取遍。
|
||||||
|
% 因此,若在生成 P_k 时将其每个半空间沿内法向平移 Delta_cut(即 b_k <- b_k - Delta_cut * 1),
|
||||||
|
% 则配置点处满足内缩后走廊的约束蕴含整段弧上车体不越出原走廊。
|
||||||
|
|
||||||
|
% 需要指出 \eqref{eq:sup_sagitta} 中的两处保守性,二者方向相反但量级都很小。
|
||||||
|
% 其一,Delta_theta 按 kappa_max 计,而实际路径在大部分弧长上曲率远小于上界,
|
||||||
|
% 故实际切入量通常显著小于 Delta_cut。其二,rho_c^(r) 按 R_min 处的 ICR 计,
|
||||||
|
% 而曲率较小时 ICR 更远、顶点圆弧半径更大;但矢高中的余弦项随曲率下降得更快
|
||||||
|
% (Delta_theta 正比于 kappa),二者相乘后仍随曲率单调下降,故以 kappa_max 取上界是正确的。
|
||||||
|
|
||||||
|
% 表 \ref{tab:sup_corner_cut} 给出矿卡尺度下的实算结果。取 R_min = 12 m、L_v = 12 m、B_v = 3 m,
|
||||||
|
% 并设后轴中心距车体后端 1.5 m(即后悬 1.5 m,故前端在车体坐标 a = 10.5 m 处)。
|
||||||
|
% 车辆左转时 ICR 位于车体坐标 [0, R_min]^T,四个顶点到 ICR 的距离分别为
|
||||||
|
% 17.10 m(右前)、14.85 m(左前)、13.58 m(右后)、10.61 m(左后),
|
||||||
|
% 故最远顶点为转弯外侧的前保险杠角点,rho_c = 17.10 m。
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering
|
||||||
|
\caption{Maximum corner-cutting deviation between adjacent collocation
|
||||||
|
points, evaluated at $R_\text{min}=12$\,m, $L_\text{v}=12$\,m,
|
||||||
|
$B_\text{v}=3$\,m and a rear overhang of $1.5$\,m
|
||||||
|
(farthest corner at $\rho_\text{c}=17.10$\,m).}
|
||||||
|
\label{tab:sup_corner_cut}
|
||||||
|
\begin{tabular}{@{}cc@{}}
|
||||||
|
\toprule
|
||||||
|
Collocation step $\Delta s$ (m) & $\Delta_\text{cut}$ (cm) \\
|
||||||
|
\midrule
|
||||||
|
0.5 & 0.37 \\
|
||||||
|
1.0 & 1.48 \\
|
||||||
|
1.5 & 3.34 \\
|
||||||
|
2.0 & 5.93 \\
|
||||||
|
3.0 & 13.34 \\
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
% 两点结论。其一,在 Delta_s <= 1.5 m 时切入量不超过 3.4 cm,远小于矿区常用的车体安全间隔,
|
||||||
|
% 故一次性内缩不会实质压缩可行域,也无须在配置点之间追加中点约束——后者会使约束数近似加倍,
|
||||||
|
% 而所换取的余量收益不足 4 cm。其二,Delta_cut 随 Delta_s 近似二次增长
|
||||||
|
% (小角度下 1 - cos(x/2) ≈ x^2/8),Delta_s = 3 m 时已达 13 cm 量级、接近安全余量本身,
|
||||||
|
% 因此 \eqref{eq:sup_sagitta} 亦为配置步长提供了上界依据:本文取 Delta_s 不超过 1.5 m。
|
||||||
|
% TODO: 待实车数据到位后,在此补一行实测车体轮廓到边界的最小间隙,与 Delta_cut 对照。
|
||||||
|
|
||||||
|
\section{Second-Difference Discretization of Curvature Constraints}
|
||||||
|
\label{sup:curvature}
|
||||||
|
|
||||||
|
% 本节给出正文虚拟中线平滑问题中二阶差分与曲率之间换算关系的推导,即
|
||||||
|
% \lVert d_i \rVert ≈ ell^2 kappa_i,并给出该近似的误差量级。
|
||||||
|
|
||||||
|
\subsection{Taylor-Series Derivation}
|
||||||
|
% 设中线经等弧长重采样后,相邻点的弧长间距为 $\ell$,并将其视为对某条以弧长为参数的光滑曲线 $\mathbf{r}(s)$ 的采样,即 $\mathbf{q}_{i} = \mathbf{r}(s_i)$、$\mathbf{q}_{i \pm 1} = \mathbf{r}(s_i \pm \ell)$。在 $s_i$ 处对前后两个采样点作泰勒展开:
|
||||||
|
\begin{subequations} \label{eq:sup_taylor}
|
||||||
|
\begin{align}
|
||||||
|
\mathbf{q}_{i+1} & = \mathbf{r} + \ell\, \mathbf{r}'
|
||||||
|
+ \frac{\ell^2}{2} \mathbf{r}''
|
||||||
|
+ \frac{\ell^3}{6} \mathbf{r}''' + O(\ell^4) \\
|
||||||
|
\mathbf{q}_{i-1} & = \mathbf{r} - \ell\, \mathbf{r}'
|
||||||
|
+ \frac{\ell^2}{2} \mathbf{r}''
|
||||||
|
- \frac{\ell^3}{6} \mathbf{r}''' + O(\ell^4)
|
||||||
|
\end{align}
|
||||||
|
\end{subequations}
|
||||||
|
% 其中 $\mathbf{r}$ 及其各阶导数均在 $s_i$ 处取值。两式相加时,奇数阶项因中心对称而相互抵消,故 $\mathbf{d}_i = \mathbf{q}_{i-1} - 2\mathbf{q}_i + \mathbf{q}_{i+1} = \ell^2\, \mathbf{r}''(s_i) + O(\ell^4)$。由于曲线以弧长为参数,其一阶导数即为单位切向量 $\mathbf{r}' = \mathbf{T}$,由 Frenet 公式\cite{docarmo2016curves}有 $\mathbf{r}'' = \mathrm{d}\mathbf{T}/\mathrm{d}s = \kappa\, \mathbf{N}$,其中 $\mathbf{N}$ 为单位法向量。由 $\lVert \mathbf{N} \rVert = 1$ 知 $\lVert \mathbf{r}'' \rVert = \kappa$,代入即得
|
||||||
|
\begin{equation}
|
||||||
|
\left\lVert \mathbf{d}_i \right\rVert = \ell^2 \kappa_i + O(\ell^4)
|
||||||
|
\label{eq:sup_curvature_relation}
|
||||||
|
\end{equation}
|
||||||
|
|
||||||
|
\subsection{Approximation Error and Discretization Choice}
|
||||||
|
% 为定量评估 \eqref{eq:sup_curvature_relation} 的近似精度,考察三个采样点恰好落在半径 $R = 1/\kappa$ 圆周上的情形,此时可得到闭式结果。设相邻点对应的圆心角间隔为 $\theta$,将圆心置于原点,则三点可表示为 $\mathbf{q}_{i} = R[1, 0]^\top$、$\mathbf{q}_{i \pm 1} = R[\cos\theta, \pm\sin\theta]^\top$,代入二阶差分得精确表达式 $\lVert \mathbf{d}_i \rVert = 2R(1 - \cos\theta) = 4R \sin^2(\theta/2)$。将弧长关系 $\theta = \ell / R = \ell\, \kappa$ 代入并对 $\sin(\cdot)$ 作级数展开,可得
|
||||||
|
\begin{equation}
|
||||||
|
\left\lVert \mathbf{d}_i \right\rVert
|
||||||
|
= \ell^2 \kappa \left( 1 - \frac{\ell^2 \kappa^2}{12}
|
||||||
|
+ O\!\left( \ell^4 \kappa^4 \right) \right)
|
||||||
|
\label{eq:sup_curvature_error}
|
||||||
|
\end{equation}
|
||||||
|
% 即 \eqref{eq:sup_curvature_relation} 的相对误差约为 $\frac{1}{12}( \ell / R )^2$,随采样间距与曲率半径之比的平方衰减。以本文所针对的矿用运输车辆为例,其最小转弯半径 $R_\text{min}$ 约为 12 m,而中线重采样间距取 $\ell = 1$~m,此时相对误差约为 $0.06\%$;即使取 $\ell = 3$~m,误差亦不超过 $0.5\%$,对约束的实际影响可以忽略。此外,由 \eqref{eq:sup_curvature_error} 可见近似值 $\ell^2 \kappa$ 略大于真实的 $\lVert \mathbf{d}_i \rVert$,因此以 $\lVert \mathbf{d}_i \rVert \le \ell_i^2 \kappa_\text{max}$ 作为约束时实际允许的曲率略小于 $\kappa_\text{max}$,即该离散化在安全性上偏保守。
|
||||||
|
|
||||||
|
% 离散曲率还可由三点外接圆法或航向角差分法估计。前者含有路径点范数的乘积作为分母,后者含有反三角函数;将它们直接写成曲率上界约束会引入非二次的非线性结构。相比之下,本文采用的二阶差分 $\mathbf{d}_i=\mathbf{q}_{i-1}-2\mathbf{q}_i+\mathbf{q}_{i+1}$ 是路径点的线性函数,因而 $\|\mathbf{d}_i\|^2$ 给出凸二次约束,并保持与目标函数相同的稀疏结构。平方形式还避免了 $\|\mathbf{d}_i\|$ 在零点的不可微性。故本文接受 \eqref{eq:sup_curvature_error} 所示的离散误差,以换取更简单、稳定的优化结构。
|
||||||
|
|
||||||
|
\section{Implementation Details and Additional Results}
|
||||||
|
\label{sup:implementation}
|
||||||
|
|
||||||
|
\subsection{Full Parameter Settings}
|
||||||
|
% TODO: 汇总全部参数取值(核参数 alpha/rho/m、场分辨率 delta、状态格分辨率、
|
||||||
|
% 基准步长 mu_0、调制区间、权重 w_U/w_Psi/w_kappa、Delta_slide、Ipopt 收敛容差等),
|
||||||
|
% 并注明各参数的标定方式(解析条件 / 实验标定 / 沿用文献)。
|
||||||
|
|
||||||
|
\begin{table}[htbp]
|
||||||
|
\centering
|
||||||
|
\caption{Complete Parameter Settings}
|
||||||
|
\label{tab:sup_params}
|
||||||
|
\footnotesize
|
||||||
|
\begin{tabular}{@{}llcl@{}}
|
||||||
|
\toprule
|
||||||
|
Symbol & Description & Value & Source \\
|
||||||
|
\midrule
|
||||||
|
% TODO: 填表
|
||||||
|
\bottomrule
|
||||||
|
\end{tabular}
|
||||||
|
\end{table}
|
||||||
|
|
||||||
|
\subsection{Nearest-Neighbor Query for the Interaction Term}
|
||||||
|
% 【新增,对应审阅意见】交互项的非零元数为 O(rho_Psi / Delta_s),但朴素实现仍需
|
||||||
|
% M_park x M_exit 次距离计算才能找出近邻点对。
|
||||||
|
% TODO: 说明所采用的空间索引结构(KD 树 / 均匀网格哈希)、其重建频次,
|
||||||
|
% 以及每次迭代中该步骤的实测耗时占比。
|
||||||
|
|
||||||
|
\subsection{Additional Ablation Results}
|
||||||
|
% TODO: 正文因篇幅只保留主要消融项,此处收录完整消融表
|
||||||
|
% (逐项去除 J_U / J_Psi / 时序权重 / 自适应步长 / 场增强启发的对照)。
|
||||||
|
|
||||||
|
\subsection{Failure Cases}
|
||||||
|
% TODO: 收录求解失败或退化的算例(极端装载位、通道宽度不足以容纳双通道时的行为),
|
||||||
|
% 并说明方法的适用边界。审稿人通常会追问这一点,主动给出比被问到更好。
|
||||||
|
|
||||||
|
% TODO(投稿前): 正文取消注释、产生有效 \cite 后删除下面这行 \nocite{*}。
|
||||||
|
% 当前草稿阶段本材料正文均为注释、无任何生效的 \cite,故必须保留此行,否则 thebibliography 为空而编译报错。
|
||||||
|
\nocite{*}
|
||||||
|
\bibliographystyle{IEEEtran}
|
||||||
|
\bibliography{refs}
|
||||||
|
|
||||||
|
\end{document}
|
||||||
Reference in New Issue
Block a user