robot_pose_ekf使用遇到的问题

本文介绍如何在ROS环境中配置robot_pose_ekf包实现IMU、编码器和视觉里程计的数据融合,以提高机器人定位精度,并解决了常见错误如Covariancespecifiedformeasurementontopicxxxiszero等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  在配置ROS导航包时,使用robot_pose_ekf包进行imu,编码器,视觉里程计三者的融合(起码两个),用来精确机器人的位姿信息.

  关于robot_pose_ekf要订阅哪些话题,以及因为它的使用tf树如何调整,参见需要努力的阿蒙.

  在上面的配置好以后,运行该包的launch文件,发现会报错:Covariance specified for measurement on topic xxx is zero

Filter time older than xxx message buffer.wiki 上也有写,但没说怎么解决.意思就是发布两个传感器信息的时候,都需要带有一个协方差矩阵,为什么,这是扩展卡尔曼滤波的 原因,我暂时也不懂.

  解决方法:我用的是型号为razor_imu_9dof的IMU,它有官方提供的软件包,会带有covariance.编码器所得里程计方面,我是直接用的turtlebot里面的矩阵.在turtlebot包里,如下图路径中,create_node包里的covariance中,定义了几个矩阵.

   然后在我们的工作空间中的导航包里的发布odom消息的源文件中,如下图路径,使用这个矩阵.


这个矩阵有两种,分机器人静止和动起来的时候用,所以要在发送odom的语句处添加判断语句:

ODOM_POSE_COVARIANCE = [1e-3, 0, 0, 0, 0, 0, 
                        0, 1e-3, 0, 0, 0, 0,
                        0, 0, 1e6, 0, 0, 0,
                        0, 0, 0, 1e6, 0, 0,
                        0, 0, 0, 0, 1e6, 0,
                        0, 0, 0, 0, 0, 1e3]
ODOM_POSE_COVARIANCE2 = [1e-9, 0, 0, 0, 0, 0, 
                         0, 1e-3, 1e-9, 0, 0, 0,
                         0, 0, 1e6, 0, 0, 0,
                         0, 0, 0, 1e6, 0, 0,
                         0, 0, 0, 0, 1e6, 0,
                         0, 0, 0, 0, 0, 1e-9]

ODOM_TWIST_COVARIANCE = [1e-3, 0, 0, 0, 0, 0, 
                         0, 1e-3, 0, 0, 0, 0,
                         0, 0, 1e6, 0, 0, 0,
                         0, 0, 0, 1e6, 0, 0,
                         0, 0, 0, 0, 1e6, 0,
                         0, 0, 0, 0, 0, 1e3]
ODOM_TWIST_COVARIANCE2 = [1e-9, 0, 0, 0, 0, 0, 
                          0, 1e-3, 1e-9, 0, 0, 0,
                          0, 0, 1e6, 0, 0, 0,
                          0, 0, 0, 1e6, 0, 0,
                          0, 0, 0, 0, 1e6, 0,
                          0, 0, 0, 0, 0, 1e-9]
if sensor_state.requested_right_velocity == 0 and \
               sensor_state.requested_left_velocity == 0 and \
               sensor_state.distance == 0:
            odom.pose.covariance = ODOM_POSE_COVARIANCE2
            odom.twist.covariance = ODOM_TWIST_COVARIANCE2
        else:
            odom.pose.covariance = ODOM_POSE_COVARIANCE
            odom.twist.covariance = ODOM_TWIST_COVARIANCE

(这是turtlebot发布里程计的python源码中的语句.路径在这里:

sensor_state是用create_node包里面的一个消息类型TurtlebotSensorState定义的.在我们的源文件中要引用这种消息类型,就牵扯到如何在一个包中使用其他包里的消息类型,方法在这里. )

        但是我们并不应该用turtlebot 的判断语句,直接订阅上层发布的速度消息,自己添加一条判断上层规划的速度指令即可.


现在我们得到了odom_combined消息。想让这个消息被movebase使用,看看这里怎么使用。这里主要是看rbx_bringup包里提供的一个节点:odom_ekf.py,很简单,odom和odom_combined它们消息类型是不同的,前者是geometry_msgs/Twist,后者是geometry_msgs/PoseWithCovarianceStamped ,两者的区别:后者的内容是前者的一部分。odom_ekf.py就是将它们转化用的。转化后还要在发布融合信息的launch文件里将odom_combined话题remap成odom_ekf.就可以给movebase使用啦~嘤嘤嘤~!


评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值