博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
orocos_kdl学习(一):坐标系变换
阅读量:6434 次
发布时间:2019-06-23

本文共 3863 字,大约阅读时间需要 12 分钟。

  KDL中提供了点(point)、坐标系(frame)、刚体速度(twist),以及6维力/力矩(wrench)等基本几何元素,具体可以参考  文档。

 Creating a Frame, Vector and Rotation

  PyKDL中创建一个坐标系时有下面4种构造函数:

__init__()         # Construct an identity frame__init__(rot, pos) # Construct a frame from a rotation and a vector# Parameters:    # pos (Vector) – the position of the frame origin# rot (Rotation) – the rotation of the frame__init__(pos)      # Construct a frame from a vector, with identity rotation# Parameters:     # pos (Vector) – the position of the frame origin__init__(rot)      # Construct a frame from a rotation, with origin at 0, 0, 0# Parameters:    # rot (Rotation) – the rotation of the frame

  下面是一个例子:

#! /usr/bin/env pythonimport PyKDL# create a vector which describes both a 3D vector and a 3D point in spacev = PyKDL.Vector(1,3,5)# create a rotation from Roll Pitch, Yaw anglesr1 = PyKDL.Rotation.RPY(1.2, 3.4, 0)# create a rotation from ZYX Euler anglesr2 = PyKDL.Rotation.EulerZYX(0, 1, 0)# create a rotation from a rotation matrixr3 = PyKDL.Rotation(1,0,0, 0,1,0, 0,0,1)# create a frame from a vector and a rotationf = PyKDL.Frame(r2, v)print f

  结果将如下所示,前9个元素为代表坐标系姿态的旋转矩阵,后三个元素为坐标系f的原点在参考坐标系中的坐标。

[[    0.540302,           0,    0.841471;            0,           1,           0;    -0.841471,           0,    0.540302][           1,           3,           5]]

  根据机器人学导论()附录中的12种欧拉角表示方法,ZYX欧拉角代表的旋转矩阵为:

  代入数据验证,KDL的计算与理论一致。

 

 Extracting information from a Frame, Vector and Rotation

  PyKDL中坐标系类Frame的成员M为其旋转矩阵,p为其原点坐标。

#! /usr/bin/env pythonimport PyKDL# framef = PyKDL.Frame(PyKDL.Rotation.RPY(0,1,0),                PyKDL.Vector(3,2,4))# get the origin (a Vector) of the frameorigin = f.p# get the x component of the originx = origin.x()x = origin[0]print x# get the rotation of the framerot = f.Mprint rot# get ZYX Euler angles from the rotation[Rz, Ry, Rx] = rot.GetEulerZYX()print Rz,Ry,Rx# get the RPY (fixed axis) from the rotation[R, P, Y] = rot.GetRPY()print R,P,Y

  将上述获取到的数据打印出来,结果如下:

3.0[    0.540302,           0,    0.841471;            0,           1,           0;    -0.841471,           0,    0.540302]0.0 1.0 0.00.0 1.0 0.0

   注意GetEulerZYX和GetRPY的结果是一样的,这其实不是巧合。因为坐标系的旋转有24种方式(本质上只有12种结果):绕自身坐标系旋转有12种方式(欧拉角),绕固定参考坐标系旋转也有12种方式(RPY就是其中一种)。EulerZYX按照Z→Y→X的顺序绕自身坐标轴分别旋转$\alpha$、$\beta$、$\gamma$角;RPY按照X→Y→Z的顺序绕固定坐标系旋转$\gamma$、$\beta$、$\alpha$角,这两种方式最后得到的旋转矩阵是一样的。

 

Transforming a point

  frame既可以用来描述一个坐标系的位置和姿态,也可以用于变换。下面创建了一个frame,然后用其对一个空间向量或点进行坐标变换:

#! /usr/bin/env pythonimport PyKDL# define a framef = PyKDL.Frame(PyKDL.Rotation.RPY(0,1,0),                PyKDL.Vector(3,2,4))# define a pointp = PyKDL.Vector(1, 0, 0)print p# transform this point with fp = f * pprint p

 

Creating from ROS types

  这个package包含了一系列转换函数,用于将tf类型的数据(point, vector, pose, etc) 转换为与其它库同类型的数据,比如KDL和Eigen。用下面的命令在catkin_ws/src中创建一个测试包:

catkin_create_pkg test rospy tf geometry_msgs

  test.py程序如下(注意修改权限chmod +x test.py):

#! /usr/bin/env pythonimport rospyimport PyKDLfrom tf_conversions import posemathfrom geometry_msgs.msg import Pose# you have a Pose messagepose = Pose()pose.position.x = 1pose.position.y = 1pose.position.z = 1pose.orientation.x = pose.orientation.y = pose.orientation.z = 0pose.orientation.w = 1# convert the pose into a kdl framef1 = posemath.fromMsg(pose)# create another kdl framef2 = PyKDL.Frame(PyKDL.Rotation.RPY(0,1,0),                 PyKDL.Vector(3,2,4))# Combine the two framesf = f1 * f2print f[x, y, z, w] = f.M.GetQuaternion()print x,y,z,w# and convert the result back to a pose messagepose = posemath.toMsg(f)pub = rospy.Publisher('pose', Pose, queue_size=1)rospy.init_node('test', anonymous=True)rate = rospy.Rate(1) # 1hzwhile not rospy.is_shutdown():    pub.publish(pose)    rate.sleep()

  通过posemath.toMsg可以将KDL中的frame转换为geometry_msgs/Pose类型的消息。最后为了验证,创建了一个Publisher将这个消息发布到pose话题上。使用catkin_make编译后运行结果如下:

 

 

参考:

转载于:https://www.cnblogs.com/21207-iHome/p/8312854.html

你可能感兴趣的文章
.NET分布式缓存Redis从入门到实战
查看>>
DPDK 全面分析
查看>>
sudo with no password
查看>>
洛谷P1919 【模板】A*B Problem升级版(FFT快速傅里叶)
查看>>
poj3296--Rinse(三分)
查看>>
虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...
查看>>
最短路径 - 迪杰斯特拉(Dijkstra)算法
查看>>
plsql developer 64位版本
查看>>
上海全球“编程一小时”活动记
查看>>
Win8Metro(C#)数字图像处理--2.33图像非线性变换
查看>>
【翻译】Nginx的反向代理
查看>>
htm、html、shtml网页区别
查看>>
InstallShield Build Error -1014: Cannot rename directory <PATH> to <PATH>\folder.Bak.
查看>>
HTML特殊符号对照表
查看>>
遍历文件夹下的子文件夹的时候,文件夹名字包含逗号或者空格
查看>>
SOD 框架
查看>>
SpringCloud学习笔记:服务注册与发现Eureka(2)
查看>>
input file 文件上传,js控制上传文件的大小和格式
查看>>
Sales Order ORA-04062 FRM-40815 in EBS R12.2.4
查看>>
第17件事 成功要素分析
查看>>