TEB(Timed Elastic Band)路径规划算法是一种基于优化的局部路径规划算法,广泛应用于移动机器人、自动驾驶等领域。它通过在机器人的运动轨迹上引入时间信息,结合动力学约束和环境约束,生成平滑且可行的路径。以下是对 TEB 算法的原理、实现方式、路线生成、约束条件设置以及参数调节的详细说明。
1. TEB 算法原理
1.1 核心思想
TEB 算法的核心思想是将机器人的运动轨迹表示为一个弹性带(Elastic Band),并在弹性带上引入时间信息(Timed),通过优化算法调整弹性带的形状和时间分配,使其满足动力学约束和环境约束。
1.2 主要特点
- 时间信息:引入时间变量,考虑机器人的速度、加速度等动力学约束。
- 弹性带:将路径表示为一组离散的位姿点,通过优化调整位姿点的位置和时间间隔。
- 多目标优化:同时优化路径的平滑性、动力学可行性和避障能力。
2. TEB 算法实现方式
2.1 路径表示
TEB 将路径表示为一组离散的位姿点 ( q i = ( x i , y i , θ i ) ) ( \mathbf{q}_i = (x_i, y_i, \theta_i) ) (qi=(xi,yi,θi)),每个位姿点对应一个时间戳 ( t i ) ( t_i ) (ti)。
2.2 优化问题
TEB 的优化问题可以表示为:
min
q
,
t
(
w
path
⋅
f
path
+
w
vel
⋅
f
vel
+
w
acc
⋅
f
acc
+
w
obs
⋅
f
obs
)
\min_{\mathbf{q}, \mathbf{t}} \left( w_{\text{path}} \cdot f_{\text{path}} + w_{\text{vel}} \cdot f_{\text{vel}} + w_{\text{acc}} \cdot f_{\text{acc}} + w_{\text{obs}} \cdot f_{\text{obs}} \right)
q,tmin(wpath⋅fpath+wvel⋅fvel+wacc⋅facc+wobs⋅fobs)
其中:
- ( f path ) ( f_{\text{path}} ) (fpath):路径平滑性代价。
- ( f vel ) ( f_{\text{vel}} ) (fvel):速度约束代价。
- ( f acc ) ( f_{\text{acc}} ) (facc):加速度约束代价。
- ( f obs ) ( f_{\text{obs}} ) (fobs):避障代价。
- ( w path , w vel , w acc , w obs ) ( w_{\text{path}}, w_{\text{vel}}, w_{\text{acc}}, w_{\text{obs}} ) (wpath,wvel,wacc,wobs):权重系数。
2.3 优化求解
使用非线性优化算法(如 Gauss-Newton 或 Levenberg-Marquardt)求解上述优化问题。
3. 路线生成
3.1 初始化
- 从全局路径规划器(如 A* 或 RRT)获取初始路径。
- 将初始路径离散为一组位姿点,并分配初始时间戳。
3.2 优化调整
- 通过优化算法调整位姿点的位置和时间间隔,使其满足动力学约束和环境约束。
- 优化过程中,位姿点会根据约束条件动态移动,形成平滑的轨迹。
3.3 轨迹输出
- 输出优化后的位姿点序列,作为机器人的局部路径。
4. 约束条件设置
4.1 动力学约束
- 速度约束:限制机器人的最大线速度和角速度。
- 加速度约束:限制机器人的最大线加速度和角加速度。
- 曲率约束:限制路径的最大曲率,确保机器人能够跟踪路径。
4.2 环境约束
- 避障约束:确保路径不与障碍物碰撞。
- 边界约束:确保路径在可行区域内。
4.3 时间约束
- 时间分配:优化时间间隔,使路径满足速度约束。
5. 参数调节
TEB 算法的性能很大程度上依赖于参数设置。以下是一些关键参数及其调节方法:
5.1 权重参数
- 路径平滑性权重 ( w path ) ( w_{\text{path}} ) (wpath):控制路径的平滑性,增大该值会使路径更平滑。
- 速度约束权重 ( w vel ) ( w_{\text{vel}} ) (wvel):控制速度约束的严格性,增大该值会使路径更符合速度约束。
- 加速度约束权重 ( w acc ) ( w_{\text{acc}} ) (wacc):控制加速度约束的严格性,增大该值会使路径更符合加速度约束。
- 避障权重 ( w obs ) ( w_{\text{obs}} ) (wobs):控制避障的严格性,增大该值会使路径更远离障碍物。
5.2 优化参数
- 最大迭代次数:控制优化的迭代次数,增大该值会提高优化精度,但增加计算时间。
- 收敛阈值:控制优化的收敛条件,减小该值会提高优化精度,但增加计算时间。
5.3 动力学参数
- 最大速度 ( v max ) ( v_{\text{max}} ) (vmax):设置机器人的最大线速度和角速度。
- 最大加速度 ( a max ) ( a_{\text{max}} ) (amax):设置机器人的最大线加速度和角加速度。
- 最大曲率 ( κ max ) ( \kappa_{\text{max}} ) (κmax):设置路径的最大曲率。
6. C++ 示例代码
以下是一个简单的 TEB 算法实现示例(基于 ROS 的 teb_local_planner
包):
#include <teb_local_planner/teb_local_planner_ros.h>
int main(int argc, char** argv) {
// 初始化 ROS 节点
ros::init(argc, argv, "teb_planner_node");
ros::NodeHandle nh;
// 创建 TEB 局部规划器
teb_local_planner::TebLocalPlannerROS teb_planner;
teb_planner.initialize("teb_planner", &nh);
// 设置目标位姿
geometry_msgs::PoseStamped goal_pose;
goal_pose.header.frame_id = "map";
goal_pose.pose.position.x = 10.0;
goal_pose.pose.position.y = 5.0;
goal_pose.pose.orientation.w = 1.0;
// 设置初始位姿
geometry_msgs::PoseStamped start_pose;
start_pose.header.frame_id = "map";
start_pose.pose.position.x = 0.0;
start_pose.pose.position.y = 0.0;
start_pose.pose.orientation.w = 1.0;
// 设置全局路径
nav_msgs::Path global_plan;
global_plan.poses.push_back(start_pose);
global_plan.poses.push_back(goal_pose);
// 调用 TEB 规划器生成局部路径
teb_planner.setPlan(global_plan);
teb_planner.computeVelocityCommands(start_pose, goal_pose);
return 0;
}
7. 总结
TEB 算法通过引入时间信息和弹性带的概念,结合动力学约束和环境约束,生成平滑且可行的路径。其核心在于优化问题的构建和求解,通过合理设置约束条件和调节参数,可以实现高效的局部路径规划。
8.问题
TEB规划算法的优化问题,怎么优化,优化原理?
TEB(Timed Elastic Band)规划算法的核心是通过优化一个非线性代价函数来生成满足动力学约束和环境约束的局部路径。以下是对 TEB 算法的优化问题、优化方法以及优化原理的详细解释。
1. TEB 优化问题
1.1 优化变量
TEB 的优化变量包括:
- 位姿点: ( q i = ( x i , y i , θ i ) ) ( \mathbf{q}_i = (x_i, y_i, \theta_i) ) (qi=(xi,yi,θi)),表示机器人在时间 ( t i ) ( t_i ) (ti) 的位姿。
- 时间间隔: ( Δ t i = t i + 1 − t i ) ( \Delta t_i = t_{i+1} - t_i ) (Δti=ti+1−ti),表示相邻位姿点之间的时间间隔。
1.2 代价函数
TEB 的优化问题可以表示为以下多目标优化问题:
min
q
,
t
(
w
path
⋅
f
path
+
w
vel
⋅
f
vel
+
w
acc
⋅
f
acc
+
w
obs
⋅
f
obs
+
w
time
⋅
f
time
)
\min_{\mathbf{q}, \mathbf{t}} \left( w_{\text{path}} \cdot f_{\text{path}} + w_{\text{vel}} \cdot f_{\text{vel}} + w_{\text{acc}} \cdot f_{\text{acc}} + w_{\text{obs}} \cdot f_{\text{obs}} + w_{\text{time}} \cdot f_{\text{time}} \right)
q,tmin(wpath⋅fpath+wvel⋅fvel+wacc⋅facc+wobs⋅fobs+wtime⋅ftime)
其中:
- ( f path ) ( f_{\text{path}} ) (fpath):路径平滑性代价。
- ( f vel ) ( f_{\text{vel}} ) (fvel):速度约束代价。
- ( f acc ) ( f_{\text{acc}} ) (facc):加速度约束代价。
- ( f obs ) ( f_{\text{obs}} ) (fobs):避障代价。
- ( f time ) ( f_{\text{time}} ) (ftime):时间分配代价。
- ( w path , w vel , w acc , w obs , w time ) ( w_{\text{path}}, w_{\text{vel}}, w_{\text{acc}}, w_{\text{obs}}, w_{\text{time}} ) (wpath,wvel,wacc,wobs,wtime):权重系数。
(1)路径平滑性代价 ( f path ) ( f_{\text{path}} ) (fpath)
路径平滑性代价用于确保路径的平滑性,通常表示为相邻位姿点之间的距离和方向变化:
f
path
=
∑
i
(
∥
q
i
+
1
−
q
i
∥
2
+
∥
θ
i
+
1
−
θ
i
∥
2
)
f_{\text{path}} = \sum_{i} \left( \| \mathbf{q}_{i+1} - \mathbf{q}_i \|^2 + \| \theta_{i+1} - \theta_i \|^2 \right)
fpath=i∑(∥qi+1−qi∥2+∥θi+1−θi∥2)
(2)速度约束代价 ( f vel ) ( f_{\text{vel}} ) (fvel)
速度约束代价用于确保路径满足机器人的速度约束:
f
vel
=
∑
i
(
max
(
0
,
∥
v
i
∥
−
v
max
)
2
)
f_{\text{vel}} = \sum_{i} \left( \max(0, \| \mathbf{v}_i \| - v_{\text{max}})^2 \right)
fvel=i∑(max(0,∥vi∥−vmax)2)
其中
(
v
i
)
( \mathbf{v}_i )
(vi) 是机器人在位姿点
(
q
i
)
( \mathbf{q}_i )
(qi) 的速度,
(
v
max
)
( v_{\text{max}} )
(vmax) 是最大速度。
(3)加速度约束代价 ( f acc ) ( f_{\text{acc}} ) (facc)
加速度约束代价用于确保路径满足机器人的加速度约束:
f
acc
=
∑
i
(
max
(
0
,
∥
a
i
∥
−
a
max
)
2
)
f_{\text{acc}} = \sum_{i} \left( \max(0, \| \mathbf{a}_i \| - a_{\text{max}})^2 \right)
facc=i∑(max(0,∥ai∥−amax)2)
其中
(
a
i
)
( \mathbf{a}_i )
(ai) 是机器人在位姿点
(
q
i
)
( \mathbf{q}_i )
(qi) 的加速度,
(
a
max
)
( a_{\text{max}} )
(amax) 是最大加速度。
(4)避障代价 ( f obs ) ( f_{\text{obs}} ) (fobs)
避障代价用于确保路径不与障碍物碰撞:
f
obs
=
∑
i
(
max
(
0
,
d
min
−
d
(
q
i
,
obs
)
)
2
)
f_{\text{obs}} = \sum_{i} \left( \max(0, d_{\text{min}} - d(\mathbf{q}_i, \text{obs}))^2 \right)
fobs=i∑(max(0,dmin−d(qi,obs))2)
其中
(
d
(
q
i
,
obs
)
)
( d(\mathbf{q}_i, \text{obs}) )
(d(qi,obs)) 是位姿点
(
q
i
)
( \mathbf{q}_i )
(qi) 到最近障碍物的距离,
(
d
min
)
( d_{\text{min}} )
(dmin) 是最小安全距离。
(5)时间分配代价 ( f time ) ( f_{\text{time}} ) (ftime)
时间分配代价用于优化时间间隔,使路径满足速度约束:
f
time
=
∑
i
(
Δ
t
i
−
Δ
t
ref
)
2
f_{\text{time}} = \sum_{i} \left( \Delta t_i - \Delta t_{\text{ref}} \right)^2
ftime=i∑(Δti−Δtref)2
其中
(
Δ
t
ref
)
( \Delta t_{\text{ref}} )
(Δtref) 是参考时间间隔。
2. 优化方法
TEB 的优化问题是一个非线性最小二乘问题,通常使用以下方法求解:
2.1 Gauss-Newton 法
Gauss-Newton 法是一种迭代优化算法,通过线性化代价函数并求解线性方程组来更新优化变量。
迭代步骤:
- 计算代价函数的梯度
(
J
)
( \mathbf{J} )
(J) 和海森矩阵
(
H
)
( \mathbf{H} )
(H):
J = ∂ f ∂ x , H = J T J \mathbf{J} = \frac{\partial f}{\partial \mathbf{x}}, \quad \mathbf{H} = \mathbf{J}^T \mathbf{J} J=∂x∂f,H=JTJ - 求解线性方程组:
H Δ x = − J T f \mathbf{H} \Delta \mathbf{x} = -\mathbf{J}^T \mathbf{f} HΔx=−JTf - 更新优化变量:
x ← x + Δ x \mathbf{x} \leftarrow \mathbf{x} + \Delta \mathbf{x} x←x+Δx - 重复上述步骤,直到收敛。
2.2 Levenberg-Marquardt(列文伯格-马夸尔特)法
Levenberg-Marquardt 法是 Gauss-Newton 法的改进版本,通过引入阻尼因子 ( λ ) ( \lambda ) (λ) 来提高稳定性。
迭代步骤:
- 计算代价函数的梯度
(
J
)
( \mathbf{J} )
(J) 和海森矩阵
(
H
)
( \mathbf{H} )
(H):
J = ∂ f ∂ x , H = J T J \mathbf{J} = \frac{\partial f}{\partial \mathbf{x}}, \quad \mathbf{H} = \mathbf{J}^T \mathbf{J} J=∂x∂f,H=JTJ - 求解线性方程组:
( H + λ I ) Δ x = − J T f (\mathbf{H} + \lambda \mathbf{I}) \Delta \mathbf{x} = -\mathbf{J}^T \mathbf{f} (H+λI)Δx=−JTf - 更新优化变量:
x ← x + Δ x \mathbf{x} \leftarrow \mathbf{x} + \Delta \mathbf{x} x←x+Δx - 根据代价函数的变化调整阻尼因子 ( λ ) ( \lambda ) (λ)。
- 重复上述步骤,直到收敛。
3. 优化原理
3.1 弹性带模型
TEB 将路径表示为一个弹性带,弹性带上的位姿点可以根据约束条件动态移动。通过优化算法调整位姿点的位置和时间间隔,使弹性带满足动力学约束和环境约束。
3.2 时间信息
TEB 在弹性带上引入时间信息,通过优化时间间隔使路径满足速度约束。时间信息的引入使得 TEB 能够生成符合机器人动力学特性的路径。
3.3 多目标优化
TEB 同时优化路径的平滑性、动力学可行性和避障能力,通过权重系数平衡不同目标之间的冲突。
4. C++ 示例代码
以下是一个简单的 TEB 优化问题求解示例(基于 Eigen 库):
#include <iostream>
#include <Eigen/Dense>
using namespace Eigen;
// 代价函数
double costFunction(const VectorXd& x, const VectorXd& obs) {
double f_path = (x.segment(0, 2) - x.segment(2, 2)).squaredNorm(); // 路径平滑性
double f_obs = (x.segment(0, 2) - obs).squaredNorm(); // 避障
return f_path + f_obs;
}
// 梯度计算
VectorXd gradient(const VectorXd& x, const VectorXd& obs) {
VectorXd grad = VectorXd::Zero(x.size());
grad.segment(0, 2) = 2 * (x.segment(0, 2) - x.segment(2, 2)); // 路径平滑性梯度
grad.segment(0, 2) += 2 * (x.segment(0, 2) - obs); // 避障梯度
return grad;
}
int main() {
// 初始位姿
VectorXd x(4);
x << 0, 0, 1, 1;
// 障碍物位置
VectorXd obs(2);
obs << 2, 2;
// 优化参数
double lambda = 0.1; // 阻尼因子
int max_iter = 100; // 最大迭代次数
double tol = 1e-6; // 收敛阈值
// Levenberg-Marquardt 优化
for (int i = 0; i < max_iter; ++i) {
VectorXd grad = gradient(x, obs);
MatrixXd H = grad * grad.transpose();
H.diagonal().array() += lambda; // 添加阻尼因子
VectorXd delta_x = H.ldlt().solve(-grad);
x += delta_x;
if (delta_x.norm() < tol) {
break;
}
}
std::cout << "Optimized pose: " << x.transpose() << std::endl;
return 0;
}
5. 总结
TEB 规划算法通过优化一个非线性代价函数生成满足动力学约束和环境约束的局部路径。其核心在于弹性带模型、时间信息和多目标优化。通过合理设置约束条件和调节参数,可以实现高效的局部路径规划。