ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)

近期开发了一款阿克曼转向结构的小车,在实现导航功能时接触TEB局部规划器(teb_local_planner),过程中也遇到了一些问题,这里做个记录和分享
ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)_第1张图片

机器人 PC
NanoCar(阿克曼转向底盘,树莓派3B+,ubuntu mate 18.04,ROS Melodic,单线激光雷达) Ubuntu16.04 ROS Kinetic(虚拟机)

ROS下的导航中local planner多数都针对两轮差速结构设计的,阿克曼转向结构由于结构的特点会有最小转向半径的限制,所以常见的local planner例如base_local_planner,dwa_local_planner等在这里都不适用里,这里使用的是teb_local_planner
它提供了一种car-like的动力学模型(即有最小转向半径限制),这样他所规划的路径也就符合了阿克曼结构的运动特点了;先跑一遍它所提供的Tutorials来了体验一下,Tutorials中内置了差速、全向、类车三种运动模型的Stage仿真测试,跑下来效果还可以,直接上车测试,把Tutorials中类车结构下的配置文件移植到我的车上,主要修改下面几点:
costmap_common_params.yaml中的footprint为实体机器人的实际尺寸信息
global_costmap_params.yaml中的robot_base_frame为你机器人的基座标名称
local_costmap_params.yaml中的robot_base_frame为你机器人的基座标名称widthheight这个参数默认设置为5.5,这里要吐槽一下,已经见过N次这两个参数被设置成小数了,但是根据costmap_2d的API介绍,这两个值都应该是int型,所以应该设置为整数而非小数。
ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)_第2张图片
接下来要修改teb_local_planner_params.yaml中的内容
这里要修改的内容比较多,主要要设置车的速度,角速度,转向半径和车外轮廓安全尺寸,对照着注释和wiki修改应该没什么问题,我在这里踩了两个坑
第一个是cmd_angle_instead_rotvel这个参数,这个参数的作用是在发布的cmd_vel(geometry_msgs/Twist)话题中将Z轴角速度的数值替换为车体的转向角度,个人理解这个纯粹是为了兼容Stage仿真器设置的,有点不伦不类的感觉,我的机器人是可以接受geometry_msgs/Twist或者ackermann_msgs/AckermannDrive类型消息,唯独不接受这种奇怪的消息,所以这个参数要设置为False以发布正常的geometry_msgs/Twist消息
第二footprint_model设置这里,这里要好好看看wiki上对于机器人模型的解释,我刚开始是想当然的去设置,测试效果比较差后才老老实实回去看wiki上的说明
改完上面的内容再写一个launch文件应该就可以正常启动导航了,车跑起来后我发现了一个新问题,终端会连续的弹出如下警告

[ WARN] [1567946341.717090426, 13.700000000]: Control loop missed its desired rate of 5.0000Hz... the loop actually took 1.0000 seconds
[ WARN] [1567946341.718131483, 13.700000000]: Map update loop missed its desired rate of 5.0000Hz... the loop actually took 0.7000 seconds

看起来是控制周期的问题,但是5Hz的控制周期已经很低了,所以应该是主机性能太差所不过来了,看来要调整参数降低计算量,在Tutorials Wiki的常见问题中就有关于怎么降低计算量的(页面最后一项)
根据我测试,基本只有这几个参数有明显效果
local_costmap_params.yaml中的widthheight
teb_local_planner_params.yaml中的enable_homotopy_class_planningmax_number_classes这里说‘或’是因为max_number_classes只有在enable_homotopy_class_planning为True时才有效,更多的信息可以去看下wiki上的内容,一通尝试后警告消失,机器人也可以正常导航运行。图中黑框中可以明显看到规划出的路径可以明显看出在需要掉头时,是使用了两次带转向半径的转弯而非一次原地转向来实现的。
ROS下阿克曼转向结构车型导航应用实践(teb_local_planner)_第3张图片

你可能感兴趣的:(ROS)