笛卡尔坐标 → 自然坐标(Frenet) 逐步推导全解 -2

结论 1

dpdds=w Tr+d′ Nr,w:=1−krd \frac{d\mathbf p_d}{ds}=w\,\mathbf T_r+d'\,\mathbf N_r,\qquad w:=1-k_r d dsdpd=wTr+d′Nr,w:=1−krd

几何读法:沿参考线走 dsdsds,切向自然前进 dsdsds;但因为标架转了 krdsk_r dskrds 的角度,偏移点被「甩」回去 d kr dsd\,k_r\,dsdkrds,两者相减得 w dsw\,dswds。这就是「内侧弧长变短、外侧弧长变长」的微分版本。

STEP 06.3 偏移曲线的弧长与「斜着走」的修正

用到的工具:向量模 · 正交基

由 STEP 04.3,Tr⊥Nr\mathbf T_r\perp\mathbf N_rTr⊥Nr 且都是单位向量,所以对 wTr+d′Nrw\mathbf T_r+d'\mathbf N_rwTr+d′Nr 用勾股定理:

∥dpdds∥=w2+(d′)2=(1−krd)2+(d′)2 \left\|\frac{d\mathbf p_d}{ds}\right\|=\sqrt{w^2+(d')^2}=\sqrt{(1-k_r d)^2+(d')^2} dsdpd =w2+(d′)2 =(1−krd)2+(d′)2

这意味着「参考线弧长每增加 1 m,偏移曲线实际走了 w2+d′2\sqrt{w^2+d'^2}w2+d′2 m」。当 d′=0d'=0d′=0(严格平行)时退化为 ∣w∣=∣1−krd∣|w|=|1-k_rd|∣w∣=∣1−krd∣,正是同心圆的半径比。

STEP 06.4 改用车辆自身弧长参数化,比较系数

用到的工具:链式法则 · 基向量线性无关 · 三角恒等式

车辆实际走的是同一条曲线 pd\mathbf p_dpd,只不过用自身弧长 sxs_xsx 作参数。它的单位切向量就是 Tx\mathbf T_xTx,方向角为 θx=θr+Δθ\theta_x=\theta_r+\Delta\thetaθx=θr+Δθ。把 Tx\mathbf T_xTx 在参考线标架下展开(相当于左乘 R(−Δθ)R(-\Delta\theta)R(−Δθ)):

Tx=cos⁡Δθ Tr+sin⁡Δθ Nr \mathbf T_x=\cos\Delta\theta\,\mathbf T_r+\sin\Delta\theta\,\mathbf N_r Tx=cosΔθTr+sinΔθNr

另一方面,同一曲线的导数用链式法则换参数:

dpdds=dsxds⋅dpddsx=dsxds Tx=dsxds(cos⁡Δθ Tr+sin⁡Δθ Nr) \frac{d\mathbf p_d}{ds}=\frac{ds_x}{ds}\cdot\frac{d\mathbf p_d}{ds_x}=\frac{ds_x}{ds}\,\mathbf T_x =\frac{ds_x}{ds}\big(\cos\Delta\theta\,\mathbf T_r+\sin\Delta\theta\,\mathbf N_r\big) dsdpd=dsdsx⋅dsxdpd=dsdsxTx=dsdsx(cosΔθTr+sinΔθNr)

与 STEP 06.2 的结果逐项对照({Tr,Nr}\{\mathbf T_r,\mathbf N_r\}{Tr,Nr} 线性无关,系数必须相等):

{w=(1−krd)=dsxdscos⁡Δθd′=dsxdssin⁡Δθ \begin{cases} w=(1-k_r d)=\dfrac{ds_x}{ds}\cos\Delta\theta\\ d'=\dfrac{ds_x}{ds}\sin\Delta\theta \end{cases} ⎩ ⎨ ⎧w=(1−krd)=dsdsxcosΔθd′=dsdsxsinΔθ

两式相除消去 dsx/dsds_x/dsdsx/ds:

结论 2

d′1−krd=sin⁡Δθcos⁡Δθ=tan⁡Δθ⟹d′=(1−krd)tan⁡Δθ \frac{d'}{1-k_r d}=\frac{\sin\Delta\theta}{\cos\Delta\theta}=\tan\Delta\theta \quad\Longrightarrow\quad \boxed{d'=(1-k_r d)\tan\Delta\theta} 1−krdd′=cosΔθsinΔθ=tanΔθ⟹d′=(1−krd)tanΔθ

由第一式解出弧长比:

结论 3

dsxds=1−krdcos⁡Δθ=(1−krd)2+(d′)2 \boxed{\frac{ds_x}{ds}=\frac{1-k_r d}{\cos\Delta\theta}=\sqrt{(1-k_r d)^2+(d')^2}} dsdsx=cosΔθ1−krd=(1−krd)2+(d′)2

两个结论其实是一件事的两种说法:d′d'd′ 描述「横向走多快(相对纵向)」,dsx/dsds_x/dsdsx/ds 描述「实际走多快(相对纵向)」,它们通过 tan⁡Δθ\tan\Delta\thetatanΔθ 与 cos⁡Δθ\cos\Delta\thetacosΔθ 互相换算。第 7 节求速度时还会再用一次。

图 3|缩放因子的几何本质。同心圆模型只解释「平行」情形(Δθ=0\Delta\theta=0Δθ=0);斜着走时还要再乘 cos⁡Δθ\cos\Delta\thetacosΔθ 的投影修正,即 STEP 06.3--06.4。

STEP 06.5 用角速度再验一遍(同圆心角)

用到的工具:圆周运动 · 消元

设车与投影点绕同一曲率中心转动,角速度同为 ω\omegaω。参考线半径 Rr=1/krR_r=1/k_rRr=1/kr,车辆所在偏移曲线半径 Rx=1/kr−dR_x=1/k_r-dRx=1/kr−d。则

vref=ωRr=ωkr,vcar=ωRx=ω(1kr−d)=ω(1−krd)kr v_{\text{ref}}=\omega R_r=\frac{\omega}{k_r},\qquad v_{\text{car}}=\omega R_x=\omega\left(\frac{1}{k_r}-d\right)=\frac{\omega(1-k_r d)}{k_r} vref=ωRr=krω,vcar=ωRx=ω(kr1−d)=krω(1−krd)

两式相除消去 ω/kr\omega/k_rω/kr:

vcarvref=1−krd⟹vref=vcar1−krd \frac{v_{\text{car}}}{v_{\text{ref}}}=1-k_r d \quad\Longrightarrow\quad v_{\text{ref}}=\frac{v_{\text{car}}}{1-k_r d} vrefvcar=1−krd⟹vref=1−krdvcar

把 vcarv_{\text{car}}vcar 换成「车速在切向的投影」vxcos⁡Δθv_x\cos\Delta\thetavxcosΔθ,vrefv_{\text{ref}}vref 换成 s˙\dot ss˙,立刻得到第 7 节的 s˙\dot ss˙ 公式。两条推导(弧长比、角速度比)结果一致,说明缩放因子没有符号错误。

STEP 06.6 为什么是减号?什么时候会变成加号

用到的工具:符号约定

减号来自两条约定的组合:

  • Nr\mathbf N_rNr 指向左侧 ,d>0d>0d>0 表示车在左侧;
  • kr>0k_r>0kr>0 表示参考线左转,曲率中心在左侧。

于是「d>0d>0d>0 且 kr>0k_r>0kr>0」意味着车在参考线与曲率中心之间,半径变小 ddd,所以 Rx=Rr−dR_x=R_r-dRx=Rr−d,弧长按 1−krd1-k_r d1−krd 缩短。

注意: 如果换了约定: ① 法向取右侧为正 → 变 1+krd1+k_r d1+krd;② 曲率以右转为正 → 也变 1+krd1+k_r d1+krd;③ 两者同时反号 → 又回到 1−krd1-k_r d1−krd。移植公式前必须先确认对方代码的两条约定,不能只看公式形状。

STEP 06.7 两个奇异条件

用到的工具:分母保护

w=1−krd=0 ⟺ d=1kr=Rr(车正好落在曲率中心) w=1-k_r d=0\ \Longleftrightarrow\ d=\frac{1}{k_r}=R_r \quad\text{(车正好落在曲率中心)} w=1−krd=0 ⟺ d=kr1=Rr(车正好落在曲率中心)

cos⁡Δθ=0 ⟺ ∣Δθ∣=90∘(车头与道路垂直) \cos\Delta\theta=0\ \Longleftrightarrow\ |\Delta\theta|=90^\circ \quad\text{(车头与道路垂直)} cosΔθ=0 ⟺ ∣Δθ∣=90∘(车头与道路垂直)

两者都会让 dsx/dsds_x/dsdsx/ds 或 s˙\dot ss˙ 发散。工程上取 ∣d∣≤0.9Rr|d|\le 0.9R_r∣d∣≤0.9Rr、∣Δθ∣≤60∘|\Delta\theta|\le 60^\circ∣Δθ∣≤60∘,越界就回退到上一帧结果或直接拒绝该参考线。

07 一阶:ṡ、ḋ、d'

有了位置和缩放因子,速度只是「位置对时间求一次导」,再在两个标架下各看一遍。

STEP 07.1 位置对时间求导:链式法则一步到位

用到的工具:链式法则 · 向量求导

车辆沿偏移曲线运动,位置为 p(t)=pd(s(t))\mathbf p(t)=\mathbf p_d(s(t))p(t)=pd(s(t))。对时间求导:

p˙=dpddt=dpdds⋅dsdt=s˙ dpdds \dot{\mathbf p}=\frac{d\mathbf p_d}{dt}=\frac{d\mathbf p_d}{ds}\cdot\frac{ds}{dt} =\dot s\,\frac{d\mathbf p_d}{ds} p˙=dtdpd=dsdpd⋅dtds=s˙dsdpd

代入 STEP 06.2 的结果:

结论

p˙=s˙(1−krd) Tr+d′ Nr \dot{\mathbf p}=\dot s\big(1-k_r d)\\,\\mathbf T_r+d'\\,\\mathbf N_r\\big p˙=s˙(1−krd)Tr+d′Nr

这是一个「速度向量 = 纵向速度 × (切向缩放 + 法向斜率)」的紧凑形式,后面所有一阶量都从它派生。

STEP 07.2 同一个速度,在车辆标架下写一遍

用到的工具:单位切向量 · 基变换

速度大小为 vxv_xvx、方向沿车头,所以

p˙=vx Tx=vx(cos⁡Δθ Tr+sin⁡Δθ Nr) \dot{\mathbf p}=v_x\,\mathbf T_x=v_x\big(\cos\Delta\theta\,\mathbf T_r+\sin\Delta\theta\,\mathbf N_r\big) p˙=vxTx=vx(cosΔθTr+sinΔθNr)

其中 Tx=cos⁡Δθ Tr+sin⁡Δθ Nr\mathbf T_x=\cos\Delta\theta\,\mathbf T_r+\sin\Delta\theta\,\mathbf N_rTx=cosΔθTr+sinΔθNr 来自 STEP 06.4(等价于左乘 R(Δθ)R(\Delta\theta)R(Δθ))。

STEP 07.3 比较系数:一次得到两个方程

用到的工具:正交基 · 线性无关 · 代数

STEP 07.1 与 07.2 是同一个向量在同一个基 {Tr,Nr}\{\mathbf T_r,\mathbf N_r\}{Tr,Nr} 下的两种写法,系数必须逐项相等:

{s˙ (1−krd)=vxcos⁡Δθ(切向)s˙ d′=vxsin⁡Δθ(法向) \begin{cases} \dot s\,(1-k_r d)=v_x\cos\Delta\theta &\quad\text{(切向)}\\ \dot s\,d'=v_x\sin\Delta\theta &\quad\text{(法向)} \end{cases} {s˙(1−krd)=vxcosΔθs˙d′=vxsinΔθ(切向)(法向)

由第一式直接解出纵向速度:

相关推荐
米糕闯编程4 天前
鱼香ros2(十七)C++小海龟巡逻
开发语言·c++·机器人·ros2·服务·小海龟
风合星语5 天前
2026 机器人工程实例(七):Nav2 到站了,任务却没完成——AMR 载货导航中的托盘滑移与验收闭环
人工智能·机器人·ros2·机器人仿真·nav2·mujoco·amr
米糕闯编程11 天前
鱼香ros2(十二)C++话题订阅与发布
开发语言·c++·ros2·话题
朝朝辞暮i13 天前
C++ 第 36 课:Action——机械臂/VLA 非常重要
开发语言·c++·算法·ros2
朝朝辞暮i14 天前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
朝朝辞暮i14 天前
C++ 第 40 章:ROS2 Publisher + Timer + Subscriber + Callback + Executor 完整闭环
开发语言·c++·算法·ros2
朝朝辞暮i14 天前
C++ 第 38 课:线程、SingleThreadedExecutor、MultiThreadedExecutor、Callback Group
开发语言·c++·算法·ros2
小奇不哭14 天前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
zhangrelay17 天前
机械臂末端规划智能模型的误区演示
linux·笔记·学习·ubuntu·ros2