robot_pose_ekf包的使用

robot_pose_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>

订阅主题

odom (nav_msgs/Odometry)

  • 2D姿势(由车轮测距法使用):2D姿势包含机器人在地平面中的位置和方向以及此姿势的协方差。发送此2D姿势的消息实际上代表3D姿势,但是简单地忽略z,roll和pitch。

imu_data(sensor_msgs / Imu

  • 3D方向(由IMU使用):3D方向提供关于机器人基础框架相对于世界参考框架的滚动,俯仰和偏转角度的信息。Roll和Pitch角度被解释为绝对角度(因为IMU传感器具有重力参考),并且偏航角度被解释为相对角度。协方差矩阵指定方向测量的不确定性。当机器人姿势ekf仅收到关于该主题的消息时,它将不会启动; 它还期望有关'vo'或'odom'主题的消息。

vo(nav_msgs / Odometry

  • 3D姿态(由视觉测距使用):3D姿势表示机器人的完整位置和方向以及此姿势的协方差。当传感器仅测量3D姿势的一部分时(例如,车轮测距法仅测量2D姿势),只需在3D姿势的未实际测量的部分上指定大的协方差。

发布主题

robot_pose_ekf / odom_combined(geometry_msgs / PoseWithCovarianceStamped

EKF工作原理

1.位姿说明

所有发送信息到滤波器节点的传感器源都有自己的世界参考坐标系,并且这些坐标系可以随着时间任意的漂移。因此,由不同传感器发送的绝对坐标系不能相互比较。节点使用每个传感器的相对位姿差异更新扩展卡尔曼滤波器。

2.协方差说明

因为机器人绕圈移动,其在世界坐标系下的位姿的不确定性不断的变得越来越大。随着时间推移,协方差会无界增长。因此在自身位姿发布协方差没有用,代替方法是传感器源发布协方差随着时间的变化情况,也就是,速度上的协方差。注意使用世界的观测将会减少机器人位姿的不确定性;然而这是定位而不是里程计。

3.定时

想象一下,机器人姿势过滤器最后一次更新时间为t_0。节点将不会更新机器人姿势过滤器,直到每个传感器的至少一次测量到达时间戳晚于t_0。当收到在例如消息奥多姆与时间戳T -1> T_0话题,并在imu_data时间戳话题T_2> T_1> T_0,过滤器现在将更新到其所有传感器的信息是可用的,在这种情况下,最晚时间到时间t_1。直接给出t_1处的odom姿势,并且通过t_0和t_2之间的imu姿势的线性插值获得t_1处的imu姿势。机器人姿势过滤器使用odom和imu的相对姿势在t_0和t_1之间更新。

robot_pose_ekf.png

上图显示了当PR2机器人从给定的初始位置(绿点)开始,被驱动并返回到初始位置时的实验结果。一个完美的odometry xy图应该显示一个精确的循环闭合。蓝线显示车轮里程表的输入,蓝点表示估计的终点位置。红线显示robot_pose_ekf的输出,其结合了车轮里程计和imu的信息,红点表示估计的结束位置。

猜你喜欢

转载自blog.csdn.net/Travis_X/article/details/85029174
EKF
今日推荐