第八课 ROS的空间描述和变换

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文件,可以看到

时间: 2024-10-11 07:13:22

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

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

1.空间描述与变换 有两个坐标系A和B,B坐标系中有一个点P,如何把B坐标系中的P映射到A坐标系呢,这就涉及到空间描述与变换, PBORG是B坐标原点在A坐标系中的表达, 目的是将B坐标系中的P点在,在A坐标系中进行表达 将它可以写成如下, 中间的表达式可以成为旋转扇子, 实部w表示标量,虚部(x,y,z)用v表示. 操作四元素,欧拉角或者固定角可以用Bullet方法,KDL::Rotation方法等 tf tf的原理 有三个坐标系,一个未知坐标系,已知坐标系,一个世界坐标系 未知坐标系在世界中

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

在命令行工具中也有一个与transformcaster相类似的工具叫做static_transform_publisher,它能够接受命令行参数来接受位置信息.旋转信息.父框架.子框架以及周期信息,通常在launch文件中来指定.static_transform_publisher主要是变换两个固定坐标系之间的转换,eg:base_link和base_laser是底座与激光雷达之间的变换. eg: <node pkg="tf" type="static_transfor

第八课 网络通信

unix_c_08.txt================第八课 网络通信================一.基本概念------------1. ISO/OSI七层网络协议模型~~~~~~~~~~~~~~~~~~~~~~~~~~+------------+--------------+ ---| 应用层 | Application | ^+------------+--------------+ || 表示层 | Presentation | 高层+------------+---------

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第三十八课:资源文件 从资源文件中载入图像: 如何把图像数据保存到*.exe程序中,使用Windows的资源文件吧,它既简单又实用. 欢迎来到NeHe教程第38课.离上节课的写作已经有些时日了,加上写了一整天的code,也许笔头已经

【C++探索之旅】第一部分第八课:传值引用,文件源头

内容简介 1.第一部分第八课:传值引用,文件源头 2.第一部分第九课预告:数组威武,动静合一 传值引用,文件源头 这一课的标题有点怪.其实是由这一课的几个重点内容结合起来取的名,慢慢学习就知道啦. 上一课<[C++探索之旅]第一部分第七课:函数效应,分而治之>中,我们初步认识了函数. 不过不要高兴得太早,你以为函数就这样离你远去了嘛?怎么可能,函数将伴随一生好吗,只要你继续编程的话.哈哈,所以你是跑不掉了~ [小编,都跟你签了协议了,没吃药不要随便出来溜达] 这一课我们就继续深入学习与函数相关

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第二十八课:贝塞尔曲面 贝塞尔曲面: 这是一课关于数学运算的,没有别的内容了.来,有信心就看看它吧. 贝塞尔曲面 作者: David Nikdel ( [email protected] ) 这篇教程旨在介绍贝塞尔曲面,希望有比我更

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

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第十八课:二次几何体 二次几何体: 利用二次几何体,你可以很容易的创建球,圆盘,圆柱和圆锥. 二次曲面是一种画复合对象的方法,这种方法通常并不需要很多的三角形.我们将要使用第七课的代码.我们将要增加7个变量以及修改纹理以增加一些变化

【Linux探索之旅】第二部分第八课:RTFM 阅读那该死的手册

内容简介 1.第二部分第八课:RTFM 阅读那该死的手册 2.第二部分第九课预告:查找文件,无所遁形 RTFM 阅读那该死的手册 今天这一课也会很轻松. 一般Windows的用户不太习惯看使用手册.有些Windows下的软件下载后是带有使用手册的,但是谁会花时间看呢? 在Linux下,阅读手册应该成为一个反射动作,一个自然而然的反应.虽说一开始要我们去看手册会有点让人生畏,但是我们学习各种Linux命令的使用方法的最好去处就是手册了. 我们这个系列教程也绝不能和手册相比,因为我们的教程里对于每一

【二毛SEO教程】第八课:SEO操作-标签的优化

课前复习(第七课): 1.   标题确定后,不要再改:关键词可改.描述不要轻易改. 2.   关键词密度:不要刻意堆砌或者靠近参考比例,临门一脚即可. 3.   关键词:选词很重要,不要急着发外链. 第八课正文: 1.  如何给网站图片添加alt属性? 作用:告诉搜索引擎,这个图片是什么内容. 什么情况下要做ALT:图片和网站本身内容有紧密联系或者链接到内页 (1)  告诉搜索引擎,图片内容. (2)  促进搜索引擎爬行图片内页内容,促进收录量提升. 哪些页面要做ALT:首页和分类页 index