tf2.BufferCore::lookupTransform: 找不到从 'map' 到 'base_link' 的变换,错误:传递给 lookupTransform 参数 target_frame 的 'base_link' 不存在
tf2.BufferCore::lookupTransform: Can't find transform from 'map' to 'base_link', error: 'base_link' passed to lookupTransform argument target_frame does not exist
ID: ros2/tf2-buffer-core-timeout
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| ROS2 Foxy Fitzroy | active | — | — | — |
| ROS2 Humble Hawksbill | active | — | — | — |
| ROS2 Iron Irwini | active | — | — | — |
根因分析
TF 缓冲区不包含请求的变换,因为源帧 ('base_link') 从未被发布,或者变换发布者(例如 robot_state_publisher)未运行或未发布正确的帧。
English
The TF buffer does not contain the requested transform because the source frame ('base_link') has never been published, or the transform publisher (e.g., robot_state_publisher) is not running or publishing the correct frames.
官方文档
https://docs.ros.org/en/humble/Tutorials/Intermediate/Tf2/Tf2-Main.html解决方案
-
Verify that the robot_state_publisher is running and publishing the correct transforms. Run `ros2 run tf2_ros tf2_echo map base_link` to check if the transform exists. If not, ensure the URDF/SDF file defines the 'base_link' frame and that robot_state_publisher is launched.
-
If the frame is published by a custom node, add a delay before calling `lookupTransform` to allow the TF tree to populate. Use `tf2_ros::Buffer::canTransform` with a timeout.
无效尝试
常见但无效的做法:
-
70% 失败
Adding a static transform publisher with wrong frame names (e.g., 'odom' instead of 'map') may silence the error but produce incorrect transforms, leading to navigation or visualization issues.
-
80% 失败
Increasing the TF buffer size in the node parameters doesn't help because the transform was never published; the buffer is empty for that frame.