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

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

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

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

定义的geometry_msgs / PointStamped消息类型。

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

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

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

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

1 Setup

roslaunch turtle_tf turtle_tf_sensor.launch 

这将会使得龟1和龟3自己移动。

话题为turtle_point_stamped,其中包含一个geometry_msgs / PoseStamped数据类型,说明了turtle3在世界框架中的位置。

为了可靠地获取turtle1坐标中的流数据,我们使用以下代码:

#include "ros/ros.h"
#include "tf/transform_listener.h"
#include "tf/message_filter.h"
#include "message_filters/subscriber.h"class PoseDrawer
{
public:PoseDrawer() : tf_(),  target_frame_("turtle1") {point_sub_.subscribe(n_, "turtle_point_stamped", 10); //节点,话题,缓冲大小tf_filter_ = new tf::MessageFilter<geometry_msgs::PointStamped>(point_sub_, tf_, target_frame_, 10);tf_filter_->registerCallback( boost::bind(&PoseDrawer::msgCallback, this, _1) );//this->msgCallback(x)} ;private:message_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 availablevoid 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
};

2 说明

2.1 包括

您必须包含tf包中的tf :: MessageFilter标头。就行之前使用的tf和ROS头文件。

#include "ros/ros.h"
#include "tf/transform_listener.h"
#include "tf/message_filter.h"
#include "message_filters/subscriber.h"

2.2 永久数据

There need to be persistent instances of tf::TransformListener tf::MessageFilter

private:message_filters::Subscriber<geometry_msgs::PointStamped> point_sub_;tf::TransformListener tf_;tf::MessageFilter<geometry_msgs::PointStamped> * tf_filter_;ros::NodeHandle n_;std::string target_frame_;

2.3 构造函数

启动时,必须使用话题初始化ros message_filters :: Subscriber。并且必须使用该Subscriber object初始化tf :: MessageFilter。

The other arguments of note in the MessageFilter constructor are the target_frame and callback function.

The target frame is the frame into which it will make sure canTransform will succeed。

回调函数是在数据准备好时调用的函数。

  PoseDrawer() : tf_(),  target_frame_("turtle1"){point_sub_.subscribe(n_, "turtle_point_stamped", 10);tf_filter_ = new tf::MessageFilter<geometry_msgs::PointStamped>(point_sub_, tf_, target_frame_, 10);tf_filter_->registerCallback( boost::bind(&PoseDrawer::msgCallback, this, _1) );} ;

注意:注册了一个回调函数。而bind把成员函数msgCallback绑定到对象上。

2.4 回调方法

Once the data is ready, just call transformPose and print to screen for the tutorial.

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}};};

3 结果

如果它正在运行,你应该看到像这样的流数据。

海龟3在龟的框架中的位置1位置(x:-0.603264 y:4.276489 z:0.000000)
海龟3在龟的框架中的位置1位置(x:-0.598923 y:4.291888 z:0.000000)
海龟3在龟的框架中的位置1位置(x:-0.594828 y:4.307356 z:0.000000)
海龟3在龟的框架中的位置1位置(x:-0.590981 y:4.322886 z:0.000000)

ROS学习笔记74(TF Using Stamped datatypes with tf::MessageFilter)相关推荐

  1. ROS学习笔记(一)补充篇 参考创客制造

    我将ROS的CPP部分分成7个部分: 1.基础的node param 2.动态调节参数 3.关于TF变换 4.actionlib 5.插件技术 6.movebase 7.nodelet技术 前言 相比 ...

  2. ROS学习笔记(八): ROS通信架构

    ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...

  3. ROS学习笔记十二:使用roswtf

    ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...

  4. ROS学习笔记之小乌龟跟随

    ROS学习笔记之小乌龟跟随 说明:整个案例是跟着赵虚左老师的视频和文档资料学习的,特此感谢赵虚左老师和Autolabor官方 文档地址 视频地址 学习案例之前的预备知识:TF坐标变换 大体实现流程: ...

  5. ROS学习笔记之——移动机器人的导航

    之前博客<ROS学习笔记之--激光雷达SLAM建图>已经介绍过如何通过激光雷达SLAM建图了,本博文讲一下ROS机器人的导航相关 目录 导航相关理论介绍 导航的概述 costmap AMC ...

  6. ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行

    ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...

  7. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

    ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...

  8. ROS 学习笔记(一):工作空间+功能包创建

    ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...

  9. ROS学习笔记基础2(基础知识和ROS架构)

    ROS学习笔记1(基础知识和ROS架构) 文章目录 ROS学习笔记1(基础知识和ROS架构) 1. 什么是ROS 2. ROS和其他机器人平台有什么不同 3. ROS架构组成 3.1 文件系统级别 3 ...

最新文章

  1. 机器人会模仿人类微笑了,但我总觉得这笑容……
  2. Sharepoint 2007 定制Feature和卸载Feature
  3. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
  4. ObjC: 使用KVO
  5. eclipse插件egit安装使用
  6. Vue.JS项目中二级路由下刷新浏览器仍呈现当前路由的实现方案
  7. 按钮随复选框选中与取消变换样式
  8. nuget 包管理器
  9. 大学英语四六各项分值
  10. C语言为什么被const声明的变量不是一个常量表达式
  11. “嫌贫爱富”之人,从一顿饭局当中便可看出
  12. 京东排行第一,近 4 万好评,这本 Python 书究竟好在哪?
  13. java序列化与反序列化总结
  14. CentOS 7 yum 安装 Nginx
  15. [转]Flex是什么?flex和flash是什么关系 ?
  16. Oauth2.0 资源服务器搭建
  17. 【VMware】vmware15 安装win10教程【史上最详细图文教程】
  18. 华为交换机的基本配置命令
  19. 9.21 正睿普及2
  20. C语言从键盘上输入年份和月份,计算并输出这一年的这一月共有多少天。

热门文章

  1. excel中如何依据日期相等实现数据匹配
  2. 中国地址选择xml 文件
  3. Camstar 客户端Modeling管理系统
  4. 关闭windows安全警报_演练常态化安全入我心——海天阳光幼儿园防火、防震演练...
  5. 使用python实现两个文件夹里文件的对比(包含内容的对比)
  6. 模拟烟雾传感器 (MQ2)
  7. 未来感爆棚 TikTok爆款“彩妆喷刷套装”获2000万播放
  8. 程序员才能看懂18张图,忍不住笑喷了
  9. 计算统计-Chap6 推断统计的蒙特卡罗方法 (3)蒙特卡罗方法
  10. meep php,科学网—centos5.4下meep配置 - 郑改革的博文