07 ROS的TF坐标管理工具

本文涉及的产品
资源编排,不限时长
简介: 本文详细介绍了ROS(机器人操作系统)中TF(Transform)坐标管理工具的使用方法,包括如何监听和广播坐标变换消息,使用相关命令行工具查看TF关系,以及如何通过编写节点代码来创建TF广播器和监听器,并展示了如何在launch文件中配置TF相关的节点。

一、TF介绍

TF 即 Transform 转换之意
通过坐标变换可以得到一个机器人中不同坐标系之间的关系
A坐标系下的位置和姿态可以通过平移和旋转,转化成B坐标系下的位姿
订阅TF消息的节点将会缓冲一份一段时间内所有坐标系变换关系的数据

二、使用TF功能包的方式

1. 监听TF变换 Listen

接收、缓存系统发布的所有坐标变换数据,从中查询所需的坐标变换关系

2. 广播TF变换 Broadcast

向系统内广播坐标系之间的变换关系
广播可以将坐标关系存入TF树,不需要再与其他不同部分同步

定义TF广播器
创建坐标变化值并封装
发布坐标变换

三、TF工具的使用

1. 查看TF树中所有坐标的发布状态

为可选参数
可以单独查看两个坐标之间的发布状态

rosrun tf tf_monitor <source_frame> <target_frame>

2. 查看两个坐标系的变换关系

rosrun tf tf_echo turtle1 turtle2

结果:打印出了用RPY和四元数两种方式描述坐标系之间的关系的数据

At time 1647863106.937

  • Translation: [0.000, 0.000, 0.000]
  • Rotation: in Quaternion [0.000, 0.000, 0.243, 0.970]
    in RPY (radian) [0.000, -0.000, 0.491]
    in RPY (degree) [0.000, -0.000, 28.144]

3. 发布相对静态坐标系的坐标变换

设置两相对静止坐标系间的偏移参数和旋转参数
两种表示方式
1.弧度制 2.使用四元数表示旋转角度

绕z轴的偏航角yaw 绕y轴的俯仰角pitch 绕x轴的翻滚角roll

rosrun tf static_transform_publisher x y z yaw pitch roll father_frame_id child_frame_id period_in_ms
rosrun tf static_transform_publisher x y z qx qy qz qw father_frame_id child_frame_id period_in_ms

在launch文件中使用该命令

<launch>
    <node 
        pkg="tf"
        type="static_transform_publisher"
        name="link1_to_link2_TF_Broadcaster"
        args="1 0 0 0 0 0 1 link1_parent link1 100"
    />
</launch>

4. 可视化查看TF关系树

可视化TF树并生成pdf文件

rosrun tf view_frames

pdf文件可以直接查看,也可以

evince frames.pdf

5. 三维坐标可视化工具Rviz

可以用三维坐标可视化工具Rviz来查看turtle_tf例程中的两龟关系

rosrun rviz rviz -d 'rospack find turtle_tf'/rviz/turtle_rviz.rviz

四、创建TF广播器 TF Broadcaster

广播器将TF信息插入TF树并发布

/*
Node Function:
create tf data , calculate and publish velocity command to turtle2
*/
#include<ros/ros.h>
#include<tf/transform_broadcaster.h>
#include<turtlesim/Pose.h>

std::string turtle_name;
//回调函数
void PoseCallBackFunction(const turtlesim::PoseConstPtr& msg)
{
   
    //create TF_Broadcaster
    //广播器
    static tf::TransformBroadcaster br;

    //TF_data INIT
    //设置turtle相对于world的坐标变换
    tf::Transform transform;
    //setOrigin设置平移变换
    transform.setOrigin(tf::Vector3(msg->x,msg->y,0.0));
    tf::Quaternion qt;
    qt.setRPY(0,0,msg->theta);
    //setOrigin设置旋转变换
    transform.setRotation(qt);

    //Broadcast TFData between world and turtle Coordinate System
    //发布坐标变换
    //该类型的TF消息不仅包含tf::Transform的坐标变换与时间轴,而且要指定父坐标系和子坐标系
    br.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"world",turtle_name));    
}

//char** argv is used to figure out turtle1 and turtle2
//but the Node name should be unique and only
//how to set different Node name for turtle1 and turtle2
//it's called Remap
int main(int argc,char** argv)
{
   
    //ROSINIT
    ros::init(argc,argv,"my_tf_broadcaster");

    //INIT NodeHandle
    ros::NodeHandle n;

    //name the turtle
    if(argc!=2)
    {
   
        ROS_ERROR("Need Turtle Name as Argument");
        return -1;
    }

    turtle_name= argv[1];

    //Create a subscriber for Pose of turtle
    //turtle_name could be turtle12345678
    ros::Subscriber sub=n.subscribe(turtle_name+"/pose",10,&PoseCallBackFunction);

    //Waiting for CBF
    ros::spin();

    return 0;
}

五、创建TF监听器 TF Listener

turtle1相对于world的TF信息已经插入树,Listener从TF树处监听TF消息,并从中获取turtle2关于turtle1的坐标变换,从而指导turtle2的运动

/*
Node Function:
Listen to TFDATA,calculate and pub turtle2 velocity command
*/
#include<ros/ros.h>
#include<tf/transform_listener.h>
#include<geometry_msgs/Twist.h>
#include <turtlesim/Spawn.h>

int main(int argc,char** argv)
{
   
    //ROSINIT
    ros::init(argc,argv,"my_tf_listener");
    ros::NodeHandle n;

    //request service /spawn to create turtle2
    ros::service::waitForService("/spawn");
    ros::ServiceClient add_turtle =n.serviceClient<turtlesim::Spawn>("/spawn");
    turtlesim::Spawn srv;
    add_turtle.call(srv);

    //Create velocity command Publisher for turtle2
    ros::Publisher turtle_vel=n.advertise<geometry_msgs::Twist>("turtle2/cmd_vel",10);

    //Create TF Listener
    tf::TransformListener listener;
    ros::Rate rate(10.0);//监听TF树,缓存10.0s
    while(n.ok())
    {
   
        //get TF Data between turtle1 and turtle2 Coordinate System
        tf::StampedTransform transform;
        //Duration :3s overtime
        //lookup relation between turtle1 and turtle2
        //result saves in Variable transform
        try
        {
   
            listener.waitForTransform("/turtle2","/turtle1",ros::Time(0),ros::Duration(3.0));
            listener.lookupTransform("/turtle2","/turtle1",ros::Time(0),transform);
            //获取turtle2和turtle1的变换关系并存在transform里
        }
        catch(tf::TransformException &ex)
        {
   
            ROS_ERROR("%s",ex.what());
            ros::Duration(1.0).sleep();
            continue;
        }

        //pub turtle2 velocity command based on relationship between t1 and t2 Coordinate System
        geometry_msgs::Twist vel_msg;
        vel_msg.angular.z=4.0 * atan2(transform.getOrigin().y(),transform.getOrigin().x());
        vel_msg.linear.x=0.5*sqrt(pow(transform.getOrigin().x(),2)+pow(transform.getOrigin().y(),2));
        turtle_vel.publish(vel_msg);
        rate.sleep();
    }
    return 0;
}

六、配置launch文件

<launch>
<!-- turtlesim Node -->
    <node
        pkg="turtlesim"
        type="turtlesim_node"
        name="sim_node"
    />
<!-- turtlesim keyboard Node -->    
    <node
        pkg="turtlesim"
        type="turtle_teleop_key"
        name="keyboard_node"
    />
<!-- turtle1 and turtle2 TF Broadcaster Node -->
    <node
        pkg="learning_tf"
        type="turtle_tf_broadcaster"
        name="Turtle1_TF_Broadcaster"
        args="/turtle1"
    />

    <node
        pkg="learning_tf"
        type="turtle_tf_broadcaster"
        name="Turtle2_TF_Broadcaster"
        args="/turtle2"
    />
<!-- TF Listener for controling  velocity of turtle2-->
    <node
        pkg="learning_tf"
        type="turtle_tf_listener"
        name="Turtle_Listener"
    />
</launch>
相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
Python
ROS节点检测ArUco标签并记录空间坐标
利用Realsense D435i相机检测ArUco标签,使用Python程序订阅相机的ROS话题,记录Time和标签的XYZ值,储存在一个csv文件中;当出现识别不到标签或者反馈坐标为0,0,0的情况时,不进行记录。
328 0
|
机器人 API
[ROS基础] --- TF坐标转换
[ROS基础] --- TF坐标转换
213 0
|
C++
ROS学习-写一个tf broadcaster(C++)
ROS学习-写一个tf broadcaster(C++)
195 0
ROS学习-写一个tf broadcaster(C++)
|
数据可视化 Ubuntu 机器人
ROS学习-tf介绍
ROS学习-tf介绍
283 0
ROS学习-tf介绍
|
传感器 存储 机器人
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
ROS TF 将传感器数据转换为机器人坐标系下
|
XML C++ 数据格式
【古月21讲】ROS入门系列(4)——参数使用与编程方法、坐标管理系统、tf坐标系广播与监听的编程实现、launch启动文件的使用方法
【古月21讲】ROS入门系列(4)——参数使用与编程方法、坐标管理系统、tf坐标系广播与监听的编程实现、launch启动文件的使用方法
282 0
【古月21讲】ROS入门系列(4)——参数使用与编程方法、坐标管理系统、tf坐标系广播与监听的编程实现、launch启动文件的使用方法
|
2月前
|
Ubuntu 机器人 Linux
|
29天前
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
前言 最近开始接触到基于DDS的这个系统,是在稚晖君的机器人项目中了解和认识到。于是便开始自己买书学习起来,感觉挺有意思的,但是只是单纯的看书籍,总会显得枯燥无味,于是自己又开始在网上找了一些视频教程结合书籍一起来看,便让我对ROS系统有了更深的认识和理解。 ROS的发展历程 ROS诞生于2007年的斯坦福大学,这是早期PR2机器人的原型,这个项目很快被一家商业公司Willow Garage看中,类似现在的风险投资一样,他们投了一大笔钱给这群年轻人,PR2机器人在资本的助推下成功诞生。 2010年,随着PR2机器人的发布,其中的软件正式确定了名称,就叫做机器人操作系统,Robot Op
71 14
|
1月前
|
XML 算法 自动驾驶
ROS进阶:使用URDF和Xacro构建差速轮式机器人模型
【11月更文挑战第7天】本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。
|
1月前
|
自动驾驶 安全 机器人
ROS2:从初识到深入,探索机器人操作系统的进化之路
【11月更文挑战第4天】ROS2的学习过程和应用,介绍DDS系统的框架和知识。

推荐镜像

更多