ROS篇——amcl定位算法参数详解

  • odom_model_type (string, default: “diff”):odom 模型定义,可以是"diff", “omni”, “diff-corrected”, “omni-corrected”,后面两个是对老版本里程计模型的矫正,相应的里程计参数需要做一定的减小。

  • odom_alpha5 (double, default: 0.2):平移相关的噪声参数(仅用于模型是"omni"的情况,就是当你的机器人是全向移动时才需要设置该参数,否则就设置其为 0.0)

  • gui_publish_rate (double, default: -1.0 Hz):扫描和路径发布到可视化软件的最大频率,设置参数为-1.0 意为失能此功能,默认-1.0。

  • laser_max_beams (int, default: 30):更新滤波器时,每次扫描中多少个等间距的光束被使用(减小计算量,测距扫描中相邻波束往往不是独立的可以减小噪声影响,太小也会造成信息量少定位不准)。

  • laser_max_range (double, default: -1.0):最大扫描范围,参数设置为-1.0 时,将会使用激光上报的最大扫描范围。

  • min_particles (int, default: 100):滤波器中的最少粒子数,值越大定位效果越好,但是相应的会增加主控平台的计算资源消耗。

  • max_particles (int, default: 5000):滤波器中最多粒子数,是一个上限值,因为太多的粒子数会导致系统资源消耗过多。

  • kld_err (double, default: 0.01):真实分布与估计分布之间的最大误差。

  • kld_z (double, default: 0.99):上标准分位数(1-p),其中 p 是估计分布上误差小于 kld_err 的概率,默认 0.99。

  • odom_alpha1 (double, default: 0.2):指定由机器人运动部分的旋转分量估计的里程计旋转的期望噪声,默认 0.2(旋转存在旋转噪声)。

  • odom_alpha2 (double, default: 0.2):机器人运动部分的平移分量估计的里程计旋转的期望噪声,默认 0.2(旋转中可能出现平移噪声)。

  • odom_alpha3 (double, default: 0.2):机器人运动部分的平移分量估计的里程计平移的期望噪声,如(double, default: 0.2):机器人运动部分的平移分量估计的里程计平移的期望噪声,如果你自认为自己机器人的里程计信息比较准确那么就可以将该值设置的很小。

  • odom_alpha4 (double, default: 0.2):机器人运动部分的旋转分量估计的里程计平移的期望噪声,你设置的这 4 个 alpha 值越大说明里程计的误差越大。

  • laser_z_hit (double, default: 0.95):模型的 z_hit 部分的混合权值,默认 0.95(混合权重 1.具有局部测量噪声的正确范围–以测量距离近似真实距离为均值,其后 laser_sigma_hit 为标准偏差的高斯分布的权重)。

  • laser_z_short (double, default: 0.1):模型的z_short 部分的混合权值,默认 0.1(混合权重 2.意外对象权重(类似于一元指数关于 y 轴对称 0~测量距离(非最大距离)的部分:–ηλe^(-λz),其余部分为0,其中 η 为归一化参数,λ 为 laser_lambda_short,z 为 t 时刻的一个独立测量值(一个测距值,测距传感器一次测量通常产生一系列的测量值)),动态的环境,如人或移动物体)。

  • laser_z_max (double, default: 0.05):模型的z_max 部分的混合权值,默认 0.05(混合权重 3.测量失败权重(最大距离时为 1,其余为 0),如声呐镜面反射,激光黑色吸光对象或强光下的测量,最典型的是超出最大距离)。

  • laser_z_rand (double, default: 0.05):模型的 z_rand 部分的混合权值,默认 0.05(混合权重 4.随机测量权重–均匀分布(1 平均分布到 0~最大测量范围),完全无法解释的测量,如声呐的多次反射,传感器串扰)。

  • laser_sigma_hit (double, default: 0.2 meters):被用在模型的z_hit 部分的高斯模型的标准差,默认0.2m。

  • laser_lambda_short (double, default: 0.1):模型 z_short 部分的指数衰减参数,默认 0.1(根据ηλe^(-λz),λ 越大随距离增大意外对象概率衰减越快)。

  • laser_model_type (string, default: “likelihood_field”):激光模型类型定义,可以是 beam, likehood_field, likehood_field_prob(和 likehood_field 一样但是融合了beamskip 特征–官网的注释),默认是"likehood_field" 。

  • laser_likelihood_max_dist (double, default: 2.0 meters):地图上做障碍物膨胀的最大距离,用作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)的高斯分布的距离概率。

  • update_min_d (double, default: 0.2 meters):在执行滤波更新前平移运动的距离,默认 0.2m(对于里程计模型有影响,模型中根据运动和地图求最终位姿的似然时丢弃了路径中的相关所有信息,已知的只有最终位姿,为了规避不合理的穿过障碍物后的非零似然,这个值建议不大于机器人半径,否则因更新频率的不同可能产生完全不同的结果)。

  • update_min_a (double, default: π/6.0 radians):执行滤波更新前旋转的角度。

  • resample_interval (int, default: 2):在重采样前需要滤波更新的次数。

  • transform_tolerance (double, default: 1.0):坐标系间的转换可以忍受的最大延时;

  • recovery_alpha_slow (double, default: 0.0 (disabled)):慢速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来 recover,默认 0(disable),可能 0.001 是一个不错的值。

  • recovery_alpha_fast (double, default: 0.0 (disabled)):快速的平均权重滤波的指数衰减频率,用作决定什么时候通过增加随机位姿来 recover,默认 0(disable),可能 0.1 是个不错的值。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AMCL(Adaptive Monte Carlo Localization)是ROS中常用的定位算法,它可以在机器人运动时根据传感器数据进行自适应定位。本文将介绍如何使用C++实现ROS机器人使用amcl功能包进行定位。 1. 安装AMCL功能包 在终端中输入以下命令,安装AMCL功能包和依赖项。 ``` sudo apt-get install ros-kinetic-amcl sudo apt-get install ros-kinetic-move-base-msgs sudo apt-get install ros-kinetic-geometry-msgs ``` 2. 创建ROS包 在终端中输入以下命令,创建ROS包。 ``` catkin_create_pkg amcl_demo roscpp std_msgs geometry_msgs move_base_msgs ``` 3. 创建ROS节点 在src文件夹中创建amcl_demo.cpp文件,并添加以下代码。 ```cpp #include <ros/ros.h> #include <geometry_msgs/PoseWithCovarianceStamped.h> #include <geometry_msgs/PoseStamped.h> #include <move_base_msgs/MoveBaseAction.h> #include <actionlib/client/simple_action_client.h> typedef actionlib::SimpleActionClient<move_base_msgs::MoveBaseAction> MoveBaseClient; class AmclDemo { public: AmclDemo() { // 订阅AMCL定位结果 amcl_pose_sub_ = nh_.subscribe("/amcl_pose", 1, &AmclDemo::amclPoseCallback, this); // 发布目标点 goal_pub_ = nh_.advertise<geometry_msgs::PoseStamped>("/move_base_simple/goal", 1); // 连接move_base节点 move_base_client_ = new MoveBaseClient("move_base", true); ROS_INFO("Waiting for move_base action server..."); move_base_client_->waitForServer(); ROS_INFO("Connected to move_base action server"); } private: void amclPoseCallback(const geometry_msgs::PoseWithCovarianceStampedConstPtr& msg) { // 获取机器人在地图上的位置 current_pose_ = msg->pose.pose; } void setGoal(double x, double y, double theta) { // 发布目标点 geometry_msgs::PoseStamped goal; goal.header.frame_id = "map"; goal.header.stamp = ros::Time::now(); goal.pose.position.x = x; goal.pose.position.y = y; goal.pose.orientation = tf::createQuaternionMsgFromYaw(theta); goal_pub_.publish(goal); // 发送目标点给move_base节点 move_base_msgs::MoveBaseGoal move_goal; move_goal.target_pose = goal; move_base_client_->sendGoal(move_goal); } ros::NodeHandle nh_; ros::Subscriber amcl_pose_sub_; ros::Publisher goal_pub_; MoveBaseClient *move_base_client_; geometry_msgs::Pose current_pose_; }; int main(int argc, char **argv) { ros::init(argc, argv, "amcl_demo"); AmclDemo amcl_demo; ros::spin(); return 0; } ``` 4. 编译ROS包 在终端中输入以下命令,编译ROS包。 ``` cd ~/catkin_ws catkin_make ``` 5. 运行ROS节点 在终端中输入以下命令,运行ROS节点。 ``` rosrun amcl_demo amcl_demo ``` 6. 发布目标点 在终端中输入以下命令,发布目标点。 ``` rostopic pub /move_base_simple/goal geometry_msgs/PoseStamped '{header: {stamp: now, frame_id: "map"}, pose: {position: {x: 1.0, y: 1.0, z: 0.0}, orientation: {w: 1.0}}}' ``` 以上就是使用C++实现ROS机器人使用amcl功能包进行定位的全部流程。需要注意的是,具体的实现方式需要根据机器人的硬件和软件环境进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值