zoukankan      html  css  js  c++  java
  • ROS Learning-015 learning_tf(编程) 编写一个监听器程序 (Python版)

    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 广播员程序)

  • 相关阅读:
    scrapy 项目搭建
    linux mysql -- ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid)
    linux 安装python 和pip
    转 Pycharm及python安装详细教程
    mysql在linux下的安装
    easyui datagrid动态修改editor时动态绑定combobox的数据
    easyui combobox 在datagrid中动态加载数据
    linux 安装tomcat
    CUBRID学习笔记23 关键字列表
    CUBRID学习笔记 22 插入数据
  • 原文地址:https://www.cnblogs.com/aobosir/p/5928569.html
Copyright © 2011-2022 走看看