ROS2 Humble中ORB_SLAM3结合IMU单目发布位姿的TF2报错解决
解决ROS2 Humble中ORB_SLAM3位姿发布的TF2编译错误
错误原因分析
tf2::Transform tf_msg;报错:未正确引入tf2的头文件或命名空间,导致编译器无法识别tf2命名空间。tf_msg::poseTFToMsg(transform, pose.pose);报错:混淆了变量名与命名空间,poseTFToMsg属于tf2命名空间,而非你定义的变量tf_msg。
具体修复步骤
1. 确认正确的头文件包含
在你的源文件顶部添加以下必要的tf2相关头文件:
#include "tf2/transform_datatypes.h" #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"
tf2/transform_datatypes.h提供tf2::Transform的定义;tf2_geometry_msgs/tf2_geometry_msgs.hpp提供tf2::poseTFToMsg转换函数的声明(ROS2 Humble中需用.hpp后缀的C++版本头文件)。
2. 修正代码中的错误行
将错误的两行代码替换为:
// 重命名变量避免与命名空间/函数名混淆 tf2::Transform transform_tf; // 正确调用tf2命名空间下的转换函数 tf2::poseTFToMsg(transform_tf, pose.pose);
- 避免使用
tf_msg作为变量名,防止与后续可能的消息类型名或命名空间混淆; - 确保
poseTFToMsg的调用前缀为tf2::,而非错误的变量名。
3. 完善CMakeLists.txt依赖
除了已有的tf2依赖,还需添加tf2_geometry_msgs和geometry_msgs的依赖,示例配置如下:
find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(tf2 REQUIRED) find_package(tf2_geometry_msgs REQUIRED) find_package(geometry_msgs REQUIRED) # 替换your_node_name为你的节点目标名 ament_target_dependencies(your_node_name rclcpp tf2 tf2_geometry_msgs geometry_msgs )
4. ORB_SLAM3位姿到tf2::Transform的转换示例
如果你的位姿来自ORB_SLAM3的Sophus SE3类型,可参考以下转换代码:
// 从ORB_SLAM3获取位姿 ORB_SLAM3::Sophus::SE3f slam_pose = ...; tf2::Transform transform_tf; // 设置平移分量 transform_tf.setOrigin(tf2::Vector3( slam_pose.translation().x(), slam_pose.translation().y(), slam_pose.translation().z() )); // 设置旋转分量(四元数) tf2::Quaternion q( slam_pose.so3().unit_quaternion().x(), slam_pose.so3().unit_quaternion().y(), slam_pose.so3().unit_quaternion().z(), slam_pose.so3().unit_quaternion().w() ); transform_tf.setRotation(q);
内容的提问来源于stack exchange,提问作者Macedon971
相关产品推荐
相关产品推荐

