【问题解决】 Extrapolation Error: Lookup would require extrapolation -0.044000000s into the future

有时候当配置完move_base各个文件,准备开启move_base节点愉快的进行导航时,打开Rviz,使用2D Nav Goal工具发布了一个目标点,会出现全局规划路径,但机器人不动,开启move_base节点的终端出现以下错误:

[ERROR] [1669281693.716503087, 871.669000000]: Extrapolation Error: Lookup would require extrapolation -0.044000000s into the future.  Requested time 871.665000000 but the latest data is at time 871.621000000, when looking up transform from frame [odom] to frame [map]

[ERROR] [1669281693.716542307, 871.669000000]: Global Frame: odom Plan Frame size 156: map

1.两个控制器之间时间不同步

我刚开始以为这个问题是两个控制器之间时间不同步的问题,但仿真平台不存在时间不同步的问题,我在仿真平台跑也出现了上图错误,于是排除时间不同步的可能。

关于时间不同步问题的解决可查看这篇文章

2.修改代价地图配置参数 

网上找了一圈也没解决,最后我分析了一下这个错误,感觉跟坐标变换和时间戳有关,下面那个错误又提到Global Frame,odom Plan Frame这些关键词,我怀疑是move_base的配置文件中哪个坐标系配置错了,或者坐标变换发布频率不一致。

经过分析后,需要做以下配置:

这是move_base的启动节点,需要对框出来的两个跟代价地图配置有关的文件进行配置:

 局部代价地图中,主要是前三项,update_frequency的数值要和其他几个频率一致,这里的global_frame一定要是odom

全局代价地图中,也是前三项,update_frequency的数值要和其他几个频率一致,这里的global_frame是map


到这为止,修改完应该可以进行导航了,但是当进行实物小车导航时,可能会出现如下错误:

这个可能是footprint参数设置的格式不对,正确的格式应该是一个数组,对应的文件在costmap_common_params.yaml,代价地图基本常规文件中,在move_base启动launch文件中一般是前两个。

如果是圆形底盘就配置robot_radius参数(半径),如果是多边形底盘,就配置footprint参数

如果这样还不能解决的话,可以更新升级一下move_base功能包

sudo apt-get upgrade

 

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
`waitForTransform` 函数在等待坐标系之间的变换关系时,需要提供一个时间戳 `time` 参数,表示所需变换的时间戳。如果该时间戳在变换的缓存范围内,则函数可以直接返回变换关系,否则需要等待直到变换关系可以被查询。 当调用 `waitForTransform` 函数时,如果所需变换的时间戳比当前时间戳晚(即未来时间戳),则会出现 `Lookup would require extrapolation into the future` 错误。这是因为 `waitForTransform` 函数默认只能查询早于或等于当前时间戳的变换关系,无法查询未来时间戳的变换关系。 解决方法是需要确保所需变换的时间戳早于当前时间戳,或者等待一段时间直到所需变换的时间戳早于或等于当前时间戳。一种解决方法是使用 `ros::Time::now()` 获取当前时间戳,并与所需变换的时间戳进行比较,如果所需变换的时间戳晚于当前时间戳,则等待一段时间再重试。示例代码如下: ```cpp #include <ros/ros.h> #include <tf/transform_listener.h> int main(int argc, char** argv){ ros::init(argc, argv, "example_tf_listener"); tf::TransformListener listener; ros::Rate rate(10.0); while (ros::ok()){ tf::StampedTransform transform; try{ ros::Time now = ros::Time::now(); ros::Duration timeout(1.0); // 等待变换时间戳早于或等于当前时间戳 if (listener.waitForTransform("target_frame", "source_frame", now, timeout)){ // 获取变换 listener.lookupTransform("target_frame", "source_frame", now, transform); } } catch (tf::TransformException ex){ ROS_ERROR("%s",ex.what()); } rate.sleep(); } return 0; } ``` 在上述代码中,首先获取当前时间戳 `now`,然后使用 `waitForTransform` 函数等待变换时间戳早于或等于 `now`,超时时间为 1 秒。如果等待成功,则使用 `lookupTransform` 函数获取变换关系。如果等待超时,则不获取变换关系。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值