惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
S
Securelist
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Google DeepMind News
Google DeepMind News
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - Franky
T
Threat Research - Cisco Blogs
罗磊的独立博客
IT之家
IT之家
人人都是产品经理
人人都是产品经理
Stack Overflow Blog
Stack Overflow Blog
K
Kaspersky official blog
博客园_首页
T
The Blog of Author Tim Ferriss
T
Tenable Blog
I
InfoQ
Apple Machine Learning Research
Apple Machine Learning Research
T
The Exploit Database - CXSecurity.com
D
Docker
TaoSecurity Blog
TaoSecurity Blog
S
Schneier on Security
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
M
MIT News - Artificial intelligence
U
Unit 42
N
Netflix TechBlog - Medium
L
LINUX DO - 热门话题
C
CERT Recently Published Vulnerability Notes
T
Tailwind CSS Blog
Hacker News: Ask HN
Hacker News: Ask HN
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
美团技术团队
F
Fortinet All Blogs
Last Week in AI
Last Week in AI
AWS News Blog
AWS News Blog
V
V2EX
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Hacker News - Newest:
Hacker News - Newest: "LLM"
Schneier on Security
Schneier on Security
腾讯CDC
H
Help Net Security
B
Blog RSS Feed
T
Tor Project blog
P
Privacy & Cybersecurity Law Blog
The Last Watchdog
The Last Watchdog
有赞技术团队
有赞技术团队

又见苍岚

COLMAP PatchMatch Stereo 算法详解 事件驱动的状态机框架:从理论到工程实践 Git 在国内网络环境下无法 Push 的排查与修复 —— 配置 Clash 代理 分段五次多项式插值原理详解 路径插值方法深度对比研究 Claude Code 使用指南 OpenClaw 记忆管理与技能创建指南 CBS(Conflict-Based Search)算法详解 A* 算法及其变种详解 OpenClaw 配置多 Agents Windows Powershell 无法加载文件,因为在此系统上禁止运行脚本问题的解决方案 MaxClaw 安装流程 大模型 AI 名词介绍 AList 网盘聚合工具简介 Protobuf 简介与测试 Claude Code 简介以及 GLM 4.7 模型接入 Github 歌词下载工具 163MusicLyrics Python __getattr__ 懒加载 Python TypedDict 机器人仿真平台 Gazebo 安装记录 机器人仿真平台 Gazebo 简介 多机器人路径规划问题(Multi-Agent Path Finding, MAPF)简介 Python exifread 读取修改过的 jpeg 信息错误问题修复 3D 坐标系变换的理解 3D 旋转矩阵基本概念 MongoDB Compass 介绍 Python 环境管理工具 uv Flutter 开发指南 Snipaste 安装下载与黑屏问题解决方案 全局路径规划算法记录 2025 Python 版本性能测试 Flutter Hello World Flutter 安装环境配置 Ubuntu VMware 硬盘扩容后 SMBus Host controller not enabled 报错问题解决 Python NetworkX 教程 Docker GPU 报错 - Failed to initialize NVML Unknown Error 解决方案 Python matplotlib 图表绘制 cuda-toolkit 安装替代 Cuda 与 Cudnn Jinja2 Python 利用 docxtpl 和 Jinja2 生成基于模板的 Word 文档 Docker 实现 CPU 核心隔离 LoFTR 基于 Transformer 的特征提取匹配算法 OmniGlue 特征匹配 SuperGlue 使用图神经网络学习特征匹配 Ubuntu 下将 xlsx 文件按照 sheet 转换为 图片 Python 使用 SQLAlchemy Python FastAPI 教程 openwrt 软路由配置安装 Nav2 地图文件(PGM/YAML)规范标准 3D OBJ 模型转换为 glb 瓦片格式 Python 源码 Redis 数据库介绍 Ubuntu 22.04 内核自动升级导致 MongoDB 7.0.12 错误记录 ubuntu 20.04 安装 ROS Noetic ubuntu 18.04 安装 ROS Melodic VMware Workstation Pro 个人免费版下载、安装、使用指南 Hybrid A-star 路径规划 Dubins 曲线 Linux kvm 虚拟机网络不通的问题解决方法 Ubuntu 自动内存清理 BiliBili 缓存视频转 mp4 Python 求解线性规划 3D Gaussian Splatting 官方源码实践记录 ImageMagick 教程 Ubuntu 22.04 安装 Colmap 对数几率 odds Ubuntu nmcli 网络管理工具使用指南 SuperPoint 自监督深度学习特征点提取 SyncTV Music Tag Web 在线音乐信息整理工具 ncm 格式转 mp3 MusicBrainz 音乐元数据百科数据库 Ubuntu 网络流量监控工具 私人云音乐平台 Navidrome 入门 手眼标定 四元数(Quaternions) OHTTPS 实现免费自动 https 证书申请、更新、部署 ubuntu 22.04 安装 CloudCompare 单机 KVM 虚拟机冷迁移 Ubuntu 22.04 使用 mdadm 实现软 raid 小鱼 一键安装 ROS-humble Fluid -46- 基于 Simpletex API 构建公式识别页面 公式识别 API 简介 -- Simpletex 使用 Python web 部署库 waitress 3D Gaussian Splatting for Real-Time Radiance Field Rendering Ubuntu Swap 简介与空间扩展 Ubuntu 24.04 安装 forticlient Clash Verge 使用 MongoDB 7.0.17 集群 Docker 构建源码 Error code - 2013. Lost connection to MySQL server during query 问题解决 Python 日志记录库 loguru 使用指北 Python 实现 Web 日志查看服务 MySQL LOAD DATA LOCAL INFILE 极速数据加载 Image size exceeds limit of 89478485 pixels 解决方案 Docker 使用 NVIDIA GPU 驱动错误解决 阿里云 docker 镜像仓库 Ubuntu中没有wired connected的解决方案 MinIO 简介 subconverter 代理订阅格式转换 修复 node –openssl-legacy-provider is not allowed in NODE_OPTIONS 错误 Ubuntu 使用 Clash For Linux 客户端
Reeds-Shepp 曲线
Yiwei Zhang · 2025-06-29 · via 又见苍岚

Reeds-Shepp 曲线已成为自动驾驶与机器人运动规划领域的‌基础算法之一‌,本文介绍相关信息。

简介

Reeds-Shepp 曲线由 ‌J.A. Reeds‌ 和 ‌L.A. Shepp‌ 于1990年提出,通过扩展 ‌Dubins曲线‌ 的运动约束(Dubins仅支持单向行驶),显著提升了路径优化能力.

Reeds-Shepp曲线(简称RS曲线)是一种用于‌路径规划‌的数学模型,专门描述平面内具备‌前进/后退能力‌的车辆(如汽车、机器人)从起点到终点的最短可行路径。其特点在于允许车辆通过‌最小转弯半径‌进行转向,并支持方向切换(前进变后退或反之).

对比Dubins曲线

  • Dubins曲线‌仅支持单向行驶(如仅前进),‌RS曲线引入后退操作‌,路径更短且灵活性更强;
  • 典型场景:车辆需倒车调整位姿(如侧方停车)时,RS曲线能提供更优解.

Simple Car Model

Simple Car Model是指一种用于描述车辆运动的简化模型。具体来说,Simple Car Model将车辆视为一个二维平面上的刚体,其原点位于车辆后轮的中心,x轴沿着车辆主轴方向,与车辆运动方向一致。车辆的状态由位置坐标(x, y)和姿态角(θ)表示。在Simple Car Model中,车辆的速度为s,方向盘的转角为α,前轮和后轮中心的距离为L。如果方向盘转角固定,车辆会在原地转圈,转圈的半径为L/sin(α)。在非常短的时间内,车辆可以近似视为沿着后轮指向的方向前进,当方向盘转角趋于0时,车辆的运动方向与x轴一致。Simple Car Model通过引入Action变量,假设车辆的运动速度和方向盘转角由这些变量控制,从而得到车辆的运动模型。这个模型适用于自动驾驶运动规划中的运动方程,可以描述车辆的向前或向后运动。

运动方程如下:

$$ \begin{aligned}&\dot{x}=u_{1}cos\theta\\&\dot{y}=u_{1}sin\theta\\&\dot{\theta}=u_{1}u_{2}\end{aligned} $$

其中,$u_1\in{-1,1},:u_2\in[-tan\phi_{max},tan\phi_{max}]$ 。当 $u_1=1$ 时,表示车辆向前运动; $u_1=-1$ 时,表示车辆向后运动。

Reeds-Shepp Car

J Reeds和L Shepp证明Reeds Shepp Car从起点 $𝑞_𝐼$到终点 $𝑞_𝐺$ 的最短路径一定是下面的 word 的其中之一。word中的"|"表示车辆运动朝向由正向转为反向或者由反向转为正向。

$$ \{C|C|C,\:CC|C,\:C|CC,\:CSC,\:CC_{\beta}|C_{\beta}C,\:C|C_{\beta}C_{\beta}|C,\C|C_{\pi/2}SC,\:CSC_{\pi/2}|C,\:C|C_{\pi/2}SC_{\pi/2}|C\}. $$

每个曲线都由$𝐿+,𝐿−,𝑅+,𝑅−,𝑆+,𝑆−$这六种基本运动组合组成,每种运动对应固定转向半径(通常取最小半径),其中$𝐿+$表示车辆左转前进;$𝐿−$表示车辆左转后退;$𝑅+$表示车辆右转前进;$𝑅−$表示车辆右转后退;$𝑆+$表示车辆直行前进;$𝑆−$表示车辆直行后退。

Reeds and Shepp曲线的word所有组合不超过48种,所有的组合一一枚举如下:

计算优化

位置姿态统一化

车辆的起点和终点的位置姿态是难以穷举的,所以一般在计算之前,会将车辆的姿态归一化.

假设车辆的初始姿态为 $𝑞_𝐼=(𝑥_1,𝑦_1,𝜃_1)$,目标姿态 $𝑞_𝐺=(𝑥_2,𝑦_2,𝜃_2)$,车辆的转向半径为 $r = 𝜌$,如何实现姿态的归一化呢,实际上归一化的过程就是向量的平移和旋转过程。

首先将向量 $\overrightarrow{q_{I}q_{G}}$ 平移到坐标原点 $(0,0)$。平移 $𝑞_𝐼$到 $O(0, 0)$,平移向量为 $(−𝑥_1,−𝑦_1)$;对 $𝑞_𝐺$ 应用同样的平移向量: $𝑞_𝐺=[𝑥_2−𝑥_1,𝑦_2−𝑦_1]$,最后得到平移后的向量:

$$ \vec{q_I}\vec{q_G}=\left[\begin{array}{c}x_2-x_1\\y_2-y_1\end{array}\right]=\left[\begin{array}{c}d_x\\d_y\end{array}\right] $$ 应用旋转矩阵,将车辆的起点朝向转到x轴正向: $$ \begin{bmatrix}cos\theta_1&sin\theta_1\\-sin\theta_1&cos\theta_1\end{bmatrix}\begin{bmatrix}d_x\\d_y\end{bmatrix}=\begin{bmatrix}d_xcos\theta_1+d_ysin\theta_1\\-d_xsin\theta_1+d_ycos\theta_1\end{bmatrix} $$

旋转之后,目标位置朝向更新为 $𝜙=𝜃_2−𝜃_1$。

将车辆转向半径缩放到1,于是最终得到车辆运动的起始姿态: $q_𝐼=[0,0,0]$

目标姿态:

$$ G=\begin{bmatrix}x\\y\\ \phi\end{bmatrix}=\begin{bmatrix}(d_xcos\theta_1+d_ysin\theta_1)/\rho\\(-d_xsin \theta_1+d_ycos\theta_1]/\rho\\ \theta_2-\theta_1\end{bmatrix} $$

归一化后得到:

  • 起始姿态: $q_{I}=(0,0,0)$

  • 目标姿态:$𝑞_𝐺=(𝑥,𝑦,𝜙) $;其中,$𝜙=𝜃_2−𝜃_1$

  • 车辆的转弯半径:$ r = 1$;

利用对称关系降低求解复杂度

Reeds Shepp曲线有48种组合,编程时一一编码计算比较麻烦,因此可以利用其对称性降低求解工作量。

以转向不同的CSC类型为例,它包含4种曲线类型:𝐿+𝑆+𝑅+、𝐿−𝑆−𝑅−、𝑅+𝑆+𝐿+、𝑅−𝑆−𝑅−,我们只需要编码推导得到𝐿+𝑆+𝑅+的计算过程,其它几种直接可以通过对称性关系得到车辆运动路径。

给定车辆起始姿态 $𝑞_𝐼$,目标姿态 $𝑞_𝐺$,可以得到𝐿+𝑆+𝑅+的运动路径如下:

利用对称性求解其它几种路径.

timefilp对称性

假设我们推导出从起始姿态 $𝑞_𝐼(𝑥_1,𝑦_1,𝜃_1)$ 达到目标姿态 $(𝑥_2,𝑦_2,𝜃_2)$ 的路径计算方法:

1
path = calc_path(𝑥1, 𝑦1, 𝜃1, 𝑥2, 𝑦2, 𝜃2)

利用对称性,将目标Pose修改为 $(−𝑥_2,𝑦_2,−𝜃_2)$,代入同样的Path计算函数:

1
path = calc_path(𝑥1, 𝑦1, 𝜃1, -𝑥2, 𝑦2, -𝜃2)

就得到从 $(𝑥_1,𝑦_1,𝜃_1)$ 到 $(𝑥_2,𝑦_2,𝜃_2)$ 的 𝐿−𝑆−𝑅−类型的运动路径。

reflect对称性

将目标姿态修改为 $(𝑥_2,−𝑦_2,−𝜃_2)$,代入同样的Path计算函数:

1
path = calc_path(𝑥1, 𝑦1, 𝜃1, 𝑥2, -𝑦2, -𝜃2)

就得到从 $(𝑥_1,𝑦_1,𝜃_1)$ 到 $(𝑥_2,𝑦_2,𝜃_2)$ 的𝑅+𝑆+𝐿+类型的运动路径。

timeflip + reflect

结合timeflip对称性和reflect对称性,将目标姿态修改为 $(−𝑥_2,−𝑦_2,𝜃_2)$,代入同样的Path计算函数:

1
path = calc_path(𝑥1, 𝑦1, 𝜃1, -𝑥2, -𝑦2, 𝜃2)

就得到从 $(𝑥_1,𝑦_1,𝜃_1)$ 到 $(𝑥_2,𝑦_2,𝜃_2)$ 的𝑅−𝑆−𝐿−类型的运动路径。

通过对称性,48种不同的Reeds Shepp曲线通过不超过12个函数就可以得到全部运动路径。

Reeds-Shepp全部曲线

Dubins曲线是从6个曲线中选出最短的那条,而Reeds-Shepp曲线是从46个曲线中选出最短的那个,这46个曲线如下图所示。(最开始的论文认为最短的曲线一定在48条曲线中,后人研究发现有两条曲线不会是最短的,所以搜索范围减小到46条)

Python 源码

https://github.com/zhm-real/CurvesGenerator

Q&A

Reeds-Shepp曲线和Dubins曲线对任意的起止位姿都存在吗?

答案是肯定的,任意的起始状态和终止状态之间都存在这样的曲线,如下图所示。箭头表示汽车的朝向,红色曲线是Reeds-Shepp曲线,而黑色曲线是Dubins曲线。

注意二者有时是重合的。

当环境中存在障碍物时,Reeds-Shepp曲线和Dubins曲线对任意的起止位姿都存在吗?

Reeds-Shepp曲线和Dubins曲线特指没有障碍物时的最短路径。如果存在障碍物,那么这样的曲线不再是传统意义上的RS和Dubins曲线了,不过为了保持一致我们还是这么称呼它们吧。

生活从来没那么简单,你在停车时可能周围会有各种障碍物,比如其它车辆、垃圾桶、树木。这时是否仍然存在RS曲线和Dubins曲线似乎没那么容易回答了。不过庆幸的是这个问题已经被人解决了,答案是:只要存在连接起止位姿的无碰撞路径,那么就存在无碰撞的Reeds-Shepp曲线。然而这个结果对Dubins曲线却不适用。这个答案好像没什么出人意料,不过稍微品味一下却让人很吃惊。注意这里的前提:“连接起止位姿的无碰撞路径”,除了无碰撞的要求以外,我没说其它任何的要求,比如存在一条类似“Z”这样完全由直线组成的折线路径也可以。很奇妙吧?不管你的路径由什么线(直线/任意曲线)组成,不管它有多怪异多扭曲,只要你能找到一条这样的路径,那么就一定存在满足要求的Reeds-Shepp曲线,即连接起止位姿,并且汽车不会碰到障碍物。在电影《车手》中就出现了神奇的一幕——汽车原地直角拐弯。其实理论上,不需要原地拐弯,汽车也能通过狭窄的直角胡同。

理论上存在没有给我们提供实际寻找的方法,这时我们可以采用随机搜索的方法,如下图。(黑色表示障碍物)

Dubins曲线和Reeds-Shepp曲线有什么用?

我们以汽车为例介绍了最短路径。实际上,汽车只是一类更广泛系统的特例,这类系统叫做“非完整约束系统”。非完整约束系统就是受到非完整约束的系统(废话)。可以用直观的例子解释,人站在平地上就不受非完整约束,因为人可以往任意方向移动,前后左右随便你怎么动都可以。可是如果你骑在自行车上就受非完整约束了,因为你的运动方向受到前后轮的限制,只能沿着前轮指向的方向运动,尽管你可以通过调整车把改变前轮的朝向,但是你无法向车轮的侧方移动。当然,如果别人从侧面踹了你一脚或者路太滑,自行车可能会向侧方移动,这时你就违反非完整约束了,但是我们暂时不考虑这些特例。这些特例,比如路滑,确实有可能发生。可是为了让问题简单一点,我们不得不理想化处理,认为自行车车轮不会发生侧滑,哪怕一毫米也不会有。因此,具有车轮的东西都属于非完整约束系统,比如独轮车。注意这里的车轮是指普通的车轮,不包括特殊的车轮(比如麦克纳姆轮)。那些带挂斗有很多轮子的大货车属于非完整约束系统吗?这就要看情况了。一般货车挂斗上的轮子不能转向,在货车拐弯的时候,有些轮子必然会侧滑,至于哪些会侧滑取决于路面的条件。因此严格来说,它不是一个非完整约束系统,虽然看上去的表现像受到非完整约束。即便这样,我们也可以按照非完整约束处理。

非完整约束有什么特别的地方吗?给车辆或移动机器人规划轨迹的工程师都不喜欢它,它也因为难以处理而臭名昭著。对于简单的系统,例如前面的汽车模型(相对于真实的汽车已经简化了),我们还能得到满足非完整约束的最短路径,可是对于复杂的模型就很难了,比如变量更多、约束形式更复杂的模型,或者环境中存在障碍物的情况。所以人们一般用Dubins曲线和Reeds-Shepp曲线作为复杂模型的近似最短路径,在实际执行时并不一定严格地遵循这些曲线。

Dubins曲线和Reeds-Shepp曲线的值函数是什么样的?

如果我们把终点(位姿)固定在原点:$(0,0,0)$,那么曲线的长度可以看成是起点的函数。我们可以对任意起点$(x,y,\theta)$ 计算函数的值,这样的函数是以位姿为自变量的函数,它的函数值则是曲线的长度,我们就叫它值函数吧。想象最简单的情况(运动不受约束,不考虑角度变化引起的),值函数就是点到点的距离,即$\sqrt{x2+y2} $ ,这样的值函数图像就是个圆锥。

对于Dubins曲线和Reeds-Shepp曲线,它们的值函数图像如下图所示。如果你听说过强化学习,这里的值函数就是强化学习中出现的值函数,即最优的累积回报。值函数的一个用处是作为启发函数,路径搜索算法需要这样的启发函数加快搜索速度,比如混合A*RRT* 等。

动画是如何制作的?

动画都是用Mathematica制作的,所使用的源代码在github上可以找到:https://github.com/robinvista/Mathematica。读者可以对程序任意修改,例如对起点进行扰动,观察最短曲线产生的不连续变化。

是否最优曲线只能用 Dubins曲线和Reeds-Shepp曲线?

其实,Reeds-Shepp和Dubins曲线只不过是最优曲线的两个特殊情况。我们还可以考虑各种各样的机器人约束或者目标函数,这时的曲线就更有意思了,当然也更难求解了。Reeds-Shepp和Dubins曲线之所以有名,是因为它们刚好存在解析形式,而且形式还不是太复杂,类似的曲线还有Balkcom-Mason曲线。其它更复杂的最优曲线要想求解析解是非常困难的。

参考资料

文章链接:
https://www.zywvvd.com/notes/study/algorithm/graph/reeds-shepp/reeds-shepp/