ROS的特遣部队系统跟踪多个坐标框架和维护在一个树结构之间的关系。tf分布,因此所有坐标系的信息是可用的ROS网络中的每个节点。MATLAB®允许您访问这个变换树。这个例子将帮助您熟悉访问可用的坐标框架,检索之间的转换,和变换点,向量,和其他实体之间的任何两个坐标框架。
先决条件:开始使用ROS,连接到一个ROS网络
系统初始化ROS。
rosinit
启动ROS核心….Done 1.2051秒。初始化ROS主在http://192.168.0.10:56211上。初始化全局节点/ matlab_global_node_57681 NodeURI http://dcc864407glnxa64:39369
对于这个示例,创建一个现实的环境使用exampleHelperROSStartTfPublisher
播放一些转换。转换代表一个相机安装在一个机器人。
有三个坐标框架中定义的这个变换树:
机器人基础坐标系(robot_base
)
相机的安装点(mounting_point
)
相机的光学中心(camera_center
)
出版两个转换:
转换从机器人基地相机的安装点
转换从安装角度相机的中心
exampleHelperROSStartTfPublisher
可视化表示的三个坐标框架如下。
在这里,x, y,和z轴的每一帧由红、绿、蓝线分别。之间的父子关系协调框架显示通过一个棕色的箭头从孩子到母公司框架。
创建一个新的转换树对象rostf
函数。您可以使用该对象来访问所有可用的转换,将它们应用到不同的实体。
tftree = rostf
tftree = TransformationTree属性:AvailableFrames: {0 x1细胞}LastUpdateTime: [0 x1时间]BufferTime: 10 DataFormat:“对象”
一旦对象被创建时,它开始接收tf转换和内部缓冲区。保持tftree
变量在工作区中,让它继续接收数据。
暂停一下,以确保所有的转换。
暂停(2);
你可以看到所有可用的坐标框架的名称访问AvailableFrames
财产。
tftree.AvailableFrames
ans =3 x1细胞{' camera_center} {‘mounting_point} {' robot_base '}
这应该显示的三个坐标框架描述相机之间的关系,其安装点,机器人。
现在可用的转换,您可以检查它们。任何转换描述ROSgeometry_msgs / TransformStamped
消息,平移和旋转组件。
检索转换描述安装点和相机之间的关系的中心。使用getTransform
函数。
mountToCamera = getTransform (tftree,“mounting_point”,“camera_center”);mountToCameraTranslation = mountToCamera.Transform.Translation
mountToCameraTranslation = ROS Vector3消息与属性:MessageType:“geometry_msgs / Vector3”X: 0 Y: 0 Z: 0.5000使用showdetails显示消息的内容
皮疹= mountToCamera.Transform.Rotation
皮疹= ROS四元数与属性信息:MessageType:“geometry_msgs /四元数”X: 0 Y: 0.7071 Z: 0 W: 0.7071使用showdetails显示消息的内容
mountToCameraRotationAngles = rad2deg (quat2eul([皮疹。W皮疹。X皮疹。Y quat.Z]))
mountToCameraRotationAngles =1×30 90 0
相对于相机安装点,中心位于沿z轴0.5米,绕y轴旋转90度。
检查机器人基础之间的关系和相机的安装点,电话getTransform
一次。
baseToMount = getTransform (tftree,“robot_base”,“mounting_point”);baseToMountTranslation = baseToMount.Transform.Translation
baseToMountTranslation = ROS Vector3消息与属性:MessageType:“geometry_msgs / Vector3”X: 1 Y: 0 Z: 0使用showdetails显示消息的内容
baseToMountRotation = baseToMount.Transform.Rotation
baseToMountRotation = ROS四元数与属性信息:MessageType:“geometry_msgs /四元数”X: 0 Y: 0 Z: 0 W: 1使用showdetails显示消息的内容
安装点沿着机器人基地位于1米的轴。
假设现在你有一个3 d点的定义camera_center
坐标系,你想点坐标的计算robot_base
框架。
使用waitForTransform
等到之间的转换函数camera_center
和robot_base
协调框架可用。这叫块直到获取数据的变换camera_center
来robot_base
是有效的,可用的转换树。
waitForTransform (tftree“robot_base”,“camera_center”);
现在定义一个点的位置1.5 - 0.2 [3]
在相机中心的坐标系。随后你将改变这一点robot_base
坐标。
pt = rosmessage (“geometry_msgs / PointStamped”);pt.Header。FrameId =“camera_center”;pt.Point。X = 3;pt.Point。Y = 1.5;pt.Point。Z = 0.2;
你可以改变点坐标通过调用变换
函数转换树对象。指定的目标坐标系转换是什么。在这个例子中,使用robot_base
。
tfpt =变换(tftree,“robot_base”pt)
tfpt = ROS PointStamped消息与属性:MessageType:“geometry_msgs / PointStamped”标题:[1 x1头]:[1 x1点]使用showdetails显示消息的内容
转换后的点tfpt
有以下的3 d坐标。
tfpt.Point
ans = ROS点消息的属性:MessageType:“geometry_msgs /点”X: 1.2000 Y: 1.5000 Z: -2.5000使用showdetails显示消息的内容
除了PointStamped
消息,变换
函数允许您将其他实体构成(geometry_msgs / PoseStamped
),四元数(geometry_msgs / QuaternionStamped
),点云(sensor_msgs / PointCloud2
)。
如果你想存储转换,您可以检索的getTransform
函数。
robotToCamera = getTransform (tftree,“robot_base”,“camera_center”)
robotToCamera = ROS TransformStamped消息与属性:MessageType:“geometry_msgs / TransformStamped”标题:[1 x1头]变换:[1 x1变换]ChildFrameId:“camera_center”用showdetails显示消息的内容
这个变换可以用来转换坐标camera_center
坐标系的坐标robot_base
框架。
robotToCamera.Transform.Translation
ans = ROS Vector3消息与属性:MessageType:“geometry_msgs / Vector3”X: 1 Y: 0 Z: 0.5000使用showdetails显示消息的内容
robotToCamera.Transform.Rotation
ans = ROS四元数与属性信息:MessageType:“geometry_msgs /四元数”X: 0 Y: 0.7071 Z: 0 W: 0.7071使用showdetails显示消息的内容
你也可以播放一个新的转换ROS网络。
假设您有一个简单的转换描述的抵消轮
坐标系相对于robot_base
坐标系。车轮沿轴安装-0.2米和-0.3沿z轴。车轮的相对旋转30度的轴。
创建相应的geometry_msgs / TransformStamped
信息描述了这种转变。源坐标系,轮
,放置ChildFrameId
财产。目标坐标系,robot_base
添加到Header.FrameId
财产。
tfStampedMsg = rosmessage (“geometry_msgs / TransformStamped”);tfStampedMsg。ChildFrameId=“轮”;tfStampedMsg.Header。FrameId =“robot_base”;
转换本身所描述的变换
财产。它包含一个翻译
和一个旋转
。填写上面列出的值。
的旋转
被描述为一个四元数。将30度绕y轴旋转四元数,您可以使用axang2quat
(导航工具箱)函数。y轴是所描述的(0 1 0)
向量和30度可以被转换成弧度函数
函数。
tfStampedMsg.Transform.Translation。X = 0;tfStampedMsg.Transform.Translation。Y = -0.2;tfStampedMsg.Transform.Translation。Z = -0.3;函数quatrot = axang2quat ([0 1 0 (30)))
quatrot =1×40.2588 0.9659 0 0
tfStampedMsg.Transform.Rotation。W = quatrot (1);tfStampedMsg.Transform.Rotation。X = quatrot (2);tfStampedMsg.Transform.Rotation。Y = quatrot (3);tfStampedMsg.Transform.Rotation。Z = quatrot (4);
使用rostime
检索当前系统时间和使用时间戳转换。这让收件人知道此时在这个变换是有效的。
tfStampedMsg.Header。邮票= rostime (“现在”);
使用sendTransform
函数来广播这一转变。
sendTransform (tftree tfStampedMsg)
新轮
坐标系是现在还在列表中可用的协调框架。
tftree.AvailableFrames
ans =4 x1细胞{' camera_center} {‘mounting_point} {‘robot_base}{“轮”}
最后的可视化表示的四坐标框架如下。
你可以看到轮
坐标系的平移和旋转你在发送指定转换。
停止转换出版商的例子。
exampleHelperROSStopTfPublisher
关闭ROS掌握全球节点和删除。
rosshutdown
关闭全球节点/ matlab_global_node_57681 NodeURI http://dcc864407glnxa64:39369关闭ROS主在http://192.168.0.10:56211上。