1、tf的实际应用

1)在机器人的配置中

从上面可以看出激光雷达中心距离机器人底座的中心有20cm,激光雷达的中心距机器人底座中心有10cm,如果激光雷达在障碍物前面0.3米,那么机器人底座离障碍物多远呢?

1、新建一个包,如下

catkin_create_pkg robot_setup_tf roscpp tf geometry_msgs

2、catkin_make一下

3、新建两个源文件tf_publisher.cpp,tf_listener.cpp

下面按照base_link和base_laser的位置来编写publisher

#include<ros/ros.h>

#include<tf/transform_broadcaster.h>

int main(int argc,char **argv)

{

  ros::init(argc,argv,"tf_publisher");

  ros::NodeHandle n;

  //发布频率

  ros::Rate r(100);

  //创建一个transform_broadcaster

  tf::TransformBroadcaster broadcaster;

  //创建一个transform对象

  tf::Transform transform;

  //下面设置其位置以及旋转信息

  transform.setOrigin(tf::Vector3(0.1,0.0,0.2));

  //再创建一个四元组

  tf::Quaternion q;

  q.setRPY(0.0,0.0,0.0);//没有旋转

  transform.setRotation(q);//以上已经把位置描述设定好了

  while(ros::ok())

  {

    broadcaster.sendTransform(tf::StampedTransform(transform,ros::Time::now(),"base_link","base_laser"));//父框架叫base_link,子框架叫base_laser

    r.sleep();

  }

  return 0;

}

下面再tf_listener.cpp当中来编写

在其中使用了一个新的类型叫做geometry_msgs/PointStamped

在命令行当中查看该类型rosmsg show geometry_msgs/PointStamped

#include<ros/ros.h>

#include<geometry_msgs/PointStamped.h>

#include<tf/transform_listener.h>

void transformPoint(const tf::TransformListener &listener)

{

  //实例化一个消息

  geometry_msgs::PointStamped laser_point;

  //指定header的frame_id,表示最新的可用的变换

  laser_point.header.framer_id="base_laser";

  laser_point.header.stamp = ros::Time();

  laser_point.point.x= rand()%5;;//赋予一个随机值

  laser_point.point.y= rand()%5;;//赋予一个随机值

  laser_point.point.z= rand()%5;;//赋予一个随机值

  try

  {

    geometry_msgs::PointStamped base_point;//实例化一个geometry_msgs::PointStamped类,表示机器人底座

    //调用transformlistener的transformpoint函数

    listener.transformPoint("base_link",laser_point,base_point);//参数目标框架target_frame,stamped_in以及stamped_out。

    //输出相关信息

    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,"tf_listener");

  ros::NodeHandle n;

  //定义一个transformlistener对象

  tf::TransformListener listener(ros::Duration(10))//等待10s,如果10s之后都还没收到消息,那么之前的消息就被丢弃掉。

  //创建一个timer对象,绑定了一个transformpoint的地址,后面是该函数transformpoint的参数

  ros::Timer timer=n.createrTimer(ros::Duration(1.0),boost::bind(&transformPoint,boost::ref(listener)));

  //在上面去实现transformPoint这个函数

ros::spin();

}

对上面代码总结一下:

在main函数实例化一个listener对象,然后创建一个定时器1s钟调用上面函数一次,......。

下面把CMakeLists.txt修改一下

add_executable(tf_listener src/tf_listener.cpp);

add_executable(tf_publisher src/tf_publisher.cpp);

target_link_libraries(tf_listener ${catkin_LIBRARIES})

target_link_libraries(tf_publisher ${catkin_LIBRARIES})

再写一个launch文件:

<launch>

//再添加一个frame称为camera把它固定在base_link上,用static_transform_publisher来指定base_link(父框架)和camera(子框架)的关系,

//位置信息0.1 0.0 0.2,方向信息为0 0 0 1

<node pkg="tf" type="static_transform_publisher" name="broadcaster" args="0.1 0.0 0.2 0 0 0 1 base_link camera 100">

//我们要启动的node

<node pkg="robot_setup_tf" type="tf_publisher" name="publisher"/>

<node pkg="robot_setup_tf" type="tf_listener" name="listener"/>

</launch>

下面去编译

catkin_make

运行之

roscore

rosrun robot_setup_tf tf_listener

rosrun robot_setup_tf tf_publisher

然后进入rviz中去观察。

然后再看看launch文件

roslaunch robot_setup_tf demo.launch,在launch文件中我们又指定了一个坐标系框架叫做camera

下面去看一下

rosrun tf view_frames,生成一个PDF文件,可以看到

第八课 ROS的空间描述和变换的更多相关文章

  1. 第六课 ROS的空间描述和变换

    1.空间描述与变换 有两个坐标系A和B,B坐标系中有一个点P,如何把B坐标系中的P映射到A坐标系呢,这就涉及到空间描述与变换, 先看一下旋转矩阵: 上面中间的行向量中的元素表示在B坐标系当中的元素用A ...

  2. 第七课 ROS的空间描述和变换

    在命令行工具中也有一个与transformcaster相类似的工具叫做static_transform_publisher,它能够接受命令行参数来接受位置信息.旋转信息.父框架.子框架以及周期信息,通 ...

  3. NeHe OpenGL教程 第三十八课:资源文件

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  4. NeHe OpenGL教程 第二十八课:贝塞尔曲面

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  5. NeHe OpenGL教程 第十八课:二次几何体

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  6. 【C语言探索之旅】 第二部分第八课:动态分配

    内容简介 1.课程大纲 2.第二部分第八课: 动态分配 3.第二部分第九课预告: 实战“悬挂小人”游戏 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...

  7. NeHe OpenGL教程 第四十八课:轨迹球

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  8. Kali Linux Web 渗透测试视频教程— 第八课 nessus

    Kali Linux Web 渗透测试视频教程— 第八课 nessus 文/玄魂 视频课程地址:http://edu.51cto.com/course/course_id-1887.html 目录 n ...

  9. NeHe OpenGL教程 第五课:3D空间

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

随机推荐

  1. iconfont阿里字体图标的使用方法

    我们在做web项目的时候,之前比较常用的是bootstrap,所以使用font awesome字体图标比较多,无意中在一个项目中接触到了iconfont,发现想要的什么图标都有,还可以自定义图标,非常 ...

  2. FastAdmin 导出 Excel 相关资料收集 (2018-08-14)

    FastAdmin 导出 Excel 相关资料收集 导出 Excel 文件时身份证号变成科学计数法怎么办? https://forum.fastadmin.net/thread/1346 姊妹篇 Fa ...

  3. MySQL for Linux错误: ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)

    参考链接:http://www.cnblogs.com/gumuzi/p/5711495.html

  4. 使用Spring和Tomcat发布CXF REST WebService

    与发布SOAP WS一样, 同样需要在web.xml文件中配置CXFServlet: <!--cxf的Servlet--> <servlet> <servlet-name ...

  5. 移植LWIP(ENC28J60)

       上图就是整个移植的基本思路,非常清晰的三个层次.其实想想,本质上就是收发数据,只是LWIP协议通过对数据的封装可以实现网络传输.从图中我们就可以看到这里首先需要ENC28J60的驱动,这个驱动需 ...

  6. 【转】Apache Jmeter发送post请求

    下面用Jmeter发送一个post请求, 对应的js代码如下: $("#register_a").click(function() { var name = $("#un ...

  7. Vue.js:组件

    ylbtech-Vue.js:组件 1.返回顶部 1. Vue.js 组件 组件(Component)是 Vue.js 最强大的功能之一. 组件可以扩展 HTML 元素,封装可重用的代码. 组件系统让 ...

  8. php字符串截取函数,支持中文截取

    /** * 基于PHP的 mb_substr,iconv_substr 这两个扩展来截取字符串,中文字符都是按1个字符长度计算: * 该函数仅适用于utf-8编码的中文字符串. * * @param ...

  9. VS2017自定义代码片段, 实现快捷输入

    点击VS2017的工具→代码片段管理器, 下图: 语言选择C#, 路径定位到 Visual C#, 然后复制这个路径在电脑中打开 这里以增加 crk 快捷方式输出 Console.ReadKey()来 ...

  10. DNS 解析流程

    DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工 ...