ROS与navigation教程——基本导航调整指南

 

说明:

  • 介绍如何调整机器人上的ROS导航包

步骤:

(1) 机器人导航需要那些准备?

在调整新机器人上的导航包时遇到的大部分问题都在本地规划器调谐参数之外的区域。机器人的里程计,定位,传感器以及有效运行导航的其他先决条件常常会出错。所以,我做的第一件事是确保机器人本身正在准备好导航。这包括三个组件检查:距离传感器,里程计和定位。

  • 距离传感器

如果机器人没有从其距离传感器(例如激光器)获取信息,那么导航将不起作用。我将确保我可以在rviz中查看传感器信息,它看起来相对正确,并以预期的速度进入。

  • 里程计

通常我会很难使机器人正确定位。它将不断迷失,我会花费大量的时间调试AMCL的参数,发现真正的罪魁祸首是机器人的测距。因此,我总是运行两个健全检查,以确保我相信机器人的里程计。

第一个测试检查角速度是否合理。我打开rviz,将坐标系设置为“odom”,显示机器人提供的激光扫描,将该主题的衰减时间设置为高(类似20秒),并执行原地旋转。然后,我看看扫描出来的边线在随后的旋转中如何相互匹配。理想情况下,每次扫描将刚好落在相互的顶端,会重叠在一起,但是有些旋转漂移是预期的,所以我只是确保扫描之间误差,不会超过一度或两度以上。

第二个测试检查线速度是否合理。机器人放置在与距离墙壁几米远地方,然后以上面相同的方式设置rviz。接着我将驱动机器人向墙壁前进,从rviz中聚合的激光扫描看看扫描出来边线的厚度。理想情况下,墙体应该看起来像一个扫描,但我只是确保它的厚度不超过几厘米。如果显示扫描边线的分散在半米以上,但有些可能是错误的测距。

  • 定位

假设里程计和激光扫描仪都能合理地执行,建图和调整AMCL通常并不会太糟糕。首先,我将运行gmapping或karto,并操纵机器人来生成地图。然后,我将使用该地图与AMCL,并确保机器人保持定位。如果我运行的机器人的距离不是很好,我会用AMCL的测距模型参数玩一下。对整个系统的一个很好的测试是确保激光扫描和地图可以在rviz的“地图”坐标系中可视化,并且激光扫描与环境地图很好地匹配。

(2)代价地图

  • 一旦我的机器人满足导航的先决条件,我想确保代价地图的设置和配置正确。

  • 如下建议可用来调整代价地图:

    • 确保根据传感器实际发布的速率为每个观测源设置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参数调整。

(3) 局部规划器

如果通过代价地图的操作令人满意,我将继续调整局部规划器参数。在具有合理加速度限制的机器人上,我通常使用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都使用这种速度估计以及机器人的加速度限制来确定规划周期的可行速度空间。虽然来自测距的速度估计不一定是完美的,但确保其至少接近得到最佳行为是重要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序跨行跨列多列复杂表格实现

今天来实现个跨行跨列多列表格。 如图,这是个列数不确定,有的单元格还要跨行跨列的复杂表格。 这里暂时最多支持4列,列数再多就放不下了。 实现原理 实现原理比较简单,通过多个嵌套的循环将数据取出。 上面的例子中,最…

Redis学习第八课:Redis高级实用特性(一)

Redis高级实用特性 注:我学习的环境是vmware7.1 ubantu10.10 redis 3.0.2 1、安全性 设置客户端连接后进行任何其他指定前需要的密码。因为redis速度相当快,一个外部用户可以在一秒钟进行很多次的密码尝试,这就需要设定非常强大的密码来防止…

分布式缓存的面试题9

1、面试题 如何保证缓存与数据库的双写一致性? 2、面试官心里分析 你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 3、面试题剖析…

ROS与navigation教程——概述

navigation是ROS的二维导航功能包,简单来说,就是根据输入的里程计等传感器的信息流和机器人的全局位置,通过导航算法,计算得出安全可靠的机器人速度控制指令。 代码库:https://github.com/ros-planning/navigation 代…

Linux下c开发 之 线程通信与pthread_cond_wait()的使用

pthread_cond_wait() /************pthread_cond_wait()的使用方法**********/pthread_mutex_lock(&qlock); pthread_cond_wait(&qready, &qlock);pthread_mutex_unlock(&qlock);/*****************************************************/The mutex passed …

ROS与navigation教程——ACML参数配置

<launch> <!--//后为wiki官网的参数说明 &#xff08;&#xff09;中为粗读算法参数说明及理解 面临的问题常用地图有2种&#xff1a;1.基于特征&#xff0c;仅指明在指定位置&#xff08;地图中包含的对象的位置&#xff09;的环境的形状。特征表示使得调节对象的位置…

【设计模式】单例模式 Singleton Pattern

通常我们在写程序的时候会碰到一个类只允许在整个系统中只存在一个实例&#xff08;Instance&#xff09; 的情况&#xff0c; 比如说我们想做一计数器&#xff0c;统计某些接口调用的次数&#xff0c;通常我们的数据库连接也是只期望有一个实例。Windows系统的系统任务管理器…

修改输入框placeholder的默认样式

一般网页中都用到input的placeholder属性&#xff0c;想让这个默认样式和网页保持一致&#xff0c;就需要重新设定样式&#xff0c;百度百度&#xff1a; :-moz-placeholder { / color: #000; opacity:1; }支持/* Mozilla Firefox 4 to 18 * ::-moz-placeholder { color: #000;…

进程及线程通信总结

上文我们介绍了如何建立一个简单的多线程程序&#xff0c;多线程之间不可避免的需要进行通信 。相比于进程间通信来说&#xff0c;线程间通信无疑是相对比较简单的。 首先我们来看看最简单的方法&#xff0c;那就是使用全局变量&#xff08;静态变量也可以&#xff09;来进行通…

ROS multi-master——multimaster_fkie配置

多主站ROS配置和mutimaster_fkie ROS版本&#xff1a;kinetic 操作系统&#xff1a;Ubuntu 16.04。 multimaster_fkie&#xff1a;github 1网络配置 1.1路由器 设置无线路由器并连接两台计算机/机器人。为这两台计算机设置静态IP地址。相互测试ping命令和ssh。 1.2主机 …

Docker入门

1. Docker简介: docker是一个基于LXC的高级容器引擎。简单地说&#xff0c;docker是一个轻量级的虚拟解决方案&#xff0c;或者说它是一个超轻量级的虚拟机&#xff08;容器&#xff09;。 Docker是一个开源的引擎&#xff0c;可以轻松的为任何应用创建一个轻量级的、可移植的、…

乐器库的混合

每台微机一个声卡&#xff0c;也就是一片D/A&#xff0c;驱动按波特率、采样位数、采样通道传输给D/A&#xff0c;输出模拟音频。播放时仅一种与硬件支持格式对应&#xff0c;其他需驱动&#xff08;有损&#xff09;变换到硬件支持格式。每个应用都可单独播放声音&#xff0c;…

kafka认知--(1)

文档参考&#xff1a;http://kafka.apache.org/documentation.html 下载代码&#xff1a; tar -xzf kafka_2.11-0.11.0.0.tgz cd kafka_2.11-0.11.0.0 启动 bin/zookeeper-server-start.sh config/zookeeper.properties 创建topic&#xff08;主题为test&#xff0c;只有一个分…

带头尾指针的list的C实现

一、缘起 很早写了一个带头尾指针的list&#xff0c;该list支持从尾部插入元素&#xff0c;在任意位置删除元素&#xff0c;最近用这个list时发现一个bug&#xff0c;修正了&#xff0c;并加了几个接口函数。贴出来&#xff0c;希望对C的初学者有用。 二、基本说明 2.1、数据结…

Gmapping——从原理到实践

概述 在SLAM中&#xff0c;机器人位姿和地图都是状态变量&#xff0c;我们需要同时对这两个状态变量进行估计&#xff0c;即机器人获得一张环境地图的同时确定自己相对于该地图的位置。我们用x表示机器人状态&#xff0c;m表示环境地图&#xff0c;z表示传感器观测情况&#xf…

关于git分支

1.关于git分支 git的“分支”乍一听是一个特别容易让人产生错觉的概念&#xff0c;以为它和树枝一样是分叉的枝节&#xff0c;其实Git中的分支本质上是个指向commit对象的指针,每次commit&#xff0c;git都把它们串成一条时间线&#xff0c;这条时间线就是一个分支。 2.直接切换…

【机器学习经典算法源码分析系列】-- 逻辑回归

1.逻辑回归&#xff08;Logistic Regression&#xff09;又常被成为“逻辑斯蒂回归”&#xff0c;实质上是一个二元分类问题。 逻辑回归代价函数&#xff1a; 代价函数导数&#xff1a; Matlab实现&#xff1a; 采用matlab中自带的无约束最小化函数fminunc来代替梯度下降法&…

求特殊自然数

总时间限制: 1000ms 内存限制: 65536kB 描述一个十进制自然数,它的七进制与九进制表示都是三位数&#xff0c;且七进制与九进制的三位数码表示顺序正好相反。编程求此自然数,并输出显示。 输入无。输出三行&#xff1a;第一行是此自然数的十进制表示&#xff1b;第一行是此自然…

ROS——不同版本间ROS进行通信

在相同版本间的ROS进行通信不在赘述了&#xff0c;修改/etc/hosts文件即可。 最近项目遇到在Ubuntu16.04 与Ubuntu18.04两个系统间进行ROS通信&#xff0c;ROS版本分别为Kinetic和Melodic。配置网络后&#xff0c;两边都能够ping通&#xff0c;但是在获取ros数据是&#xff0c…

大数据开发实战:数据流图及相关数据技术

1、大数据流程图 2、大数据各个环节主要技术 2.1、数据处理主要技术 Sqoop&#xff1a;&#xff08;发音&#xff1a;skup&#xff09;作为一款开源的离线数据传输工具&#xff0c;主要用于Hadoop(Hive) 与传统数据库&#xff08;MySql,PostgreSQL&#xff09;间的数据传递。它…