1.问题一:针对阿克曼底盘控制的小车,方向控制“摆头”严重!
在Teb中,主要由几个参数决定:

根据de_ref参考两个位姿之间的时间差,dt_hysteresis为滞后时间,也就是为时间差加一个误差限,一般为dt_ref的10%。
经过调整滞后想要达到的目的是,每个时间差都在dt_ref左右。

 # ********************** Carlike robot parameters ********************min_turning_radius: 0.5        # Min turning radius of the carlike robot (compute value using a model or adjust with rqt_reconfigure manually)wheelbase: 0.4                 # Wheelbase of our robotcmd_angle_instead_rotvel: True # stage simulator takes the angle instead of the rotvel as input (twist message)# ********************************************************************

在车体模型参数中,轴距和转弯半径都会对其造成影响,cmd_angle_instead_rotvel会将控制命令转换成线速度和角度的方式,当轴距设置较大时,再经过反正切函数计算角度时,会将其角度的波段范围缩小,会有效的降低“摆头”情况,但是治标不治本。
通过设置de_ref也可以有效的降低“摆头”情况。

2.问题二:局部路径目标点设置错误,导致并不会严格按照全局路径寻迹,直接贯穿地图。
原因:在Teb中,切割全局路径时,将CostMap的一半作为阈值,如果当前位置在局部地图边界之外,则把全局地图的最后一个点设置为局部规划的目标点。
在Teb的transformGlobalPlan函数中:

    //we'll discard points on the plan that are outside the local costmapdouble dist_threshold = std::max(costmap.getSizeInCellsX() * costmap.getResolution() / 2.0,costmap.getSizeInCellsY() * costmap.getResolution() / 2.0);

以上确定了距离的阈值,接下来计算全局路径中符合阈值的路径点,这里全局地图和局部地图都是在Map坐标系下,其实并没有转换。如果满足阈值要求,则加入到局部路径transformed_plan中去。

 //now we'll transform until points are outside of our distance thresholdwhile(i < (int)global_plan.size() && sq_dist <= sq_dist_threshold && (max_plan_length<=0 || plan_length <= max_plan_length)){const geometry_msgs::PoseStamped& pose = global_plan[i];tf::poseStampedMsgToTF(pose, tf_pose);tf_pose.setData(plan_to_global_transform * tf_pose);tf_pose.stamp_ = plan_to_global_transform.stamp_;tf_pose.frame_id_ = global_frame;tf::poseStampedTFToMsg(tf_pose, newer_pose);transformed_plan.push_back(newer_pose);double x_diff = robot_pose.getOrigin().x() - global_plan[i].pose.position.x;double y_diff = robot_pose.getOrigin().y() - global_plan[i].pose.position.y;sq_dist = x_diff * x_diff + y_diff * y_diff;// caclulate distance to previous poseif (i>0 && max_plan_length>0)plan_length += distance_points2d(global_plan[i-1].pose.position, global_plan[i].pose.position);++i;}

如果没有满足要求的全局路径点,就会发生将全局路径最后一个点设置为局部路径的当前目标点,此时便会发生横穿地图的情况:

    if (transformed_plan.empty()){tf::poseStampedMsgToTF(global_plan.back(), tf_pose);tf_pose.setData(plan_to_global_transform * tf_pose);tf_pose.stamp_ = plan_to_global_transform.stamp_;tf_pose.frame_id_ = global_frame;tf::poseStampedTFToMsg(tf_pose, newer_pose);transformed_plan.push_back(newer_pose);// Return the index of the current goal point (inside the distance threshold)if (current_goal_idx) *current_goal_idx = int(global_plan.size())-1;}

否则,将从全局路径中找到的符合要求的最后一个点,设置为局部路径的当前目标点current_goal_idx

    else{// Return the index of the current goal point (inside the distance threshold)if (current_goal_idx) *current_goal_idx = i-1; // subtract 1, since i was increased once before leaving the loop}

因为在实际需求中,给定固定的全局路径,因此如果要避免这种情况,就要将局部地图CostMap的范围设大,此时会影响计算的效率,否则要时小车的当前位置靠近全局路径。如果参数设置不当,小车较容易偏离全局路径,如果此时不更新全局路径的话,就会直接奔向全局地图的最后一个点。
附上Teb代码解析博客 https://blog.csdn.net/windxf/article/details/110039280

在后续的调试中,发现是全局路径剪切问题,导致无法找到最近点,即参数global_plan_prune_distance: 0.6

double dist_thresh_sq = dist_behind_robot*dist_behind_robot;// iterate plan until a pose close the robot is foundstd::vector<geometry_msgs::PoseStamped>::iterator it = global_plan.begin();std::vector<geometry_msgs::PoseStamped>::iterator erase_end = it;while (it != global_plan.end()){double dx = robot.getOrigin().x() - it->pose.position.x;double dy = robot.getOrigin().y() - it->pose.position.y;double dist_sq = dx * dx + dy * dy;if (dist_sq < dist_thresh_sq){erase_end = it;break;}++it;}

通过参数擦除之前经过的全局路径点,默认全局路径中第一个点即最近点,因此并不会往后去寻找。
因为在一般规划中,全局路径会不断地更新,所以全局路径中第一个点即为最近点。
而在本次需求下,需要按照事先规定的全局路径,而此时巡逻开始的位置并不一定在全局路径的起点。

3.问题三:在Teb计算控制命令时,计算时间较长,发送频率过低导致控制不平滑,频繁刹车。
参考文章:https://www.it610.com/article/1295841594758471680.htm

TEB规划器的性能问题的总结参考
关闭多路径并行规划(效果非常显著)
使用Costmap Converter (非常显著)
降低迭代次数(no_inner/outer_iterations) (显著)
降低 max_lookahead_distance (一般)
减小局部耗费地图的大小 (显著)
增大规划周期和控制周期 (影响效果)
使用单点footprint,配合最小障碍物距离约束 (不太显著且影响效果)

Costmap Converter(ROS WIKI:costmap_converter)
TEB默认情况下不使用Costmap Converter。事实上,此插件可以在复杂场景下极大提高运算效率,尤其是处理激光雷达分散的测量数据时。因为将障碍物视为系列孤立点效率极低。

#当使用costmap_converter插件时
costmap_converter_plugin  #(字符串,默认值:" ")
#定义插件名称,以及将成本单元格转换成点/线/多边形。设置一个空字符串以禁用转换,以便将所有单元格都视为点障碍
costmap_converter_spin_thread #(bool,默认值:true)
#如果设置为true,costmap转换器将在另一个线程中调用其回调队列
costmap_converter_rate  #(double,默认值:5.0)
#用于定义插件处理当前成本图的频率

本地costmap_2d配置(强烈建议使用滚动窗口!):
weight/height:局部成本图的大小:表示最大轨迹长度以及要考虑的占用单元数(对计算时间有重大影响,但是如果太小:较短的预测/规划范围会降低自由度,例如,为了避开障碍物)
resolution:解析局部成本图:精细的解析度(较小的值)意味着存在许多需要优化的障碍(对计算时间的重大影响)

teb_local_planner/Tutorials/Frequently Asked Questions中有更多关于如何设置优化参数来降低计算时间。
Wiki链接:http://wiki.ros.org/teb_local_planner/Tutorials/Frequently%20Asked%20Questions

*关于Teb的博客:
ROS - teb_local_planner 参数总结
帮助路径规划理解

4.问题四:路径规划的过程中,小车原地转圈,但是全局路径正常
检查local cost map参数,heightwidth是否太小!
如果参数设置过小的话,局部路径无法生成就会原地打转!

现实环境中,关于Teb Local Planner 参数调试总结相关推荐

  1. 今晚直播 |现实环境中的强化学习如何解决?你不可错过的RL终极奥义

    都说强化学习很难,其实掌握了正确的学习方法,也会变得非常简单! 这次,所以我们荣幸的邀请到了百度连续两届获得NeurIPS全球顶会赛事冠军团队,6月16日-6月23日,连续7天,20:30-21:30 ...

  2. 最新综述 | 强化学习中从仿真器到现实环境的迁移

    ©PaperWeekly 原创 · 作者|李文浩 学校|华东师范大学博士生 研究方向|强化学习 最近 survey 了一下 sim2real 领域最近的相关工作,先整理个第一版(共有七篇论文)的总结. ...

  3. 在Unity环境中使用强化学习训练Donkey Car(转译)

    在Unity环境中使用强化学习训练Donkey Car 1.Introduction 简介 2. Train Donkey Car with Reinforcement Learning 使用强化学习 ...

  4. 为什么游戏AI无法帮助AI在现实世界中发挥作用,但可以

    多人游戏被视为一个硕果累累的竞技场,可以在其中模拟许多现实世界中的AI应用程序场景(例如自动驾驶汽车,无人驾驶无人机和协作商务),这些场景可能过于昂贵,投机性或冒险性,无法在现实世界中进行全面测试. ...

  5. 游戏ai人工智能_为什么游戏AI无法帮助AI在现实世界中发挥作用,但可以

    游戏ai人工智能 多人游戏被视为一个硕果累累的竞技场,在其中可以模拟许多现实世界中的AI应用程序场景(例如自动驾驶汽车,无人驾驶无人机和协作商务),这些场景可能过于昂贵,投机性或冒险性,无法在现实世界 ...

  6. 在受限环境中优化无人机集群的蜂拥行为

    文章目录 引用 摘要 结果 通过进化优化进行蜂拥模型实例化 速度的可伸缩性 集群个体数量的可扩展性与集体避障 室外飞行的实验结果 讨论 材料和方法 可调式自组织蜂拥模型 排斥(Repulsion) 速 ...

  7. 在 CCR 环境中使用 Exchange 命令行管理程序移动存储组和数据库

    作为Exchange管理员或许会遇到需要对Exchange Server存储组和数据库更改存储路径的情况,在常规情况下,更改Exchange Server存储组和数据库的路径一项比较简单的操作,通常在 ...

  8. Webpack中的sourcemap以及如何在生产和开发环境中合理的设置sourcemap的类型

    简要介绍:在webpack的官网,给出了十几种sourcemap,那么每一种sourcemap之间有什么区别,本文在理解sourcemap的基础上,分析在生产和开发环境中,应该采用何种形式的sourc ...

  9. 各种编译环境中如何为C++添加命令行参数(Command-line parameter)

    本篇文章引用自 http://blog.csdn.net/whb923/article/details/42964441 因恐其内容丢失所以重新编辑到本博文中 在实际的编程中,我们经常使用命令行参数. ...

最新文章

  1. 网络工程师历年试题解析(PDF文字版)2004-2009
  2. 计算机考试题操作题答案,全国计算机等级考试模拟题一(带操作题及答案)
  3. JZTK项目 驾照题库项目servlet层得到的json字符串在浏览器中 汉字部分出现问号?无法正常显示的解决方法
  4. 软件设计师习题笔记-重点习题一
  5. Linux uname 命令 打印系统信息
  6. 水题 CodeForces 602C -Two Bases
  7. Tech-Ed2004的收获
  8. Oracle redo解析之-1、oracle redo log结构计算
  9. html做一个课程表
  10. 迅雷9下载down.php,迅雷9-文件下载工具-迅雷9下载 V9.1.49.1060测试版-完美下载
  11. php getcwd文件件,PHP目录函数 getcwd (取得当前工作目录)
  12. npm安装出现npm err FetchError Invalid response body while trying to fetch httpsregistry.npmjs.orgvu
  13. 关于Vue的再次试炼
  14. iPhone模拟器消失 解决办法
  15. Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法
  16. python时间戳datetime取出年、月、日、时
  17. 同一篇Word文档设置多个不同的页眉页脚
  18. 外部接口调用失败重试
  19. 计算机高逼格术语,你能看懂这些高逼格专业词汇吗?
  20. 反恐精英java_使用java查询反恐精英1.6服务器信息

热门文章

  1. 【OpenCV入门到精通之九】OpenCV之视频截取、图片与视频互转
  2. excel显著性检验_《如何利用Excel对所得数据进行显著性分析?》 excel怎么做方差齐性检验...
  3. 什么情况下应该选用远心镜头
  4. token的使用方法
  5. 理解实时频谱分析仪的频域电平触发
  6. 金蝶k3单据编码规则_编码规则
  7. flowable工作流技术学习
  8. [ Azure - NSG ] 通过 Azure 网络安全组建立虚拟机的入站规则 Inbound 和出站规则 Outbound
  9. windows 组策略
  10. Autolayout布局相关和UIStackView