官网就是最好的教程,如果阅读英文没什么压力,强烈推荐以下链接进行全面了解:
1. ROS中的坐标
机器人当中有一套自己的坐标标准,它的直角坐标系表示如下:

相对于机器人来说:
X :朝前 ,红色
Y :朝左,绿色
Z :朝上,蓝色
旋转变换的坐标表示如下:

其中:Roll,Pitch,Yaw的右手法则,大拇指的方向为X,Y,Z的方向。
怎么理解发布的坐标呢?
建立父link到子link的tf变换,就是让父link向子link移动过程中(x, y, z, Roll,Pitch,Yaw)的变化。
2. tf到tf2的变化
tf已经被ROS弃用了,而且tf2包含了tf的所有功能,所以这里不介绍tf了,如果想要了解tf到tf2的变化,可以点击下列链接。
数据类型的变化:http://wiki.ros.org/tf2/Tutorials/Migration/DataConversions
监听模式的变化:http://wiki.ros.org/tf2/Tutorials/Migration/TransformListener
发布模式的变化:http://wiki.ros.org/tf2/Tutorials/Migration/TransformBroadcaster
3. 发布静态tf2
静态tf是不随时间变化的坐标变换,可以有三种发布方式,:launch方式、urdf发布方式和写代码方式,下面分别介绍。
- 方式一:launch(或run)文件方式发布
这种方式最简单直接,直接发布从父link到子link的坐标变换,代码如下:
1) 欧拉角发布
- launch方法
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z yaw pitch roll link1 link2 100" />
</launch>
- run方法
# 欧拉角
rosrun tf2_ros static_transform_publisher x y z yaw pitch roll frame_id child_frame_id
2) 四元数发布
- launch方法
<launch>
<node pkg="tf" type="static_transform_publisher" name="link1_link2_broadcaster" args="x y z qx qy qz qw link1 link2 100" />
</launch>
- run方法
# 四元数
rosrun tf2_ros static_transform_publisher x y z qx qy qz qw frame_id child_frame_id
x y z 代表link2相对与link1的位置变换。
qx qy qz qw表示link2相对与link1的位姿变换的四元数。
参数100表示每隔100毫秒发布一次。
- 方式二:urdf方式发布
待添加 - 方式三:代码方式发布
创建ros包:
catkin_create_pkg learning_tf2 tf2 tf2_ros roscpp rospy turtlesim
代码以及注释如下:
#include <ros/ros.h>
#include <tf2_ros/static_transform_broadcaster.h>
#include <geometry_msgs/TransformStamped.h>
#include <cstdio>
#include <tf2/LinearMath/Quaternion.h>
#include <iostream>
std::string static_turtle_name;
int main(int argc, char **argv)
{
ros::init(argc,argv, "my_static_tf2_broadcaster");
if(argc != 8)//需要输入8个参数
{
ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw");
return -1;
}
if(strcmp(argv[1],"world")==0)//1号参数不能和world相同,因为它是子link
{
ROS_ERROR("Your static turtle name cannot be 'world'");
return -1;
}
static_turtle_name = argv[1];//赋值给子link,argv[0]为命令节点
static tf2_ros::StaticTransformBroadcaster static_broadcaster;
geometry_msgs::TransformStamped static_transformStamped;
static_transformStamped.header.stamp = ros::Time::now();
static_transformStamped.header.frame_id = "world";
static_transformStamped.child_frame_id = static_turtle_name;
//将char*类型的值转换为double类型,从第2号开始输入值
//前三位为位置变换
static_transformStamped.transform.translation.x = atof(argv[2]);
static_transformStamped.transform.translation.y = atof(argv[3]);
static_transformStamped.transform.translation.z =

本文是ROS中TF2的教程,介绍了ROS中的坐标标准,说明了tf已被弃用、tf2包含其所有功能。详细讲解了发布静态和动态tf2的多种方式,如launch、urdf、代码方式等,还介绍了监听tf2的方法及注意事项,最后提及增加自定义frame的操作。
最低0.47元/天 解锁文章
7468

被折叠的 条评论
为什么被折叠?



