官网:http://wiki.ros.org/tf/Tutorials/Using%20Stamped%20datatypes%20with%20tf%3A%3AMessageFilter

本教程介绍了如何将传感器数据与tf一起使用。一些传感器数据的实际例子是:

单目摄像头和双目摄像头    激光雷达

假设创建了一只名为turtle3的新龟,但它没有里程信息;

但有一个高架摄像机跟踪了其位置,并将其位置作为与世界坐标系相关的geometry_msgs / PointStamped消息发布出来。

Turtle 1如果想知道turtle3与自身的比较呢?

要做到这一点,turtle1必须收听正在发布的关于turtle3姿势话题,等待转换到所需的坐标已准备好,然后执行其操作。

为了使这更容易,tf :: MessageFilter类非常有用。

tf :: MessageFilter将订阅任何ros消息并对其进行缓存,直到可以将其转换为目标坐标(turtle3相对于turtle1的坐标)。

重点:前面几节都是发布和接收的各个节点相对于其他节点的tf树的变换transform,这次直接收发的是某个节点相对其他节点的带时间戳的位置信息

#include "ros/ros.h"
#include "tf/transform_listener.h"
#include "tf/message_filter.h"
#include "message_filters/subscriber.h"class PoseDrawer
{
public://这里的构造函数很有意思,5个私有成员变量,tf_、target_frame_在初始化列表中构造,point_sub_、tf_filter_ 在构造
//函数的函数体中构造,n_没有提及//冒号后面是初始化列表;tf_()没有参数,是显式调用默认构造函数(可能加快速度?)//变量名后加下划线,一种命名风格,表示该变量为类的成员//target_frame_目标坐标系,此处为turtle1。//重要参数1:目标坐标系turtle1PoseDrawer() : tf_(),  target_frame_("turtle1"){/*使用 topic “turtle_point_stamped”初始化message_filters::Subscriber(point_sub_是私有成员变量,类型为
message_filters::Subscriber)重要参数2:turtle3位置消息的topic名 "turtle_point_stamped",*/
point_sub_.subscribe(n_, "turtle_point_stamped", 10);
/*使用该message_filters::Subscriber初始化tf::MessageFilter,tf::MessageFilter初始化需要的参数还有目标
坐标系target_frame,target_frame是tf::MessageFilter会确认transform能够成功执行的坐标系
*/
tf_filter_ = new tf::MessageFilter<geometry_msgs::PointStamped>(point_sub_, tf_, target_frame_, 10);
/*And the callback function is the function which will be called when the data is ready. 回调函数是当数据准备
好时会调用的函数。此处boost::bind(&PoseDrawer::msgCallback, this, _1)的作用是将本类中的成员函数
PoseDrawer::msgCallback绑定到tf::MessageFilter上,成为其回调函数
*/tf_filter_->registerCallback( boost::bind(&PoseDrawer::msgCallback, this, _1) );} ;private://这是一个模板类,模板参数类型为geometry_msgs::PointStampedmessage_filters::Subscriber<geometry_msgs::PointStamped> point_sub_;tf::TransformListener tf_;tf::MessageFilter<geometry_msgs::PointStamped> * tf_filter_;ros::NodeHandle n_;std::string target_frame_;/*Callback to register with tf::MessageFilter to be called when transforms are available*数据准备好后执行如下函数,将turtle3的在全局坐标系下的位置消息转为在turtle1下的位置消息*point_ptr为turtle3的在全局坐标系下的位置消息,target_frame_目标坐标系,point_out为转换后turtle3在目标坐
*标系下的位置消息。此处再强调一次,前面的教程都是发布的turtle相对于其他节点的变换transform消息,这次发布的
*是geometry_msgs::PointStamped类型的msg消息
*point_out就是转换后turtle3在目标坐标系下的位置消息,如果有publisher就可以发布了
*/void msgCallback(const boost::shared_ptr<const geometry_msgs::PointStamped>& point_ptr) {geometry_msgs::PointStamped point_out;try {tf_.transformPoint(target_frame_, *point_ptr, point_out);printf("point of turtle 3 in frame of turtle 1 Position(x:%f y:%f z:%f)\n", point_out.point.x,point_out.point.y,point_out.point.z);}catch (tf::TransformException &ex) {printf ("Failure %s\n", ex.what()); //Print exception which was caught}};};int main(int argc, char ** argv)
{ros::init(argc, argv, "pose_drawer"); //Init ROSPoseDrawer pd; //Construct classros::spin(); // Run until interupted
};

Using sensor messages with tf(Using Stamped datatypes with tf::MessageFilter)相关推荐

  1. ROS学习笔记74(TF Using Stamped datatypes with tf::MessageFilter)

    本教程介绍了如何将传感器数据与tf一起使用.一些传感器数据的实际例子是: 单目摄像头和双目摄像头 激光雷达 假设创建了一只名为turtle3的新龟,但它没有里程信息: 但有一个高架摄像机跟踪了其位置, ...

  2. ROS学习笔记(十三):Using Stamped datatypes with tf::MessageFilter

    本教程介绍了如何在tf中使用传感器数据. 传感器数据的一些实际示例是: 单声道和立体声相机 激光扫描 假设创建了一个新的乌龟,名为turtle3,并且没有很好的里程表,但是有一个高架摄像机跟踪其位置并 ...

  3. 高通SDM845平台Sensor学习——3.SLPI(Physical Sensor)

    ####三:Sensor SLPI层代码分析 #### 在学习SLPI侧代码前我们先了解下SEE的registry&config. registry 放在/persist/sensors/re ...

  4. tf/idf_Neo4j:带密码的TF / IDF(和变体)

    tf/idf 几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wik ...

  5. RK3568 Sensor驱动开发移植(3)

    RK3568 Camera 使用 RK3568 Sensor驱动开发移植(1) RK3568 Sensor驱动开发移植(2) RK3568 Sensor驱动开发移植(3) 实现标准 I2C 子设备驱动 ...

  6. RK3568 Sensor驱动开发移植(2)

    RK3568 Camera 使用 RK3568 Sensor驱动开发移植(1) RK3568 Sensor驱动开发移植(2) RK3568 Sensor驱动开发移植(3) v4l2_subdev_op ...

  7. 海思3518E开发笔记4.2——sensor数据交互接口(MIPI、LVDS、DVP并口),以AR0130和OV9712为例

    目录 前言 DVP(并口) LVDS MIPI(MIPI-CSI2) 总结 前言 摄像头是一个独立的芯片,和主控芯片是弧线独立的,两者通过接口进行交互,交互的信息有控制信号和数据信号 控制信号常用I2 ...

  8. StarlingX 前世今生 -- (汇总了网上的一些资料)

    初识StarlingX 背景 发展历程 愿景 组件.架构 StaringX控制.计算.存储节点架构及和相关开源项目渊源 StarlingX组成架构 扩展模式 StarlingX架构技术栈 Starli ...

  9. 人机智能交互技术(ROS-HRI-人与机器人的智能交互)课程介绍与资料

    人机智能交互技术(ROS-HRI-人与机器人的智能交互)课程介绍与资料 这是机器人系统设计与控制技术的后续课程,全部的课程内容包括四门课程(本科),如下: 人机智能交互技术是人机融合的基础,课程介绍多 ...

最新文章

  1. 真·摸鱼带师!每天工作10分钟年薪57万,这位程序员火了
  2. 软件工程(1)——对书本的温习
  3. 【Kaggle-MNIST之路】两层的神经网络Pytorch(改进版)(二)
  4. [Android1.6]继承BaseAdapter为GridView设置数据时设置setLayoutParams时注意
  5. android如何编译lame,Android 编译 Lame 库心路历程
  6. (59)逆向分析 KiSwapContext 和 SwapContext —— 线程切换核心代码
  7. C++数组与指针的区别
  8. 【JavaScript】JS的变量、数组、计算器案例、函数、类、常用对象的方法
  9. C++ 带默认参数值的函数
  10. java里有哪些对象_Java中创建对象的方式有哪些
  11. oracle 数字处理函数,ORACLE 数字型函数
  12. 异步任务利器Celery(一)介绍
  13. 火山PC画板打造UI
  14. 示波器的使用和李萨如图形
  15. 用msicuu2.exe卸载office可能遇到的问题及解决办法
  16. 圆面积公式积分法推导
  17. Excel小问题 - 前三个非空单元格数值之和
  18. codeforces884D(大概是构造,优先队列)
  19. PgMP Program Management Professional All-in-One Exam Guide
  20. Android高手笔记 - IO优化

热门文章

  1. ADSL与PPPoE的区别
  2. 混合模式:mix-blend-mode: difference
  3. 计算机vb考试程序试题,2014中职计算机VB考试试题.doc
  4. #设计思维# 设计思维如何解决创新挑战
  5. 【apollo6.0安装全教程】
  6. 咖说丨清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列
  7. 身价10亿的打工皇帝—唐骏
  8. OS基础-四大基本特征
  9. 【案例分析】从安捷伦的逆袭之路,看供应商管理如何实现双赢
  10. 小学计算机动画制作,小学flash动画课件制作方法