ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数

C++ tf::TransformListener ROS编写机器人的时候,不免会用到坐标变换,而TF是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具。 TF库的目的是实现系统中任一个点在所有坐标系之间的坐标变换,也就是说,只要给定一个坐标系下的一个点的坐标,就能获得这个点在其他坐标系下的坐标。 使用TF功能包主要有以下两种方式: A:监听tf变换,接收并缓存系统中发布的所有参考系变换,并从中查询所需要的参考系变换。 B:广播tf变换,向系统中广播参考系之间的坐标变换关系。系统中更可能会存在多个不同部分的tf变换广播,每个广播都可以 阅读详情

ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) — waitForTransformFull() 函数

我使用的虚拟机软件:VMware Workstation 11
使用的Ubuntu系统:Ubuntu 14.04.4 LTS
ROS 版本:ROS Indigo


一 . 前言

这一节要做的事情:使用 tf 的一个强大功能:可以再现在与过去中穿梭。(就是:如何使用 waitForTransformFull() 函数。)

我们不让 turtle2 跟随当前的 turtle1 的坐标, 而是让 turtle2 去跟随 过去的 turtle1 的坐标。
一样,我们只需要改变 监听器 程序 ( turtle_tf_listener.py )中的一点点代码就可以实现。我们就让 turtle2 去跟随5秒钟前的 turtle1 的坐标吧。

跟随过去 的 程序编写

1 . 重点讲解

我们将之前编写的 监听器 程序 ( turtle_tf_listener.py )里面的这一段代码:

        try:
            (trans, rot) = listener.lookupTransform('/turtle2', '/turtle1', rospy.Time(0))

修改为:

        try: 
            now = rospy.Time.now()
            past = now - rospy.Duration(5.0)
            listener.waitForTransformFull('/turtle2', now, '/turtle1', now, '/world', rospy.Duration(4.0))         
            (trans,rot) = listener.lookupTransform('/turtle2', now, '/turtle1', past, '/world')

我们来具体了解一下上面代码中出现的:lookupTransformFull() 函数,这个函数也是坐标系信息转换的功能。这个函数有6个形参: ( 其实它的功能和lookupTransform()函数的功能一样,只不过是个升级版函数 ) :

1 . 父类坐标系节点名
2 . 指定时间
3 . 子类坐标系节点名
4 . 指定时间
5 . 指定不随时间改变的坐标系, 在这里是 “/world” 坐标系.

通过 形参1 和 形参2 就可以得到一个 姿态的信息(线速度和角速度),通过 形参3 和 形参4 就可以得到另一个姿态的信息。

图示 lookupTransformFull() 函数的作用:

这里写图片描述

解说一下这幅图的意思: lookupTransformFull() 函数 做了下面三步的事情。
第1步 : 将 形参1 在指定的时间 形参2 时的姿态信息转换到 形参5 坐标系上;
第2步 : 接着,将 形参3 在指定的时间 形参4 时的姿态信息转换到 形参5 坐标系上;
第3步 : 最后,将 第1步 得到的姿态信息做为坐标原点(即:以 形参1 的位置做为参考坐标系),求出 第二步 得到的姿态信息 在 这个参考坐标中的姿态信息,将其做为 lookupTransformFull() 函数返回值输出。


2 . 编写代码

在learning_tf 程序包中的 nodes 路径下,新建一个文件:turtle_tf_listener_pastNow.py:

roscd learning_tf/node/
gedit turtle_tf_listener_pastNow.py

下面是完整的程序。将这段程序复制到 turtle_tf_listener_pastNow.py 文件里面:

#!/usr/bin/env python

import roslib
roslib.load_manifest('learning_tf')
import rospy
import math
import tf
import geometry_msgs.msg
import turtlesim.srv

if __name__ == '__main__':
    rospy.init_node('tf_turtle')
    listener = tf.TransformListener()

    rospy.wait_for_service('spawn')
    spawner = rospy.ServiceProxy('spawn', turtlesim.srv.Spawn)
    spawner(4, 2, 0, 'turtle2')

    turtle_vel = rospy.Publisher('turtle2/cmd_vel', geometry_msgs.msg.Twist, queue_size=1)

    rate = rospy.Rate(10.0)
    listener.waitForTransform("/turtle2", "/turtle1", rospy.Time(), rospy.Duration(4.0))
    while not rospy.is_shutdown():
        try: 
            now = rospy.Time.now()
            past = now - rospy.Duration(5.0)
            listener.waitForTransformFull('/turtle2', now, '/turtle1', now, '/world', rospy.Duration(4.0))         
            (trans,rot) = listener.lookupTransform('/turtle2', now, '/turtle1', past, '/world')
        except (tf.LookupException, tf.ConnectivityException, tf.ExtrapolationException):
            continue

        angular = 4 * math.atan2(trans[1], trans[0])
        linear  = 0.5 * math.sqrt(trans[0] ** 2 + trans[1] ** 2)
        cmd = geometry_msgs.msg.Twist()
        cmd.linear.x = linear
        cmd.angular.z = angular
        turtle_vel.publish(cmd)
        rate.sleep()

给这个文件添加可执行权限:

chmod 777 turtle_tf_listener_pastNow.py

3 . 编写启动文件

在learning_tf 程序包中的 launch 路径下,新建一个文件:start_demo6.launch:

roscd learning_tf/launch/
gedit start_demo6.launch

将下面的代码拷贝进去。(下面这段代码就是通过 start_demo2.launch 文件改写的,基本和它一模一样)

<launch>
    <!-- Turtlesim Node -->
    <node pkg="turtlesim" type="turtlesim_node" name="sim" />
    <node pkg="turtlesim" type="turtle_teleop_key" name="teleop" output="screen" />

    <node name="turtle1_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
        <param name="turtle" type="string" value="turtle1" />
    </node>
    <node name="turtle2_tf_broadcaster" pkg="learning_tf" type="turtle_tf_broadcaster.py" respawn="false" output="screen" >
        <param name="turtle" type="string" value="turtle2" />
    </node>

    <node pkg="learning_tf" type="turtle_tf_listener_pastNow.py" name="listener" />

</launch>

4 . 运行

运行 start_demo6.launch 这个启动脚本文件:

$ roslaunch  learning_tf start_demo6.launch 

这次的运行效果,很不错,当前时间的 turtle2 小海龟 就在跟随这个 过去5秒钟之前的 turtle1 小海龟做运动。

这里写图片描述

搞定


5 . 扩展: ROS 官方上的错误

下面这段是 ROS 官网中的程序:(这个网站)

        try: 
            now = rospy.Time.now()
            past = now - rospy.Duration(5.0)
            listener.waitForTransformFull('/turtle2', now, '/turtle1', past, '/world', rospy.Duration(4.0))         
            (trans,rot) = listener.lookupTransform('/turtle2', now, '/turtle1', past, '/world')

这段代码是错误的。如果运行的话,会输出下面的错误信息:

[listener-6] process has died [pid 8919, exit code 1, cmd /home/aobosir/catkin_ws/src/learning_tf/nodes/turtle_tf_listener_pastNow.py __name:=listener __log:=/home/aobosir/.ros/log/71c1eedc-75ad-11e6-8577-000c29fd0c33/listener-6.log].
log file: /home/aobosir/.ros/log/71c1eedc-75ad-11e6-8577-000c29fd0c33/listener-6*.log

这里写图片描述

正确的代码就是:(这样就不会出现问题)

        try: 
            now = rospy.Time.now()
            past = now - rospy.Duration(5.0)
            listener.waitForTransformFull('/turtle2', now, '/turtle1', now, '/world', rospy.Duration(4.0))         
            (trans,rot) = listener.lookupTransform('/turtle2', now, '/turtle1', past, '/world')


总结:
现在,我们学会了如果在ROS 中进行不同时间段之间的 tf 转换。
接下来,下一节,介绍:如果调试使用 tf 转换的程序(C++ 版)。


RK3588视频转码实战:如何用FFmpeg+MPP实现16路1080P硬解压(附完整命令) 本文详细介绍了如何在RK3588处理器上使用FFmpeg和MPP框架实现16路1080P视频的硬件加速转码。通过解析RK3588的视频处理架构、环境搭建步骤和实战配置,提供了完整的命令示例和性能调优建议,帮助开发者高效处理多路视频转码任务。 阅读详情

相关推荐

2024最新Typora配置指南:从安装到打造学术写作环境(含LaTeX/参考文献解决方案)

本文提供2024年最新Typora配置指南,详细讲解如何从安装开始,结合Pandoc、Zotero和LaTeX,打造高效的学术写作环境。指南涵盖Typora深度定制、学术主题配置、参考文献自动管理以及一键生成出版级PDF的完整解决方案,旨在帮助科研人员和学生实现内容与格式分离,大幅提升论文写作效率。

weixin_29258297的博客 211

ROS-TF使用:waitForTransform和lookupTransform故障分析

ROS中TF,waitForTransform和lookupTransform的使用

zhaoliang的博客 2034

KIBANA可视化管理界面说明

更说明转自https://blog.youkuaiyun.com/IT_ZRS/article/details/125496588 1 主要结构功能 使用浏览器访问 ip:5601 默认端口,进入首页 Discover:日志管理视图 主要进行搜索和查询 Visualize:统计视图 构建可视化的图表 Dashboard:仪表视图 将构建的图表组合形成图表盘 Timelion:时间轴视图 随着时间流逝的数据 APM:性能管理视图 应用程序的性能管理系统 Canvas:大屏展示

tian830937的专栏 7084

ROS自学实践(9):TF坐标变换实例解析

前言 在进行SLAM建图或者自动驾驶系统开发的时候,往往需要多个传感器,比如激光雷达、相机、毫米波雷达、里程计等等,由于机器人本身具有自己的坐标系,每个传感器又有自己的坐标系,在建图的时候还涉及世界坐标系,了解各个坐标系之间的转换至关重要,ROS给我们提供了一个很好的坐标变换工具——TF包,下面简单介绍一下相关的使用。 参考文献: 1.https://www.guyuehome.com/355 ...

qq_43066145的博客 5887

CANoe从入门到精通“保姆级”教程(二)- 堪称全网“最全”系列

CANoe各功能区介绍;

车载控制器AutoSAR软件开发工程师 2万+

八路抢答器____一个作品的制作思路

学习了解到一个产品制作完全由一个人去采购,设计,仿真,画PCB。不光是需求的分析还有实现功能时如何搭建电路,和给出一个简单高效的设计方法也是至关重要的。

weixin_73690807的博客 1522

【ROS学习】- tf学习 - tf中重要函数解析 (陆续更新....)

【ROS学习】- tf学习 - tf中重要函数解析

qq_39779233的博客 8174

ENVI遥感技术

记录2024.03.06所遇到的遥感问题

qq_44453923的博客 4332

ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) — waitForTransform() 函数

ROS Indigo learning_tf-05 now() 和 Time(0)的区别 (Python版) — waitForTransform() 函数 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LTSROS 版本:ROS Indigo 一. 前言 这一节要做的事情:使用 tf 的 now() 和 Time(0)...

ADAS_LOVER的博客 3090

DRV8311HRRWR直流无刷(BLDC)电机驱动原理图设计

DRV8311HRRWR集成三个MOSFET 半H桥,用于驱动三相无刷直流电机(BLDC),适用于5V、9V、12V或18V直流电源轨或1S至4S电池供电应用。内部集成三个具有集成电流感测功能的电流感测放大器(CSA),可感测BLDC电机的三相电流,从而实现FOC和电流控制系统设计方案。集成保护特性:VM 欠压锁定 (UVLO)、 电荷泵欠压 (CPUV)、过流保护 (OCP)、热警告和热关断 (OTW/OTSD)、故障条件指示引脚 (nFAULT)支持 1.8V、3.3V 和 5V 逻辑输入。

zhusl6688的博客 1228

11、系统稳定性分析与李雅普诺夫函数的应用

本文深入探讨了李雅普诺夫函数在系统稳定性分析中的核心作用,重点介绍了时变与时不变系统的稳定性判据差异,以及巴尔巴拉特引理在处理非自治系统中的应用。文章还阐述了正线性系统与严格正实传递函数的性质及其在非线性控制系统中的重要性,并展示了李雅普诺夫函数在评估主导时间常数和设计快速干扰抑制控制策略方面的实际应用。通过具体示例和流程图,系统地总结了李雅普诺夫方法在稳定性分析、性能评估与控制器设计中的多维度价值,同时指出了当前挑战与未来发展方向。

Jerry的专栏 93

ROS Learning-022 learning_tf-06(编程) 现在与过去中穿梭 (Python版) --- waitForTransformFull() 函数...

ROS Indigo learning_tf-06 现在与过去中穿梭 (Python版) — waitForTransformFull() 函数 我使用的虚拟机软件:VMware Workstation 11 使用的Ubuntu系统:Ubuntu 14.04.4 LTS ROS 版本:ROS Indigo 一 . 前言 这一节要做的事情:使用 tf 的一个...

weixin_30530523的博客 525

2024年数字IC秋招-格科微-数字电路设计工程师-笔试题

笔试题型:简答题(9个)笔试平台:牛客(电脑监控)笔试时间:2h。

qq_42135020的博客 1605

ROS学习笔记:tf的学习和使用(二)

1.增加一个坐标系 前面我们的效果是让turtle2跟着turtle1走,那么做到有一定布局地跟随呢?事实上原理比较简单,我们只需再构造一个turtle1的子坐标系,然后让turtle2跟着这个子坐标系走即可。 需要注意的是,每个子坐标系都只能有一个父坐标系,而一个坐标系是可以有多个子坐标系的。 $ roscd learning_tf src/frame_tf_broadcaster

banzhuan133的博客 3303

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

25. tf坐标系广播与监听的编程实现

pkg需要的依赖:roscpp rospy tf turtlesim(例子) 1. broadcaster(得到坐标系关系并发布到树中) 1.1 头文件部分: #include <ros/ros.h> #include <tf/transform_broadcaster.h> #include <turtlesim/Pose.h> 海龟的位置是通过turtlesim不断往外发布的 1.2 main函数部分: int main(int a...

大厂offer宝典 447

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

ROS中tf变化与时间之间的关系

在TF中会保持更新TF参考系的结构,这个结构会随着时间的变化而变化 TF中会存放10s的各个坐标系变化的时间镜像 通常利用lookuptramsform()来获取最新的坐标系变换 通过修改nodes/turtle_tf_listener.py来改变调用方式 try: now = rospy.Time.now() (trans,rot) = listener.lookupTransform(...

Catdeo的博客 1458

ROS tf::TransfromBroadcaster tf::TransformListener listener.lookupTransform listener.waitForTransfor

1.How to broadcast coordinate frames of a robot to tf ? 使用tf::TransfromBroadcaster API,具体代码如下: #include &amp;lt;ros/ros.h&amp;gt; 2 #include &amp;lt;tf/transform_broadcaster.h&amp;gt; 3 #include &amp;lt;turtlesi...

Hansry的博客 1万+

(七)坐标管理、tf坐标系广播与监听

一个机器人可以有多个坐标系,若要去描述任意两个坐标系之间的关系,会出现大量的矩阵运算。而可以用ROS中的TF(Transform)功能包来解决问题,它可以管理坐标系,通过查询可获知两个坐标系间的关系,无需自己去做运算。

qq_53589322的博客 812

ROS学习笔记三(TF的类)

tf::MessageFilter可以订阅任何的ROS消息,然后将其缓存,直到这些消息可以转换到目标坐标系,然后进行相应的处理(一般在回调函数中处理)。tf::StampedTransform是tf::Transforms的一个特例,同时要求具有frame_id,stamp 和 child_frame_id。tf::Stamped在上面的数据类型(tf::Transform除外)上被模板化,元素有frame_id_和stamp_返回一个由由固定轴横滚角、俯仰角和偏航角组成的tf::Quaternion。

做题记录 2031

ROS专题----tf和tf2坐标变换

ROS专题----tf和tf2坐标变换----工作区设置如果您尚未创建用于完成教程的工作区, 请单击此处查看一些简要说明 。从tf1迁移到tf2转换数据类型这是对转换数据类型的语法更改的快速说明。将TransformListener从tf迁移到tf2这是一个将tf TransformListener类转换为tf2监听器类的指南将TransformBroadcaster从tf迁移到tf2这是一个将t

zhangrelay的专栏 1万+

ROS学习(四)机器人的移动与矫正

移动底座的坐标系 机器人在移动的时候使用的是右手坐标系。如图: 这里的右手坐标系和课本上的不太一样: 不过本质是一样的,进行反转后其实会重合。 我们以图1作为解释。 x轴指向机器人的正前方,y轴指向正左方,z轴指向正上方。 ROS的移动控制架构 整个架构从对发动机的直接控制,到路径规划SLAM,不同层代表着不同的抽象。 Motor Speeds 发动机控制器。

qq_24747993的博客 1万+

学习ROS笔记之TF——learning tf(一)

1,tf官网学习,第一部分微learning tf                  http://wiki.ros.org/tf/Tutorials

u012089678的专栏 1万+

ROS中的tf(transform)的理解 ,你追我小乌龟的深入剖析

对于ros中的tf其实一直理解不是很深,最近工作上一直在用,就很懵逼,出来混果然是要还的~于是这两天把ros官方提供的小乌龟版的你追我,如果你追到我,我就让你xxx,一个一个命令跑了一下,现在有了一个较深的理解,如果哪里说的不对,还请指正。 首先看launch文件内容 <launch> <!-- 海龟仿真器 --> <node pkg="turtle...

凌少skier的小窝 1万+

ROS学习--轻松使用tf

tf是ROS中建立坐标系,并且使用各个坐标间转换关系的一个很好的工具,对于非导航专业的同学,常常苦恼与各种旋转矩阵的变换,自己经常被搞的头大,最近由于课题实验的需要,尝试使用tf,对此有了一个初步的了解。很多已经接触ROS有一段时间的朋友,可能都没有真正使用过tf,因为从官方给的例程看起来好像非常繁琐,所以也就不想使用,但是最近一段时间的学习发现,其实真正有用程序的就仅仅几句,所以其实非常简单。

Start_From_Scratch的博客 4万+

ROS的tf包中坐标变换的方法

1、setRotation函数的参数在坐标变换的时候常有这样的写法: tfTutorialsAdding a frame (C++)transform.setOrigin( tf::Vector3(0.0, 2.0, 0.0) ); transform.setRotation( tf::Quaternion(0, 0, 0, 1) ); br.sendTransform(tf::StampedTr

张京林要加油的技术专栏 1万+

tf树的一些理解

1.建立和维护一棵tf树。主要是通过不停地向tf树发送各个坐标系之间的转换关系,也就是位置关系,来维护一个tf树。主要用到的指令就是: static tf::TransformBroadcaster br; tf::Transform transform; transform.setOrigin( tf::Vector3(msg->x, msg->y, 0.0) ); tf::

qq_33179208的博客 4316

ROS学习笔记:TF坐标变换及编程详解

ROS学习笔记:TF坐标变换及编程详解1. 前言及TF简介2. TF编程实例详解2.1 常用数据类型2.2 TF使用流程2.3 TF广播器2.4 TF监听器3 TF编程练习参考 1. 前言及TF简介 2. TF编程实例详解 这边以ROS Wiki上给出的TF编程实例作为降解对象 2.1 常用数据类型 参考ROS Wiki上面给出的TF数据类型,主要有以下几种基本类型,分别对应四元数,向量,点坐标,...

moumde的博客 8197
上一篇: ROS Learning-021 learning_tf-05(编程) now() 和 Time(0) 的区别 (Python版)
下一篇: Python 网络爬虫 004 (编程) 如何编写一个网络爬虫,来下载(或叫:爬取)一个站点里的所有网页
AoboSir
博客等级 码龄10年 996粉丝 285原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值