ROS Indigo learning_tf-02 编写一个 监听器 程序 (Python版)

我使用的虚拟机软件:VMware Workstation 11

使用的Ubuntu系统:Ubuntu 14.04.4 LTS

ROS 版本:ROS Indigo


1. 这一节要做的事情:

上一节我们已经编写了一个广播员的程序,下面我们编写一个监听器程序来监听广播员发布的小海龟的坐标系信息:

监听器程序:利用广播员程序广播的坐标信息,在同一个窗口中,有2只小海龟,我们控制 小海龟1 ,让 小海龟2 自动跟随 小海龟1 运行。

2. 程序如何实现:

这个监听器,监听广播员发出的广播(turtle1turtle2 之间坐标系的变化信息),然在同个运算,把结果发布给 turtle2 订阅的 turtle2/cmd_vel 话题上,从而控制 turtle2 运动。

废话少说,开始编程。

2.1. 将路径切换到 learning_tf 软件包,在 nodes 文件夹里创建一个 turtle_tf_listener.py 文件:

$ roscd learning_tf
$ gedit nodes/turtle_tf_listener.py

2.2. 将下面的代码添加进去:

#!/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) while not rospy.is_shutdown():
try:
(trans,rot) = listener.lookupTransform('/turtle2', '/turtle1',rospy.Time(0))
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()

2.3. 讲解代码:

2.4. 最后一步,给这个 turtle_tf_listener.py 文件加上可执行权限:

$ chmod +x turtle_tf_listener.py

3. 运行程序

3.1. 再运行程序之前, 需要编写一个 start_demo2.launch 启动脚本文件:

$ roscd learning_tf/launch
$ gedit 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.py" name="listener"/>
</launch>

3.2. 讲解启动脚本程序:

3.3. 运行启动脚本文件:

$ roslaunch learning_tf start_demo2.launch 

当你在当前终端中操控键盘方向键时,turtle2(踪色的)跟随 turtle1(白色的):

下面这幅图就是 world 固定坐标图:

我们使用下面的命令,来打印 turtle1turtle2 的姿态信息:(分别开2个终端)

$ rosrun tf tf_echo /world /turtle1
$ rosrun tf tf_echo /world /turtle2

上节讲过:

tf_echo 关键字 : 打印出 源坐标系目标坐标系 之间的特定转换信息。

$ rosrun tf tf_echo [源坐标系(父类)] [目标坐标系(子类)]

输出:



总结:

那么到这里,广播 tf 信息的程序 和 监听 tf 变化的监听器程序 我们都学完了。

你有没有发现,turtle2 跟随 turtle1turtle2 最终会移动到与 turtle1 重叠。看到这样的运行现象,我想你肯定不舒服,想个办法来解决这个不算是问题的问题。

下一节,我教你如何将一个额外的坐标系添加到 TF树 中,从而解决这个问题。(这非常类似于创建 TF 广播员程序)

ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)的更多相关文章

  1. Java基础---Java---网络编程---TCP的传输、客户端和服务端的互访、建立一个文本转换器、编写一个聊天程序

    演示TCP的传输的客户端和服务端的互访 需求:客户端给服务端发送数据,服务端收到后,给客户端反馈信息. 客户端: 1.建立Socket服务,指定要连接方朵和端口 2.获取Socket流中的输出流,将数 ...

  2. Java连接MySQL数据库。编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计。

    题目2:编写一个应用程序,在主类Test_4类中,通过JDBC访问stu数据库,显示t_student表中的内容(表结构见表1),显示效果自己设计.之后,可根据显示的内容进行某条记录的删除(以id为条 ...

  3. 编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容

    题目1:编写一个应用程序,在主类Test1类中,创建两个链表List<E>对象,分别存储通过键盘输入的字符串内容--"chen","wang",&q ...

  4. Python网络编程——编写一个简单的回显客户端/服务器应用

    今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...

  5. Java编程-第一个Java程序

    Java编程用到的IDE是Eclipse. 关于第一个Java程序实现的简单流程: (1)    下载eclipse (2)    File-New-Java Project 命名工程名字:Hello ...

  6. 在ubuntu linux 中编写一个自己的python脚本

    在ubuntu linux 中编写一个自己的简单的bash脚本. 实现功能:终端中输入简单的命令(以pmpy为例(play music python),为了区别之前说的bash脚本添加了py后缀),来 ...

  7. 18_Android中Service的生命周期,远程服务,绑定远程服务,aidl服务调用,综合服务案例,编写一个应用程序调用远程支付宝远程服务场景

    ============================================================================ 服务的生命周期: 一.采用start的方式开始 ...

  8. Android逆向 编写一个Android程序

    本节使用的Android Studio版本是3.0.1 首先,我们先编写一个apk,后面用这个apk来进行逆向.用Android Studio创建一个新的Android项目,命名为Jhm,一路Next ...

  9. python高级编程 编写一个包1

    #目的是:编写,发行python包可重复过程"""1:是缩短开始真正工作之前所需要的设置时间,也就是提供模板2:提供编写包的标准化方法3:简化测试驱动开发方法的使用4:为 ...

随机推荐

  1. centos下安装storm

    centOS安装ZeroMQ centOS安装ZeroMQ所需组件及工具: yum install gcc yum install gcc-c++ yum install make yum insta ...

  2. winform中的状态栏,以及在状态栏目上显示时间

    1:在winform上添加状态栏,并且在状态栏目上多添加几个label. step1:拖一个StatusStrip到winform上,名字默认为statusStrip1.找到statusStrip1的 ...

  3. git教程4-创建分支与删除分支

    一.分支的理解 分支,即branch,用于从主分支(master)中新开辟出一个分支,用于对文件进行修改.这部分修改的内容在新的分支未融合到主分支的情况下,主分支是看不见的.新的分支相当于开辟了新的修 ...

  4. 转载:maven依赖范围

    其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath(注意是与classpath)的关系. 主要的是三种依赖关系如下:1.compile: 默认编译依赖范围.对于编译,测试,运行 ...

  5. LeetCode Second Minimum Node In a Binary Tree

    原题链接在这里:https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/ 题目: Given a ...

  6. django的get_or_create

    转:http://www.nanerbang.com/article/51/ get_or_create会根据条件从数据库里面查找符合条件的记录,如果没有符合条件的记录,则新创建一条记录

  7. Python函数-bytearray()

    bytearray([source [, encoding [, errors]]]) bytearray([source [, encoding [, errors]]])返回一个byte数组.By ...

  8. 常用Kerberos指令

    1. 以超管身份进入kadminkadmin.local addprinc -randkey root/master1@JENKIN.COM   //生成随机key的principal addprin ...

  9. hive JDBC异常到多租户

    hive jdbc执行select count(*) from test报错. return code 1 from org.apache.hadoop.hive.ql.exec.mr.MapRedT ...

  10. Springboot正常启动,但是访问404报错

    原因: 查看是否配置文件中有以下配置: server.context-path=/hellopath 我这里是以/hellopath为例,如果有该配置的话,只能通过该路径访问到. 其他原因