< >
Home » ROS与navigation教程 » ROS与navigation教程-robot_pose_ekf

ROS与navigation教程-robot_pose_ekf

ROS与navigation教程-robot_pose_ekf

说明:

  • 介绍了 robot_pose_ekf 的概念及相关知识

代码库

概要

  • Robot Pose EKF 包用于评估机器人的3D位姿,基于来自不同来源的位姿测量信息。

  • 它使用带有6D(3D position and 3D orientation)模型信息的扩展卡尔曼滤波器来整合来自轮式里程计,IMU传感器和视觉里程计的数据信息。

  • 基本思路就是用松耦合方式融合不同传感器信息实现位姿估计。

How to use the Robot Pose EKF

( 1 ) Configuration

  • EKF节点的默认启动文件位于robot_pose_ekf包目录中。 启动文件包含多个可配置参数:

    • freq: 滤波器更新和发布频率。注意:频率高仅仅意味着一段时间可以获得更多机器人位姿信息,但是并不表示可以提高每次位姿评估的精度。

    • sensor_timeout: 当传感器停止向滤波器发送信息时,滤波器在没有传感器的情况下等待多长时间才重新开始工作。

    • odom_used, imu_used, vo_used: 确认是否输入。

  • 在启动文件中修改配置,例如:

     <launch>
  <node pkg="robot_pose_ekf" type="robot_pose_ekf" name="robot_pose_ekf">
    <param name="output_frame" value="odom"/>
    <param name="freq" value="30.0"/>
    <param name="sensor_timeout" value="1.0"/>
    <param name="odom_used" value="true"/>
    <param name="imu_used" value="true"/>
    <param name="vo_used" value="true"/>
    <param name="debug" value="false"/>
    <param name="self_diagnose" value="false"/>
  </node>
 </launch>

( 2 ) Running

  • 编译
 $ rosdep install robot_pose_ekf

 $ roscd robot_pose_ekf

 $ rosmake
  • 运行
 $ roslaunch robot_pose_ekf.launch

Nodes

( 1 ) robot_pose_ekf

  • robot_pose_ekf包实现扩展卡尔曼滤波器,用于确定机器人位姿。

( 1.1 ) Subscribed Topics

odom ([nav_msgs/Odometry][2]) 
  • 2D pose (用于轮式里程计):其包含机器人在地面中的位置(position)和方位(orientation)以及该位姿的协方差。 发送此2D位姿的消息实际上表示3D位姿,但z,pitch和roll分量被简单忽略了。
imu_data ([sensor_msgs/Imu][3]) 
  • 3D orientation (用于IMU):3D方位提供机器人基座相对于地图坐标系的Roll, Pitch and Yaw偏角。Roll and Pitch角是绝对角度(因为IMU使用了重力参考),而YAW角是相对角度。协方差矩阵指定的方位测量的不确定度。当仅仅收到这个主题消息时,机器人位姿ekf还不会启动,因为它还需要来自主题'vo'或者'odom'的消息。
vo ([nav_msgs/Odometry][4]) 
  • 3D pose (用于视觉里程计):3D位置表示机器人的完整位置和方位以及该位姿的协方差。当用传感器只测量部分3D位姿(e.g. the wheel odometry only measures a 2D pose)时候, 可以给还未真正开始测量的部分3D位姿先简单指定一个大的协方差。

robot_pose_ekf节点不要求所有三个传感器源一直可用。每个源给出位态估计和协方差。源以不同的速率和延迟进行操作。 源可以随着时间的推移出现并消失,节点将自动检测并使用可用的传感器。假如要添加您自己的传感器到输入源中,请查看 the Adding a GPS sensor tutorial

( 1.2 ) Published Topics

robot_pose_ekf/odom_combined ([geometry_msgs/PoseWithCovarianceStamped][6]) 
  • 滤波器输出 (评估的3D机器人位姿)。

( 1.3 ) Provided tf Transforms

  • odom_combined → base_footprint

How Robot Pose EKF works

( 1 ) Pose interpretation

  • 向滤波器节点发送信息的所有传感器源都有自己的参考坐标系,并且随着时间推移都可能出现漂移现象。

  • 因此,不同传感器发送的绝对位姿不能相互比较。

  • 节点使用每个传感器的相对位姿差来更新扩展卡尔曼滤波器。

( 2 ) Covariance interpretation

  • 随着机器人的移动,其在参考坐标系中的位姿的不确定性越来越大。同时随着时间的推移,协方差将会无限增长。因此,在位姿本身上公布协方差是没有意义的,而传感器源则会随时间的变化来公布协方差,即速度的协方差。

  • Note that using observations of the world (e.g. measuring the distance to a known wall) will reduce the uncertainty on the robot pose; this however is localization, not odometry.

( 3 ) Timing

  • 想象一下,机器人姿势过滤器最后在时间t_0更新。 在每个传感器的至少一次测量到达时间晚于t_0的时间戳之后,节点将不会更新机器人姿态滤波器。

  • 当例如 收到有关时间戳t_1> t_0的odom主题的消息,并且在时间戳t_2> t_1> t_0的imu_data主题上,过滤器现在将更新为关于所有传感器的信息可用的最新时间,在这种情况下为时间T_1。 直接给出t_1处的odom姿态,并且通过在t_0和t_2之间的imu姿态的线性插值来获得t_1上的imu姿态。 在t_0和t_1之间,使用odom和imu的相对姿势来更新机器人姿势过滤器。

请输入图片描述

  • 上图显示了PR2机器人从给定的初始位置(绿点)开始移动并返回到初始位置时的实验结果。 完美的odometry x-y曲线图显示精确的闭环曲线图。 蓝线显示来自轮式里程计的输入,蓝点是估计的最终位置。 红线显示的是robot_pose_ekf的输出,其整合了轮式里程计和imu的信息与红点的估计结束位置。

Package Status

( 1 ) Stability

  • 该包的基础部分代码已经被充分测试且稳定较长时间。

  • 但是ROS API一直在随着消息类型的变化而被升级。

  • 在未来的版本中,ROS API可能会再次更改为简化的单主题界面(参见下面的路线图)。

( 2 ) Roadmap

  • 目前该滤波器被设计用于在PR2机器人上使用的三个传感器信号(wheel odometry, imu and vo) 。下一步计划是让该包更加通用可以监听更多传感器源,所有发布均使用消息 (nav_msgs/Odometry) 。每个源将在“里程计”消息中设置3D位姿的协方差,来指定其实际测量的3D位姿的哪一部分。

  • 增加速度到扩展卡尔曼滤波器状态中。

Tutorials

参考资料

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros与navigation教程