借用前辈郑开宇基本调试指南经验,谈一谈对于配置、调参、优化这些到底应该怎么做,经验之谈.
三个组件检查:距离传感器,里程计和定位。
如果机器人没有从其距离传感器(例如激光器)获取信息,那么导航将不起作用。首先确保可以在rviz中查看传感器信息,它看起来相对正确(一般判断激光点是否跟障碍物对齐),并以预期的速度在刷新。
最后确认建图导航中是否为需要的传感器数据topic以及link是否正确。
里程计是一个很不确定的因素,大部分移动机器人是有编码器的,编码器本身会有少量误差,但是加上轮子摩擦空转、地面不平、机器人驱动结构(二轮差动、四轮差动、全向轮)等因素影响,会累计出很大的误差,尤其是原地旋转,通常情况下可以加入IMU等数据进行融合重新计算里程计数据,如果使用得当,里程计误差便可以控制在很好的范围。然而,又是然而,IMU的安装位置是机械的,如何标定IMU的准确相对位置是困难的,不过通常良好的机械安装会使计算后的里程在可控范围内,所以,使用EKF等融合数据时,一定要保证IMU位置与数据的准确,否则只会让里程计信息雪上加霜。
第一个测试检查角速度是否合理。打开rviz,将坐标系设置为“odom”,显示机器人提供的激光扫描,将该主题的衰减时间设置为高(类似20秒),并执行原地旋转。然后,我看看扫描出来的边线在随后的旋转中如何相互匹配。理想情况下,每次扫描将刚好落在相互的顶端,会重叠在一起,但是有些旋转漂移是预期的,所以我只是确保扫描之间误差,不会超过一度或两度以上。
第二个测试检查线速度是否合理。机器人放置在与距离墙壁几米远地方,然后以上面相同的方式设置rviz。接着我将驱动机器人向墙壁前进,从rviz中聚合的激光扫描看看扫描出来边线的厚度。理想情况下,墙体应该看起来像一个扫描,但我只是确保它的厚度不超过几厘米。如果显示扫描边线的分散在半米以上,但有些可能是错误的测距。
其他的测试角速和线速方法:
线速标定:http://www.ncnynl.com/archives/201701/1217.html
角速标定:http://www.ncnynl.com/archives/201701/1218.html
线速标定:http://www.ncnynl.com/archives/201707/1812.html
角速标定:http://www.ncnynl.com/archives/201707/1813.html
假设里程计和激光扫描仪都能合理地执行,建图和调整AMCL通常并不会太糟糕。首先,运行gmapping或者hector啥的,操控机器人来生成地图。然后使用该地图与AMCL,并确保机器人保持定位。通常是需要设置一个大概的初始位置,稍微移动机器人,就可以看到激光与障碍物对齐了。
最大/最小速度和加速度是移动基座的两个基本参数,正确设置对优化本地规划器行为有很大帮助.在ROS中有平动和旋转的两种速度/加速度。
加速度与速度,对于规划的影响就很神奇,不同的加速度,速度,最大最小速度,最大加速度,前进速度与转弯速度的组合,各种组合就是会有不一样的效果,想要获得好的效果只能多次尝试不同组合,对于不同的机器人效果也不近相同,还有controller的频率也会影响最后的输出速度。
通常可以参考移动底盘手册,找到最大速度.还可以订阅odom话题,控制机器人运动,直线运动和原地旋转运动分别可以一个恒定值,便是最大平动速度和旋转速度,为了安全一般我们设置低于最大值.
同样可以在手册中找到.若不能再次使用里程计参数,根据机器人到达最大速度的时间,最大速度,位置或角度,可以计算出最大加速度.
这里的最小值我们设置为较大的负值,因为需要机器人后退,以及在任意方向旋转.注意:DWA Local Planner采用机器人最小转速的绝对值.
X方向速度为平行于机器人直线运动的方向的速度,与平动速度相同.Y方向速度为垂直于机器人直线运动方向的速度.对于非完整机器人,如两轮差速机器人,需将Y轴方向速度设置为0.
move_base的运行依赖于global planner和local planner.这里有三个nav core::BaseGlobal Planner 的接口: carrot planner, navfn and global planner.
global planner通常是我们喜欢使用的,下面讨论一些关键参数.并非所有参数在ROS网站,这时使用rqt的参数重新配置程序,可以看到所有参数
rosrun rqt_reconfigure rqt_reconfigure
将参数 allow_unknown(true) use_dijkstra(true) use_quadratic(true) use_grid_path(false) old_navfn_behavior(false) 设置成默认.如果需要查看potential map,将visualize potential(false)设置成true可能会很有帮助
除了这些参数外,还有三个未列出的参数实际上决定了计划全局路径的质量。成本因素、中性成本、致命成本。实际上,这些参数也出现在NAVFN中。源代码2有一段解释navfn如何计算成本值。
navfn cost value的设置:
cost = COST NEUTRAL + COST FACTOR * costmap cost value
costmap cost values的输入值在0到252之间.
在成本中性值为50的情况下,成本系数需要大约为0.8,以确保输入值在输出范围(50到253)上均匀分布。如果成本因素更高,成本值将在障碍物周围有一个高原,然后规划者将(例如)把狭窄走廊的整个宽度视为同样不可取的,因此不会规划沿着中心的路径.
实验证明。将成本系数设置为过低或过高会降低路径的质量。这些路径有不经过每边障碍物的中间,曲率相对平缓。极端中性的成本值也有同样的效果。对于致死成本,即使可行路径明显,将其设置为低值也可能导致无法生成任何路径。图5-10显示了成本因素和中性成本对全球路径规划的影响。绿线是全球规划师制定的全球路径。经过几次实验,我们发现当cost factor=0.55,neutral cost=66,lethal cost=253时,全局路径是比较理想的。
Local planners依赖于nav core::BaseLocalPlanner interface的接口:
dwa local planner eband local planner teb local planner
它们使用不同算法生成速度命令.我们通常选择DWA.
dwa_local_planner采用了Dynamic Window Approach(DWA)算法
算法基本思想:
DWA的目标是产生一个(v,ω)对,它表示一个最适合机器人的局部状况。DWA通过搜索下一个时间间隔。这个空间的速度被限制在允许范围内,这意味着机器人必须能够在到达最近的障碍物之前停止。由这些容许速度决定的圆形轨道。而且,DWA只会考虑动态窗口中的速度,该窗口定义为在给定当前平移和旋转速度和加速度的情况下,在下一个时间间隔内可到达的一组速度对。DWA最大化了一个目标函数,这取决于:
(1)抵达目标的进度(2)障碍物空间(3)前进速度产生最佳速度对。
算法摘要:第一步是在动态窗口中的速度空间中采样速度对(v x,v y,ω)。第二步基本上是消除速度(即消除不良轨道),这是不允许的。第三步是使用OBJEC评估速度对.输出轨迹得分的动态函数。第四步和第五步很容易理解,选择当前的最佳速度选项并重新计算。
这个DWA计划依赖于提供障碍信息的本地成本图信息。因此,调整局部成本图的参数对于优化DWA Local planner的行为。接下来,我们将在正向模拟中查看参数,轨迹评分,成本地图等等。
前向仿真是DWA算法的第二步。在这一步中,local planner在机器人的控制空间中提取速度样本,并检查这些速度样本所代表的圆形轨迹,最终消除不良速度(轨迹与障碍物相交的速度)。每一个速度样本都被模拟,就好像它被应用到机器人上一个设定的时间间隔,由模拟时间(s)参数控制。我们可以把sim_time看作是机器人以采样速度移动所允许的时间。
实验结果表明,模拟时间越长,计算量越大。另外,当仿真时间变长时,local planner的路径也会变长,这是合理的。下面是一些关于如何调整此sim_time参数的建议。
如果将sim_time设置为一个非常低的值(<=2.0),将导致性能受限,特别是当机器人需要通过狭窄的门口或家具之间的间隙时,因为没有足够的时间来获得实际通过狭窄通道的最佳轨迹。另一方面,由于有了DWA Local planner,所有的轨迹都是简单的圆弧,将sim_time设置为一个非常高的值(>=5.0)将导致不太灵活的长曲线。这个问题并不是不可避免的,因为计划员在每个时间间隔(由控制器频率(hz)控制)后都会主动重新规划,这为小的调整留出了空间。即使对于高性能计算机,4.0秒的值也应该足够。
除了sim_time之外,其他一些值得关注的参数.
速度样本和其他参数 vy_sample,vy_sample决定了在x,y方向要取多少平移速度样本。vy_sample控制旋转速度样本的数量。您希望采集的样本数量取决于您拥有多少计算能力。在大多数情况下,我们倾向于将vy_sample设置为高于平动速度样本,因为转弯通常比直行更复杂。如果将max_vel_y设置为0,则无需在y方向上进行速度采样,因为没有可用的采样。我们选取vy_sample=20,vy_sample=40。
模拟粒度 sim_granularity是在轨迹上的点之间采样的步长。它基本上意味着应该检查轨迹上的点的频率(测试它们是否与任何障碍物相交)。较低的值意味着较高的频率,这需要更多的计算能力。默认值0.025通常足以满足Turtlebot大小的移动基础。
如上所属,DWA Local Planner 最大化目标函数来获得最佳路径.DWA最大化了一个目标函数,取决于:
(1)抵达目标的进度(2)障碍物空间(3)前进速度产生最佳速度对。
目标函数的成本计算如下:
cost = path distance bias ∗ (distance(m) to path from the endpoint of the trajectory) +
goal distance bias ∗ (distance(m) to local goal from the endpoint of the trajectory) +
occdist scale ∗
(maximum obstacle cost along the trajectory in obstacle cost (0-254))
目标是获得最低的成本。path_distance_bias是Local应保持接近Global planner的程度的权重。高值将使Local planner更喜欢全局路径上的轨迹。
goal_distance_bias是指机器人在任何路径下,都应尝试达到local goal的权重。实验表明,增加该参数可以减少机器人对全局路径的依赖。
occdist_scale是机器人应避免多少障碍物的权重。此参数的高值会导致不确定的机器人卡入到位。目前,对于Scitos G5,我们将path_distance_bias设置为32.0,goal_distance_bias设置为20.0,occdist_scale设置为0.02。它们在仿真方面工作得很好。
Goal distance tolerance
Oscilation reset 如在通过门口等情况下,机器人可以来回摆动,因为它的本地规划者正在生成通向两个相反方向的路径。如果机器人持续抖动,导航堆栈将让机器人尝试其恢复行为。
如上所述,成本图参数的调整对于本地规划者的成功至关重要(不仅对于DWA)。在ROS中,代价地图由静态地图层、障碍地图层和膨胀层组成。静态地图层直接解释提供给导航堆栈的给定静态SLAM地图。障碍物地图层包括二维障碍和三维障碍(三维像素层)。膨胀层是一个障碍物膨胀的地方,用来计算每个二维成本图单元的成本。
此外,还有一个global costmap和一个local costmap。global costmap是通过向导航点提供的地图上的障碍物膨胀而生成的。通过对机器人传感器实时检测到的障碍物进行膨胀,生成local costmap。
有许多重要的参数应该设置得尽可能好。
足迹是移动基地的轮廓。在ROS中,它由一个二维数组表示,其形式为[X 0,Y 0]、[X 1,Y 1]、[X 2,Y 2]、…],无需重复第一个坐标。该足迹将用于计算内接圆的半径和外接圆,以适合机器人的方式进行膨胀.通常为了安全,我们希望轮廓要比机器人真实的形状大.
要确定机器人的足迹,最简单的方法是参考机器人的图纸。此外,还可以手动拍摄其底部的俯视图。然后使用CAD软件(如SolidWorks)适当地缩放图像,并将鼠标移动到基础轮廓周围,读取其坐标。坐标的原点应该是机器人的中心。或者,你
可以在一张大纸上移动你的机器人,然后画出底座的轮廓。然后选择一些顶点并使用标尺计算出它们的坐标。
膨胀层由成本在0到255之间的单元组成。每个单元要么被占用,没有障碍,要么是未知的。图13说明了如何计算通货膨胀衰减曲线。
inflation radius和cost scaling factor是决定膨胀的参数。inflation radius控制着零成本点离障碍物的距离。cost scaling factor与单元成本成反比。设置得更高会使衰减曲线更陡.
Pronobis博士建议,最佳的Costmap衰减曲线是一条坡度相对较低的曲线,因此,最佳路径尽可能远离两侧的障碍物。其优点是机器人更喜欢在障碍物中间移动。如图8和图9所示,在相同的起点和目标下,当Costmap曲线陡峭时,机器人倾向于接近障碍物。在图14中,通货膨胀半径=0.55,成本比例系数=5.0;在图15中,通货膨胀半径=1.75,成本比例系数=2.58
在衰减曲线图的基础上,对这两个参数进行设置,使膨胀半径几乎覆盖了腐蚀体,且成本值衰减适中,这意味着降低了cost scaling factor的值。
本地代价地图和全局代价地图可以分别设置此参数。它们影响计算负载和路径规划。当低分辨率(>=0.05)时,在狭窄的通道中,障碍区域可能会重叠,因此local planner无法找到通过的路径。
对于全局代价地图分辨率,它足以保持与提供给导航堆栈的地图的分辨率相同。如果你有足够的计算能力,你应该看看激光扫描仪的分辨率,因为当使用gmapping创建地图,如果激光扫描仪的分辨率低于您所需的地图分辨率,将会有很多小的“未知点”,因为激光扫描仪无法覆盖该区域,如图16所示。
例如,Hokuyo URG-04LX-UG01激光扫描仪的公制分辨率为0.01mm。因此,扫描分辨率<=0.01的地图需要机器人旋转几次以清除未知的点。我们发现0.02是一个足够的解决方案。
这两个层负责在Costmap上标记障碍物。它们可以统称为障碍层。根据Roswiki,障碍层是二维的,而体素层是三维的。根据机器人传感器的数据,对障碍物进行标记(检测)或清除(清除),该传感器具有costmap可订阅的主题。
在ROS实现中,体体素继承了障碍层,它们都通过解析激光扫描或使用PointCloud或PointCloud2类型消息发送的数据来获取障碍信息。此外,体素层需要深度传感器,例如作为Microsoft Kinect或Asus Xtion。三维障碍物最终会被投影到二维成本图中用于膨胀。
体素层如何工作 体素是三维立方体(想想三维像素),它在空间中具有一定的相对位置。它可用于与它附近的体积数据或所有物的属性相关联,例如,它的位置是否是障碍物。关于利用体素进行深度相机在线三维重建的研究还比较多。这里有一些。
体素网格是一个ROS包,它提供了一个高效的3D体素网格数据结构的实现,该数据结构存储了三种状态的体素:标记、自由、未知.体素网格占据Costmap区域内的体积。在体素层边界的每次更新过程中,体素层将根据传感器的观察标记或删除体素网格中的某些体素。它还执行光线跟踪,这将在下面讨论。请注意,更新时不会重新创建体素网格,只有在更改本地Costmap的大小时才会更新。
为什么在障碍层和体素层进行光线跟踪?光线跟踪最著名的是渲染逼真的三维图形,所以可能会疑惑为什么在处理障碍物时使用它。一个很大的原因是机器人的传感器可以检测到不同类型的障碍物。看看图17。理论上,我们还能够知道障碍物是硬的还是软的。
有了以上的理解,让我们研究障碍物层的参数。这些参数是适用于所有传感器的全局过滤参数.
max obstacle height:插入成本地图的障碍物的最大高度,单位为米。此参数应设置为略高于机器人的高度。对于体素层,这基本上是体素网格的高度。
obstacle range:与机器人的默认最大距离,障碍物将插入成本图中,单位为米。这可以在每个传感器的基础上分开进行。
raytrace range:使用传感器数据从地图中对障碍物进行光线跟踪的默认范围,单位为米。这可以在每个传感器的基础上分开进行。
这些参数仅用于体素层(VoxelCostMapPlugin)。
origin z:地图的z原点,单位为米。
z resolution:地图的Z分辨率,单位为米/格。
z voxels:每个垂直列中的体素数量,网格高度为z_resolution * z_voxels。
unknown threshold:列con中允许的未知单元格数被认为是“已知的”
mark_threshold:列中允许的标记单元格的最大数目被认为是“免费的”。
实验观察
实验观察实验进一步阐明了体素层参数的影响。我们使用Asus Xtion Pro作为深度传感器。我们发现X离子的位置决定了“盲区”的范围,即深度传感器看不到任何东西的区域。
此外,仅当障碍物出现在局部代价地图更新范围内时,表示障碍物的体素才会更新(标记或清除)。否则,一些体素信息将保留,它们对Costmap膨胀的影响仍然存在。此外,Z分辨率控制体素在Z轴上的密度。如果它更高,体素层更密集。如果该值太低(例如0.01),所有体素将被组合在一起,因此您将无法获得有用Costmap信息。如果将Z分辨率设置为更高的值,您的目的应该是更好地获取障碍,因此需要增加Z体素参数,该参数控制多少个体素。在每个垂直列中。如果一列中的体素太多,但分辨率不够,这也是无用的,因为每个垂直列都有高度限制。
AMCL是一个处理机器人定位的ROS包。它是自适应蒙特卡罗定位(AMCL)的缩写,也称为粒子滤波器定位。这种定位技术的工作原理是这样的:每个样本存储一个代表机器人姿势的位置和方向数据。最初,所有粒子都是随机取样的。当机器人移动时,根据粒子的当前状态以及机器人的动作,采用递归贝叶斯估计对粒子进行重采样。
现在总结几个可能会影响amcl定位精度的问题.
通过实验,我们观察到影响AMCL定位的三个问题。如[Thrun et al.,2005]所述,MCL维持两个概率模型,一个运动模型和一个测量模型。在ROS AMCL中,运动模型对应一个里程计模型,而测量模型对应一个激光扫描模型。根据这一总体理解,我们描述了三个问题分别如下。
发布到扫描主题的消息类型为sensor msgs/LaserScan。此消息包含一个标题,其字段取决于您使用的特定激光扫描仪。这些字段包括(从消息文档中复制)
angle min (float32)扫描开始角度[rad]
angle max (float32)结束角度[rad]
angle increment(float32) 扫描起始角度[rad]
time increment(float32) 时间[秒]-如果扫描仪正在移动,这将用于插入三维点的位置。
scan time(float32)扫描间隔时间[秒]
range min(float32)最小范围值[m]
range max(float32)最大范围值[m]
AMCL包中列出了有关调整激光扫描仪模型(测量)和里程计模型(运动)的参数。有关完整列表及其定义,请参阅包页面。详细的讨论需要对[Thrun等人,2005]中的MCL算法有很好的理解,这里我们省略了这一点。我们提供了一个微调这些参数的例子,并定性地描述了它们的结果。你使用的实际参数应该取决于你的激光扫描仪和机器人。
为了改善机器人的定位,我们增加了激光Z击和激光sigma击,以包含更高的测量噪声。结果参数为:(此处实验未观察出理想变化)
对于激光扫描仪型号,默认参数为:
里程计模型的噪声较小时,粒子相对集中,反之则相对发散
有一个从laser link 到 base footprint 或 base link的TF变换,指示激光扫描仪相对于机器人底盘的姿态。如果这种转换不正确,则很可能是本地化行为异常。在这种情况下,我们观察到墙上的激光读数不断变化以及本地化的突然剧烈变化。它非常简单,可以确保转换是正确的;这通常在您的机器人的URDF和SRDF规范中处理。但是,如果您使用的是Rosbag文件,那么您可能需要自己发布转换。
机器人导航的一个恼人之处是机器人可能会被卡住。幸运的是,导航堆栈内置了恢复行为。即使如此,有时机器人也会尝试完所有回复行为变成静止。因此,我们可能需要找出一个更健壮的解决方案。
恢复行为类型 ROS导航有两种恢复行为。它们是clear_costmap_recovery和rotate_recovery。清除代价地图恢复基本上是将本地代价地图复原为与全局代价地图相同的状态。旋转恢复是通过原地旋转360度来恢复。
解开机器人 有时会因为旋转失败而无法执行旋转恢复。在这一点上,机器人可能会放弃,因为它已经尝试了所有的恢复行为-清除成本图和旋转。在大多数实验中,我们观察到当机器人放弃时,实际上有很多方法可以解开机器人。为了避免放弃,我们不断尝试不同的恢复行为,还有一些额外的目标,比如设定一个非常接近机器人的临时目标,回到以前去过的姿势(即后退)。这些方法的结果是,大大提高了机器人的耐久性,并从我们的实验观察中把它从以前没有希望的狭窄空间中解开。
参数 ROS恢复行为的参数通常可以保留为默认值。对于清晰的成本地图恢复,如果您的sim_time相对较高,这意味着轨迹较长,您可能需要考虑增加reset_distance,以便删除本地代价地图上较大的区域,并且本地规划人员有更好的机会找到路径。
ROS导航最灵活的一个方面是动态重构,当机器人接近目标时不同的参数设置可能对某些情况更有帮助。然而,没有必要进行大量的动态重构。
例如,我们在实验中观察到的一种情况是,即使在不必要或不好的情况下,机器人也倾向于脱离全局路径。因此我们增加了path_distance_bias。由于高path_distance_bias会使机器人坚持全局路径,这实际上不会导致最终目标由于公差,我们需要一种方法让机器人毫不犹豫地达到目标。我们选择动态减少path_distance_bias,这样当机器人接近目标时,goal_distance_bias会被强调。毕竟,做更多的实验是找到问题并找出解决方案的最终方法。
一旦我的机器人满足导航的先决条件,我想确保代价地图的设置和配置正确。我会在如何配置ROS导航教程和costmap_2d文档详细说明,但是我会给出一些我经常做的事情的提示。
如下建议可用来调整代价地图:
确保根据传感器实际发布的速率为每个观测源设置expected_update_rate参数。我通常在这里给出相当的容忍度,把检查的期限提高到我期望的两倍,但是当传感器低于预期速率时,它很容易从导航中接收警告。
为系统适当设置transform_tolerance参数。查看使用tf从“base_link”坐标系到“map”坐标系的转换的预期延迟。我通常使用tf_monitor查看系统的延迟,并将参数保守地设置为关闭。另外,如果tf_monitor报告的延迟足够大,我可能会随时看看导致延迟的原因。这有时会导致我发现关于给定机器人的变换如何发布的问题。
在缺乏处理能力的机器人上,我会考虑关闭map_update_rate参数。然而,在这样做时,我考虑到这将导致传感器数据快速进入代价地图的延迟,这反过来会降低机器人对障碍物的反应速度。
该publish_frequency参数是在rviz可视化costmap有用。然而,特别是对于大型全局地图,该参数可能导致事情运行缓慢。在生产系统中,我考虑降低成本图发布的速度,当我需要可视化非常大的地图时,我确定设置速度真的很低。
是否对代价地图使用voxel_grid或costmap模型的决定在很大程度上取决于机器人具有的传感器套件。调整代价地图为基于3D-based代价地图更多是涉及未知空间的考虑。如果我正在使用的机器人只有一个平面激光,我总是使用costmap模型的地图。
有时,它只能在里程坐标系中运行导航。要做到这一点,我发现最容易做的事情就是我的复制local_costmap_params.yaml文件覆盖global_costmap_params.yaml文件并更改了地图宽度和高度比如10米。如果需要独立的定位性能来调整导航,这是一个简单易行的方法
我倾向于根据机器人的尺寸和处理能力选择我使用的地图的分辨率。在具有很多处理能力并需要适应狭窄空间的机器人,如PR2,我会使用细粒度的地图…将分辨率设置为0.025米。对于像roomba这样的东西,我可能会以高达0.1米的分辨率去降低计算量。
Rviz是验证代价地图正常工作的好方法。我通常从代价地图中查看障碍物数据,并确保在操纵杆控制下驱动机器人时,它与地图和激光扫描相一致。这是对传感器数据以合理的方式进入代价地图的合理检查。如果我决定用机器人跟踪未知的空间,主要是这些机器人正在使用voxel_grid模型的代价地图,我一定要看看未知的空间可视化,看看未知的空间被以合理的方式清除。是否正确地从代价地图中清除障碍物的一个很好的检查方法是简单地走在机器人的前面,看看它是否都成功地看到我,并清除我。
当导航包仅运行costmap时,检查系统负载是一个好主意。这意味着提高move_base节点,但不会发送目标点并查看负载。如果计算机在这个时候陷入僵局,我知道如果我想要运行规划器的话,我需要做一些CPU参数调整。
如果通过代价地图的操作令人满意,我将继续调整局部规划器参数。在具有合理加速度限制的机器人上,我通常使用dwa_local_planner,对于那些具有较低加速度限制的机器人,并且可以从每个步骤考虑到加速限制的,我将使base_local_planner。调整dwa_local_planner比调整base_local_planner更为愉快,因为它的参数是动态可配置的。为导航包添加dynamic_reconfigure也已经在计划中。针对规划器的提示:
对于给定的机器人最重要的是,正确设置了加速度限制参数。如果这些参数关闭,只能期望来自机器人的次优行为。如果我不知道机器人的加速度极限是什么,我会花点时间写出一个脚本,让电机以最大平移和旋转速度命令运行一段时间,看看报告的里程计速度(假设里程会给出合理的估计),并从中得出加速度极限。合理设置这些参数可以节省很多时间。
如果我正在使用的机器人具有低加速度限制,我确保我正在运base_local_planner,其中dwa设置为false。将dwa设置为true后,我还将确保根据处理能力将vx_samples参数更新为8到15之间的值。这将允许在展示中生成非圆形曲线。
如果我正在使用的机器人的定位并不是很好,我将确保将目标公差参数设置得比我想象的要高一些。如果机器人具有较高的最小旋转速度以避免在目标点的振荡,那么我也将提高旋转公差。
如果我使用低分辨率的CPU原因,我有时会提高sim_granularity参数,以节省一些周期。
我实际上很少发现自己改变了path_distance_bias和goal_distance_bias(对于base_local_planner这些参数被称为pdist_scale和gdist_scale)参数在计划者上非常多。当我这样做时,通常是因为我试图限制本地规划器自由,让计划的路径与除NavFn以外的全局规划器合作。将path_distance_bias参数增大,将使机器人更紧密地跟随路径,同时以快速向目标向前移动。如果这个值设置得太高,机器人将会拒绝移动,因为移动的代价大于停留在路径上的位置。简单来说就是让实际移动更接近全局路径还是本地路径。
如果我想以聪明的方式介绍代价函数,我将确保将meter_scoring参数设置为true。这使得它在代理函数中的距离以米而不是单元格,也意味着我可以调整一个地图分辨率的代价函数,并且当我移动到他人时期望合理的行为。此外,您现在可以通过将publish_cost_grid参数设置为true来显示本地计划程序在rviz中生成的代价函数。(这不管怎么说,从来没有把它放入文档,我会很快到那个时候)。考虑到以米为单位的代价函数,我可以计算出移动1米的成本与目标平衡的成本的折衷。这倾向于给我一个如何调整东西的体面的想法。
轨迹从其端点得分。这意味着将sim_time参数设置为不同的值可能对机器人的行为有很大的影响。我通常将此参数设置在1-2秒之间,其中设置更高可以导致稍微平滑的轨迹,确保乘以sim_period的最小速度小于目标的两倍。否则,机器人将倾向于在其目标位置的范围之外的位置旋转,而不是朝向目标移动。
精确的轨迹模拟也取决于距离测距的合理速度估计。这来自于dwa_local_planner和base_local_planner都使用这种速度估计以及机器人的加速度限制来确定规划周期的可行速度空间。虽然来自测距的速度估计不一定是完美的,但确保其至少接近得到最佳行为是重要的。
注:非原创,总结
比较好的测试建图的方式,是对闭环回环进行建图,观察闭环效果,有可能两侧是不对称的,效果就不太好,多次建图效果不一样,对于规则闭环算法会有一定的校准但是非常有限,效果不好.建图过程中控制适当速度,尽量不要走直线,尤其是在特征变化较少的长廊中,车可能会认为自己没动,导致定位发生偏移,好的时候会自动校准,不好的时候会直接建一张新的图发生重叠.反向建图进行补全,为了避免失败概率,正向先保存一次,反向因为需要补全的特征太少,很容易发生偏移,能够即使校准是好的,失败时便挂了,反向完成闭环时也非常容易发生问题,实验中直接在错误的方向建了重叠的地图,越错越严重.地图中的黑点可以直接用修图工具抹掉,在local中同样可以识别,让地图更加完美.
在建图完成的情况下
首先确定amcl定位是否准确,粒子发散与集中,转动机器人,粒子会聚合,能够观察到定位是否准确(frame可能需要换)原地转会不会飘
调整move_base 参数尽量从默认值开始,观察,根据机器人情况更改一些基础参数,观察效果,继续调整,遇到速度值太小,车不动dwa_local_planner无法直接规划路线,需要等待一会开始recover,或者推一下才能开始规划,尝试调大效果好一些
加速度值大小,如加速度太小转弯慢,弯会很大,距离近或者方向相反就会绕远
效果不理想,有可能时定位跟不上
rosrun rqt_reconfiger rqt_reconfiger 手动调整参数(文件名不对tab)
rosrun rviz rviz -d rospack find rbx1_nav
/sim.rviz
local_costmap算法更改效果改善
y轴速度的影响,给y轴速度值,车起速会直接冲出去,给为零之后,车会先往前一小段再转弯,但是会稳定流畅很多,不会很猛,适当调整速度与加速度的值,可以让车的运动稳定流畅.
全局地图与本地地图全部更新效果好于只更新本地地图,会导致膨胀效果不好,车还是会冲进半径不能完全绕开,同时更新两个的同时,调整两个膨胀半径大小,找到车比较合适的避障大小.
第一次调试遇到遇到问题:
思考解决办法:occdist_scale 与goal_distance_bias权重的设置会影响路径,膨胀半径与成本系数的合理设置,影响成本曲线,在尽量使膨胀半径覆盖更新区域的同时,让成本值衰减适中.