RC-ESDF 详解:以机器人为中心的欧几里得有符号距离场
RC-ESDF 详解:以机器人为中心的欧几里得有符号距离场
来源:浙大高飞团队论文
核心思想:将复杂的"机器人形状"问题从在线计算中剥离,通过离线预计算实现极致的碰撞检测速度(2.4μs 级查询)
目录
- 1. 什么是 ESDF?
- 2. 什么是 RC-ESDF?
- 3. RC-ESDF 的核心原理
- 4. RC-ESDF 与传统 ESDF 的区别
- 5. RC-ESDF 如何与局部规划器结合?
- 6. 三级碰撞检测与指数衰减软惩罚框架
- 7. 常见疑问解答
1. 什么是 ESDF?
ESDF(Euclidean Signed Distance Field,欧几里得有符号距离场) 是一种环境地图表示方法:
- 将空间离散化为网格
- 每个点存储到最近障碍物的欧几里得距离
- 正距离 = 在障碍物外部(安全)
- 负距离 = 在障碍物内部(碰撞)
- 同时存储梯度方向(最快的逃离方向)
ESDF 使得规划器不仅能判断"能不能走",还能精确掌握"离障碍物多远"以及"该往哪躲"。
传统 ESDF 的构建流程
传感器数据 → 占据栅格地图 → 距离变换算法 → ESDF 距离场
常用算法包括 BFS 广度优先搜索、FIESTA 增量更新、Voxblox(TSDF 转 ESDF) 等。
2. 什么是 RC-ESDF?
RC-ESDF(Robo-centric ESDF,以机器人为中心的 ESDF) 是高飞团队提出的创新方法。其核心思路是:
将"机器人在环境中的碰撞检测"这个动态问题,转化为"在机器人坐标系下,机器人形状与静态障碍物场的距离查询"这个静态问题。
一句话理解
RC-ESDF 在机器人本体坐标系下,预先构建一张描述机器人自身几何形状的"自我距离场"地图。这张地图记录了机器人身上每个点到其自身"皮肤"(外轮廓)的有符号距离和梯度。
它不包含任何环境信息,是一张纯静态的、与外界无关的自我描述地图。
3. RC-ESDF 的核心原理
3.1 构建过程(离线预计算)
机器人 CAD 模型 → 体素化(本体坐标系) → 距离变换 → RC-ESDF 地图
- 体素化与边界标记:根据机器人几何模型,在本体坐标系中创建密集网格,"皮肤"表面经过的格子标记为边界(距离=0)
- 内外区分:内部点标记为负,外部点标记为正
- 距离变换传播:计算每个点到最近边界的最短欧氏距离,内部为负值
- 预计算解析梯度:提前算好每个位置的梯度方向,供规划器直接调用
3.2 查询过程(在线查表)
运行时,RC-ESDF 完全不更新,只做 O(1) 复杂度的内存访问:
- 将机器人候选位姿变换到本体坐标系
- 在 RC-ESDF 查表,获取"该点到自己皮肤的距离"
- 同时查全局 ESDF(环境地图),获取"该点到最近障碍物的距离"
- 比较两者:如果障碍物距离 < 自身皮肤距离 → 碰撞
3.3 关键数值含义
| 值 | 含义 |
|---|---|
| 正 (+) | 该点在机器人外部(安全),数值 = 到最近表面的距离 |
| 零 (0) | 该点恰好位于机器人轮廓表面 |
| 负 (-) | 该点在机器人内部,绝对值 = 穿透深度 |
3.4 在线查询的插值方法
RC-ESDF 在离线阶段构建了一个规则网格,每个网格点存储了机器人坐标系下的距离值和梯度方向。在线查询时,机器人当前位置并不恰好落在网格节点上,因此需要通过插值快速估算中间值。
📐 双线性插值原理
双线性插值是一种在二维网格上估算任意点函数值的常用方法。基本思想是:先在一个方向(x 轴)上做两次线性插值,再在另一个方向(y 轴)上做一次线性插值,从而得到平滑的曲面拟合结果。
假设已知网格四个角点 Q 11 = ( x 1 , y 1 ) Q_{11}=(x_1, y_1) Q11=(x1,y1)、 Q 12 = ( x 1 , y 2 ) Q_{12}=(x_1, y_2) Q12=(x1,y2)、 Q 21 = ( x 2 , y 1 ) Q_{21}=(x_2, y_1) Q21=(x2,y1)、 Q 22 = ( x 2 , y 2 ) Q_{22}=(x_2, y_2) Q22=(x2,y2) 上的函数值。对于任意点 P = ( x , y ) P=(x,y) P=(x,y),其中 x 1 ≤ x ≤ x 2 , y 1 ≤ y ≤ y 2 x_1 \le x \le x_2, y_1 \le y \le y_2 x1≤x≤x2,y1≤y≤y2:
-
x 方向线性插值:在 y = y 1 y = y_1 y=y1 线上,由 Q 11 Q_{11} Q11 和 Q 21 Q_{21} Q21 插值得到 R 1 R_1 R1:
f ( R 1 ) ≈ x 2 − x x 2 − x 1 f ( Q 11 ) + x − x 1 x 2 − x 1 f ( Q 21 ) f(R_1) \approx \frac{x_2 - x}{x_2 - x_1} f(Q_{11}) + \frac{x - x_1}{x_2 - x_1} f(Q_{21}) f(R1)≈x2−x1x2−xf(Q11)+x2−x1x−x1f(Q21)
在 y = y 2 y = y_2 y=y2 线上,由 Q 12 Q_{12} Q12 和 Q 22 Q_{22} Q22 插值得到 R 2 R_2 R2:
f ( R 2 ) ≈ x 2 − x x 2 − x 1 f ( Q 12 ) + x − x 1 x 2 − x 1 f ( Q 22 ) f(R_2) \approx \frac{x_2 - x}{x_2 - x_1} f(Q_{12}) + \frac{x - x_1}{x_2 - x_1} f(Q_{22}) f(R2)≈x2−x1x2−xf(Q12)+x2−x1x−x1f(Q22) -
y 方向线性插值:在 R 1 R_1 R1 和 R 2 R_2 R2 之间沿 y 方向插值得到 P P P:
f ( P ) ≈ y 2 − y y 2 − y 1 f ( R 1 ) + y − y 1 y 2 − y 1 f ( R 2 ) f(P) \approx \frac{y_2 - y}{y_2 - y_1} f(R_1) + \frac{y - y_1}{y_2 - y_1} f(R_2) f(P)≈y2−y1y2−yf(R1)+y2−y1y−y1f(R2)
合并写成对称形式:
f ( P ) = ∑ i = 1 2 ∑ j = 1 2 w i j f ( Q i j ) f(P) = \sum_{i=1}^2 \sum_{j=1}^2 w_{ij} \, f(Q_{ij}) f(P)=i=1∑2j=1∑2wijf(Qij)
其中权重 w i j w_{ij} wij 与 P P P 到对角点的距离成比例。
🧠 直观理解
| 特性 | 说明 |
|---|---|
| 线性 | 在每个方向上,函数值随坐标线性变化 |
| 双 | 在两个独立的方向上各做一次线性插值 |
| 效果 | 得到的是双线性曲面(网格内光滑,但二阶导数不连续) |
🔧 在 RC-ESDF 中的应用
使用双线性插值的好处:
- 计算极快:只需几次乘加运算,时间复杂度 O(1)
- 连续可微:保证轨迹优化时梯度信息平滑,避免碰撞函数出现台阶突变
- 精度足够:对于中等分辨率的网格,插值误差远小于机器人控制精度需求
📝 与最近邻插值的对比
| 插值方法 | 速度 | 光滑性 | 精度 | 是否可导 |
|---|---|---|---|---|
| 最近邻 | 最快 | 阶梯状 | 较低 | 不可导 |
| 双线性 | 很快 | 连续 | 较高 | 一阶可导 |
在机器人运动规划这类需要梯度下降的场合,双线性插值是网格距离场查询的首选。
4. RC-ESDF 与传统 ESDF 的区别
| 对比维度 | 传统 ESDF(环境为中心) | RC-ESDF(机器人为中心) |
|---|---|---|
| 坐标系 | 世界坐标系 | 机器人本体坐标系 |
| 构建基础 | 依赖环境障碍物信息 | 依赖机器人自身形状模型 |
| 更新方式 | 在线实时更新,开销大 | 离线预计算,在线无需更新 |
| 存储内容 | 空间点到最近环境障碍物的距离 | 机器人本体上点到最近自身表面的距离 |
| 运行时任务 | 在线实时计算距离场 | 仅坐标变换 + 查表 |
| 查询速度 | 取决于地图大小和算法 | 2.4μs 级,与地图大小无关 |
| 形状支持 | 凸形状可实时处理,非凸形状计算复杂 | 天然支持任意复杂形状(包括非凸) |
| 梯度类型 | 数值梯度 | 解析梯度(精确指导逃离方向) |
核心区别:一表 vs. 一计算器
| 传统 ESDF | RC-ESDF | |
|---|---|---|
| 本质 | 动态计算器 | 静态速查表 |
| 任务 | 一体化:同时处理"自我形状"+“环境障碍物” | 分而治之:离线处理"自我",在线专注"环境" |
5. RC-ESDF 如何与局部规划器结合?
5.1 完整碰撞检测需要两张地图
| 角色 | 全称 | 职责 | 构建方式 |
|---|---|---|---|
| 自我模型 | RC-ESDF | 描述机器人自身的几何轮廓 | 离线一次性预计算 |
| 世界模型 | 局部 ESDF | 描述机器人周围的环境障碍物 | 在线实时增量更新 |
5.2 与 MPPI 等采样规划器的结合
RC-ESDF 集成到 MPPI 中,本质上是扩展原有的 ObstaclesCritic 模块:
// 原有方式(基于 Costmap)
for (轨迹上每个采样点) {
cost = costmap->getCost(x, y); // 粗糙的膨胀代价
}
// RC-ESDF 方式(精确距离)
for (轨迹上每个采样点) {
// 1. 坐标变换:全局坐标 → 机器人本体坐标系
(bx, by) = transform_to_body_frame(x, y, pose);
// 2. 查 RC-ESDF:获取该点到自身皮肤的距离
d_self = rcesdf->lookup(bx, by);
// 3. 查局部 ESDF:获取该点到障碍物的距离
d_world = local_esdf->lookup(x, y);
// 4. 代价计算
if (d_world < d_self) {
cost = w * (d_self - d_world); // 碰撞惩罚
}
}
5.3 与不同规划器的适配
| 规划器 | RC-ESDF 的作用 |
|---|---|
| Fast-Planner | 无缝替换碰撞评估模块 |
| Ego-Planner | 快速判断车体轮廓是否碰撞,替代原有的"碰撞轨迹 vs 无碰撞引导路径"比较 |
| TEB | 解决障碍物增多时优化耗时剧增的问题,加速收敛 |
| MPPI | 扩展 ObstaclesCritic,用精确距离替代膨胀代价 |
6. 三级碰撞检测与指数衰减软惩罚框架
m = φ_self(x_body) - d_obs(x_world)
其中:
- ϕ s e l f ≥ 0 \phi_{self} \ge 0 ϕself≥0:RC-ESDF 查询得到的机器人外部点到自身皮肤的距离
- d o b s ≥ 0 d_{obs} \ge 0 dobs≥0:全局/局部 ESDF 查询得到的点到最近障碍物的距离
物理意义:
| 条件 | 含义 |
|---|---|
| m > 0 m > 0 m>0 | 皮肤离障碍物还有 m m m 的余量 → 安全 |
| m = 0 m = 0 m=0 | 皮肤刚好碰到障碍物 |
| m < 0 m < 0 m<0 | 皮肤已被穿透,穿透深度为 $ |
6.2 三级安全区间(基于 m m m)
设定两个正阈值 M 1 > M 2 > 0 M_1 > M_2 > 0 M1>M2>0:
| 区间 | 条件 | 含义 |
|---|---|---|
| 安全区 | m ≥ M 1 m \ge M_1 m≥M1 | 足够安全,代价为 0 |
| 警告区 | M 2 ≤ m < M 1 M_2 \le m < M_1 M2≤m<M1 | 接近障碍物,施加轻度软惩罚 |
| 危险区 | 0 ≤ m < M 2 0 \le m < M_2 0≤m<M2 | 非常接近或即将碰撞,施加强指数惩罚 |
| 碰撞区 | m < 0 m < 0 m<0 | 已穿透,施加极大常数惩罚或截断 |
6.3 指数衰减软惩罚函数
J c o l l i s i o n = w ⋅ { 0 , m ≥ M 1 e − λ ( m − M 1 ) − e − λ ( M 2 − M 1 ) , M 2 ≤ m < M 1 e − λ ( m − M 1 ) − e − λ ( M 2 − M 1 ) + α ⋅ ( M 2 − m ) , 0 ≤ m < M 2 C m a x , m < 0 J_{collision} = w \cdot \begin{cases} 0, & m \ge M_1 \\ e^{-\lambda (m - M_1)} - e^{-\lambda (M_2 - M_1)}, & M_2 \le m < M_1 \\ e^{-\lambda (m - M_1)} - e^{-\lambda (M_2 - M_1)} + \alpha \cdot (M_2 - m), & 0 \le m < M_2 \\ C_{max}, & m < 0 \end{cases} Jcollision=w⋅⎩ ⎨ ⎧0,e−λ(m−M1)−e−λ(M2−M1),e−λ(m−M1)−e−λ(M2−M1)+α⋅(M2−m),Cmax,m≥M1M2≤m<M10≤m<M2m<0
参数说明:
- λ > 0 \lambda > 0 λ>0:衰减速率,越大则靠近时惩罚上升越快
- α > 0 \alpha > 0 α>0:危险区内的线性附加项,确保进入危险区后惩罚快速抬升
- C m a x C_{max} Cmax:极大常数,表示绝对不可接受的碰撞状态
6.4 为什么比单纯用 d o b s d_{obs} dobs 更好?
- 利用 RC-ESDF 的精确形状信息:不同部位(如尖角、凸起)的 ϕ s e l f \phi_{self} ϕself 不同,因此同样的环境距离 d o b s d_{obs} dobs 在不同部位产生的安全裕度 m m m 不同,惩罚自然不同 → 真正实现了全身碰撞评估
- 指数衰减的连续性:从安全区到警告区再到危险区,代价函数连续可导(碰撞区可平滑化),有利于 MPPI 的梯度/加权采样优化
- 动态适应性:结合预测的障碍物位置,可以提前减小 M 1 , M 2 M_1, M_2 M1,M2 或增大 λ \lambda λ,实现预测性避障
6.5 简历/技术文档描述参考
将 RC-ESDF 预计算的自我距离场与局部 ESDF 环境距离场融合,定义安全裕度 m = ϕ s e l f − d o b s m = \phi_{self} - d_{obs} m=ϕself−dobs,在此基础上构建三级碰撞检测区间(安全/警告/危险)与指数衰减软惩罚代价函数,并串联动态障碍物预测链路,有效提升了动态干扰场景下全身绕障的连续性与规划鲁棒性。
该设计使得 MPPI 在复杂形状机器人的实时避障中,单次碰撞查询仅需微秒级,且惩罚函数平滑可微,保证了轨迹优化的稳定性。
7. 常见疑问解答
Q1:RC-ESDF 需要提前构建整个环境地图吗?
不需要。RC-ESDF 本身只包含"自我",与环境完全无关。
真正需要环境信息的是局部 ESDF(或全局 ESDF),它负责实时感知"周围有什么"。
Q2:RC-ESDF 建好之后还需要更新吗?
不需要。RC-ESDF 是纯离线预计算的静态表,只要机器人形状不变,就永远不需要更新。
Q3:为什么有了全局 ESDF 还需要 RC-ESDF?
全局 ESDF 能告诉你"离障碍物多远",但**不知道机器人自己的皮肤在哪里"。RC-ESDF 通过离线预计算,把"机器人形状"这个问题从在线计算中彻底剥离,换来了 2.4μs 级的极致查询速度。
Q4:突然出现动态障碍物怎么办?
**环境感知系统(局部 ESDF)**会实时增量更新(如 FIESTA 算法)。RC-ESDF 本身不需要任何改动,规划器拿到新的环境信息后,重新评估候选轨迹即可。
Q5:RC-ESDF 对复杂形状的优势在哪里?
对于非圆形机器人(如多旋翼无人机、机械臂),传统方法只能用圆形/矩形近似。RC-ESDF 天然支持任意复杂形状(包括非凸形状),因为它提前用 CAD 模型构建好了完整的自我距离场。
Q6:RC-ESDF 的"排斥力"是怎么工作的?
RC-ESDF 本身不产生排斥力,它提供的是指向机器人外部的解析梯度(最快逃离方向)。这个梯度与全局 ESDF 的梯度联合,指导优化器调整机器人位姿,从而产生"推开"效果。
总结
| 传统 ESDF | RC-ESDF | |
|---|---|---|
| 核心思想 | 一体化构建,环境中心 | 分而治之,机器人为中心 |
| 自我形状 | 在线近似(如圆形) | 离线精确预计算 |
| 在线计算 | 重(实时更新) | 轻(仅查表) |
| 查询速度 | 取决于地图大小 | 2.4μs 固定 |
| 形状支持 | 简单形状 | 任意复杂形状 |
| 架构 | 一张图搞定一切 | 两张图协同:自我离线表 + 环境在线图 |
RC-ESDF 的设计哲学:用离线预计算换取在线极致速度,用分而治之换取任意形状支持。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)