障碍物避障以及机器人足迹模型

简介:障碍物避障的实现,以及必要参数的设置对于机器人足迹模型和其对应的影响

1.障碍物避障是怎样工作的

1.1 惩罚项

障碍物避障作为整个路径优化的一部分。显然,优化是找出指定的代价函数(目标函数)的最小代价解决方案。简而言之:如果一个计划的位姿违背了与障碍物分离的期望,代价函数的代价必须增加。理想情况下,代价函数值必须是无限的在某些情况下或者优化器能够更好的拒绝这些区域。然而,这就要求优化器处理强约束(解决非线性问题)。

teb_local_planner放弃了考虑墙约束项,以便更好的考虑有效性。强约束项被转换为了软约束向,使得具有有限值的二次惩罚项的组成。

上图展示了对弈障碍物避障的惩罚项例子。允许的到障碍物的最小欧拉距离(参数min_obstacle_dist)设置为0.2m。因此低于0.2m产生一个非零的代价值。可以想象得到优化问题是由多个代价项构成。他们中的有些是相互冲突的,比如时间优化。因此,可能发生,优化器考虑一个小的违背(因此小的惩罚项)以便最小化全部的代价函数。有两个选择来调试行为:

1.调整优化权重(各自代价的变化,在这里是参数weight_obstacle).如果选择值太高,优化问题会变得病态导致不好的收敛行为。

2.通过添加额外的边缘来转移增广。通过把一个小的额外的边缘添加到min_obstacle_dist里面,就可以隐含增加在0.2m处的代价值。可以在单个参数里面penalty_epsilon中来转移所有惩罚项,但是小心,这样做会广泛影响优化结果。

1.2 局部优化解决方案

注意,优化器本身只找具有优化解决方案。想象一下,机器人可能由两个障碍物横向包围。惩罚项实际上是非零,但是优化器会卡住在局部最小里面,因为横向移动对应位姿到任何一个障碍物会进一步增加总共代价。有点像下面的情况:

以上轨迹不能跳过障碍物。甚至位姿本身也被推离障碍物之间的区域(红色箭头)。很显然,在实际情况中,这种情况应该被避免。因此,同轮类的规划算法寻找替代的解决方案以及可行的检测来排斥这种解决方案在实际发送命令给机器人之前。

1.3位姿与障碍物之间的关系

下图描述了常见的规划方案情形:

以上规划的轨迹由多个机器人位姿组成。规划器目的在于根据期望的瞬时分辨率(参数dt_ref)来安排每两个连续的位姿。注意,实际的分辨率是不固定的,因为优化器为了寻找时间最优性需要调整过渡时间。

对于障碍物避障,在障碍物和规划的位姿之间的距离必须被固定为以下。图上例子轨迹由8个可变的位姿组成(起始点固定)。对于每一个障碍物(点,即占据栅格,线,多边形)离规划路径上的最近位姿被确定下来。根据参数obstacle_poses_affected的值,与最近的位姿的邻居位姿也会被考虑进来。只有选择的位姿子集被考虑进随后的优化步骤中(在这里有三个位姿和三个惩罚项)。本过程根据参数no_inner_iterations的值来决定重复次数。obstacle_poses_affected参数的值会轻微影响在障碍物附近轨迹的平滑性。更大的障碍物就要求更多连接的位姿来避免不可访问的捷近。可能需要选择高于轨迹长度的值来连接每一个障碍物的所有位姿。

2.机器人足迹模型

机器人足迹模型近似机器人的2d轮廓,主要用于优化目的。对于复杂的距离计算,这个模型是很关键的。因此,机器人足迹模型构成一个专用的参数而不是从公共的costmap_2d的参数中加载机器人足迹。优化足迹模型与costmap 的足迹模型不相同,costmap的足迹模型是用于可行性检测。

机器人足迹模型使用参数服务器来选择和配置。可以添加如下参数结构到teb_local_planner配置文件中:

TebLocalPlannerROS:
footprint_model: # types: "point", "circular", "line", "two_circles", "polygon"
type: "point"
radius: 0.2 # for type "circular"
line_start: [-0.3, 0.0] # for type "line"
line_end: [0.3, 0.0] # for type "line"
front_offset: 0.2 # for type "two_circles"
front_radius: 0.2 # for type "two_circles"
rear_offset: 0.2 # for type "two_circles"
rear_radius: 0.2 # for type "two_circles"
vertices: [ [0.25, -0.05], [0.18, -0.05], [0.18, -0.18], [-0.19, -0.18], [-0.25, ], [-0.19, 0.18], [0.18, 0.18], [0.18, 0.05], [0.25, 0.05] ] # for type "polygon"

2.1默认足迹模型是点类型。

机器人被模拟为单点类型,对于这种类型计算时间最少。

2.2 圈类型

机器人被模拟为简单的圆圈类型。距离计算类似于点类型的机器人,机器人的半径被添加到参数min_obstacle_dist的每一个函数调用中。也可以通过选择一个点类型的机器人来摆脱额外的增加,然后把半径添加到最小障碍物距离,一个先验信息。

2.3足迹类型:线

2.4两个圆的足迹类型

2.5足迹类型:多边形

通过定义一个闭合的多边形来表达一个复杂的模型。多边形是通过一个顶点表来定义的(每个顶点通过x,y坐标表示)。假设机器人的旋转轴位于(0,0),单位m。第一个顶点和最后一个顶点不用重复。

3.可行性检查

可行性检查被执行,是在优化器返回一个轨迹之后,然后在发送速度命令到机器人之前。检查的目的在于验证优化器产生的轨迹的有效性。

当前,算法迭代的头n个位姿(feasibility_check_no_poses)从机器人当前位置开始,然后检查这些位姿是否不碰撞。

如果碰撞发生,costmap的footprint被使用。因此,验证模型可能比用于优化的footprint更复杂。

值feasibility_check_no_poses不应该选择很高,因为优化器可能不会完全收敛:比如,在将来的位姿规划中小障碍物的违背可以被纠正,当机器人向前移动到目标点的时候。

如果是在狭窄的环境中驱动时,确定配置合适的障碍物避障行为(局部规划和全局规划)。另外局部路径规划器可能排斥一个不可行的轨迹(从它的观点来看),但是全局规划器相反可能认为选择的全局规划是可行的:此时机器人卡住了。

teb教程4的更多相关文章

  1. teb教程1

    http://wiki.ros.org/teb_local_planner/Tutorials/Setup%20and%20test%20Optimization 简介:本部分关于teb怎样优化轨迹以 ...

  2. teb教程8

    融合动态障碍物 简介:考虑怎样把其他节点发布的动态障碍物考虑进来 1.本部分演示了动态障碍物该如何被包含到teb_local_planner中. 2.写一个简单的动态障碍物的发布器publish_dy ...

  3. teb教程3

    配置和运行机器人导航 简介:配置teb_local_planner作为navigation中local planner的插件 参考teb安装 由于局部代价地图的大小和分辨率对优化性能影响很大,因为占据 ...

  4. teb教程10 teb questions

    http://wiki.ros.org/teb_local_planner/Tutorials/Frequently%20Asked%20Questions

  5. teb教程9

    通过costmap_converter来跟踪和包含动态障碍物 简介:利用costmap_converter来很容易跟踪动态障碍物 1.costmap_converter中提供了一个插件称之为costm ...

  6. teb教程7

    融合自定义的障碍物 简介:本部分讲解怎样考虑其他节点发布的多边形的障碍物. 1.在一些应用当中,可能不想依赖于代价地图或者想添加其他的除了点状的障碍物.你可以发送你自己的障碍物列表到teb_local ...

  7. teb教程6

    代价地图的转换 简介:本部分关于怎样把代价地图转换插件应用到转换占据栅格costmap2d到几何形状来优化(测试阶段) teb_local_planner包支持costmap_converter插件, ...

  8. teb教程5

    跟随全局规划器 简介:本部分是关于如何配置局部规划器严格跟随全局规划,也包括调节在时优和路径跟随上的权衡. 1.先看一下via-points当前的优化行为:启动下面节点 roslaunch teb_l ...

  9. teb教程2

    http://wiki.ros.org/teb_local_planner/Tutorials/Inspect%20optimization%20feedback 检查优化反馈 简介:怎样检查优化的轨 ...

随机推荐

  1. keepalive+nginx

    1Nginx+keepAlived负载均衡高可用1.1Nginx+keepAlive架构图 1.1.1主机宕机 1.1.2主机恢复 1.1.3高可用环境 两台nginx,一主一备:192.168.10 ...

  2. ps学习记录

    基本快捷键: ctrl + 放大 ctrl - 缩小 ctrl 空格键 放大工具 ctrl 0 适合屏幕大小 ctrl 1 显示实际大小 ctrl n 新建画布 ctrl v 移动工具 按住alt键 ...

  3. webpack从入门到精通(一)

    1.webpack的使用背景: 目前国内前端开发都是基于模块化的 2.webpack的作用有哪些: 3.webpack四大核心理念: entry,output,loaders,plugins 4.使用 ...

  4. Ansible--04 ansible 流程控制

    ansible 流程控制 playbook 条件语句 不管是 shell 还是各大编程预言中,流程控制,条件判断都是必不可少的,在我们使用 Ansible的过程中,条件判断的使用频率都非常高. 例如: ...

  5. mybatis 自定义查询语句

    通过mybatis插件生成的mapper文件只有基本的增.删.改.查.汇总.但是实际使用场景中,总是有各种需要连表.汇总.分组查询的需求,那我们一般都通过自定义查询语句去实现. 有时候会有表结构更改的 ...

  6. jQuery遍历之向下遍历

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <ti ...

  7. 【算法】一致性Hash算法

    一.分布式算法 在做服务器负载均衡时候可供选择的负载均衡的算法有很多,包括: 轮循算法(Round Robin).哈希算法(HASH).最少连接算法(Least Connection).响应速度算法( ...

  8. 为什么不能在shell脚本中执行source /etc/profile或者source ~/.bashrc问题?

    执行脚本时,其中的命令是在一个子shell中执行的.子shell继承了父shell的环境变量,但无法修改他们,或者说所做的修改仅对子shell有效.

  9. jdbc的连接数据库,使用PreparedStatement实现增删改查等接口

    首先是连接,关闭资源等数据库操作 将连接数据库,关闭资源封装在JDBCUtils里 package jdbc.utils; import java.sql.Connection; import jav ...

  10. [CSP-S模拟测试72]题解

    A.简单的序列 遇到括号匹配,先将左右括号转化为1和-1. 那么一个括号序列合法的必要条件:总和为0且所有时刻前缀和$\ge 0$. 用dp预处理出长度为$i$,总和为$j$的括号序列数量.那么如果p ...