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 鍵不好使。是以需要你手動全輸入)
learning_tf
nodes
turtle_tf_broadcaster.py
roscd
$ 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. 代碼講解:
2.5. 最後一步,給這個 turtle_tf_broadcaster.py
檔案加上可執行權限:
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. 講解代碼:
3.4. 運作這個啟動檔案:
$ roslaunch learning_tf start_demo.launch
現在你可以在目前終端中使用 方向鍵 來控制螢幕中的小海龜。
3.5. 現在我們來檢測一下 turtle_tf_broadcaster.py
程式運作的效果:(新開一個終端)
turtle_tf_broadcaster.py
$ rosrun tf tf_echo /world /turtle1
運作後,該終端在實時重新整理小海龜
/turtle1
相對于 世界坐标系
/world
的姿态(pose) 資訊。
tf_echo
關鍵字 : 列印出 源坐标系 和 目标坐标系 之間的特定轉換資訊。
在終端中不斷刷屏:
總結:
現在,你還沒有看到 tf 強大的一面,上面的程式,隻是想讓你了解 tf 。下一節,我編寫一個 程式:使用上面程式廣播的小海龜坐标資訊,來讓另一個小海龜跟随這隻小海龜。