文章目录
1. TF数据的发送
使用tf.TransformBroadcaster
类完成tf树的发布,有两个函数:
- 法1:
sendTransform(translation,rotation,time,child,parent)
- 法2:
sendTransformMessage(transform)
法1:发送手动封装的tf数据
sendTransform(translation,rotation,time,child,parent)
需要将父子farme之间的平移、旋转手动打时间戳,然后发给/tf
案例1:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import tf
import rospy
if __name__ == '__main__':
rospy.init_node('tf_test_node')
br = tf.TransformBroadcaster()
while not rospy.is_shutdown():
br.sendTransform((1,2,0),
tf.transformations.quaternion_from_euler(0,0,0),
rospy.Time.now(),"world","test")
案例2:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
import math
import tf
if __name__ == '__main__':
rospy.init_node('py_tf_broadcaster')
br = tf.TransformBroadcaster()
x=1.0
y=2.0
z=3.0
roll=0
pitch=0
yaw=1.57
rate = rospy.Rate(1)
while not rospy.is_shutdown():
yaw=yaw+0.1
br.sendTransform((x,y,z),
tf.transformations.quaternion_from_euler(roll,pitch,yaw),
rospy.Time.now(),
"base_link",
"link1")
rate.sleep()
法2:发布已经封装好的tf数据
sendTransformMessage(transform)
发送的是已经封装好的Message
案例:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import rospy
import geometry_msgs.msg
import tf2_ros.transform_broadcaster
import math
import tf
if __name__ == '__main__':
rospy.init_node('py_tf_broadcaster')
m=tf.TransformBroadcaster()
t = geometry_msgs.msg.TransformStamped()
t.header.frame_id = 'base_link'
t.header.stamp = rospy.Time(0)
t.child_frame_id = 'link1'
t.transform.translation.x = 1
t.transform.translation.y = 2
t.transform.translation.z = 3
t.transform.rotation.w=1
t.transform.rotation.x=0
t.transform.rotation.y=0
t.transform.rotation.z=0
#输入相对原点的值和欧拉角
rate = rospy.Rate(1)
while not rospy.is_shutdown():
m.sendTransformMessage(t)
rate.sleep()
2. TF树的查看
(1)查看当前tf树:
rosrun rqt_tf_tree rqt_tf_tree
(2)查看两个frame的变换关系
rosrun tf tf_echo [reference_frame] [target_frame]
(3)根据当前tf树创建一个pdf图
rosrun tf view_frames
3. 定义位姿的常用API
(1)定义空间点和空间向量
函数名称 | 函数功能 |
---|---|
tf.transformations.random_quaternion(rand=None) | 返回均匀随机单位四元数 |
tf.transformations.random_rotation_matrix(rand=None) | 返回均匀随机单位旋转矩阵 |
tf.transformations.random_vector(size) | 返回均匀随机单位向量 |
tf.transformations.translation_matrix(v) | 通过向量来求旋转矩阵 |
tf.transformations.translation_from_matrix(m) |
通过旋转矩阵来求向量 |
(2)定义四元数
函数名称 | 函数功能 |
---|---|
tf.transformations.quaternion_about_axis(angle axis) | 通过旋转轴和旋转角返回四元数 |
tf.transformations.quaternion_conjugate(quaternion) | 返回四元数的共轭 |
tf.transformations.quaternion_from_euler(ai,aj,ak, axes’ryxz’) | 从欧拉角和旋转轴,求四元数 |
tf.transformations.quaternion_from_matrix(matrix) | 从旋转矩阵中,返回四元数 |
tf.transformations.quaternion_multiply(quaternion1,quaternion2) | 两个四元数相乘 |
tf.transformations.euler_matrix(ai,aj,ak,axes=‘xyz’) | 由欧拉角和旋转轴返回旋转矩阵 |
tf.transformations.euler_from_matrix(matrix) | 由旋转矩阵和特定的旋转轴返回欧拉角 |
tf.transformations.euler_from_quaternion(quaternion) | 由四元数和特定的轴得到欧拉角 |
(3)欧拉角、位姿矩阵及四元数的转换
函数 | 注释 |
---|---|
euler_matrix(ai,aj,ak,axes=‘sxyz’) | 欧拉角到矩阵 |
euler_form_matrix(matrix,axes=‘sxyz’) | 矩阵到欧拉角 |
euler_from_quaternion(quaternion,axes=‘sxyz’) | 四元数到欧拉角 |
quaternion_form_euler(ai,aj,ak,axes=‘sxyz’) | 欧拉角到四元数 |
quaternion_matrix(quaternion) | 四元数到矩阵 |
quaternion_form_matrix(matrix) | 矩阵到四元数 |
… | … |
参考:
评论(1)
您还未登录,请登录后发表或查看评论