Using sensor messages with tf(Using Stamped datatypes with tf::MessageFilter)
官网: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)相关推荐
- ROS学习笔记74(TF Using Stamped datatypes with tf::MessageFilter)
本教程介绍了如何将传感器数据与tf一起使用.一些传感器数据的实际例子是: 单目摄像头和双目摄像头 激光雷达 假设创建了一只名为turtle3的新龟,但它没有里程信息: 但有一个高架摄像机跟踪了其位置, ...
- ROS学习笔记(十三):Using Stamped datatypes with tf::MessageFilter
本教程介绍了如何在tf中使用传感器数据. 传感器数据的一些实际示例是: 单声道和立体声相机 激光扫描 假设创建了一个新的乌龟,名为turtle3,并且没有很好的里程表,但是有一个高架摄像机跟踪其位置并 ...
- 高通SDM845平台Sensor学习——3.SLPI(Physical Sensor)
####三:Sensor SLPI层代码分析 #### 在学习SLPI侧代码前我们先了解下SEE的registry&config. registry 放在/persist/sensors/re ...
- tf/idf_Neo4j:带密码的TF / IDF(和变体)
tf/idf 几周前,我写了一篇博客文章,介绍了如何使用scikit-learn在HIMYM成绩单上运行TF / IDF,以按情节找到最重要的短语,然后我很好奇在Neo4j中很难做到. 我首先将Wik ...
- RK3568 Sensor驱动开发移植(3)
RK3568 Camera 使用 RK3568 Sensor驱动开发移植(1) RK3568 Sensor驱动开发移植(2) RK3568 Sensor驱动开发移植(3) 实现标准 I2C 子设备驱动 ...
- RK3568 Sensor驱动开发移植(2)
RK3568 Camera 使用 RK3568 Sensor驱动开发移植(1) RK3568 Sensor驱动开发移植(2) RK3568 Sensor驱动开发移植(3) v4l2_subdev_op ...
- 海思3518E开发笔记4.2——sensor数据交互接口(MIPI、LVDS、DVP并口),以AR0130和OV9712为例
目录 前言 DVP(并口) LVDS MIPI(MIPI-CSI2) 总结 前言 摄像头是一个独立的芯片,和主控芯片是弧线独立的,两者通过接口进行交互,交互的信息有控制信号和数据信号 控制信号常用I2 ...
- StarlingX 前世今生 -- (汇总了网上的一些资料)
初识StarlingX 背景 发展历程 愿景 组件.架构 StaringX控制.计算.存储节点架构及和相关开源项目渊源 StarlingX组成架构 扩展模式 StarlingX架构技术栈 Starli ...
- 人机智能交互技术(ROS-HRI-人与机器人的智能交互)课程介绍与资料
人机智能交互技术(ROS-HRI-人与机器人的智能交互)课程介绍与资料 这是机器人系统设计与控制技术的后续课程,全部的课程内容包括四门课程(本科),如下: 人机智能交互技术是人机融合的基础,课程介绍多 ...
最新文章
- 真·摸鱼带师!每天工作10分钟年薪57万,这位程序员火了
- 软件工程(1)——对书本的温习
- 【Kaggle-MNIST之路】两层的神经网络Pytorch(改进版)(二)
- [Android1.6]继承BaseAdapter为GridView设置数据时设置setLayoutParams时注意
- android如何编译lame,Android 编译 Lame 库心路历程
- (59)逆向分析 KiSwapContext 和 SwapContext —— 线程切换核心代码
- C++数组与指针的区别
- 【JavaScript】JS的变量、数组、计算器案例、函数、类、常用对象的方法
- C++ 带默认参数值的函数
- java里有哪些对象_Java中创建对象的方式有哪些
- oracle 数字处理函数,ORACLE 数字型函数
- 异步任务利器Celery(一)介绍
- 火山PC画板打造UI
- 示波器的使用和李萨如图形
- 用msicuu2.exe卸载office可能遇到的问题及解决办法
- 圆面积公式积分法推导
- Excel小问题 - 前三个非空单元格数值之和
- codeforces884D(大概是构造,优先队列)
- PgMP Program Management Professional All-in-One Exam Guide
- Android高手笔记 - IO优化