一、什么是TF

 二、TF使用方法

三、TF包内的指令工具

四、相关API

1、广播变换
发布坐标之间的坐标关系
 
#include <ros/ros.h>
#include <tf/transform_broadcaster.h> int main(int argc, char** argv)
{
ros::init(argc, argv, "robot_tf_publisher");
ros::NodeHandle n; ros::Rate r(); tf::TransformBroadcaster broadcaster; while(n.ok()){ //发布坐标变换
broadcaster.sendTransform(tf::StampedTransform(tf::Transform(
tf::Quaternion(, , , ), //四元数
tf::Vector3(-0.25, 0.0, 0.0)),
ros::Time::now(),
"base_link",
"laser"));
r.sleep();
}
}

2、使用变换

通过监听到上面发布的坐标变换,把坐标中的一个点变换到另一个坐标中的坐标

#include <ros/ros.h>
#include <geometry_msgs/PointStamped.h>
#include <tf/transform_listener.h> //我们将创建一个函数,给定一个TransformListener,在“base_laser”坐标系中取一点,并将其转换为“base_link”坐标系。
// 这个函数将作为在我们程序的main()中创建的ros::Timer的回调,并且每秒都会触发。
void transformPoint(const tf::TransformListener& listener){
//we'll create a point in the base_laser frame that we'd like to transform to the base_link frame
geometry_msgs::PointStamped laser_point;
laser_point.header.frame_id = "base_laser"; //we'll just use the most recent transform available for our simple example
laser_point.header.stamp = ros::Time();//时间戳 //just an arbitrary point in space
laser_point.point.x = 1.0;
laser_point.point.y = 0.2;
laser_point.point.z = 0.0; try{
geometry_msgs::PointStamped base_point;
listener.transformPoint("base_link", laser_point, base_point);//坐标中的点的位置变换 ROS_INFO("base_laser: (%.2f, %.2f. %.2f) -----> base_link: (%.2f, %.2f, %.2f) at time %.2f",
laser_point.point.x, laser_point.point.y, laser_point.point.z,
base_point.point.x, base_point.point.y, base_point.point.z, base_point.header.stamp.toSec());
}
catch(tf::TransformException& ex){
ROS_ERROR("Received an exception trying to transform a point from \"base_laser\" to \"base_link\": %s", ex.what());
}
} int main(int argc, char** argv){
ros::init(argc, argv, "robot_tf_listener");
ros::NodeHandle n; //我们需要创建一个tf::TransformListener。一个TransformListener对象自动订阅了ROS变换消息主题和管理所有将在网络中广播的变换数据。
tf::TransformListener listener(ros::Duration()); //we'll transform a point once every second
ros::Timer timer = n.createTimer(ros::Duration(1.0), boost::bind(&transformPoint, boost::ref(listener))); ros::spin(); }

wiki.ros.org/tf/Overview

http://wiki.ros.org/cn/tf/Tutorials

https://www.ncnynl.com/archives/201708/1881.html

最新文章

  1. Theano: CNMeM is disabled, CuDNN not available
  2. 开发基于C#.NET的mongodb桌面版的应用程序(1)
  3. 【Android Studio使用教程2】Android Studio创建项目
  4. DNS子域委派配置案例[转载]
  5. java读写csv
  6. zz[C++]合理的设计和使用消息队列
  7. C#yield return和yield break
  8. 【IE6的疯狂之八】链接伪类(:hover)CSS背景图片有闪动BUG
  9. servlet文件上传2——复合表单提交(数据获取和文件上传)
  10. Keras官方中文文档:序贯模型API
  11. python条件控制
  12. 安装vue 教程
  13. iOS开发——无网占位图的实现
  14. MySQL中 如何查询表名中包含某字段的表
  15. Windows NTFS 符号链接 与 Linux 软连接
  16. php解释命令行的参数
  17. 膨胀卷积与IDCNN
  18. Tomcat Connector
  19. 解决IE下select标签innerHTML插入option的BUG(兼容
  20. HDU 1611 敌兵布阵【线段树模板】

热门文章

  1. 《转》python 11 表达式和语句
  2. opencv——基础篇
  3. 2018ICPC焦作 F. Honeycomb /// BFS
  4. 更改idea启动内存信息
  5. oracle中的decode函数的使用
  6. 《构建之法》CH5~6读书笔记 PB16110698 第九周(~5.15)
  7. 深度探索C++对象模型之第二章:构造函数语意学之成员初始值列表
  8. Algo: Majority Element
  9. sslforfree的证书合并成类似于certbot的ssl证书文件
  10. Cats Transport