天天看點

ROS Learning-014 learning_tf(程式設計) 坐标系變換(tf)廣播員 (Python版)ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

我使用的虛拟機軟體:VMware Workstation 11

使用的Ubuntu系統:Ubuntu 14.04.4 LTS

ROS 版本:ROS Indigo

1. 什麼是 tf :

tf : 坐标系變換。

想要确定一個物體在什麼位置,最好的方法是找一個坐标系,我們就可以得到這個物體的坐标,是以就确定了這個物體的空間位置。tf 庫就是為這個而生的。

你可能還是沒有明白究竟是什麼意思,下面我們來寫個程式,看看 tf 這個庫到底是幹什麼的:

2. 我們下面編寫一個程式:

程式的功能:

(我們先啟動一個小海龜節點) 當這個小海龜在小海龜視窗中的 pose(pose:姿态,包括平移和旋轉)發生了改變的時候,我們釋出這個小海龜在這個小海龜視窗中的pose資訊。

這就是我們下面這個程式要做的事情,簡單的說就是編寫一個:當小海龜坐标改變時,向外界廣播 ( broadcast ) 小海龜的坐标(pose )的程式。(将坐标換成 pose 更為準确。)

2.1. 好,我們先建立一個程式包:learning_tf,用來學習 tf 的。

$ cd ~/catkin_ws/src
$ catkin_create_pkg learning_tf tf roscpp rospy turtlesim
$ cd ~/catkin_ws
$ catkin_make
           

2.2. 在剛剛建立的

learning_tf

程式包中,建立一個

nodes

檔案夾,再在這裡面建立

turtle_tf_broadcaster.py

檔案: (注 : 因為第一次使用

roscd

打開建立的程式包, Tab 鍵不好使。是以需要你手動全輸入)

$ roscd learning_tf
$ mkdir nodes
$ gedit nodes/turtle_tf_broadcaster.py
           

2.3. 添加下面的代碼:

#!/usr/bin/env python 

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

def handle_turtle_pose(msg, turtlename):
    br = tf.TransformBroadcaster()
    br.sendTransform((msg.x, msg.y, ),
                    tf.transformations.quaternion_from_euler(, , msg.theta),
                    rospy.Time.now(),
                    turtlename,
                    "world")

if __name__ == '__main__':
    rospy.init_node('turtle_tf_broadcaster')
    turtlename = rospy.get_param('~turtle')
    rospy.Subscriber('/%s/pose' % turtlename,
                    turtlesim.msg.Pose,
                    handle_turtle_pose,
                    turtlename)
    rospy.spin()
           

2.4. 代碼講解:

ROS Learning-014 learning_tf(程式設計) 坐标系變換(tf)廣播員 (Python版)ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

2.5. 最後一步,給這個

turtle_tf_broadcaster.py

檔案加上可執行權限:

$ chmod +x nodes/turtle_tf_broadcaster.py
           

大功告成,我們下面開運作這個程式,看看效果:

3. 運作程式:

我們如何才能看出上面這個程式的運作效果呢, 下面跟我一步一步的做:

我們直接運作上面程式是運作不了的,我們必須要将上面那個程式寫在一個 啟動腳本程式 中,然後運作這個啟動腳本。(為什麼不能直接運作:

turtle_tf_broadcaster.py

。 因為它需要傳入一個參數,使用終端輸入的指令的方式,無法傳入這個參數,是以,我們隻能使用,編寫啟動腳本程式的方式,來啟動這個

turtle_tf_broadcaster.py

程式)

3.1. 下面編寫一個 launch 啟動檔案:

在這 learning_tf 軟體包中建立一個

launch

檔案夾,然後在裡面建立一個

start_demo.launch

檔案:

$ roscd learning_tf
$ mkdir launch
$ gedit launch/start_demo.launch
           

3.2. 添加下面的代碼:

<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>
</launch>
           

3.3. 講解代碼:

ROS Learning-014 learning_tf(程式設計) 坐标系變換(tf)廣播員 (Python版)ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

3.4. 運作這個啟動檔案:

$ roslaunch learning_tf start_demo.launch
           

現在你可以在目前終端中使用 方向鍵 來控制螢幕中的小海龜。

3.5. 現在我們來檢測一下

turtle_tf_broadcaster.py

程式運作的效果:(新開一個終端)

$ rosrun tf tf_echo /world /turtle1
           

運作後,該終端在實時重新整理小海龜

/turtle1

相對于 世界坐标系

/world

的姿态(pose) 資訊。

ROS Learning-014 learning_tf(程式設計) 坐标系變換(tf)廣播員 (Python版)ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

tf_echo

關鍵字 : 列印出 源坐标系 和 目标坐标系 之間的特定轉換資訊。

在終端中不斷刷屏:

ROS Learning-014 learning_tf(程式設計) 坐标系變換(tf)廣播員 (Python版)ROS Indigo learning_tf-01 坐标系變換(tf)廣播員 (Python版)

總結:

現在,你還沒有看到 tf 強大的一面,上面的程式,隻是想讓你了解 tf 。下一節,我編寫一個 程式:使用上面程式廣播的小海龜坐标資訊,來讓另一個小海龜跟随這隻小海龜。