TEB(Timed Elastic Band)路径规划算法是一种基于优化的局部路径规划算法,广泛应用于移动机器人、自动驾驶等领域。它通过在机器人的运动轨迹上引入时间信息,结合动力学约束和环境约束,生成平滑且可行的路径。以下是对 TEB 算法的原理、实现方式、路线生成、约束条件设置以及参数调节的详细说明。
TEB 算法的核心思想是将机器人的运动轨迹表示为一个弹性带(Elastic Band),并在弹性带上引入时间信息(Timed),通过优化算法调整弹性带的形状和时间分配,使其满足动力学约束和环境约束。
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)。
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)
其中:
使用非线性优化算法(如 Gauss-Newton 或 Levenberg-Marquardt)求解上述优化问题。
TEB 算法的性能很大程度上依赖于参数设置。以下是一些关键参数及其调节方法:
以下是一个简单的 TEB 算法实现示例(基于 ROS 的 teb_local_planner
包):
#include
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;
}
TEB 算法通过引入时间信息和弹性带的概念,结合动力学约束和环境约束,生成平滑且可行的路径。其核心在于优化问题的构建和求解,通过合理设置约束条件和调节参数,可以实现高效的局部路径规划。
TEB规划算法的优化问题,怎么优化,优化原理?
TEB(Timed Elastic Band)规划算法的核心是通过优化一个非线性代价函数来生成满足动力学约束和环境约束的局部路径。以下是对 TEB 算法的优化问题、优化方法以及优化原理的详细解释。
TEB 的优化变量包括:
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 = ∑ 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)
速度约束代价用于确保路径满足机器人的速度约束:
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) 是最大速度。
加速度约束代价用于确保路径满足机器人的加速度约束:
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) 是最大加速度。
避障代价用于确保路径不与障碍物碰撞:
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) 是最小安全距离。
时间分配代价用于优化时间间隔,使路径满足速度约束:
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) 是参考时间间隔。
TEB 的优化问题是一个非线性最小二乘问题,通常使用以下方法求解:
Gauss-Newton 法是一种迭代优化算法,通过线性化代价函数并求解线性方程组来更新优化变量。
Levenberg-Marquardt 法是 Gauss-Newton 法的改进版本,通过引入阻尼因子 ( λ ) ( \lambda ) (λ) 来提高稳定性。
TEB 将路径表示为一个弹性带,弹性带上的位姿点可以根据约束条件动态移动。通过优化算法调整位姿点的位置和时间间隔,使弹性带满足动力学约束和环境约束。
TEB 在弹性带上引入时间信息,通过优化时间间隔使路径满足速度约束。时间信息的引入使得 TEB 能够生成符合机器人动力学特性的路径。
TEB 同时优化路径的平滑性、动力学可行性和避障能力,通过权重系数平衡不同目标之间的冲突。
以下是一个简单的 TEB 优化问题求解示例(基于 Eigen 库):
#include
#include
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;
}
TEB 规划算法通过优化一个非线性代价函数生成满足动力学约束和环境约束的局部路径。其核心在于弹性带模型、时间信息和多目标优化。通过合理设置约束条件和调节参数,可以实现高效的局部路径规划。