赞
踩
显示5秒中坐标关系:
ros2 run tf2_tools view_frames.py
查看一个坐标系关于另一个坐标系相对位置
ros2 run tf2_ros tf2_echo (坐标1) (坐标2)
使用rviz2对TF坐标进行可视化显示:
ros2 run rviz2 rviz2
在选项栏左下角add里加入新TF,把fixed Frame设为World,可以看到随着海龟移动各自在坐标系上位置也在移动
静态TF广播
有些时候一个物体坐标关于另一个参考系为固定的,如一般来说房子相对地面是静态的
import rclpy # ROS2 Python接口库 from rclpy.node import Node # ROS2 节点类 from geometry_msgs.msg import TransformStamped # 坐标变换消息 import tf_transformations # TF坐标变换库 from tf2_ros.static_transform_broadcaster import StaticTransformBroadcaster # TF静态坐标系广播器类 class StaticTFBroadcaster(Node): def __init__(self, name): super().__init__(name) # ROS2节点父类初始化 self.tf_broadcaster = StaticTransformBroadcaster(self) # 创建一个TF广播器对象 static_transformStamped = TransformStamped() # 创建一个坐标变换的消息对象 static_transformStamped.header.stamp = self.get_clock().now().to_msg() # 设置坐标变换消息的时间戳 static_transformStamped.header.frame_id = 'world' # 设置一个坐标变换的源坐标系 static_transformStamped.child_frame_id = 'house' # 设置一个坐标变换的目标坐标系 static_transformStamped.transform.translation.x = 10.0 # 设置坐标变换中的X、Y、Z向的平移 static_transformStamped.transform.translation.y = 5.0 static_transformStamped.transform.translation.z = 0.0 quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0) # 将欧拉角转换为四元数(roll, pitch, yaw) static_transformStamped.transform.rotation.x = quat[0] # 设置坐标变换中的X、Y、Z向的旋转(四元数) static_transformStamped.transform.rotation.y = quat[1] static_transformStamped.transform.rotation.z = quat[2] static_transformStamped.transform.rotation.w = quat[3] self.tf_broadcaster.sendTransform(static_transformStamped) # 广播静态坐标变换,广播后两个坐标系的位置关系保持不变 def main(args=None): rclpy.init(args=args) # ROS2 Python接口初始化 node = StaticTFBroadcaster("static_tf_broadcaster") # 创建ROS2节点对象并进行初始化 rclpy.spin(node) # 循环等待ROS2退出 node.destroy_node() # 销毁节点对象 rclpy.shutdown()
1 static_transformStamped = TransformStamped()
创建广播器对象,该对象在ROS2里是定义好的,在前面from geometry_msgs.msg import TransformStamped 即可。这里类似于话题发布,先创建发布者对象,再往对象里填充消息
2 static_transformStamped.header.stamp = self.get_clock().now().to_msg()
获取对应时间
3 static_transformStamped.header.frame_id = ‘world’
header为静态参考系,这里我们选择world为参考系
4 static_transformStamped.child_frame_id = ‘house’
child为物体“house”坐标
5 static_transformStamped.transform.translation.x = 10.0
static_transformStamped.transform.translation.y = 5.0
static_transformStamped.transform.translation.z = 0.0
设置x,y,z三个方向水平坐标
6 quat = tf_transformations.quaternion_from_euler(0.0, 0.0, 0.0)
static_transformStamped.transform.rotation.x = quat[0]
static_transformStamped.transform.rotation.y = quat[1]
static_transformStamped.transform.rotation.z = quat[2]
static_transformStamped.transform.rotation.w = quat[3]
设置角度坐标。ROS2里默认使用四元数作为角度坐标,不过我们可以先用欧拉角表示然后使用函数tf_transformations.quaternion_from_euler将其转换为四元数
7 self.tf_broadcaster.sendTransform(static_transformStamped)
广播消息,由于这里坐标为静态,广播一次即可
效果如下:
TF监听器
import rclpy # ROS2 Python接口库
from rclpy.node import Node # ROS2 节点类
import tf_transformations # TF坐标变换库
from tf2_ros import TransformException # TF左边变换的异常类
from tf2_ros.buffer import Buffer # 存储坐标变换信息的缓冲类
from tf2_ros.transform_listener import TransformListener # 监听坐标变换的监听器类
class TFListener(Node):
def __init__(self,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。