首先看了开源操作机器人系统-ros这本书(张建伟)第五章slam导航 5.1使用tf配置机器人

还有ros navigation 教程

http://wiki.ros.org/navigation/Tutorials/RobotSetup/TF

这里需要区分两种变换

1、坐标系变换

2、坐标变换

坐标系变换就是指一个坐标系怎么变换成另外一个坐标系

坐标变换就是指一个坐标系下点怎么变换成另外一个坐标系下坐标

这两个略微有所不同

tf tree维护的是坐标系变换

base_link到base_laser坐标系变换就是[0.1,0,0.2]

而base_laser到base_link就是[-0.1,0,-0.2]

坐标变换则是转动坐标系在固定坐标系下运动描述

具体可以看这篇博客

http://blog.exbot.net/archives/1686

博客主要知识点:

这里有个巧合,当然也不是巧合,那就是从child到parent的坐标变换等于从parent到child的frame transform,等于child在parent frame的姿态描述。这里牵扯到了线性代数里的基变换、线性变换、过渡矩阵的概念。

接下来是实际操作部分

下面这段代码实现了从user_set topic读取数据,在call_back中进行tf 广播,在主程序里进行look_up

#include <ros/ros.h>
#include <tf/transform_broadcaster.h>
#include <nav_msgs/Odometry.h>
#include <geometry_msgs/Pose2D.h>
#include <tf/transform_listener.h>
#include <stdio.h>
class test
{
private:
ros::NodeHandle nh_;
ros::Subscriber sub_;
tf::TransformBroadcaster br_;
bool data_ready; public:
test(ros::NodeHandle& nh)
{
nh_=nh;
sub_ = nh_.subscribe("/user_set", 10, &test::call_back,this);
data_ready = false;
}
void call_back(const geometry_msgs::Pose2DPtr& msgs)
{
ROS_INFO("recive");
tf::Transform dest_transform;
dest_transform.setOrigin(tf::Vector3(msgs->x,msgs->y,0));
tf::Quaternion q;
q.setRPY(0, 0, msgs->theta);
dest_transform.setRotation(q);
br_.sendTransform(tf::StampedTransform(dest_transform, ros::Time::now(),"world","user_set_frame"));
data_ready = true;
} bool is_data_ready()
{
if(data_ready)
return true;
else
return false;
} };
int main(int argc, char** argv){
ros::init(argc, argv, "tf_broadcaster"); ros::NodeHandle node;
test Otest(node);
tf::TransformListener listener; tf::StampedTransform transform; while(ros::ok())
{
if(!Otest.is_data_ready())
{
ros::spinOnce(); continue;
}
ROS_INFO("lookup_transfoem;");
try
{
    //查找的是world到user_set_frame“坐标变换”具体可以看见看教程
//http://wiki.ros.org/tf/Tutorials/Writing%20a%20tf%20listener%20%28C%2B%2B%29
//rosrun tf tf_echo求的是坐标系变换
listener.waitForTransform("world","user_set_frame",ros::Time::now(), ros::Duration(1.0));
listener.lookupTransform("world","user_set_frame",ros::Time(0),transform);
}
catch (tf::TransformException ex)
{
ROS_ERROR("%s",ex.what());
break;
}
tf::Vector3 vectortf = transform.getOrigin();
ROS_INFO("transform.x:%f,transform.y:%f,transform.z:%f",vectortf.x(),vectortf.y(),vectortf.z());
ros::spinOnce(); }
return 0;
}

 

Here, the real work is done, we query the listener for a specific transformation. Let's take a look at the four arguments:

  1. We want the transform from this frame ...
  2. ... to this frame.
  3. The time at which we want to transform. Providing ros::Time(0) will just get us the latest available transform.

  4. The object in which we store the resulting transform.

知道tf变换后怎么进行坐标变换呢?

开源操作机器人系统-ros这本书(张建伟)第五章slam导航 5.1使用tf配置机器人

tf一些理解(根据资料)的更多相关文章

  1. 对word2vec的理解及资料整理

    对word2vec的理解及资料整理 无他,在网上看到好多对word2vec的介绍,当然也有写的比较认真的,但是自己学习过程中还是看了好多才明白,这里按照自己整理梳理一下资料,形成提纲以便学习. 介绍较 ...

  2. CSS3 float深入理解浮动资料整理

    CSS浮动(float,clear)通俗讲解 CSS 浮动 CSS float浮动的深入研究.详解及拓展(一) CSS float浮动的深入研究.详解及拓展(二) 1.浮动实现图文环绕(理解难点) 浮 ...

  3. c语言宏定义#define的理解与资料整理

    1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...

  4. tf.segment_sum和tf.unsorted_segment_sum理解实例

    本文来自 guotong1988 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/guotong1988/article/details/77622790 import ...

  5. [转]c语言宏定义#define的理解与资料整理

    原文地址:http://www.cnblogs.com/haore147/p/3646934.html 1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也 ...

  6. 深入理解JavaScript——闭包

    跟很多新手一样我也是初入前端,对闭包的理解花费的时间和精力相当的多.效果也还行,今天我就来根据自己的理解细致的讲一讲闭包,由于是初入学习的时候不免有一些弯路和困惑,我想信这也是很多跟我一样的人会同样遇 ...

  7. ROS探索总结(十八)——重读tf

    在之前的博客中,有讲解tf的相关内容,本篇博客重新整理了tf的介绍和学习内容,对tf的认识会更加系统. 1 tf简介 1.1 什么是tf tf是一个让用户随时间跟踪多个参考系的功能包,它使用一种树型数 ...

  8. Hadoop介绍篇

    Hadoop详解 1.前言 对于初次接触Hadoop的小伙伴来说,Hadoop是一个很陌生的东西,尤其是Hadoop与大数据之间的关联,写这篇文章之前,我也有许多关于Hadoop与大数据的疑惑,接下来 ...

  9. 从DOM操作看Vue&React的前端组件化,顺带补齐React的demo

    前言 接上文:谈谈我对前端组件化中“组件”的理解,顺带写个Vue与React的demo 上次写完博客后,有朋友反应第一内容有点深,看着迷迷糊糊:第二是感觉没什么使用场景,太过业务化,还不如直接写Vue ...

随机推荐

  1. python 发送 get post请求

    GET请求: python2.7: import urllib,urllib2 url='http://192.168.199.1:8000/mainsugar/loginGET/' textmod ...

  2. shell参数 传递

    $# 是传给脚本的参数个数 $0 是脚本本身的名字 $1 是传递给该shell脚本的第一个参数 $2 是传递给该shell脚本的第二个参数 $@ 是传给脚本的所有参数的列表 $* 是以一个单字符串显示 ...

  3. python考点

    Python考点 1.Python类继承,内存管理(阿里) 答:内存管理机制包括:引用计数机制,垃圾回收机制,内存池机制 a = 1,1就是对象,a就是引用,引用a指向对象1. 2.Python装饰器 ...

  4. 腾讯QQ空间穿越时光轴3D特效

    <DOCTYPE html> <html> <head> <title>腾讯QQ空间穿越光轴3D特效</title> <style&g ...

  5. USACO Section2.3 Longest Prefix 解题报告 【icedream61】

    prefix解题报告------------------------------------------------------------------------------------------ ...

  6. Python 3基础教程3-数学运算

    本文来介绍下Python中的常见数学运算,其实和其他语言一样,加减乘除语法差不多,这里注意下Python中指数的表示方法. # 这里介绍 常见的数学运算 # 加法print(5 + 8) # 减法pr ...

  7. Lua2

    1. 迭代器与Closure 在Lua中,迭代器通常为函数,每调用一次函数,即返回集合中的“下一个”元素.每个迭代器都需要在每次成功调用之间保持一些状态,这样才能知道它所在的位置和下一次遍历时的位置. ...

  8. 1155 Heap Paths (30 分)(堆+dfs遍历)

    比较简单的一题 遍历左右的时候注意一下 #include<bits/stdc++.h> using namespace std; ; ]; ; vector<int>t; ve ...

  9. 1043 Is It a Binary Search Tree (25 分)(二叉查找树)

    #include<bits/stdc++.h> using namespace std; typedef struct node; typedef node *tree; struct n ...

  10. 聊聊、AES 和 DES

    AES 和 DES 都是对称加密的一种,但是 DES 的 Key 是 56 位,而 AES 的 Key 有 128,256,512 可选. AES 加密AES String randomKey = & ...