0. 简介
我们上面讲了最基础的通信机制以及在Matlab中如何使用这些通信,下面我们这一讲来主要介绍ROS当中最常用的TF坐标系在Matlab中的使用。tf是分布式的,因此所有的坐标帧信息对ROS网络中的每个节点都是可用的。所以这一节就是带领读者熟悉该怎么在Matlab中使用ROS的TF坐标系
1. TF概念
要为这个示例创建一个真实的环境,可以使用exampleHelperROSStartTfPublisher来传播几个转换。这里通过转换来表示安装在机器人上的摄像机的位姿。
在这个变换树中定义了三个坐标坐标系:
- 机器人基本框架(robot_base)
- 相机的安装点(mounting_point)
- 相机的光学中心(camera_center)
同时会发布两个转换:
- 从机器人底座到相机安装点的转换
- 从安装点到相机中心的转换
exampleHelperROSStartTfPublisher
三个坐标坐标系的可视化表示如下所示
在这里,每个帧的x、y和z轴分别用红色、绿色和蓝色线表示。坐标框架之间的父子关系通过一个从子框架指向父框架的棕色箭头显示。
使用rostf函数创建一个新的转换树对象。您可以使用此对象访问所有可用的转换,并将它们应用于不同的实体。
tftree = rostf
tftree =
TransformationTree with properties:
AvailableFrames: {0x1 cell}
LastUpdateTime: [0x1 Time]
BufferTime: 10
DataFormat: ‘object’
一旦创建了对象,它就开始接收tf转换并在内部缓冲它们。将tftree变量保留在工作空间中,以便它继续接收数据。
停顿,以确保接收到所有转换。
pause(2);
您可以通过访问AvailableFrames属性查看所有可用坐标帧的名称。
tftree.AvailableFrames
ans = 3x1 cell
{‘camera_center’ }
{‘mounting_point’}
{‘robot_base’ }
这里显示三个坐标框架,描述相机、其安装点和机器人之间的关系。
2. 获取TF坐标系
现在TF转换是可用的,同时可以检查它们。任何转换都是由ROS的geometry_msgs/TransformStamped消息描述的,该消息中具有平移和旋转组件。
检索描述安装点和摄像机中心之间关系的转换。使用getTransform函数来做到这一点。
mountToCamera = getTransform(tftree, 'mounting_point', 'camera_center');
mountToCameraTranslation = mountToCamera.Transform.Translation
mountToCameraTranslation =
ROS Vector3 message with properties:
MessageType: ‘geometry_msgs/Vector3’
X: 0
Y: 0
Z: 0.5000
Use showdetails to show the contents of the message
quat = mountToCamera.Transform.Rotation
quat =
ROS Quaternion message with properties:
MessageType: ‘geometry_msgs/Quaternion’
X: 0
Y: 0.7071
Z: 0
W: 0.7071
Use showdetails to show the contents of the message
mountToCameraRotationAngles = rad2deg(quat2eul([quat.W quat.X quat.Y quat.Z]))
mountToCameraRotationAngles = 1×3
0 90 0
这里表示相对于安装点,摄像机中心位于沿z轴0.5米的位置,并围绕y轴旋转90度。