ROS学习笔记74(TF Using Stamped datatypes with tf::MessageFilter)
本教程介绍了如何将传感器数据与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)相关推荐
- ROS学习笔记(一)补充篇 参考创客制造
我将ROS的CPP部分分成7个部分: 1.基础的node param 2.动态调节参数 3.关于TF变换 4.actionlib 5.插件技术 6.movebase 7.nodelet技术 前言 相比 ...
- ROS学习笔记(八): ROS通信架构
ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...
- ROS学习笔记十二:使用roswtf
ROS学习笔记十二:使用roswtf 在使用ROS过程中,roswtf工具可以为我们提供ROS系统是否正常工作的检查作用. 注意:在进行下列操作之前,请确保roscore没有运行. 检查ROS是否安装 ...
- ROS学习笔记之小乌龟跟随
ROS学习笔记之小乌龟跟随 说明:整个案例是跟着赵虚左老师的视频和文档资料学习的,特此感谢赵虚左老师和Autolabor官方 文档地址 视频地址 学习案例之前的预备知识:TF坐标变换 大体实现流程: ...
- ROS学习笔记之——移动机器人的导航
之前博客<ROS学习笔记之--激光雷达SLAM建图>已经介绍过如何通过激光雷达SLAM建图了,本博文讲一下ROS机器人的导航相关 目录 导航相关理论介绍 导航的概述 costmap AMC ...
- ROS 学习笔记(三):自定义服务数据srv+server+client 示例运行
ROS 学习笔记(三):自定义服务数据srv+Server+Client 示例运行 一.自定义服务数据: 1.向功能包添加自定义服务文件(AddTwoInts.srv) cd ~/catkin_ws/ ...
- ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...
- ROS 学习笔记(一):工作空间+功能包创建
ROS 学习笔记(一):工作空间+功能包创建 一.创建工作空间(catkin_make编译): 1.创建工作空间 catkin_ws 创建空间.初始化(建立一个文件夹) cd ~ mkdir -p ~ ...
- ROS学习笔记基础2(基础知识和ROS架构)
ROS学习笔记1(基础知识和ROS架构) 文章目录 ROS学习笔记1(基础知识和ROS架构) 1. 什么是ROS 2. ROS和其他机器人平台有什么不同 3. ROS架构组成 3.1 文件系统级别 3 ...
最新文章
- 机器人会模仿人类微笑了,但我总觉得这笑容……
- Sharepoint 2007 定制Feature和卸载Feature
- 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
- ObjC: 使用KVO
- eclipse插件egit安装使用
- Vue.JS项目中二级路由下刷新浏览器仍呈现当前路由的实现方案
- 按钮随复选框选中与取消变换样式
- nuget 包管理器
- 大学英语四六各项分值
- C语言为什么被const声明的变量不是一个常量表达式
- “嫌贫爱富”之人,从一顿饭局当中便可看出
- 京东排行第一,近 4 万好评,这本 Python 书究竟好在哪?
- java序列化与反序列化总结
- CentOS 7 yum 安装 Nginx
- [转]Flex是什么?flex和flash是什么关系 ?
- Oauth2.0 资源服务器搭建
- 【VMware】vmware15 安装win10教程【史上最详细图文教程】
- 华为交换机的基本配置命令
- 9.21 正睿普及2
- C语言从键盘上输入年份和月份,计算并输出这一年的这一月共有多少天。
热门文章
- excel中如何依据日期相等实现数据匹配
- 中国地址选择xml 文件
- Camstar 客户端Modeling管理系统
- 关闭windows安全警报_演练常态化安全入我心——海天阳光幼儿园防火、防震演练...
- 使用python实现两个文件夹里文件的对比(包含内容的对比)
- 模拟烟雾传感器 (MQ2)
- 未来感爆棚 TikTok爆款“彩妆喷刷套装”获2000万播放
- 程序员才能看懂18张图,忍不住笑喷了
- 计算统计-Chap6 推断统计的蒙特卡罗方法 (3)蒙特卡罗方法
- meep php,科学网—centos5.4下meep配置 - 郑改革的博文