所有约束在teb_local_planner\include\teb_local_planner\g2o_types
,都是头文件。 动态障碍约束EdgeDynamicObstacle
,最短路径约束EdgeShortestPath
,优先转向约束EdgePreferRotDir
,路径点约束EdgeViaPoint
没有求雅格比矩阵。
速度约束
最小化的函数是
penaltyInterval
表示惩罚函数,见penaltyBoundToInterval()
函数,它只用于速度约束、加速度约束和edge_velocity_obstacle_ratio
向量的维度是2,第一个元素代表线速度,第二个是角速度。
调用:TebOptimalPlanner::AddEdgesVelocity
和 setTebConfig()
1 | class EdgeVelocity : public BaseTebMultiEdge<2, double> |
人工智能开发中很少用到不是0就是1的阶跃函数,而是用更为平滑过渡的sigmoid
的函数,在深度学习里用的很多。这里的fast_sigmoid
函数是保证速度连续可微,很有借鉴意义。
Rösmann还使用了sign/sigmoid
函数决定当前的运动方向。
计算误差函数用到的penaltyBoundToInterval
,比较好理解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 /* Linear penalty function for bounding var to the interval $-a < var < a $
* var The scalar that should be bounded
* a lower and upper absolute bound
* epsilon safty margin (move bound to the interior of the interval)
* penaltyBoundToIntervalDerivative
* return Penalty / cost value that is nonzero if the constraint is not satisfied
*/
inline double penaltyBoundToInterval(const double& var,const double& a,const double& epsilon)
{
if (var < -a+epsilon)
{
return (-var - (a - epsilon));
}
// 怀疑这里应该是 >=
if (var <= a-epsilon)
{
return 0.;
}
else
{
return (var - (a - epsilon));
}
}
/**
* Linear penalty function for bounding \c var to the interval \f$ a < var < b \f$
* var The scalar that should be bounded
* a lower bound
* b upper bound
* epsilon safty margin (move bound to the interior of the interval)
* penaltyBoundToIntervalDerivative
* return Penalty / cost value that is nonzero if the constraint is not satisfied
*/
inline double penaltyBoundToInterval(const double& var,const double& a, const double& b, const double& epsilon)
{
if (var < a+epsilon)
{
return (-var + (a + epsilon));
}
if (var <= b-epsilon)
{
return 0.;
}
else
{
return (var - (b - epsilon));
}
}
雅格比矩阵的推导
雅格比矩阵的计算被注释了,以为使用重写的雅格比可以加快运算速度,但是Github上有作者的解释,看了似懂非懂:对于一些nontrivial(非显而易见的,难以直观理解的) cost functions (比如 penalizing the distance between a line and a polygon) 最终表达式实在太长了,是否 central difference approximation is slower (2 times evaluating the function) then evaluating the exact Jacobian.
雅克比矩阵的维度为 误差维度 × 优化变量的维度,class EdgeVelocity : public BaseTebMultiEdge<2, double>
,是三元边,两个VertexPose
顶点,类型PoseSE2(3维)。顶点VertexTimeDiff
,类型double(1维)。对于前者,雅格比矩阵是 2x3,对后者是 2x1,也就是如下1
2
3_jacobianOplus[0].resize(2,3); // conf1
_jacobianOplus[1].resize(2,3); // conf2
_jacobianOplus[2].resize(2,1); // deltaT
我们把雅格比矩阵简写为 , 表示第1个VertexPose
, 表示第2个VertexPose
, 表示VertexTimeDiff
。 是两行三列的矩阵,第一行是线速度的误差方程penaltyBoundToInterval
对 , , 求偏导。第二行是角速度的误差方程(penaltyBoundToInterval
另一个重载形式)对 , , 求偏导。
和 以此类推