TEB算法3- teb中的g2o问题

本文详细介绍了基于TEB_local_planner的路径规划中,如何使用g2o进行非线性优化。主要内容包括问题背景、g2o优化问题的数学表述、顶点(pose和timediff)的定义以及多种边(动力学、障碍物、速度、加速度、时间最优和via点约束)的实现细节。通过这些约束,实现了对阿克曼底盘动态避障和时间最优路径的规划。

1.问题背景

针对阿克曼底盘的导航,TEB_local_planner没有直接给出具体的导航策略,而是利用非线性优化问题完成了对该问题的建模。

2.g2o问题的表述形式

参照论文[^1]给出非线性优化问题的格式:
V ∗ ( b ) = min ⁡ b ∑ k = 1 n − 1 Δ T k 2 V^{*}(b)=\min _{b} \sum_{k=1}^{n-1} \Delta T_{k}^{2} V(b)=bmink=1n1ΔTk2
subject to
s 1 = s s , s n = s f , Δ T k > 0 h k ( s k + 1 , s k ) = 0 r k ( s k + 1 , s k ) ≥ 0 o k ( s k ) ≥ 0 v k ( s k + 1 , s k , Δ T k ) ≥ 0 , ( k = 1 , 2 , … , n − 1 ) α k ( s k + 1 , s k + 1 , s k , Δ T k + 1 , Δ T k ) ≥ 0 , ( k = 2 , 3 , … , n − 2 ) α 1 ( s 2 , s 1 , Δ T 1 ) ≥ 0 , α n ( s n , s n − 1 , Δ T n − 1 ) ≥ 0 \begin{array}{l}{\mathbf{s}_{1}=\mathbf{s}_{s}, \quad \mathbf{s}_{n}=\mathbf{s}_{f}, \quad \Delta T_{k}>0} \\ {\mathbf{h}_{k}\left(\mathbf{s}_{k+1}, \mathbf{s}_{k}\right)=\mathbf{0}} \\ {r_{k}\left(\mathbf{s}_{k+1}, \mathbf{s}_{k}\right) \geq 0} \\ {\mathbf{o}_{k}\left(\mathbf{s}_{k}\right) \geq \mathbf{0}} \\ {\boldsymbol{v}_{k}\left(\mathbf{s}_{k+1}, \mathbf{s}_{k}, \Delta T_{k}\right) \geq \mathbf{0}, \quad(k=1,2, \ldots, n-1)} \\ {\boldsymbol{\alpha}_{k}\left(\mathbf{s}_{k+1}, \mathbf{s}_{k+1}, \mathbf{s}_{k}, \Delta T_{k+1}, \Delta T_{k}\right) \geq \mathbf{0}, \quad(k=2,3, \ldots, n-2)} \\ {\boldsymbol{\alpha}_{1}\left(\mathbf{s}_{2}, \mathbf{s}_{1}, \Delta T_{1}\right) \geq \mathbf{0}, \quad \boldsymbol{\alpha}_{n}\left(\mathbf{s}_{n}, \mathbf{s}_{n-1}, \Delta T_{n-1}\right) \geq \mathbf{0}}\end{array} s1=ss,sn=sf,ΔTk>0hk(sk+1,sk)=0rk(sk+1,sk)0ok(sk)0vk(sk+1,sk,ΔTk)0,(k=1,2,,n1)αk(sk+1,sk+1,sk,ΔTk+1,ΔTk)0,(k=2,3,,n2)α1(s2,s1,ΔT1)0,αn(sn,sn1,ΔTn1)0

其中, b = [ s 1 , Δ T 1 , s 2 , Δ T 2 , s 3 , … , Δ T n − 1 , s n ] ⊤ b=[s_{1}, \Delta T_{1}, s_{2}, \Delta T_{2}, s_{3}, \ldots, \Delta T_{n-1}, s_{n}]^{\top} b=[s1,ΔT1,s2,ΔT2,s3,,ΔTn1,sn]

3.顶点

顶点分为两类:pose与timediff

vetex_pose

  • 定义于g2o_types/vetex_pose.h
  • 优化变量的数据类型定义为pose_se2,定义于pose_se2.h,由三个分量组成:x,y,theta,优化维度为三维。
  • 在Teb初始化的过程中,将起点的Pose与终点的Pose所在的顶点设为fixed,使得g20不对这两个Pose进行优化。
  • 初始化某一个TEB时,其路线简单的由起点和终点的连线组成。随后在这条直线上均匀采样点作为待优化的顶点。采样的步长由cfg_->trajectory.min_samples 决定。而 timediff 顶点的初始值为步长除以 cfg_->robot.max_vel_x。每有一个pose顶点就产生一个time_diff顶点。time_diff顶点实际上是每两个Pose之间所需要的时间。

vetex_timediff

  • 定义于g20_types/vetex_timediff.h
  • 优化变量的数据类型为double。
  • 由上所述,其生成在Teb初始化的时候。具体在timed_elastic_band.h/.cpp中的TimedElasticBand::initTrajectoryToGoal中。

4.边

1)动力学约束

EdgeKinematicsCarlike
  • 定义于g2o_types/edge_time_optimal.h中
  • 二元边,观测值维度为2,数据类型为double,连接两个VertexPose
  • 误差由文章[^1]中的动力学约束提出。阿克曼底盘模型还增加了最小转弯半径的约束。

在这里插入图片描述

2)障碍物约束

在AddEdgeObstacle函数中,只将离某个Pose最近的最左边与最右边的两个Obstacle加入优化中。(因为优化路径不会使得路径相对于障碍物的位置关系发生改变)。同时,还设了一个阈值,凡是离该Pose距离低于某个距离的障碍物也一并加入考虑之中。

EdgeObstacle
  • 定义于g2o_types/edge_obstacle.h中,当inflated=false时使用此障碍物边

  • 一元边,观测值维度为1,测量值类型为Obstacle基类,连接VertexPose顶点

  • 存储了某个障碍物的中心点的三维位置,形状与顶点的位置

  • 根据机器人的轮廓模型计算当前Pose与某个障碍物的距离

  • e r r o r = d i s t > m i n _ o b s t a c l e _ d i s t + ϵ ? 0 : ( m i n _ o b s t a c l e _ d i s t + ϵ ) − d i s t error = dist > min\_obstacle\_dist + \epsilon ? 0 : (min\_obstacle\_dist + \epsilon) - dist error=dist>min_obstacle_dist+ϵ?0:(min_obstacle_dist+ϵ)dist

  • 信息矩阵为cfg_->optim.weight_obstacle * weight_multiplier

在这里插入图片描述

EdgeInflatedObstacle
  • 定义于g2o_types/edge_obstacle.h中,当inflated=true时使用此障碍物边

  • 一元边,观测值维度为2,类型为Obstacle基类,连接VertexPose顶点

  • e r r o r [ 0 ] = d i s t > m i n _ o b s t a c l e _ d i s t + ϵ ? 0 : ( m i n _ o b s t a c l e _ d i s t + ϵ ) − d i s t e r r o r [ 1 ] = d i s t > i n f l a t i o n _ d i s t ? 0 : i n f l a t i o n _ d i s t − d i s t error[0] = dist > min\_obstacle\_dist + \epsilon ? 0 : (min\_obstacle\_dist + \epsilon) - dist \\ error[1] = dist > inflation\_dist ? 0 : inflation\_dist - dist \\ error[0]=dist>min_obstacle_dist+ϵ?0:(min_obstacle_dist+ϵ)disterror[1]=dist>inflation_dist?0:inflation_distdist

  • 信息矩阵为2x2对角阵,(0,0) = weight_obstacle, (1,1) = weight_inflation

3)速度约束

EdgeVelocity
  • 定义于g2o_types/edge_via_point.h中
  • 三元边,观测值变量维度为2,类型为double,连接两个VetexPose与一个VertexTimeDiff
  • 速度由两个VetexPose间的距离除以时间得到。角速度由两个VetexPose间的角度除以时间得到
  • error有两项,分别是线速度与线速度线速度是否在设定好的区间内。
  • 信息矩阵为3x3对角矩阵,(0,0) = weight_max_vel_x, (1,1) = weight_max_vel_y, (2,2) =weight_max_vel_theta(对于全向轮底盘来说)
    在这里插入图片描述

4)加速度约束

EdgeAcceleration
  • 定义于g2o_types/edge_acceleration.h中
  • 五元边,观测值维度为2,类型为double,连接三个pose与两个timediff顶点
  • 根据三个Pose与两个timediff做两次差分得到线加速度与角加速度。
  • error有两项,分别是线加速度与角加速度是否在设定好的区间内。
  • 信息矩阵为2x2对角矩阵(对于阿克曼底盘来说),(0,0) =weight_acc_lim_x, (1,1) = weight_acc_lim_theta,
    在这里插入图片描述

5) 时间最优约束

EdgeTimeOptimal
  • 定义于g2o_types/edge_time_optimal.h中
  • 一元边,观测值维度为1,数据类型为double,连接一个VertexTimeDiff
  • error直接就是连接的VertexTimeDiff的dt本身
  • 信息矩阵为1x1矩阵,其值为weight_optimaltime
    在这里插入图片描述

6) via_point约束

via_point是一类点,其规定了轨迹应当经过这些点,否则会产生相应的cost。via_point边会与原规划的路径中与其距离最近的Pose顶点相连。

EdgeViaPoint
  • 定义于g2o_types/edge_via_point.h中
  • 一元边,观测值维度为1,类型为Eigen::Vector2d*,连接VertexPose顶点
  • 存储了某个via_point的位置。
  • error为其连接的Pose顶点的位置到这个Viapoint的距离的模长。
  • 信息矩阵为1x1的矩阵,其值为weight_viapoint

[^1]:Integrated online trajectory planning and optimization in distinctive topologies
TEB中的g2o问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值