17 KiB
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}} 不会形成跨路径导数耦合。只有在另外重新定义约束时,才可能形成真正的跨路径约束,例如:
-
直接施加
\boldsymbol\eta^{\mathrm{park}}(s_{\mathrm{park}}) -\boldsymbol\eta^{\mathrm{exit}}(0)=0; -
由上层模型额外引入一个待优化的共享位姿变量,并让两条路径的边界条件同时依赖该变量。这个做法已经改变了当前论文中“装载位姿由上层系统给定”的问题定义。
因此,按照论文当前“装载位姿固定”的问题定义,真正的跨路径导数耦合只来自 $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块发生跨路径耦合。