机器人系统ROS导航调优指南

机器人系统ROS导航调优指南

摘要

ROS 导航栈可使移动机器人可靠地从一个地点移动到另一个地点,其主要作用是通过处理测距、传感器以及环境地图数据,为机器人生成可执行的安全路径。有效优化导航栈的性能需要对参数进行精细调优,然而这并不像看起来那么简单。一个对概念和原理一知半解的人可能随意尝试,浪费大量时间。本文旨在通过指导读者精细调优导航参数的过程,为读者提供 “如何” 和 “为什么” 在设置关键参数值时的参考资料。本指南假设读者已经安装好了导航栈并准备好优化。本文也是我在 ROS 导航栈方面工作总结的概述。

主题
1.速度和加速度
2.全局规划器
(a)全局规划器选择
(b)全局规划器参数
3.局部规划器
(a)局部规划器选择
(b)局部规划器参数
4.代价地图
(a)代价地图设置
(b)代价地图更新
5.锁定机制

详细内容请参见原文:https://blog.csdn.net/u010489383/article/details/52395124

1 速度和加速度

本节介绍同步驱动机器人。机器人的动态特性(例如速度和加速度)对于包括动态窗口方法(DWA)和时间弹性带(TEB)的本地规划器至关重要。在ROS导航堆栈中,本地规划器接收里程计消息(“odom”话题)并输出控制机器人运动的速度命令(“cmd vel”话题)。最大/最小速度和加速度是移动底盘的两个基本参数。正确设置这些参数有助于实现最佳的本地规划器行为。在ROS导航中,我们需要了解平移和旋转的速度和加速度。

1.1 获取最大速度

通常,您可以参考移动底盘的手册。例如,SCITOS G5的最大速度为1.4 m/s。在ROS中,您还可以订阅odom话题以获得当前的里程计信息。如果您可以手动控制机器人(例如使用操纵杆),则可以尝试将其向前行驶,直到其速度达到恒定状态,然后回显里程计数据。

平移速度(m/s)指机器人直线移动时的速度。其最大值与上面得到的最大速度相同。旋转速度(rad/s)相当于角速度;其最大值是机器人在原地旋转时的角速度。为了获得最大旋转速度,我们可以通过手柄来控制机器人,在机器人的速度达到常数后将机器人旋转360度,并计时这一运动。出于安全考虑,我们愿意将最大平移速度和最大旋转速度设置为低于它们实际的最大值。

1.2 获取最大加速度

如果您的手册未直接告诉您如何测量移动平台的最大加速度,那么有许多方法可供选择。在ROS中,我们可以回显包括时间戳的里程计数据,然后查看机器人到达恒定最大平移速度($t_i$)的时间。然后,我们使用里程计(nav msgs/odometry message)中的位置和速度信息来计算这一过程中的加速度。进行多次试验并取平均值。使用$t_t$,$t_r$来表示从静止到达最大速度所需的时间,分别是平移和旋转的最大速度。最大平移加速度为$a_{t,max}=max \ dv/dt\approx v_{max}/t_t$。同样地,旋转加速度可以通过$a_{r,max}= max\ d\omega/dt\approx \omega_{max}/t_r$计算得出。这些信息可从MetraLabs的网站中获得。

1.3 设置最小值

设置最小速度并不像上面提到的那么公式化。对于最小平移速度,我们希望将其设置为较大的负值,因为这可以使机器人在需要解除卡住时后退,但在大多数情况下应该更喜欢向前移动。对于最小旋转速度,我们也希望将其设置为负值(如果参数允许的话),这样机器人可以向任一方向旋转。注意,DWA本地规划器会将机器人的最小旋转速度的绝对值作为参数。

1.4 x、y方向的速度

x速度是指沿着机器人直线运动方向的速度。它与平移速度是相同的。y速度是指垂直于直线运动方向的速度。在teb_local_planner中,它被称为“横向速度”。对于非完整约束机器人(例如差分轮式机器人),应将y速度设置为零。

2 全局规划器

2.1 全局规划器选择

要在导航堆栈中使用move_base节点,我们需要有一个全局规划器和一个本地规划器。有三种全局规划器符合navcore::BaseGlobalPlanner接口:carrot_planner,navfn和global _planner。

2.1.1 carrot_planner

这是最简单的规划器。它检查给定的目标是否为障碍物,如果是,则通过沿着机器人和目标点之间的向量向后移动,选择一个靠近原始目标的备选目标。最终,它将此有效目标作为规划传递给本地规划器或控制器(内部)。因此,此规划器不进行全局路径规划。如果您要求机器人靠近给定目标即使目标不可达,这是很有帮助的。在复杂的室内环境中,此规划器不太实用。

2.1.2 navfn和全局规划器

navfn使用Dijkstra算法在起点和终点之间找到最小成本的全局路径。全局规划器是navfn的更灵活的替换,具有更多选项。这些选项包括:(1)支持$A^*$,(2)切换二次近似,(3)切换网格路径。导航函数(navfn)和全局规划器(global planner)都基于 [Brock 和 Khatib,1999] 的工作。

2.2 全局规划参数

由于全局规划通常是我们首选的,让我们看一下一些关键参数。注意:并非所有这些参数都列在ROS的网站上,但您可以通过运行rqt dynamic reconfigure程序查看它们:

1
rosrun rqt_reconfigure rqt_reconfigure

我们可以将“allow unknown”(true)、“usedijkstra”(true)、“usequadratic”(true)、“usegrid path”(false)、“oldnavfn behavior”(false)保留为默认值。将“visualize potential”(false)设置为true有助于在RVIZ中可视化势能地图。

除了这些参数之外,还有另外三个未列出的参数实际上确定了计划的全局路径的质量。它们是cost_factor、neutral_cost、lethal_cost。实际上,这些参数也出现在navfn中。源代码中有一段解释navfn如何计算成本值的代码。

navfn的代价值被设置为
cost = COST_NEUTRAL + COST_FACTOR *costmap_cost_value
输入的costmap代价值介于0到252之间。注释中还说:如果将中性代价(COST_NEUTRAL)设置为50,则代价因子(COST_FACTOR)需要约为0.8,以确保将输入值均匀分布到输出范围50到253之间。如果代价因子过高,则代价值会在障碍物周围形成高原,规划器将把(例如)狭小走廊的整个宽度视为同样不可取,因此将不会在中心规划路径。实验观察证实了这一点。设置代价因子过低或过高会降低路径的质量。这些路径不会通过障碍物的中心,具有相对平坦的曲率。极端的中性代价值具有相同的影响。对于致命代价,将其设置为较低的值可能会导致无法生成任何路径,即使可行的路径很明显。图5-10展示了代价因子和中性代价对全局路径规划的影响。绿线是全局规划器生成的全局路径。经过多次实验,当代价因子cost_factor=0.55,中性成本neutral_cost=66,致命成本lethal_cost=253时,全局路径是比较理想的。

3.选择局部规划器

遵循navcore::BaseLocalPlanner接口的局部规划器有dwa_local_planner、eband_local _planner和teb_local_planner。它们使用不同的算法来生成速度命令。通常情况下,dwa_local_planner是首选。我们将详细讨论它。其他规划器的更多信息将在稍后提供。

3.1 DWA局部规划器

3.1.1 DWA算法

dwa本地路径规划器采用动态窗口方法(DWA)算法。ROSWiki提供了该算法实现的概要:

  1. 在机器人的控制空间(dx,dy,dtheta)中离散抽样。
  2. 对于每个采样的速度,从当前状态进行前向模拟,以预测如果应用采样的速度一段(短)时间会发生什么。
  3. 使用包括以下特性的衡量标准(接近障碍物、接近目标、接近全局路径和速度)评估前向模拟产生的每个轨迹。
  4. 丢弃非法轨迹(与障碍物碰撞的轨迹)。
  5. 选择得分最高的轨迹并发送相应的速度给移动基地。

不论采样的速度如何,DWA都会将该速度视为机器人下一个时间间隔内的运动矢量,在速度空间中产生一个动态窗口。DWA的目的是通过在下一个时间间隔内在速度空间中进行搜索生成代表机器人本地状态的圆形轨迹。DWA通过这种方式实现其目标,该路径是最适合机器人本地环境的路径。在该空间中的速度被限制为可接受的,这意味着机器人必须能够在到达受这些可接受速度规定的圆形轨迹上的最近障碍物之前停止。此外,动态窗口法将仅考虑动态窗口内的速度,该窗口定义为在当前平移和旋转速度和加速度下可到达下一时间间隔内的速度对集合。动态窗口法通过最大化一个目标函数来产生最佳速度对,该函数依赖于(1)到达目标的进程,(2)与障碍物的间隔和(3)前进速度。现在,让我们看看ROS Wiki上的算法概述。第一步是在动态窗口内的速度空间中采样速度对$(v_x,v_y,\omega)$。第二步基本上是消除不可接受的速度(即淘汰不良轨迹)。第三步是使用目标函数评估速度对,该函数输出轨迹分数。第四步和第五步很容易理解:采用当前最佳速度选项并重新计算。

这个DWA规划器依赖于提供障碍物信息的本地代价地图。因此,调整本地代价地图的参数对于DWA本地规划器的最优行为至关重要。接下来,我们将研究前向仿真、轨迹评分、代价地图等参数。

3.1.2 DWA局部规划器:前向模拟

前向模拟是DWA算法的第二步。在这一步中,局部规划器采用机器人控制空间中的速度样本,并检测由这些速度样本表示的圆弧轨迹,最终消除不良速度(其轨迹与障碍物相交的速度)。每个速度样本都被模拟,就好像它应用于机器人一样,由 sim_time(s)参数控制着一定的时间间隔。我们可以认为sim_time是允许机器人使用采样速度移动的时间。通过实验,我们观察到,sim_time的值越长,计算负荷就越重。此外,sim_time变得越长,局部规划器产生的路径就越长,这是合理的。以下是一些关于如何调整sim_time参数的建议。

如何调整sim_time
将sim_time设置为非常低的值(<= 2.0)将导致性能受限,特别是当机器人需要通过狭窄的门道或家具之间的缝隙时,因为没有足够的时间获取实际通过狭窄通道的最佳轨迹。另一方面,使用 DWA 本地规划器,所有轨迹都是简单的弧线,将sim_time设置为非常高的值(>= 5.0)将导致不太灵活的长曲线。这个问题并非不可避免,因为规划器在每个时间间隔(由控制器频率(Hz)控制)后主动重新规划,留下小的调整空间。即使对于高性能计算机,4.0 秒的值应该已经足够。图11:sim_time = 1.5。图12:sim_time = 4.0。
除了 sim_time,还有几个值得我们注意的参数。

速度样本

除了其他参数外,vx_sample和vy_sample决定在x、y方向上进行多少个平移速度样本。vth_sample控制旋转速度样本的数量。您希望采样的数量取决于您有多少计算能力。在大多数情况下,我们更喜欢将vth_samples设置为比平移速度样本更高,因为掉头通常比直线行驶更复杂。如果将max_vel_y设置为零,则不需要在y方向上具有速度样本,因为没有可用的样本。我们选择了vx_sample=20和vth_samples=40。

模拟细化度

sim_granularity是在轨迹点之间取的步长。它基本上意味着轨迹上的点应该被多频繁地检查(测试它们是否与任何障碍物相交)。较低的值意味着更高的频率,这需要更多的计算能力。对于turtlebot大小的移动基础,默认值0.025通常已经足够。

3.1.3 DWA本地规划器:轨迹评分

正如我们所提到的,DWA本地规划器通过最大化一个目标函数来获得最优速度对。在其论文中,这个目标函数的值取决于三个组成部分:接近目标的进展,远离障碍物和前向速度。在ROS的实现中,目标函数的代价计算如下:
cost = path_distance_bias(从轨迹的终点到路径距离
的距离(米))
+goal_distance_bias
(从轨迹的终点到本地目标的距离(米))
+occdist_scale*(轨迹中障碍物代价的最大值(0-254))
目标是获得最小的代价。path_distance_bias是控制本地规划器多少接近全局路径的权重[Furrer等人,2016]。较高的值将使本地规划器更倾向于全局路径。goal_distance_bias是控制机器人尝试达到本地目标的路径权重。实验表明,增加这个参数可以使机器人对全局路径的依赖性降低。

occdist_scale比重是指机器人应该尝试避开障碍物的权重。这个参数设置得太高会导致机器人犹豫不决,无法前进。目前对于SCITOS G5,我们将路径距离偏差设置为32.0,goal_distance_bias设置为20.0,occdist_scale比例设置为0.02。这些参数在模拟中表现良好。

3.1.4 DWA本地规划器:其它参数

目标距离容差 这些参数很容易理解,以下将列出它们在ROS Wiki上的描述:

  • yaw_goal_tolerance(double,默认值:0.05)
    当控制器实现目标时,偏航的容差值(弧度)。
  • xy_goal_tolerance(double,默认值:0.10)
    当实现目标时,控制器在x方向和y方向上的容差值(米)。
  • latch_xy_goal_tolerance(bool,默认值:false)
    如果目标容差被锁定,如果机器人到达目标XY位置,它将简单地原地旋转,即使在此期间它超出了目标容差。
  • 振荡复位
    在穿过门口等情况下,机器人可能会来回振荡,因为其本地规划器会生成导致机器人向两个相反方向移动的路径。如果机器人持续振荡,导航堆栈将让机器人尝试恢复行为。
  • oscillation_reset_dist(double,默认值:0.05)
    机器人必须行驶多少米才能重置振荡标志。

4.代价地图参数

正如上文提到的,调整代价地图参数对于局部规划器的成功非常重要(不仅仅是DWA)。在ROS中,代价地图由静态地图层、障碍物地图层和膨胀层组成。静态地图层直接解释提供给导航栈的静态SLAM地图。障碍物地图层包括2D障碍物和3D障碍物(体素层)。膨胀层是障碍物被膨胀以计算每个2D成本地图单元的成本的地方。此外,还有一个全局代价地图和一个局部代价地图。全局代价地图是通过膨胀提供给导航栈的地图中的障碍物生成的。局部代价地图是通过实时检测机器人传感器中的障碍物生成的。有一些重要的参数应该尽可能地设置好。

4.1 footprint

footprint是移动底座的轮廓。在ROS中,它由一个形如[[x0;y0],[x1;y1],[x2;y2],…]的二维数组表示,不需要重复第一个坐标。这个footprint将被用来计算内切圆的半径和圆形轮廓。通常为了安全考虑,我们希望机器人的接触面比实际轮廓略大。为了确定机器人的接触面,一种最直接的方式是参考机器人的图纸。此外,您还可以手动拍摄底座的俯视图,并使用 CAD 软件(如 Solidworks)对图像进行适当的缩放,然后将鼠标移动到底座轮廓周围并读取其坐标。坐标原点应为机器人的中心。或者,您可以将机器人放在一张大纸上,然后绘制出底座的轮廓。然后选取一些顶点并使用尺子测量其坐标。

4.2 膨胀层

膨胀层由成本为0到255的单元格组成。每个单元格要么被占用,要么没有障碍物,要么未知。图13展示了一个图,说明了如何计算膨胀衰减曲线。膨胀半径inflation_radius和代价缩放因子cost_scaling_factor是决定膨胀的参数。膨胀半径inflation_radius控制了零代价点距离的远近。障碍物的代价缩放因子cost_scaling_factor与单元格的代价成反比,将其设置得更高会使衰减曲线更陡峭。

Pronobis博士建议最佳的costmap衰减曲线是具有相对较低的斜率,以便最佳路径离障碍物尽可能远。优点是机器人更喜欢在障碍物的中间移动。如图8和9所示,从相同的起点和目标出发,当costmap曲线陡峭时,机器人倾向于靠近障碍物。在图14中,膨胀半径inflation _radius=0.55,代价缩放因子cost_scaling_factor=5.0;在图15中,膨胀半径inflation _radius=1.75,代价缩放因子cost_scaling_factor=2.58。

根据衰减曲线图,我们希望设置这两个参数,使膨胀半径几乎覆盖通道,并且代价值的衰减是适度的,这意味着降低代价缩放因子的值。

4.3 costmap分辨率

此参数可以单独设置用于本地costmap和全局costmap。这些因素会影响计算负载和路径规划。当分辨率较低(>=0.05)时,在狭窄的通道中,障碍区域可能会重叠,因此局部规划器将无法找到通行路径。对于全局代价图分辨率,将其保持与导航堆栈提供的地图分辨率相同即可。如果计算能力足够强大,您应该检查激光扫描仪的分辨率,因为在使用gmapping创建地图时,如果激光扫描仪的分辨率低于所需的地图分辨率,就会出现许多小的“未知点”,因为激光扫描仪无法覆盖该区域,如图16所示。

例如,Hokuyo URG-04LX-UG01激光扫描仪的度量分辨率为0.01mm。因此,扫描分辨率<=0.01的地图将需要机器人旋转数次才能清除未知的点。我们发现0.02是足够使用的分辨率。

4.4 障碍层和体素层

这两个层负责在代价地图上标记障碍物。它们可以被统称为障碍层。根据ROS wiki的说法,障碍层跟踪两个维度,而体素层跟踪三个维度。障碍物根据机器人传感器收集到的数据进行标记或清除,并且代价地图会订阅这些数据的话题。在ROS的实现中,体素层继承了障碍层,并且它们都使用激光扫描仪或PointCloud或PointCloud2类型消息来获取障碍物信息。此外,体素层需要深度传感器,例如Microsoft Kinect或ASUS Xtion。3D障碍物最终会被投影到2D代价地图中进行膨胀。体素层的工作原理是,体素是具有一定空间相对位置的三维体积立方体(类似于三维像素),可以用于与其周围的数据或属性相关联,例如其位置是否为障碍物。已经有很多关于通过体素使用深度摄像头进行在线三维重建的研究。以下是其中一些研究的数据来源:https://www.hokuyo-aut.jp/02sensor/07scanner/download/pdf/URG-04LX_UG01_spec_en.pdf。

  • KinectFusion:使用移动深度相机实现实时3D重建和交互
  • Voxel Hashing:实时大规模三维重建

voxel_grid 是一个ROS包,提供了一个高效的三维体素网格数据结构实现,其中包括三种状态的体素:标记、自由和未知。体素网格占据了costmap区域内的所有空间。在每次更新体素层的边界时,根据传感器的观测结果,体素层将标记或移除体素网格中的一些体素。它还执行射线追踪,这部分将在下面讨论。请注意,体素网格不会被重新创建,只有在局部costmap的大小发生变化时才会进行更新。

为什么障碍层和体素层需要射线追踪呢?

射线追踪以呈现逼真的三维图形而闻名,因此它被用于处理障碍可能有些令人困惑。其中一个很重要的原因是机器人传感器可以检测到不同类型的障碍物。请看图17。理论上,我们还可以知道障碍物是刚性的还是柔软的。

一个很好的关于体素光线追踪与多边形光线追踪的博客:http://raytracey.blogspot.com/2008/08/voxel-ray-tracing-vs-polygon-ray.html

有了上面的理解,让我们来看一下障碍层的参数。这些参数是适用于所有传感器的全局过滤器参数。

  • max_obstacle_height:以米为单位将任何障碍物插入到代价地图中的最大高度。该参数应设置为略高于机器人的高度。对于体素层来说,这基本上是体素网格的高度。
  • obstacle_range:机器人与障碍物之间的默认最大距离,以米为单位。这可以在每个传感器上被覆盖。
  • raytrace_range:默认范围,以米为单位,使用传感器数据从地图上追踪障碍物。这可以在每个传感器上被覆盖。这些参数仅用于体素层(VoxelCostmapPlugin)。
  • origin_z:地图在米中的z轴起始点。
  • z_resolution:地图在米/单元的z轴分辨率。
  • z_voxels:每个垂直列中的体素数,网格的高度为z分辨率*z_voxels。
  • unknown_threshold:被认为是“已知”的列中允许的未知单元格数。
  • mark_threshold:被认为是“自由”的列中允许的最大标记单元格数。

实验观察:实验进一步澄清了体素层参数的影响。我们使用ASUS Xtion Pro作为深度传感器。我们发现Xtion的位置很重要,因为它确定了“盲区”的范围,这是深度传感器不能看到任何东西的区域。

此外,表示障碍物的体素仅在Xtion范围内出现障碍物时更新(标记或清除)。否则,某些体素信息将保留,并且它们对代价地图的影响仍然存在。

此外,z_resolution控制z轴上体素的密度。如果它更高,体素层就会更密集。如果值太低(例如0.01),所有体素都会放在一起,因此您将无法获得有用的代价地图信息。如果您将z_resolution设置为较高的值,则您的意图应该是更好地获取障碍物,因此需要增加z_voxels参数,该参数控制每个垂直列中的体素数量。如果在某列中有太多的体素但分辨率不足,则也是无用的,因为每个垂直列的高度有限。图18-20显示了不同体素层参数设置之间的比较。

5 AMCL

amcl是处理机器人定位的ROS(Robot Operating System)软件包。它是自适应蒙特卡罗定位(AMCL)的缩写,也称为粒子滤波定位。该定位技术的原理如下:每个样本存储表示机器人姿态的位置和方向数据。初始时,粒子是随机抽取的。当机器人移动时,粒子根据其当前状态以及机器人的动作使用递归贝叶斯估计进行重新抽样。更多关于AMCL参数调优的讨论将在后面提供。请参考http://wiki.ros.org/amcl获取更多信息。关于原始算法蒙特卡罗定位(MCL)的详细说明,请参阅《Probabilistic Robotics》(Thrun et al.,2005)的第8章。我们现在总结几个可能影响AMCL定位质量的问题。我们希望这些信息能够使本指南更加完整,使您能够从中受益。

通过实验,我们观察到三个影响AMCL定位的问题。正如[Thrun et al., 2005]所述,MCL维护两个概率模型,一个运动模型和一个测量模型。在ROS中,运动模型对应于里程计模型,而测量模型对应于激光扫描模型。在这个基本理解的基础上,我们分别描述以下三个问题。

第一,局部最大值。当机器人旋转或在状态空间中向前移动时,AMCL会生成一组新的粒子进行状态估计。这些粒子的初始位置应该在之前的状态估计周围的高概率区域,但在某些情况下,新的粒子可能在高概率区域之外。这可能会导致AMCL出现局部最大或次优解,从而影响它的定位性能。

第二,过度自适应。AMCL中的自适应过程可以根据测量模型和运动模型中的可信度调整样本的数量。在某些情况下,这可能会导致AMCL对一些未知障碍物或测量偏差进行过度自适应,从而使得状态估计过分依赖于先前的观测数据。

第三,粒子退化。在长时间运动或遇到复杂地形的情况下,可能会导致AMCL粒子集合的退化。在这种情况下,AMCL会在粒子集合中保留数量较少的高置信度粒子,从而影响其定位精度和鲁棒性。

5.1 LaserScan消息中的Header

发布到扫描主题的消息类型为sensor_msgs/LaserScan。此消息包含一个标题,其中的字段取决于您使用的具体激光扫描仪。这些字段包括(从消息文档复制):

  • angle_min(float32)扫描的起始角度[弧度]
  • angle_max(float32)扫描的结束角度[弧度]
  • angle_increment(float32)扫描的起始角度[弧度]
  • time_increment(float32)测量之间的时间[秒] - 如果扫描仪移动,将用于插值3D点的位置
  • scan_time(float32)扫描之间的时间[秒]
  • range_min(float32)最小范围值[m]
  • range_max(float32)最大范围值[m]

我们观察到,在搭载的激光扫描仪产品上,如果这些值未正确设置,则将影响定位的质量(请参见图21和22)。我们已经使用了两个激光扫描仪产品,分别是SICK LMS 200和SICK LMS 291。我们在下面提供参数。参见:http://docs.ros.org/melodic/api/sensor_msgs/html/msg/LaserScan.html\n\n对于LMS 200,感谢这个Github的问题(https://github.com/smichaud/lidar-snowfall/issues/1)。

SICK LMS 200:
{

  • “range_min”: 0.0,
  • “range_max”: 81.0,
  • “angle_min”: -1.57079637051,
  • “angle_max”: 1.57079637051,
  • “angle_increment”: 0.0174532923847,
  • “time_increment”: 3.70370362361e-05,
  • “scan_time”: 0.0133333336562
    }

SICK LMS 291:
{

  • “range_min”: 0.0,
  • “range_max”: 81.0,
  • “angle_min”: -1.57079637051,
  • “angle_max”: 1.57079637051,
  • “angle_increment”: 0.00872664619235,
  • “time_increment”: 7.40740724722e-05,
  • “scan_time”: 0.0133333336562
    }

5.2 测量和运动模型的参数

在amcl程序包中有一些关于调整激光扫描仪模型(测量)和里程计模型(运动)的参数。请参考程序包页面获取完整列表及其定义。详细讨论需要对[MCL算法(Thrun等人,2005)]有很好的理解,本文不再赘述。我们提供了一个微调这些参数并质量化描述其结果的示例。实际使用的参数应该取决于您的激光扫描仪和机器人。

对于激光扫描仪模型,默认参数为:
{

  • “laser_z_hit”: 0.5,
  • “laser_sigma_hit”: 0.2,
  • “laser_z_rand” :0.5,
  • “laser_likelihood_max_dist”: 2.0
    }

为了改善我们机器人的定位效果,我们增加了laser_z_hit and和laser_sigma_hit的值,以包含更高的测量噪声。给出的结果参数为:

图23:默认测量模型参数
图24:调整测量模型参数后(增加噪声)

{

  • “laser_z_hit”:0.9,
  • “laser_sigma_hit”:0.1,
  • “laser_z_rand”:0.5,
  • “laser_likelihood_max_dist”:4.0
    }

如图23和24所示,很明显,在我们的情况下,将噪声加入到测量模型中有助于定位。对于里程计模型,我们发现里程计在稳定性方面非常可靠。因此,我们调整了参数,使算法假设里程计的噪声很低:

{

  • “kld_err”:0.01,
  • “kld_z”:0.99,
  • “odom_alpha1”:0.005,
  • “odom_alpha2”:0.005,
  • “odom_alpha3”:0.005,
  • “odom_alpha4”:0.005
    }

为了验证上述运动模型参数是否有效,我们还尝试了一组建议使用噪声里程计模型的参数:

  1. “kld_err”: 0.10
  2. “kld_z”: 0.5
  3. “odom_alpha1”: 0.008
  4. “odom_alpha2”: 0.040
  5. “odom_alpha3”: 0.004
  6. “odom_alpha4”: 0.025

我们观察到当里程计模型嘈杂程度较低时,粒子更加聚集。相反,当嘈杂程度较高时,粒子会更加分散。

5.3 激光雷达扫描的转换

有一个 tf 变换,用于将laser_link转换到base_footprint或base_link坐标系中,以指示激光雷达相对于机器人底盘的位置。如果此转换不正确,定位行为很可能会出现奇怪的行为。在这种情况下,我们观察到从环境的墙壁上读取的激光数据不断偏移,以及定位的突然剧烈变化。确保转换正确非常简单;这通常在机器人的 URDF 和 SRDF 规范中处理。但是,如果您使用 rosbag 文件,则可能需要自己发布转换。

6. 恢复行为

机器人导航的一个令人烦恼的问题是机器人可能会被卡住。很幸运的是,导航栈内置了恢复行为。即便如此,有时机器人也会用尽所有可用的恢复行为而不动。因此,我们可能需要找到更为强大的解决方案。ROS导航有两种恢复行为,它们分别是清除代价地图恢复和旋转恢复。清除代价地图恢复基本上是将本地代价地图还原为与全局代价地图相同的状态。旋转恢复是通过原地旋转360度进行恢复。解除机器人的堵塞有时旋转恢复由于旋转失败而无法执行。此时,机器人可能会放弃,因为它已经尝试了所有的恢复行为-清除代价地图和旋转。在大多数实验中,我们观察到当机器人放弃时,实际上有许多方法可以解决机器人的堵塞问题。为了避免放弃,我们使用SMACH不断尝试不同的恢复行为。除常规恢复行为外,还有一些额外的方法可以提高机器人的耐用性并将其从先前无望的狭窄空间中解救出来,例如设置一个距离机器人非常近的临时目标,并返回到先前访问的姿势(即后退)。图25:SMACH中的简单恢复状态。

参数
通常情况下,ROS恢复行为的参数可以保持默认值。对于清晰的代价地图恢复,如果你的模拟时间(sim_time)相对较高,即路径比较长,你可能需要考虑增加重置距离参数,这样可以移除更大区域的本地代价地图,并且有更好的机会让本地规划器找到一条路径。

7 动态重构

ROS导航中最灵活的方面之一就是动态重构,因为不同的参数设置可能对某些情况更有帮助。这里有一个我在移动机器人导航上的视频演示:https://youtu.be/1-7GNtR6gVk, 当机器人靠近目标时,通常不需要进行过多的动态重新配置。在我们的实验中观察到的一种情况是,即使机器人不需要或者不应该这么做,它也有很大可能会偏离全局路径。因此,我们增加了路径距离的偏差。由于较高的路径距离偏差会让机器人坚持全局路径,但由于误差造成的偏离并不能实际上导致最终目标的达成,因此我们需要一种方法,让机器人在靠近目标时能够毫不犹豫地到达目标。我们选择动态减少路径距离偏差,以强调目标距离偏差。总之,进行更多的实验是找出问题并找到解决方案的最终途径。

8 问题

  1. 卡住了
    这是我们在使用 ROS 导航时经常遇到的问题。在模拟和实际情况下,机器人会卡住并放弃目标。

  2. 不同方向的速度不同
    我们观察到导航栈的一些奇怪行为。当目标相对于 TF 原点设置在负 x 方向时,局部规划器会规划得不够稳定(局部规划轨迹会跳动),机器人移动速度非常慢。但是,当目标设置在+x方向时,dwa本地规划器更加稳定,机器人可以移动得更快。我在Github上报告了这个问题,链接为:https://github.com/ros-planning/navigation/issues/503 。目前还没有人尝试解决它。

  3. 现实与模拟

现实与模拟存在差异。在现实中,存在更多具有各种形状的障碍物。例如,在实验室里有一根竖直的棍子,用于撑门。由于它太细,机器人有时无法检测到它并撞上了它。现实中还存在更复杂的人类活动。

  1. 不一致性

使用ROS导航堆栈的机器人可能表现出不一致的行为,例如进入门时,本地代价地图会一遍又一遍地生成,每次略有不同,这可能会影响路径规划,特别是当分辨率较低时。此外,机器人没有记忆。它不记得上次是如何从门进入房间的。因此需要重新进行规划。每次尝试进入门时,机器人都会重新开始。因此,如果它以不同的角度进入门,它可能会卡住并放弃尝试。

参考文献

[Brock and Khatib, 1999] Brock, O. and Khatib, O.(1999).High-speed navigation using the global dynamic window approach.In Proceedings 1999 IEEE International Conference on Robotics and Automation (Cat.No.99CH36288C) , volume 1, pages 341-346.IEEE.

[Fox et al., 1997] Fox, D., Burgard, W., and Thrun, S. (1997).The dynamic window approach to collision avoidance.IEEE Robotics & Automation Magazine , 4(1):23-33.

[Furrer et al., 2016] Furrer, F., Burri, M., Achtelik, M., , and Siegwart, R. (2016).Robot operating system (ros): The complete reference (volume 1) .by A. Koubaa.Cham: Springer International Publishing.

[Thrun et al., 2005] Thrun, S., Burgard, W., and Fox, D. (2005).Probabilistic robotics .MIT press.


机器人系统ROS导航调优指南
https://qiangsun89.github.io/2023/05/30/机器人系统ROS导航调优指南/
作者
Qiang Sun
发布于
2023年5月30日
许可协议