ros发布tf
时间: 2025-06-08 08:04:50 浏览: 32
### 如何在 ROS 中发布 TF 变换
#### 使用 `static_transform_publisher` 发布静态变换
在 ROS 中,可以通过命令行工具 `static_transform_publisher` 来发布静态的坐标变换关系。该工具属于 `tf2_ros` 功能包的一部分[^2]。下面是一个典型的例子:
```bash
rosrun tf2_ros static_transform_publisher 5 5 5 0 0 0 /base_link /radar
```
上述命令表示创建了一个从 `/base_link` 到 `/radar` 的固定变换关系,其中 `(5, 5, 5)` 是平移量 (单位为米),`(0, 0, 0)` 表示旋转角度 (以弧度制给出)[^1]。
---
#### 编写 Python 或 C++ 节点来发布动态变换
对于更复杂的场景,可以编写自定义节点来实时计算并广播动态变换数据。以下是基于 Python 和 C++ 的实现方式:
##### 基于 Python 的动态变换发布器
以下代码展示了如何通过 Python 广播一个随时间变化的坐标系转换关系:
```python
#!/usr/bin/env python
import rospy
import tf2_ros
from geometry_msgs.msg import TransformStamped
import math
def broadcast_tf():
node = rospy.init_node('dynamic_tf_broadcaster', anonymous=True)
br = tf2_ros.TransformBroadcaster()
rate = rospy.Rate(10)
while not rospy.is_shutdown():
t = rospy.Time.now().to_sec() * math.pi
transform = TransformStamped()
transform.header.stamp = rospy.Time.now()
transform.header.frame_id = "world"
transform.child_frame_id = "robot"
# 设置平移部分
transform.transform.translation.x = math.sin(t)
transform.transform.translation.y = math.cos(t)
transform.transform.translation.z = 0.0
# 设置四元数形式的旋转部分
transform.transform.rotation.x = 0.0
transform.transform.rotation.y = 0.0
transform.transform.rotation.z = 0.0
transform.transform.rotation.w = 1.0
br.sendTransform(transform)
rate.sleep()
if __name__ == '__main__':
try:
broadcast_tf()
except rospy.ROSInterruptException:
pass
```
这段脚本会每隔一段时间更新一次 `/world` 到 `/robot` 的变换矩阵,并将其发送到 TF 主题上[^3]。
---
##### 基于 C++ 的动态变换发布器
如果偏好使用 C++ 实现,则可参考如下代码片段:
```cpp
#include <ros/ros.h>
#include <tf2/LinearMath/Quaternion.h>
#include <geometry_msgs/TransformStamped.h>
#include <tf2_ros/transform_broadcaster.h>
int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
ros::NodeHandle nh;
tf2_ros::TransformBroadcaster broadcaster;
ros::Rate rate(10);
while(nh.ok()){
geometry_msgs::TransformStamped tfs;
tfs.header.stamp = ros::Time::now();
tfs.header.frame_id = "map";
tfs.child_frame_id = "drone";
// 定义位置偏移
tfs.transform.translation.x = cos(ros::Time::now().toSec());
tfs.transform.translation.y = sin(ros::Time::now().toSec());
tfs.transform.translation.z = 0.0;
// 定义姿态角
tf2::Quaternion q;
q.setRPY(0, 0, ros::Time::now().toSec()); // 绕 Z 轴旋转一定角度
tfs.transform.rotation.x = q.getX();
tfs.transform.rotation.y = q.getY();
tfs.transform.rotation.z = q.getZ();
tfs.transform.rotation.w = q.getW();
broadcaster.sendTransform(tfs);
rate.sleep();
}
}
```
以上程序实现了类似的逻辑——即让无人机围绕某个中心点做圆周运动的同时调整其朝向[^4]。
---
#### 总结
无论是简单的静态变换还是复杂的时间依赖型动态变换,在 ROS 系统里都可以借助内置的功能包轻松完成设置工作。具体方法取决于实际需求以及开发者的熟悉程度。
阅读全文
相关推荐


















