一 Introduction to tf2

本部分是关于tf2简单介绍,比如tf2能做什么,并使用一个turtlesim的例子来显示tf2在多机器人中的一些能力.同时也包括一些工具的使用,比如tf2_echo, view_frames, and rviz.

1.安装Demo

  1. sudo apt-get install ros-$ROS_DISTRO-turtle-tf2 ros-$ROS_DISTRO-tf2-tools ros-$ROS_DISTRO-tf

2.Running the Demo

  1. $ roslaunch turtle_tf2 turtle_tf2_demo.launch

看到下面两个turtles,如下

在启动的界面使用方向键来控制中间的turtle运动,会看到另外一个turtle跟随运动.

3.上面都做了什么呢?

在这个demo里面使用tf2库来创建了三个坐标系:世界坐标系,turtle1坐标系,turtle2坐标系.

本教程使用了一个tf2 的broadcaster来发布turtle的坐标系,以及一个tf2 的listener来计算两个turtles坐标系之间的差异.然后移动一个turtle来跟随另一个运动.

4.tf2 工具

4.1 使用view_frames

view_frames创建一个由tf2在ROS中发布的坐标系图标.

  1. $ rosrun tf2_tools view_frames.py

有一个tf2的listener来监听ROS中发布的frames,然后画出由坐标系组成的树型结构:

  1. $ evince frames.pdf

4.2 使用tf_echo

tf_echo得出在ROS中任意两个坐标系之间的transform.

  1. rosrun tf tf_echo [reference_frame] [target_frame]

对于本demo中turtle2相对于trutle1坐标系的一个变换等同于如下:

:

  1. $ rosrun tf tf_echo turtle1 turtle2

二 写代码实现一个tf2的静态broadcaster

1.创建一个包learning_tf2

  1. $ catkin_create_pkg learning_tf2 tf2 tf2_ros roscpp rospy turtlesim

2.怎样来broadcast一个transforms

怎样broadcast坐标系到tf2中.在本例中将broadcast变化中的turtles的坐标系.

创建文件,包的src/static_turtle_tf2_broadcaster.cpp

  1. #include <ros/ros.h>
  2. #include <tf2_ros/static_transform_broadcaster.h>
  3. #include <geometry_msgs/TransformStamped.h>
  4. #include <cstdio>
  5. #include <tf2/LinearMath/Quaternion.h>
  6.  
  7. std::string static_turtle_name;
  8.  
  9. int main(int argc, char** argv)
  10. {
  11. ros::init(argc, argv, "my_static_tf2_broadcaster");
  12. if(argc != )
  13. {
  14. ROS_ERROR("Invalid number of parameters\nusage: static_turtle_tf2_broadcaster child_frame_name x y z roll pitch yaw ");
  15. return -;
  16. }
  17. if(strcmp(argv[], "world") == )
  18. {
  19. ROS_ERROR("Your static turtle name cannot be 'world' ");
  20. return -;
  21. }
  22. static_turtle_name = argv[];
  23. static tf2_ros::StaticTransformBroadcaster static_broadcaster;
  24. geometry_msgs::TransformStamped static_transformStamped;
  25. static_transformStamped.header.stamp = ros::Time::now();
  26. static_transformStamped.header.frame_id ="world";
  27. static_transformStamped.child_frame_id = static_turtle_name;
  28. static_transformStamped.transform.translation.x = atof(argv[]);
  29. static_transformStamped.transform.translation.y = atof(argv[]);
  30. static_transformStamped.transform.translation.z = atof(argv[]);
  31. tf2::Quaternion quat;
  32. quat.setRPY(atof(argv[]), atof(argv[]), atof(argv[]));
  33.  
  34. static_transformStamped.transform.rotation.x = quat.x();
  35. static_transformStamped.transform.rotation.y = quat.y();
  36. static_transformStamped.transform.rotation.z = quat.z();
  37. static_transformStamped.transform.rotation.w = quat.w();
  38.  
  39. static_broadcaster.sendTransform(static_transformStamped);
  40. ROS_INFO("Spinning until killed publishing %s to world",static_turtle_name.c_str());
  41. ros::spin();
  42. return ;
  43. }

修改CMakeLists.txt文件

  1. add_executable(${PROJECT_NAME}_node src/static_turtle_tf2_broadcaster.cpp)
  2.  
  3. target_link_libraries(${PROJECT_NAME}_node
  4. ${catkin_LIBRARIES}
  5. )

然后运行之

  1. $ rosrun learning_tf2 static_turtle_tf2_broadcaster mystaticturtle
  1. rostopic echo /tf_static
  2. transforms:
  3. -
  4. header:
  5. seq:
  6. stamp:
  7. secs:
  8. nsecs:
  9. frame_id: "world"
  10. child_frame_id: "mystaticturtle"
  11. transform:
  12. translation:
  13. x: 0.0
  14. y: 0.0
  15. z: 1.0
  16. rotation:
  17. x: 0.0
  18. y: 0.0
  19. z: 0.0
  20. w: 1.0
  21. ---

3.发布静态transform的合适方法

在实际的机器人开发使用中,基本不会使用上面的方式来发布静态tf,应该使用一个可执行节点static_transform_publisher来执行,其要么在命令行执行,要么在launch文件中执行.

  1. static_transform_publisher x y z yaw pitch roll frame_id child_frame_id
  2.  
  3. Publish a static coordinate transform to tf2 using an x/y/z offset in meters and yaw/pitch/roll in radians. (yaw is rotation about Z, pitch is rotation about Y, and roll is rotation about X).
  4.  
  5. static_transform_publisher x y z qx qy qz qw frame_id child_frame_id
  6.  
  7. Publish a static coordinate transform to tf2 using an x/y/z offset in meters and quaternion.

比如

  1. <launch>
  2. <node pkg="tf2_ros" type="static_transform_publisher" name="link1_broadcaster" args="1 0 0 0 0 0 1 link1_parent link1" />
  3. </launch>

Unlike in tf, there is no period argument, and a latched topic is used.

Tutorial1的更多相关文章

  1. JavaFX 教程资料收集

    1. JavaFX中文资料 http://www.javafxchina.net/blog/docs/tutorial1/ 2. JavaFX入门教程 http://www.xrpmoon.com/c ...

  2. RDF和Jena RDF API简介

    这是官方文章<An Introduction to RDF and the Jena RDF API>的译文.原文是在刺猬的温驯这里看到的.其中的图片没法显示了,还有一段丢失了.于是我在此 ...

  3. Redis 学习笔记续

    Redis - 数据类型 Redis支持5种类型的数据类型,它描述如下的: 字符串 Redis字符串是字节序列.Redis字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你 ...

  4. React JS快速入门教程

    翻译至官方文档<Tutorial>http://facebook.github.io/react/docs/tutorial.html 转载请注明出处:http://blog.csdn.n ...

  5. 使用MyBatis Generator生成DAO

    虽然MyBatis很方便,但是想要手写全部的mapper还是很累人的,好在MyBatis官方推出了自动化工具,可以根据数据库和定义好的配置直接生成DAO层及以下的全部代码,非常方便. 需要注意的是,虽 ...

  6. Scalding初探之二:动手来做做小实验

    输入文件 Scalding既可以处理HDFS上的数据,也可以很方便地在本地运行处理一些test case便于debug,Source有好多种 1 TextLine(filename) TextLine ...

  7. C++混合编程之idlcpp教程Python篇(3)

    上一篇 C++混合编程之idlcpp教程Python篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与PythonTutorial0相似,工程Pyth ...

  8. C++混合编程之idlcpp教程Lua篇(3)

    上一篇 C++混合编程之idlcpp教程Lua篇(2) 是一个 hello world 的例子,仅仅涉及了静态函数的调用.这一篇会有新的内容. 与LuaTutorial0相似,工程LuaTutoria ...

  9. jQuery 图片剪裁插件初探之 Jcrop

    主页:http://deepliquid.com/content/Jcrop.html 官方下载地址:http://deepliquid.com/content/Jcrop_Download.html ...

随机推荐

  1. AIX下的ha高可用集群cluster

    安装ha软件 一.安装软件 最稳定的版本是5.4.0,优先安装稳定版本5.4 安装依赖于包base.data, cluster的man包安装失败原因是缺少base.data包 安装所有cluster. ...

  2. 破坏双亲委托机制的一些情况---Tomcat和JDBC,破坏后的安全问题

    采用双亲委托机制的原因 类加载器就是将字节码搬进jvm方法区的组件.我们知道,JVM识别加载进来的类是通过类加载器+类全名完成的,也就是说同一个类由不同类加载器加载进去的话就会被视为不同的类.jdk提 ...

  3. python开发之virtualenv与virtualenvwrapper

    在使用 Python 开发的过程中,工程一多,难免会碰到不同的工程依赖不同版本的库的问题: 亦或者是在开发过程中不想让物理环境里充斥各种各样的库,引发未来的依赖灾难. 此时,我们需要对于不同的工程使用 ...

  4. 使用Fabric在tomcat中部署应用的问题总结

    关闭tomcat时 A.为什么调用shutdown时,报错连接拒绝 结论——很可能是因为tomcat没启动或没完全启动:而这个时候调用shutdown就会出现此类报错 解决方法:time.sleep ...

  5. 华为RH2288V3服务器部署指南

    一.配置好局域网 首先配置好局域网,将电脑和服务器通过网线直连,服务器默认IP192.168.2.100,因此电脑本地的IP需要设置一下改为和服务器同一网段: 二.登录导控制页面 浏览器中输入服务器的 ...

  6. FPGA资源平民化的新晋- F9 技术解析

    FPGA (现场可编程门阵列)由于其硬件并行加速能力和可编程特性,在传统通信领域和IC设计领域大放异彩.一路走来,FPGA并非一个新兴的硬件器件,由于其开发门槛过高,硬件加速算法的发布和部署保护要求非 ...

  7. spring security权限架架mvn坐标

    <!-- spring security start --> <dependency> <groupId>org.springframework.security& ...

  8. Angular:ViewProviders和Providers的区别

    在Angular中使用依赖注入(DI)的时候,我们一般会使用providers.其实要做同样的事我们还有另外一个选择:viewProviders. viewProviders允许我们定义只对组件的vi ...

  9. CF286E Ladies' Shop FFT

    题目链接 读完题后,我们发现如下性质: 在合法且和不超过 $m$ 的情况下,如果 $a_{i}$ 出现,则 $a_{i}$ 的倍数也必出现. 所以如果合法,只要对所有数两两结合一次就能得到所有 $a_ ...

  10. spring+JdbcTemplate简单使用(一)

    目录 @ 1. 环境配置 maven(项目管理) idea(编译器) jdk1.8(Java环境) MySQL5.6(MySQL数据库) 2. 创建项目 在 idea 中创建普通的 maven 项目 ...