1.代码
#! /usr/bin/env python
# 1.导包
import rospy
import tf.transformations
import tf2_ros
import tf
from geometry_msgs.msg import TransformStamped
"""
发布方:发布两个坐标系的相对关系(车辆底盘--base_link 和 雷达--laser
流程:
1.导包
2.初始化节点
3.创建发布者对象
4.组织被发布的数据
5.发布数据
6.spin()
#若不添加spin(),节点发布完,直接结束了。它的作用是启动一个 ROS 节点的事件处理循环,等待相应回调函数的触发
"""
if __name__ == "__main__":
# 2.初始化 ROS 节点
rospy.init_node("static_pub_p")
# 3.创建发布对象 静态坐标广播器
pub = tf2_ros.StaticTransformBroadcaster()#需要导包tf2_ros
# 4.创建并组织被发布的消息
#消息是geometry_msgs/TransformStamped,需要导包geometry_msgs.msg
ts = TransformStamped()
#消息格式见5.1.1
# --- 头信息
# header
#tf.header.seq = 101#seq序列号可不用设置
ts.header.stamp = rospy.Time.now()
ts.header.frame_id = "base_link"#父坐标系
# --- 子坐标系
#child frame
ts.child_frame_id = "laser"
# --- 坐标系相对信息
# ------ 偏移量(子坐标系相对父坐标系,在xyz轴上的偏移量)
ts.transform.translation.x = 0.2
ts.transform.translation.y = 0.0
ts.transform.translation.z = 0.5
# ------ 四元数
#子坐标系相对父坐标线上,角度的偏移;翻滚x,俯仰y,偏航z
#一般不直接设置四元数,先设置欧拉角(本次雷达相对小车均为0),再转换为四元数(此时xyz均为0,w=1)
#需要导包tf
qtn = tf.transformations.quaternion_from_euler(0,0,0)#从欧拉角获取四元数
ts.transform.rotation.x = qtn[0]
ts.transform.rotation.y = qtn[1]
ts.transform.rotation.z = qtn[2]
ts.transform.rotation.w = qtn[3]
# 5.发布数据
pub.sendTransform(ts)
# 6.spin
rospy.spin()
2.发布的数据 geometry_msgs/TransformStamped
格式如下
表1
std_msgs/Header header #头信息 uint32 seq #|-- 序列号 #可不用设置 time stamp #|-- 时间戳 string frame_id #|-- 父坐标 ID(被参考坐标系) string child_frame_id #子坐标系的 id geometry_msgs/Transform transform #坐标信息 geometry_msgs/Vector3 translation #偏移量(两个坐标系在xyz三个轴的偏移量) float64 x #|-- X 方向的偏移量 float64 y #|-- Y 方向的偏移量 float64 z #|-- Z 方向上的偏移量 geometry_msgs/Quaternion rotation #四元数(子坐标系相对父坐标线上,角度的偏移;翻滚,俯仰,偏航)(不直接设置四元数,先设置欧拉角(本次雷达相对小车均为0),再转换为四元数(此时xyz均为0,w=1),需要导包tf,) float64 x float64 y float64 z float64 w |
3. 运行
先启动roscore,刷新环境变量,rosrun .py文件
1)获取当前话题相关消息
获取当前话题的相关信息
消息类型
发布者信息
订阅者信息
消息类型 Type: tf2_msgs/TFMessage
订阅者有两个:1)rostopic echo /tf_static ;2)rviz(两种查看发布消息的方式)
rostopic type /tf_static 打印该话题的消息类型
rosmsg info tf2_msgs/TFMessage 显示该消息类型的描述信息
2)两种查看发布消息的方式
(1)查看方式1 rostopic echo /tf_static
打印(echo)tf_static话题发布的消息
(注意:本次未设置话题,是tf2函数自带的,tf_static是tf2包的一部分,用于发布静态变换。)
该方式不适合查看动态消息发布,因为会不断刷新,导致在屏幕上不容易观察。
(2)查看方式2 Rviz
红色x,绿色y,蓝色z,
显示了laser相对于base_link的位置关系