【局部开源规划器】base_local_planner规划器

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
TODO:写完再整理


前言

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!

在项目和平时的学习中,我对机器人/无人驾驶的决策规划模块进行了划分,当然划分的方法有很多,我的划分方式仅供参考
(1)动态障碍物行为预测模块(Behavior prediction)–结合感知和高精度地图信息,估计周围障碍物未来运动状态
(2)执行机构的轨迹规划模块(Trajectory_planning)–执行机构如机器人载体上的机械臂、串行云台等的运动轨迹规划
(3)任务决策模块(Mission_planning)–任务决策模块比较偏业务层了,处理机器人/无人驾驶的各种任务,主要分为三个方面:车底盘航线业务决策(交规、横向换道等等)、执行应用机构业务决策(机械臂、人机交互等等)、不同场景的导航方案切换决策(组合导航、融合导航)
(4)前端路径探索模块(path_finding)–全局路径规划算法难度不算复杂,找到一条可通行的(必须满足)、考虑动力学的(尽可能满足)、可以是稀疏的路径base_waypoints【由于其只考虑了环境几何信息,往往忽略了无人机本身的运动学与动力学模型。因此,其得到的轨迹往往显得比较“突兀”,并不适合直接作为无人机的控制指令】
(5)后端轨迹处理模块(motion_planning)–我主要归纳整理为三个方向:(1)对base_waypoints进行简单处理及生成方向、(2)对base_waypoints轨迹优化方向【一般是二次优化,这里用的较多的事优化方面的知识】、(3)进行对应功能的replan方向(replan之前的预处理、进入replan的条件、停障replan、避障replan、纠偏replan、换道replan、自动泊车replan、穿过狭窄道路replan等等),这部分内容使用的方法比较专
(6)路径跟踪模块(trajectory_following)–这个模块就得针对机器人载体了,如无人驾驶使用得阿克曼模型可以采用几何的pure pursuit纯追踪算法,更好的可以用模型预测控制MPC方法,还有强化学习做的(效果怎样我就没验证过了);当然也可能事麦克纳姆轮车、差速车PID、还有无人机的三维轨迹跟踪等等
(7)碰撞检测模块
(8)集群多机器人规划模块

当然,这种划分方式是我权衡了原理和功能粗略划分的,在实际产品研发过程中,需要理解了各个算法的功能和定位的基础上融汇贯通,不能生搬硬套,如全段通过hybrid A探索出来的路径与A、RRT*探索出来的路径更平滑,后端轨迹优化的任务就不用这么重了;又如,机器人/无人驾驶项目研发的需求业务还没发展到能响应很多功能阶段,任务决策使用简单的状态机(fsm)就可以对现有任务进行状态转移了

本文先对**(ROS)base_local_planner规划器**做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章


提示:以下是本篇文章正文内容

一、(ROS)base_local_planner介绍

base_local_planner 提供用Dynamic Window and Trajectory Rollout approaches来做局部规划控制,与base_local_planner相比,专用的DWA局部规划插件具有更加整洁,更加易用的界面,机器人更容易理解,【防盗标记–盒子君hzj】由更灵活的y轴变量

二、Trajectory Rollout基本算法原理

DWA与Trajectory Rollout的区别主要是在机器人的控制空间采样差异。Trajectory Rollout采样点来源于整个前向模拟阶段所有可用速度集合,而DWA采样点仅仅来源于一个模拟步骤中的可用速度集合。【防盗标记–盒子君hzj】这意味着相比之下DWA是一种更加有效算法。因为其使用了更小采样空间;然而对于低加速度的机器人来说可能Trajectory Rollout更好,因为DWA不能对常加速度做前向模拟。

在实践中,我们经过多次实验发现Trajectory Rollout、DWA方法性能基本相当,【防盗标记–盒子君hzj】这样的话我们推荐使用效率更高的DWA算法

三、(ROS)base_local_planne运行流程

在这里插入图片描述
在move base中进行TrajectoryPlannerROS这里更封装过的类进行初始化了。每次有goal发布的时候,都会去调用executeCb,executeCb会去调用executeCycle
进行local plan,发布cmd_vel的topic,根据小车处于的状态,【防盗标记–盒子君hzj】进行相应的实现(会进行plan,control,clear obstacle)

整一个逻辑顺序就是computeVelocityCommands->findBestTrajectory --> createTrajectories --> generateTrajectory。最终,选择分数最低的轨迹,发布出去。这便是整个局部规划器的实现思路和逻辑

四、(ROS)base_local_planner核心函数

(1)initialize()【初始化局部规划器】
实现的功能及流程
在这里插入图片描述

(2)setPlan()
【只是规划标志位设定而已】

(3)isGoalReached()
【检查局部规划师是否达到了目标姿势】

(4)computeVelocityCommands()
实现的功能及流程

【计算机器人实际运行的速度和位置控制指令,发布局部路径规划,是base_local_planner的核心】
在这里插入图片描述
其他都是自己的定义的被调函数了

五、findBestPath()路径探索的核心原理

base_local_planner基础代码已经被扩展成很多个接口

(0)给定栅格地图Grid Map和全局路径

为了有效地评价轨迹,必须依赖地图栅格,每个控制周期,【防盗标记–盒子君hzj】都会在机器人周围创建局部栅格地图(大小为局部costmap区域),并且全局路径会被映射到这个区域上。这时候的局部代价地图既有静态信息,又有动态信息。同时,有一定栅格将被标记为到全局路径点距离为0

(1)TrajectorySampleGenerator接口

功能:【产生一系列轨迹】
在这里插入图片描述
该接口描述了一种产生一系列局部路径的发生器,每调用一次nextTrajectory()就会返回一个新的轨迹。其中,SimpleTrajectoryGenerator类可以使用trajectory rollout或DWA原理来生成根据加速度的限制产生一系列轨迹(轨迹就是速度跟点的集合,在trajectory.h中定义),以供后面打分挑选
.
.
.

(2)TrajectoryCostFunction接口

功能:【建立四个代价函数,遍历轨迹进行打分】
这个接口包含了最重要的函数scoreTrajectory(),【防盗标记–盒子君hzj】 该函数输入轨迹后会输出轨迹评价分数。如果输出负分数意味着轨迹无效;输出分数为正值,对于cost函数来说值越小越好。每个cost函数有一个比例因子,与其它cost函数比较时候,通过调节比例因子,cost函数影响可以被改变。

具体的子代价函数如下:
在这里插入图片描述
(1)TrajectoryCostFunction,这个接口主要规定了一个scoreTrajectory函数,也就是走过一个轨迹需要付出的代价,在wiki上可以看到对4种代价的详细介绍;
(2)MapGridCostFunction用来评估局部规划的轨迹离全局规划的轨迹的距离,也可以用来评估到目标的距离
(3)ObstacleCostFunction就是计算小车在costmap上行走的代价【防盗标记–盒子君hzj】,看看是否撞到障碍。其中ObstacleCostFunction用到了worldModel接口来检测底座是不是撞到障碍物,从初始化函数可以看出来,ObstacleCostFunction选用了CostmapModel作为具体实现
(4)oscillationcostFunction判断小车是不是老是震动
(5)preferForwardCostFunction判断小车会不会倒着走
.
.
.

(3)SimpleScoredSamplingPlanner接口

功能:【这是一个循环实现–ScoredSamplingPlanner把一系列(4个)costFunction子代价评价函数打分加起来,选代价最低的轨迹,最后TrajectorySearch找到最优的局部路径】
在这里插入图片描述
这是轨迹搜索的一种简单实现,利用了TrajectorySampleGenerator产生的轨迹和一系列TrajectoryCostFunction。 它会一直调用nextTrajectory()直到发生器停止生成轨迹。对于每一个生成的轨迹,【防盗标记–盒子君hzj】将会把列表中的cost函数都循环调用,并把cost函数返回的正值,负值丢弃。 最佳轨迹就是cost函数加权求和后最好的的那条轨迹。
.
.
.

(4)局部规划器提供支持的一些类

(1)LocalPlannerUtil
管理当前的全局规划,当前的运动约束,以及当前的cost地图(感知障碍物的局部cost地图)

(2)OdometryHelperRos
提供odometry信息

(3)atchedStopRotateController
当机器人足够靠近目标时可以迅速启用改控制器

(4)FootprintHelper
打印机器人运功的轨迹出来

(5)worldModel类会给检查小车有没有碰到障碍物提供支持
在这里插入图片描述
worldModel:检查给定位置和方向上的足迹在世界上的合法性

(5)TrajectoryPlannerROS接口

【这个是遵循navcore接口的】
base_local_planner::TrajectoryPlannerROS是对base_local_planner::TrajectoryPlanner的ROS封装。【防盗标记–盒子君hzj】它在初始化时确定的ROS命名空间内运行,该接口继承了nav_core包的nav_core::BaseLocalPlanner接口。


“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:数字20 设计师:CSDN官方博客 返回首页
评论

打赏作者

盒子君~

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值