TF_动态坐标系之间的转换

需求

启动 turtlesim_node,该节点中窗体有一个世界坐标系(左下角为坐标系原点),乌龟是另一个坐标系,键盘控制乌龟运动,将两个坐标系的相对位置动态发布。

示例

学习案例

  • 小乌龟订阅位置通信
  • TF_坐标变换案例

实现思路

  • 实现目标:发布两个坐标系的相对位置关系
  • 将小乌龟当成一个坐标系,已知话题 /turtle1/pose中会动态发布小乌龟的位置信息
  • 将发布的小乌龟的位置信息进行相应的转换即可

具体:

  • 编写一个可执行文件,去订阅话题里面的内容,在回调函数中,去发布相对位置信息即可。

代码实现

#! usr/bin/env python

import rospy
import tf.transformations
from turtlesim.msg import Pose
from geometry_msgs.msg import TransformStamped
import tf
import tf2_ros
'''
    需求:订阅小乌龟位置信息的话题,在回调函数中,发布小乌龟的位置信息
    步骤:
        1.导包
        2.初始化ros节点
        3.创建订阅者对象
        4.回调函数
        5.spin()

'''

def pub_callback(msg):
    #获取小乌龟的位置信息
    '''
    float32 x
    float32 y
    float32 theta
    float32 linear_velocity
    float32 angular_velocity
    '''

    rospy.loginfo("乌龟的位置信息:(%.2f,%.2f)",msg.x,msg.y)

    #有了两个坐标系之间的相对关系,转化成标准格式
    transform_msg = TransformStamped()
    '''
    std_msgs/Header header
        uint32 seq
        time stamp
        string frame_id
    string child_frame_id
    geometry_msgs/Transform transform
    geometry_msgs/Vector3 translation
        float64 x
        float64 y
        float64 z
    geometry_msgs/Quaternion rotation
        float64 x
        float64 y
        float64 z
        float64 w

    '''
    #---------header-----------------
    transform_msg.header.frame_id = "world"
    transform_msg.header.stamp = rospy.Time.now()
    #---------child_frame_id-----------------
    transform_msg.child_frame_id = "turtle1"
    #---------位置坐标系之间转化的坐标点,设置偏移量-----------------
    transform_msg.transform.translation.x = msg.x
    transform_msg.transform.translation.y = msg.y
    transform_msg.transform.translation.z = 0.0
    #---------四元数的转化----------------
    qtn = tf.transformations.quaternion_from_euler(0,0,msg.theta)
    transform_msg.transform.rotation.x = qtn[0]
    transform_msg.transform.rotation.y = qtn[1]
    transform_msg.transform.rotation.z = qtn[2]
    transform_msg.transform.rotation.w = qtn[3]

    #采用广播发布
    broadcaster = tf2_ros.TransformBroadcaster()
    broadcaster.sendTransform(transform_msg)






if __name__ == "__main__":
    
    #节点初始化
    rospy.init_node('tf_optimistic')

    #创建订阅者对象
    sub = rospy.Subscriber('/turtle1/pose', Pose, pub_callback,queue_size=10)

    #编写回调函数

    #挂起,等待消息来临
    rospy.spin()

总结

启动流程

  • 启动roscore
  • 启动小乌龟节点:rosrun turtlesim turtlesim_node
  • 启动小乌龟控制节点:rosrun turtlesim turtle_teleop_key
  • 启动动态坐标发布节点:rosrun 包名 可执行文件名
  • 启动rviz仿真查看:rviz

关键API

#创建订阅者对象
sub = rospy.Subscriber(‘/turtle1/pose’, Pose, pub_callback,queue_size=10)

#有了两个坐标系之间的相对关系,转化成标准格式
transform_msg = TransformStamped()

#采用广播发布
broadcaster = tf2_ros.TransformBroadcaster()
broadcaster.sendTransform(transform_msg)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值