#include "rclcpp/rclcpp.hpp" #include "geometry_msgs/msg/transform_stamped.hpp"//提供消息接口 #include "tf2/LinearMath/Quaternion.h"//提供tf2::Quaternion类 #include "tf2_geometry_msgs/tf2_geometry_msgs.hpp"//消息类型转换函数 #include "tf2_ros/static_transform_broadcaster.h" //静态坐标广播器类
时间: 2025-06-26 22:02:05 浏览: 12
### 使用 C++ 实现 ROS2 中 TF2 的坐标变换及广播功能
在 ROS2 中,`tf2_ros::StaticTransformBroadcaster` 是用于发布静态坐标变换的核心工具之一。通过它,可以轻松地将 `geometry_msgs::msg::TransformStamped` 类型的消息发送到 `/tf_static` 主题上。
以下是基于引用内容以及标准实践的一个完整示例:
#### 静态坐标变换的发布流程
为了实现静态坐标变换的广播,需要完成以下几个部分的工作:
1. 创建一个 `rclcpp::Node` 对象作为节点的基础。
2. 初始化并配置 `tf2_ros::StaticTransformBroadcaster` 来广播消息。
3. 构造 `geometry_msgs::msg::TransformStamped` 消息对象,并设置其字段值(如平移量和旋转量)。
4. 调用 `sendTransform()` 方法来发布该消息。
具体代码如下所示:
```cpp
#include <memory>
#include <cmath>
// 包含必要的头文件
#include "rclcpp/rclcpp.hpp"
#include "tf2/LinearMath/Quaternion.h" // 提供四元数操作支持 [^2]
#include "tf2_ros/static_transform_broadcaster.h" // StaticTransformBroadcaster 定义所在位置
#include "geometry_msgs/msg/transform_stamped.hpp"
class StaticTfPublisher : public rclcpp::Node {
public:
StaticTfPublisher() : Node("static_tf_publisher") {
// 初始化静态变换广播器
static_broadcaster_ = std::make_shared<tf2_ros::StaticTransformBroadcaster>(this);
// 设置要发布的变换数据
make_transforms();
}
private:
void make_transforms() {
geometry_msgs::msg::TransformStamped transform;
// 设置 header 和时间戳
transform.header.stamp = this->now(); // 当前时间戳
transform.header.frame_id = "world"; // 父级参考系名称
transform.child_frame_id = "object"; // 子级参考系名称
// 设置平移分量 (x, y, z)
transform.transform.translation.x = 0.5;
transform.transform.translation.y = -0.3;
transform.transform.translation.z = 1.0;
// 计算并设置旋转分量 (quaternion 表达方式)
double roll = M_PI / 4; // 绕 X 轴旋转角度为 π/4 弧度
double pitch = 0.0; // 绕 Y 轴无旋转
double yaw = M_PI / 2; // 绕 Z 轴旋转角度为 π/2 弧度
tf2::Quaternion quat;
quat.setRPY(roll, pitch, yaw); // 将欧拉角转成四元数形式
transform.transform.rotation.x = quat.getX();
transform.transform.rotation.y = quat.getY();
transform.transform.rotation.z = quat.getZ();
transform.transform.rotation.w = quat.getW();
// 广播此变换
static_broadcaster_->sendTransform(transform);
}
st
阅读全文
相关推荐


















