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

第八课 ROS的空间描述和变换的更多相关文章
- 第六课 ROS的空间描述和变换
1.空间描述与变换 有两个坐标系A和B,B坐标系中有一个点P,如何把B坐标系中的P映射到A坐标系呢,这就涉及到空间描述与变换, 先看一下旋转矩阵: 上面中间的行向量中的元素表示在B坐标系当中的元素用A ...
- 第七课 ROS的空间描述和变换
在命令行工具中也有一个与transformcaster相类似的工具叫做static_transform_publisher,它能够接受命令行参数来接受位置信息.旋转信息.父框架.子框架以及周期信息,通 ...
- NeHe OpenGL教程 第三十八课:资源文件
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第二十八课:贝塞尔曲面
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- NeHe OpenGL教程 第十八课:二次几何体
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 【C语言探索之旅】 第二部分第八课:动态分配
内容简介 1.课程大纲 2.第二部分第八课: 动态分配 3.第二部分第九课预告: 实战“悬挂小人”游戏 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言 ...
- NeHe OpenGL教程 第四十八课:轨迹球
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- Kali Linux Web 渗透测试视频教程— 第八课 nessus
Kali Linux Web 渗透测试视频教程— 第八课 nessus 文/玄魂 视频课程地址:http://edu.51cto.com/course/course_id-1887.html 目录 n ...
- NeHe OpenGL教程 第五课:3D空间
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
随机推荐
- 阿里云ESC上面部署项目
注意:我这里的服务器是Windows系统,后面会研究Linux下的命令 1.将javaWEB项目打包为war包 右击项目,先择“Export ” 2.通过“附件”->“远程连接桌面”,连接到服务 ...
- hdu 5730 Shell Necklace——多项式求逆+拆系数FFT
题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730 可以用分治FFT.但自己只写了多项式求逆. 和COGS2259几乎很像.设A(x),指数是长度,系数 ...
- 浅谈对【OSI七层协议】的理解
我们每天都在上网冲浪,在这背后到底有那些设备.协议去支撑呢?ISO是[Open System Interconnection]的缩写,该模型定义了不同计算机互联的标准,是设计和描述计算机网络通信的基本 ...
- 蓝桥杯 基础练习 BASIC-12 十六进制转八进制
基础练习 十六进制转八进制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定n个十六进制正整数,输出它们对应的八进制数. 输入格式 输入的第一行为一个正整数n (1<=n&l ...
- 【转】Apache Jmeter发送post请求
下面用Jmeter发送一个post请求, 对应的js代码如下: $("#register_a").click(function() { var name = $("#un ...
- jmeter中50%70%80%90%代表的含义
参考 http://www.cnblogs.com/jackei/archive/2006/11/11/557972.html 我的理解是: 在4.08秒响应时间内有50%的用户达到这个4.08的标准 ...
- Rest之路 - 搭建开发环境
准备Jersey框架和类库 从官网 (https://jersey.java.net/download.html) 下载最新的zip文件,解压后如下图: lib: 包含Jersey的所有类库. ext ...
- C++获取Lua全局变量和执行Lua多参数多返回值函数
C++代码: // LuaAndC.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> #i ...
- SQL Server2005中文版x64安装29506错误解决办法
在使用SQL Server 2005简体中版安装时,使用X86(32位操作系统下)安装没有出现任何问题.可是在X64(64位操作系统下)安装过程没有出现问题,可是安装完成后却没有Microsoft S ...
- 匿名类型与Select方法实现自定义对象插入局部表结构中
在提取局部表结构数据时,通过Select选取需要的字段,如下句,此时其实产生了一个不用于_menuMan的原新数据类型new { c.SYS_COMMANDS_ID,c.TXT_COMMANDTITL ...