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

2023-11-14

<launch>
<!--



//后为wiki官网的参数说明
()中为粗读算法参数说明及理解
×××面临的问题

常用地图有2种:
    1.基于特征,仅指明在指定位置(地图中包含的对象的位置)的环境的形状。特征表示使得调节对象的位置变得简单,作为附加的检测结果。这样的地图在地图构建领域很受欢迎。
    2.基于位置,这样的地图是有体积的,它们为环境中的许多位置都提供标签。不仅包括环境物体的信息,也包括了对象没有物体的信息(如空闲空间),比较经典的占用栅格地图就是基于位置的。

根据官网信息,amcl采用的是结合自适应(增强蒙特卡洛Augmented_MCL)和库尔贝克-莱不勒散度采样KLD_Sampling_MCL(蒙特卡洛定位的一个变种)。
    1.KLD_Sampling_MCL随时间改变粒子数,改良了度过初期后的蒙特卡洛大样本集合的资源浪费。两个kld_配置参数就是KLD的参数。对于每次粒子滤波迭代,KLD采样以概率1-δ确定样本数(1-δ就是kld_z配置参数),使得真实的后验与基于采样的近似之间的误差小于ε(ε就是kld_err配置参数).kld_z=0.99,kld_err=0.05,直方图位大小为15cm*15cm*15°就能取得良好的结果。
    2.Augmented_MCL解决的是从机器人绑架或全局定位失效中恢复的问题。两个recovery_alpha_配置参数就是用于失效恢复的。随机采样以max{0.0,1.0-w(fast)/w(slow)}概率增加。如果短期似然劣于长期似然则增加随机采样,这种方法,测量似然的一个突然衰减将引起随机采样的数目增加。w=w+α(Wavg-w)--Wavg当前测量模型的权重,w为短期(w(fast))或长期(w(slow))平滑估计,α为与w对应的recovery_alpha_参数。

-->
  <node pkg="amcl" type="amcl" name="amcl" output="screen">
    <!-- Publish scans from best pose at a max of 10 Hz -->

    //全部滤波器参数
    <param name="min_particles" value="500"/>   //允许的粒子数量的最小值,默认100
    <param name="max_particles" value="5000"/> //允许的例子数量的最大值,默认5000
    <param name="kld_err" value="0.05"/>    //真实分布和估计分布之间的最大误差,默认0.01
    <param name="kld_z" value="0.99"/>   //上标准分位数(1-p),其中p是估计分布上误差小于kld_err的概率,默认0.99
    <param name="update_min_d" value="0.2"/>   //在执行滤波更新前平移运动的距离,默认0.2m(对于里程计模型有影响,模型中根据运动和地图求最终位姿的释然时丢弃了路径中的相关所有信息,已知的只有最终位姿,为了规避不合理的穿过障碍物后的非零似然,这个值建议不大于机器人半径。否则因更新频率的不同可能产生完全不同的结果)
    <param name="update_min_a" value="0.5"/>   //执行滤波更新前旋转的角度,默认pi/6 rad
    <param name="resample_interval" value="1"/>   //在重采样前需要的滤波更新的次数,默认2
    <param name="transform_tolerance" value="0.1"/>  //tf变换发布推迟的时间,为了说明tf变换在未来时间内是可用的
    <param name="recovery_alpha_slow" value="0.0"/> //慢速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来recover,默认0(disable),可能0.001是一个不错的值
    <param name="recovery_alpha_fast" value="0.0"/>  //快速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来recover,默认0(disable),可能0.1是个不错的值
    <param name="gui_publish_rate" value="10.0"/>  //扫描和路径发布到可视化软件的最大频率,设置参数为-1.0意为失能此功能,默认-1.0
    <param name="save_pose_rate" value="0.5"/>  //存储上一次估计的位姿和协方差到参数服务器的最大速率。被保存的位姿将会用在连续的运动上来初始化滤波器。-1.0失能。
    <param name="use_map_topic" value="false"/>  //当设置为true时,AMCL将会订阅map话题,而不是调用服务返回地图。也就是说,当设置为true时,有另外一个节点实时的发布map话题,也就是机器人在实时的进行地图构建,并供给amcl话题使用;当设置为false时,通过map server,也就是调用已经构建完成的地图。在navigation 1.4.2中新加入的参数。
    <param name="first_map_only" value="false"/>  //当设置为true时,AMCL将仅仅使用订阅的第一个地图,而不是每次接收到新的时更新为一个新的地图,在navigation 1.4.2中新加入的参数。

    //激光模型参数
    <param name="laser_min_range" value="-1.0"/>  //被考虑的最小扫描范围;参数设置为-1.0时,将会使用激光上报的最小扫描范围
    <param name="laser_max_range" value="-1.0"/>  //被考虑的最大扫描范围;参数设置为-1.0时,将会使用激光上报的最大扫描范围
    <param name="laser_max_beams" value="30"/>   //更新滤波器时,每次扫描中多少个等间距的光束被使用(减小计算量,测距扫描中相邻波束往往不是独立的可以减小噪声影响,太小也会造成信息量少定位不准)
<!--
这4个laser_z参数,在动态环境下的定位时用于异常值去除技术(还有一种状态增广技术-将隐藏状态包含进状态估计,缺点是计算复杂,acml定位未使用这种定位)
这种定位思想是环境中的动态物体总是会获得比静态地图障碍物更短的读数(人在障碍物后面是扫描不到的-假如不考虑体积,比如单个激光光束不用考虑体积),利用这样的不对称性去除异常值
缺点是:在其他可改变环境的其他类型情景(如去除障碍物)时,这样的非对称性可能不存在,但相同概率分析通常是可适用的。因为每一个异常值都被舍弃了,缺少对称性的缺点可能是从全局定位失效中恢复变得不可能。这种情况下,×××强加额外约束(如限制部分可能已被破坏的测量值)是有意义的(×××怎么约束)。(这里说的舍弃与likelihood_field模型的舍弃有区别,这里定位是先计算测量值对应非预期物体的概率(意外对象概率/混合概率)大于用户设定的阀值(amcl配置参数里貌似没有这个?)舍弃,而似然域概率是舍弃的超出最大测量范围的值,不计算概率。)
(针对这个缺点不想改代码的粗暴又好用省心的处理方式可能是构图的时候将可移动的障碍物搬走,还有更直接的办法就是PS)
最后,概率由这4个权重乘他们对应的概率然后相加,算法中4个权重相加等于1(这里默认值不等于1,估计做了归一化)。
这6个laser_参数可以用learn_intrinsic_parameters算法计算,该算法是期望值极大化算法,是估计极大似然参数的迭代过程。(×××好吧,amcl好像并没有做这个工作)
-->
    <param name="laser_z_hit" value="0.5"/> //模型的z_hit部分的混合权值,默认0.95(混合权重1.具有局部测量噪声的正确范围--以测量距离近似真实距离为均值,其后laser_sigma_hit为标准偏差的高斯分布的权重)
    <param name="laser_z_short" value="0.05"/> //模型的z_short部分的混合权值,默认0.1(混合权重2.意外对象权重(类似于一元指数关于y轴对称0~测量距离(非最大距离)的部分:--ηλe^(-λz),其余部分为0,其中η为归一化参数,λ为laser_lambda_short,z为t时刻的一个独立测量值(一个测距值,测距传感器一次测量通常产生一系列的测量值)),动态的环境,如人或移动物体)
    <param name="laser_z_max" value="0.05"/> //模型的z_max部分的混合权值,默认0.05(混合权重3.测量失败权重(最大距离时为1,其余为0),如声呐镜面反射,激光黑色吸光对象或强光下的测量,最典型的是超出最大距离)
    <param name="laser_z_rand" value="0.5"/> //模型的z_rand部分的混合权值,默认0.05(混合权重4.随机测量权重--均匀分布(1平均分布到0~最大测量范围),完全无法解释的测量,如声呐的多次反射,传感器串扰)
    <param name="laser_sigma_hit" value="0.2"/> //被用在模型的z_hit部分的高斯模型的标准差,默认0.2m
    <param name="laser_lambda_short" value="0.1"/> //模型z_short部分的指数衰减参数,默认0.1(根据ηλe^(-λz),λ越大随距离增大意外对象概率衰减越快)
    <param name="laser_likelihood_max_dist" value="2.0"/> //地图上做障碍物膨胀的最大距离,用作likelihood_field模型(likelihood_field_range_finder_model只描述了最近障碍物的距离,(目前理解应该是在这个距离内的障碍物膨胀处理,但是算法里又没有提到膨胀,不明确是什么意思).这里算法用到上面的laser_sigma_hit。似然域计算测量概率的算法是将t时刻的各个测量(舍去达到最大测量范围的测量值)的概率相乘,单个测量概率:Zh * prob(dist,σ) +avg,Zh为laser_z_hit,avg为均匀分布概率,dist最近障碍物的距离,prob为0为中心标准方差为σ(laser_sigma_hit)的高斯分布的距离概率)
    <param name="laser_model_type" value="likelihood_field"/> //模型使用,可以是beam, likehood_field, likehood_field_prob(和likehood_field一样但是融合了beamskip特征--官网的注释),默认是“likehood_field” 

    //里程计模型参数
    <!--
    ×××里程计模型并没有涉及机器人漂移或打滑的情况,一旦出现这样的情况,后续定位基本废了,虽然Augmented_MCL有失效恢复,但是实际运行中耗时太长且结果不太理想(位置居然跳,这很不合理,可能参数配置不太好)
    -->
    <param name="odom_model_type" value="diff"/> //模型使用,可以是"diff", "omni", "diff-corrected", "omni-corrected",后面两  个是对老版本里程计模型的矫正,相应的里程计参数需要做一定的减小
    <param name="odom_alpha1" value="0.2"/> //指定由机器人运动部分的旋转分量估计的里程计旋转的期望噪声,默认0.2(旋转存在旋转噪声)
    <param name="odom_alpha2" value="0.2"/> //制定由机器人运动部分的平移分量估计的里程计旋转的期望噪声,默认0.2(旋转中可能出现平移噪声)
    <!-- translation std dev, m -->
    <param name="odom_alpha3" value="0.8"/> //指定由机器人运动部分的平移分量估计的里程计平移的期望噪声,默认0.2(类似上)
    <param name="odom_alpha4" value="0.2"/> //指定由机器人运动部分的旋转分量估计的里程计平移的期望噪声,默认0.2(类似上)
    <param name="odom_alpha5" value="0.1"/> //平移相关的噪声参数(仅用于模型是“omni”的情况--wiki官网的注释)
    <param name="odom_frame_id" value="odom"/>  //里程计默认使用的坐标系
    <param name="base_frame_id" value="base_link"/>  //用作机器人的基坐标系
    <param name="global_frame_id" value="map"/>  //由定位系统发布的坐标系名称
    <param name="tf_broadcast" value="true"/>  //设置为false阻止amcl发布全局坐标系和里程计坐标系之间的tf变换

    //机器人初始化数据设置
    <param name="initial_pose_x" value="0.0"/> //初始位姿均值(x),用于初始化高斯分布滤波器。(initial_pose_参数决定撒出去的初始位姿粒子集范围中心)
    <param name="initial_pose_y" value="0.0"/> //初始位姿均值(y),用于初始化高斯分布滤波器。(同上)
    <param name="initial_pose_a" value="0.0"/> //初始位姿均值(yaw),用于初始化高斯分布滤波器。(粒子朝向)
    <param name="initial_cov_xx" value="0.5*0.5"/> //初始位姿协方差(x*x),用于初始化高斯分布滤波器。(initial_cov_参数决定初始粒子集的范围)
    <param name="initial_cov_yy" value="0.5*0.5"/> //初始位姿协方差(y*y),用于初始化高斯分布滤波器。(同上)
    <param name="initial_cov_aa" value="(π/12)*(π/12)"/> //初始位姿协方差(yaw*yaw),用于初始化高斯分布滤波器。(粒子朝向的偏差)
  </node>
</launch>

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS与navigation教程——ACML参数配置 的相关文章

  • ROS multi-master——multimaster_fkie配置

    多主站ROS配置和mutimaster fkie ROS版本 kinetic 操作系统 Ubuntu 16 04 multimaster fkie github 1网络配置 1 1路由器 设置无线路由器并连接两台计算机 机器人 为这两台计算
  • 【硬核】 ROS Navigation 局部路径规划常见算法

    简介 最近 作者参加了关于RMUS 高校 SimReal挑战赛 首次接触到了机器人导航领域 这里记录一下这段时间的收货 sim2real的全称是simulation to reality 是强化学习的一个分支 同时也属于transfer l
  • ROS系统基本功能的使用详解(基本指令/节点/服务/启动文件/动态参数)

    ROS系统基本功能的使用详解 一 创建工作空间 二 创建与编译ROS功能包 三 ROS的基本命令 3 1 节点 3 2 主题 3 3 服务 3 4 参数服务器 四 节点的创建与运行 4 1 创建源文件 4 2 修改CMakeLists tx
  • 无人驾驶论坛

    1 百度Apollo论坛 http www 51apollo com 2 人工智能中文资讯网 http www ailab cn
  • 关于相机与激光雷达数据采集与标定

    最近在做一个关于车路协同的项目 需要做一个路侧系统 传感器有摄像头和激光雷达 相机和激光雷达联合标定费了老半天劲 在此记录一下 雷达时间戳不对 导致摄像头和雷达的数据无法对齐 解决办法 修改雷达驱动发布点云消息时的时间戳 相机内参标定可以使
  • ROS学习(1)——ROS1和ROS2的区别

    因为机器人是一个系统工程 它包括了机械臂结构 电子电路 驱动程序 通信框架 组装集成 调试和各种感知决策算法等方面 任何一个人甚至是一个公司都不可能完成机器人系统的研发工作 但是我们又希望自己能造出一个机器人跑一跑 验证一下自己的算法 所以
  • 线速度和角速度

    转自 https baike baidu com item E7 BA BF E9 80 9F E5 BA A6 1532652 fr aladdin https baike baidu com item E8 A7 92 E9 80 9F
  • ROS noetic tf demo错误处理及python版本切换

    文章目录 报错描述及解决 ubuntu20 04下python版本切换 报错描述及解决 ubuntu版本 20 04 ROS版本 noetic roslaunch turtle tf turtle tf demo launch 报错信息 t
  • Hypervisor介绍及在智能驾驶的应用

    转自Hypervisor 智能座舱和智能驾驶融合的关键技术 腾讯新闻
  • 树莓派配置wifi做热点方法

    http wiki jikexueyuan com project raspberry pi wifi html
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • 如何将从 rospy.Subscriber 数据获得的数据输入到变量中?

    我写了一个示例订阅者 我想将从 rospy Subscriber 获得的数据提供给另一个变量 以便稍后在程序中使用它进行处理 目前 我可以看到订阅者正在运行 因为当我使用 rospy loginfo 函数时 我可以看到打印的订阅值 虽然我不
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 在 Python 3 中导入 Rosbag

    我正在尝试从 Python 3 读取 rosbag 文件 我安装了 ROS2 Eloquent Elusor 它应该支持 Python 3 当我跑步时 import rosbag bag rosbag Bag test bag 从Pytho
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • ROS 从 python 节点发布数组

    我是 ros python 的新手 我正在尝试从 python ros 节点发布一个一维数组 我使用 Int32MultiArray 但我无法理解多数组中布局的概念 谁能给我解释一下吗 或者还有其他方式发布数组吗 Thanks usr bi
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新

随机推荐

  • VS2022+OpenCV4.6.0+MFC环境配置

    一 环境安装 OpenCV Releases OpenCVhttps opencv org releases VS2022 Visual Studio 面向软件开发人员和 Teams 的 IDE 和代码编辑器Visual Studio 开发
  • 【selenium3+JAVA】界面自动化测试教程(六)——元素查找和操作

    一 前言 元素查找为selenium的基础操作 基本上大部分操作都是基于元素的 故此部分为必须掌握内容 方法包括通过名称 id tagName xpath等方法 下面会详细介绍这些方法 二 元素查找 下面一一介绍这些方法 无论哪种查找方式
  • IC验证工程师工作一周年的体会

    转眼之间自己已经工作一周年了 作为一名验证工程师 这一年里面感觉自己虽然有了一定的成长 但是成长的还是比较缓慢的 接下来从个人的角度说说我现在对从IC验证的一些体会 一 要养成良好的工作习惯 1 自己在工作中发现很多时候都是可以偷懒的 有时
  • Docker网络模式

    目录 Docker 网络 Docker 网络图解 Docker 四种网络模式 Host 模式 Container模式 None模式 Bridge模式 Docker 网络自定义 查看网络列表 自定义网络固定IP 暴露端口 在宿主机环境执行容器
  • 软件测试新手入门小知识点,一定要牢记

    引言 最近有很多朋友来问我做测试难不难 需要注意哪些 接下来就给大家讲讲软件测试新手入门需要了解的小知识点 这些软件测试常识你必须牢记 一 软件测试 软件测试存在的意义 1 发现程序中的错误而执行程序的过程 2 检验产品是否符合用户需求 3
  • Prometheus 监控mysql

    目录 下载安装mysqld exporter 在mysql中创建监控用户并赋权 启动mysqld exporter 添加到系统服务 浏览器访问服务器9104端口 在prometheus定义job来监控mysqld 运行prometheus并
  • Linux系统查看硬盘空间的常用命令!

    在Linux系统中 查看硬盘空间使用情况可以使用命令来完成 其中比较常见的命令有 df和du 那么它们具体如何使用呢 本文为大家详细介绍一下 快来学习吧 查看磁盘空间 df df命令以磁盘分区为单位查看文件系统中磁盘空间的使用情况 选项 h
  • VS2019 + Qt5.12 配置完成后,无法打开 Qt 源文件解决方案(非常实用)

    注 本文主要是解决 VS 无法打开 Qt 源文件问题 关于 VS Qt 配置问题 网上一搜一大堆 各个版本都有 这里就不做详细阐述了 最近自己在使用 VS2019 建立 Qt 工程的时候 遇到了无法打开 Qt 源文件问题 在网上阅读了大量的
  • 每天一个设计模式之 -- 组合模式

    组合模式 组合模式 Composite Pattern 又叫部分整体模式 是用于把一组相似的对象当作一个单一的对象 组合模式依据树形结构来组合对象 用来表示部分以及整体层次 这种类型的设计模式属于结构型模式 它创建了对象组的树形结构 这种模
  • 基于TCP的Socket网络编程

    前言 Socket通信是基于TCP IP协议的通信 在工作和做项目中应用非常广 下面来介绍下Socket网络编程 Socket的介绍 首先 在Socket网络编程中我们要了解两个重要的东西 ip和端口号 一台拥有IP地址的主机可以提供许多服
  • HttpContext在一般程序中无法引用

    刚刚写代码的时候 发现在类库的程序中无法直接使用HttpContext 经过学习发现 只要在引用上右击弹出下面界面 然后点击程序集 直接在搜索框中搜web 然后选用System Web 确定 再在你的cs文件中using System We
  • isolation forest在MATLAB和python上的简单应用

    isolation forest在MATLAB和python上的简单应用 1 问题描述 2 isolation forest 3 MATLAB实现isolation forest 4 python实现isolation fores 5 遇到
  • 【linux学习笔记】红帽Linux 7.8系统在虚拟机上的安装

    目录 一 打开VMware 选择新建虚拟机选项 二 选择自定义 并且点击下一步 三 可以选择默认继续下一步 可以进行更改虚拟机硬件兼容性 四 继续下一步 选择稍后安装系统 五 下一步选择客户操作系统Red Hat Enterprise Li
  • Centos8无法用yum下载

    原因 CentOS 8操作系统版本结束了生命周期 EOL Linux社区已不再维护该操作系统版本 解决方案 在服务器上执行如下代码 1 curl o etc yum repos d CentOS Base repo https mirror
  • 遍历Redis集群中的所有Key

    文章目录 1 背景s 2 需求 3 实现思路 4 SCAN 简介 5 用Jedis来实现Key扫描 5 1 基础的辅助工具类 5 2 批处理停止开关 5 3 扫描结果回调函数 5 4 实现单个Redis节点的Key扫描 5 5 实现Redi
  • 从软件的角度看待PCI和PCIE(二)

    PCI电路图 如图所示AD0 AD31 A表示地址 D表示数据 PCI是并行接口 怎么去分辨别当前使用的是地址还是数据呢 是根据FRAME这个引脚来分辨的 上面可以看出PCI是并行接口 在我们的印象中 并口传输的速率会比较高 但是当速率达到
  • mysql delete limit 使用方法详解

    一 mysql delete limit优点 用于DELETE的MySQL唯一的LIMIT row count选项用于告知服务器在控制命令被返回到客户端前被删除的行的最大值 本选项用于确保一个DELETE语句不会占用过多的时间 您可以只重复
  • php md化的nav,宝塔面板搭建onenav – 使用PHP开发的简约导航/书签管理系统

    onenav 使用PHP SQLite 3开发的简约导航 书签管理器 用宝塔搭建体验了一番 效果不错 这篇文章就来说说用宝塔搭建的体验教程 之前也介绍过Shiori书签管理程序 基于docker安装 喜欢的可以看看 1 功能特点支持后台管理
  • windows 只能同时 启动一个_如何将U盘一分为二(启动分区和存储分区两不误)...

    现在网上有很多关于U盘分区的帖子 有的方法过时不适用 有的过于深奥繁琐 难道将U盘一分为二 做成一个启动盘 文件存储盘有那么难吗 小编找来一篇有详实操作体验的U盘分区心得文章 希望能传达一个将U盘分成启动和存储两个分区的有效方法给广大用户们
  • ROS与navigation教程——ACML参数配置