博客参考:https://www.ncnynl.com/archives/201702/1312.html

ROS与C++入门教程-tf-增加坐标系

说明:

  • 介绍如何为TF增加额外固定的坐标系

为何增加坐标系

  • 对于许多任务,更容易在本地坐标内思考。
  • 例如,更容易推断在激光扫描器中心的坐标系中的激光扫描。
  • tf允许您为系统中的每个传感器,链接等定义一个本地坐标系。
  • 并且,tf将处理所引入的所有额外坐标系的变换。

那里增加坐标系

  • tf建立坐标系的树结构; 它不允许在坐标系结构中存在闭环。
  • 这意味着一个坐标系只有一个父系,但它可以有多个子系。
  • 目前我们的tf树包含三个坐标系:world,turtle1和turtle2。 两只乌龟是世界的子系。
  • 如果我们要向tf添加一个新坐标系,三个现有坐标系中的一个需要是父系,新坐标系将成为子系。
  • 图示:

如何添加坐标系

  • 在我们的乌龟例子中,我们将添加一个新的坐标系carrot1到turtle1。
  • 新建文件frame_tf_broadcaster.cpp:
$ roscd learning_tf
$ touch src/frame_tf_broadcaster.cpp
$ vim src/frame_tf_broadcaster.cpp
  • 代码如下:
#include <ros/ros.h>
#include <tf/transform_broadcaster.h> int main(int argc, char** argv){
ros::init(argc, argv, "my_tf_broadcaster");
ros::NodeHandle node; tf::TransformBroadcaster br;
tf::Transform transform; ros::Rate rate(10.0);
while (node.ok()){
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1"));
rate.sleep();
}
return 0;
};

代码解释:

  • 代码:
transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
br.sendTransform(tf::StampedTransform(transform, ros::Time::now(), "turtle1", "carrot1")
  • 解释:我们创建transform,从父系turtle1到子系carrot1,carrot1离左边的turtle12米远

编译运行

  • 打开CMakeLists.txt
$ rosed learning_tf CMakeLists.txt
  • 在底部增加代码:
add_executable(frame_tf_broadcaster src/frame_tf_broadcaster.cpp)
target_link_libraries(frame_tf_broadcaster ${catkin_LIBRARIES})
  • 编译:
$ cd ~/catkin_ws
$ catkin_make
  • 编译顺利,在bin目录会生成frame_tf_broadcaster文件

  • 编辑start_demo.launch

$ rosed learning_tf start_demo.launch
  • 增加新代码:
  <launch>
...
<node pkg="learning_tf" type="frame_tf_broadcaster"
name="broadcaster_frame" />
</launch>
  • 运行:
 $ roslaunch learning_tf start_demo.launch

检查结果:

  • 接着上个教程的,如果你驱动turtle1,你注意到,即使我们添加了一个新的坐标系,行为没有改变。 这是因为添加额外的坐标系不会影响其他坐标系,我们的监听器仍然使用先前定义的坐标系。 所以,让我们改变监听器的行为。
  • 编辑src/turtle_tf_listener.cpp,在26-27行用/carrot1替换/turtle1,如:
 listener.lookupTransform("/turtle2", "/carrot1",
ros::Time(0), transform);
  • 编译运行:
 $ catkin_make
$ roslaunch learning_tf start_demo.launch
  • 应该可以看到,turtle2跟随carrot1变化,而不是turtle1

广播移动的坐标系

  • 我们在本教程中发布的额外坐标系是一个固定的坐标系,不随时间改变相对于父系。 但是,如果要发布移动坐标系,您可以更改广播器以随时间更改。 让我们修改/carrot1坐标系以相对于/turtle1随时间改变。
  • 修改编辑src/turtle_tf_listener.cpp
$ vim src/frame_tf_broadcaster.cpp
  • 代码如下:
transform.setOrigin( tf::Vector3(2.0*sin(ros::Time::now().toSec()), 2.0*cos(ros::Time::now().toSec()), 0.0) );
transform.setRotation( tf::Quaternion(0, 0, 0, 1) );
  • 编译运行:
$ catkin_make
$ roslaunch learning_tf start_demo.launch

  

ROS tf-增加坐标系的更多相关文章

  1. ROS tf监听编写

    博客转载自:https://www.ncnynl.com/archives/201702/1311.html ROS与C++入门教程-tf-编写tf listener(监听) 说明: 介绍如何使用tf ...

  2. ROS tf广播编写

    博客参考:https://www.ncnynl.com/archives/201702/1310.html ROS与C++入门教程-tf-编写tf broadcaster(广播) 说明: 介绍如何广播 ...

  3. ROS tf 编程指南

    ROS (Robot Operating System, 机器人操作系统)是最知名的机器人操作系统,广泛应用于无人驾驶和机器人,tf(transforms,坐标系转换)是ROS下的一个常用的工具库.r ...

  4. ROS tf基础使用知识

    博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ...

  5. ROS TF——learning tf

    在机器人的控制中,坐标系统是非常重要的,在ROS使用tf软件库进行坐标转换. 相关链接:http://www.ros.org/wiki/tf/Tutorials#Learning_tf 一.tf简介 ...

  6. ROS tf

    一.节点中使用(cpp,python) 1. ros wiki 提供的tutorials 2. https://blog.csdn.net/start_from_scratch/article/det ...

  7. ROS tf 两个常用的函数

    /** \brief Get the transform between two frames by frame ID.   * \param target_frame The frame to wh ...

  8. ROS Learning-014 learning_tf(编程) 坐标系变换(tf)广播员 (Python版)

    ROS Indigo learning_tf-01 坐标系变换(tf)广播员 (Python版) 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu ...

  9. 制作自己的ros机器人(navigaion)前提--22

    摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/  一.要求: 1.大家已经对ROS的基本概念(进程间通讯topic service 数据类型 m ...

随机推荐

  1. 云计算与大数据实验:Hbase shell操作成绩表

    [实验目的] 1)了解hbase服务 2)学会hbase shell命令操作成绩表 [实验原理] HBase是一个分布式的.面向列的开源数据库,它利用Hadoop HDFS作为其文件存储系统,利用Ha ...

  2. Linux实验:NTP网络时间服务器

    [实验目的]    1)掌握时间服务器的搭建方法    2)掌握客户机与时间服务同步时间的方法[实验原理]    NTP服务器[Network Time Protocol(NTP)]是用来使计算机时间 ...

  3. 线性回归-API

    线性回归的定义 利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式 线性回归的分类 线性关系 非线性关系 损失函数 最小二乘法 线性回归优化方法 正规方程 ...

  4. 计算机网络基础之OSI参考模型

    计算机网络基础之OSI参考模型 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.OSI参考模型 OSI是Open System Interconnection的缩写,意为开放式系 ...

  5. Pthon魔术方法(Magic Methods)-可调用对象

    Pthon魔术方法(Magic Methods)-可调用对象 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.可调用对象方法 __call__: 类中定义一个该方法,实例就可以像 ...

  6. LeetCode初级算法--其他02:有效的括号

    LeetCode初级算法--其他02:有效的括号 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net ...

  7. P4160 [SCOI2009]生日快乐[dfs]

    题目描述 windy的生日到了,为了庆祝生日,他的朋友们帮他买了一个边长分别为 X 和 Y 的矩形蛋糕. 现在包括windy,一共有 N 个人来分这块大蛋糕,要求每个人必须获得相同面积的蛋糕. win ...

  8. Android init介绍(上)

    1. 介绍 init进程是Linux系统第一个用户进程,是Android系统应用程序的根进程,即1号进程(PID为1):Android中的init文件位于/init,代码位于system/core/i ...

  9. linux下安装Sublime Text3并将它的快捷方式放进启动器中和卸载Sublime

    Sublime Text是一个代码编辑器,我主要是用它来编辑python.下面就来简单说明下它在linux的安装过程吧! 1.添加sublime text3的仓库 首先按下快捷键ctrl+alt+t打 ...

  10. 深入理解JVM内存分配和常量池

    一.虚拟机的构成 虚拟结主要由运行时数据区.执行引擎.类加载器三者构成: 而我们所说的JVM内存模型指的就是运行时数据区,下面具体分析一下运行时数据区: 二.运行时数据区组成和各个区域的作用 我们看到 ...