第七课 ROS的空间描述和变换
在命令行工具中也有一个与transformcaster相类似的工具叫做static_transform_publisher,它能够接受命令行参数来接受位置信息、旋转信息、父框架、子框架以及周期信息,通常在launch文件中来指定。static_transform_publisher主要是变换两个固定坐标系之间的转换,eg:base_link和base_laser是底座与激光雷达之间的变换。
eg:
<node pkg="tf" type="static_transform_publisher" name="broadcaster" args="1 0 0 0 0 0 1 parent child 100">
下面来实现tf的订阅者
新建一个源文件turtle_tf_listener.cpp
在这个订阅者的任务里面主要是调用一个服务再生一个turtle,然后再发布cmd_vel这个主题在turtle2上面用于控制turtle2的轨迹,同时turtle2的轨迹是由transform_listener中得到的transform是由turtle1到turtle2的变换。
#include<ros/ros.h>
#include<tf/transform_listener.h>
#include<geometry_msg/Twist.h>
#include<turtlesim/Spawn.h>
int main(int argc,char **argv)
{
ros::init(argc,argv,"turtle_tf_listener");//节点名字turtle_tf_listener
ros::NodeHandle node;
//下面写服务,等待spawn服务,如果服务没有到达就一直等待
ros::service::waitForService("spawn");
//创建一个服务的客户端,其类型为turtlesim::Spawn,服务类型为spawn
ros::ServiceClient add_turtle=node.service<turtlesim::Spawn>("spawn");
//创建一个turtlesim::Spawn变量
turtlesim::Spawn srv;
//调用该服务
add_turtle.call(srv);
//下面来写一个publisher,其类型为geometry_msgs::Twist,发布到turtle2/cmd_vel上,消息队列为10
ros::Pubisher turtle_vel=node.advertise<geometry_msgs::Twist>("turtle2/cmd_vel",10);
//下面创建一个transform_listener对象
tf::transformListener listener;
//指定一个频率
ros::Rate rate(10.0);
//判断节点是否被关闭
while(ros::ok())
{
//创建一个stampedtransform对象来储存变换的信息
tf::StampedTransform transform;
try //在try里面使用lookuptransform
{
//其参数使targetframe,sourceframe,time,以及transform它用来储存变换的信息。父框架是turtle2,子框架是turtle1,时间为ros::Time(0)是指把最新的有效信息发布出去,在之前的broadcater中用的是time.now()是把现在的信息发送出去。
listener.lookupTransform("/turtle2","/turtle1",ros::Time(0),transform);
}
catch(tf::TransformException &ex)
{
ROS_ERROR("%s",ex.what());//把异常显示在终端上
ros::Duration(1.0).sleep();//显示的时间为1s。
continue;
}
//从transform中得到一个Twist的消息,然后发布给turtle2,下面实例化一个geometry_msgs
geometry_msgs::Twist vel_msg;
//角速度z的值,先指定一个系数4.0,然后其计算方法为atan2。
vel_msg.angular.z = 4.0* atan2(transform.getOrigin().y(), transform.getOrigin().x());
//线速度只指定x,系数设为0.5.其计算方法是使用平方函数。
vel_msg.linear.x = 0.5 * sqrt(pow(transform.getOrigin().x(), 2) + pow(transform.getOrigin().y(), 2));
//然后发布这个消息。
turtle_vel.publish(vel_msg);
rate.sleep();
}
return 1;
}
回顾一下上面程序包含了哪些内容:
首先,初始化节点,然后调用Spawn服务再生一只乌龟,接着再定义一个publisher发布消息在turtle2/cmd_vel上面,发布的消息为geometry_msg:Twist类型的vel_msg,其内容为transform储存的turtle2到turtle1的变换。
下面到CMakeList.txt里面添加内容
add_executable(turtle_tf_listener src/turtle_tf_listener.cpp)
target_link_libraries(turtle_tf_listener ${catkin_LIBRARIES})
下面再来写一个launch文件。
demo.launch
<launch>
<node pkg="turtlesim" type="turtlesim_node" name="sim"/>
<node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen"/>
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle1" name="turtle1_tf">
<node pkg="learning_tf" type="turtle_tf_broadcaster" args="/turtle2" name="turtle2_tf">//将/turtle1和/turtle2两个的在世界坐标系中的速度和位置信息发布到tf树上
<node pkg="learning_tf" type="turtle_tf_listener" name="listener">//用来获取/turtle1与/turtle2之间的变换.
</launch>
launch文件的逻辑为首先启动turtlesim_node,然后再启动turtle_teleop_key通过按键来控制它的运动,然后再learning_tf中再生一只乌龟,有两只乌龟,在tf_listener中会发布turtle2/cmd_vel这个主题来控制turtle2的运动,在turtle_tf_broadcaster中同时启动两个节点,一个节点订阅的是turtle1的pose,另一个节点订阅的是turtle2的pose,然后在tf树中广播turtle1和turtle2的位置;然后listener订阅在世界坐标系中的turtle1个turtle2的相对位置,储存在transform中,通过transform中存储的位置信息转化为控制信息。
args是指从命令行输入的参数!!
下面去编译,别忘了增加tf的依赖项。!!!!!!!!
运行roslaunch learning_tf demo.launch
运行仿真工具rosrun rviz rviz
运行之后把tf添加进去。记得把Fixed frame选择为world。
第七课 ROS的空间描述和变换的更多相关文章
- 第六课 ROS的空间描述和变换
1.空间描述与变换 有两个坐标系A和B,B坐标系中有一个点P,如何把B坐标系中的P映射到A坐标系呢,这就涉及到空间描述与变换, 先看一下旋转矩阵: 上面中间的行向量中的元素表示在B坐标系当中的元素用A ...
- 第八课 ROS的空间描述和变换
1.tf的实际应用 1)在机器人的配置中 从上面可以看出激光雷达中心距离机器人底座的中心有20cm,激光雷达的中心距机器人底座中心有10cm,如果激光雷达在障碍物前面0.3米,那么机器人底座离障碍物多 ...
- NeHe OpenGL教程 第七课:光照和键盘
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- [译]Quartz.NET 框架 教程(中文版)2.2.x 之第七课 触发监听器和作业任务监听器
第七课:触发监听器和作业任务监听器 监听器是在调度器中基于事件机制执行操作的对象.你大概可以猜到,触发监听器接收响应跟触发器有关的事件,作业任务监听器接收响应跟作业任务有关的事件. 跟触发器有关的事件 ...
- Kali Linux Web 渗透测试视频教程— 第七课 OpenVas
Kali Linux Web 渗透测试视频教程— 第七课 OpenVas 文/玄魂 视频教程地址:http://edu.51cto.com/course/course_id-1887.html 目录 ...
- NeHe OpenGL教程 第五课:3D空间
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 【C语言探索之旅】 第二部分第七课:文件读写
内容简介 1.课程大纲 2.第二部分第七课: 文件读写 3.第二部分第八课预告: 动态分配 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编写三个游戏 ...
- 【C语言探索之旅】 第一部分第七课:循环语句
内容简介 1.课程大纲 2.第一部分第七课: 循环语句 3.第一部分第八课预告: 第一个C语言小游戏 课程大纲 我们的课程分为四大部分,每一个部分结束后都会有练习题,并会公布答案.还会带大家用C语言编 ...
- 【Cocos游戏实战】功夫小子第七课之游戏主功能场景逻辑功能和暂停功能场景的分析和实现
CSDN的markdown编辑器是吃屎了么! !.什么玩意.!写了一半写不了东西还全没了,搞个毛线! 本节课的视频教程地址是:第七课在此 假设本教程有帮助到您,希望您能点击进去观看一下,并且如今注冊成 ...
随机推荐
- UITextField的使用总结
初始化一个文字框: UITextField * textField = [[UITextField alloc]initWithFrame:CGRectMake(, , , )]; 设置和获取文字框文 ...
- 使用.NET Remoting开发分布式应用——基于租约的生存期
一.概述 知名类型的SingleCall对象可以在客户程序的方法调用之后被垃圾收集器清理掉,因为它没有保持状态,属于无状态的.而客户激活的类型的对象和知名类型的SingleTon对象都属于生存期长的对 ...
- ubuntu下安装ros出现“无法下载-package.ros.org中某个包-校验和不符”的解决方法
新安装的Ubuntu14.04,为了科研马上准备装ros indigo,却困难重重,一步一个坎. 比如说按照ros wiki里面一步一步来,当运行sudoapt-get update 然后出现下列情况 ...
- 【转】CentOs中Apache开启rewrite模块详解
rewrite是apache环境的一个伪静态功能了,如果我们没有没让Apache开启rewrite功能,网站上所有的rewrite规则都不可使用. centos的配置文件放在: /etc/httpd/ ...
- The java.util.concurrent Synchronizer Framework笔记
这篇笔记是关于 Doug Lea 的 The java.util.concurrent Synchronizer Framework . 原文地址:http://gee.cs.oswego.edu/d ...
- POJ 2823 Sliding Window(单调队列入门题)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 67218 Accepted: 190 ...
- js 格式化相关的时间
javascript Date format(js日期格式化) 方法一: // 对Date的扩展,将 Date 转化为指定格式的String // 月(M).日(d).小时(h).分(m).秒(s). ...
- 五 搭建kafka集群
1 下载 wget http://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.0.0/kafka_2.12-2.0.0.tgz 2 tar -zxv ...
- win10系统怎么关闭自动更新
现在win10已经很普遍了,对于win10 现在还不是很完美,比如自动更新功能,现在的选项中没有关闭自动更新的选项了,这是一个bug,微软要强制更新.我就忍受不了自动更新,会拉取网络,影响我们的上网体 ...
- ILMerge最佳实践
背景 为了生成的代码更加简捷,复制方便,常常会把多个可执行文件合并成一个. 方案 Project=>Properties=>Build Events=>Edit Post-build ...