ROS Indigo beginner_Tutorials-10 編寫 ROS 話題版的 Hello World 程式(Python版)
1. 前言 :
Hello world 程式,在我們程式設計界,代表學習某種語言編寫的第一個程式。對於 ROS 機器人作業系統來說,這個 Hello World 程式就是 : 寫一個簡單的訊息釋出器(傳送) 和 訂閱器(接收)。
2. 準備工作 :
C++ 的程式都會存放在每個程式包的 src
資料夾裡。 Python 不同,Python 程式都存放在 scripts
資料夾中, 反正意思都是 原始檔 包。
Step 1 .
beginner_tutorials
軟體包中建立一個 scripts
資料夾:
$ roscd beginner_tutorials
$ mkdir scripts
$ cd scripts
- 1
- 2
- 3
3. 編寫訊息釋出器節點程式:
如果你懶得去寫的話,你可以使用 wget
命令, 在 github 上獲取一個 talker.py
原始碼。如何獲取呢 ?
Step 2 . 開一個終端,輸入下面的命令就可以獲取 talker.py
$ wget https://raw.github.com/ros/ros_tutorials/indigo-devel/rospy_tutorials/001_talker_listener/talker.py
$ ls
talker.py
- 1
- 2
- 3
但是我建議你親自動手,寫一寫:手動建立一個
talker.py
檔案在/scripys
資料夾裡:$ roscd beginner_tutorials/scripts $ gedit talker.py
- 1
- 2
將這上面連結裡的程式碼手動輸入到
talker.py
檔案中。(我就不將程式碼貼上來了)
下面我來講解一下程式碼:
HZ,赫茲,表示每秒的週期次數,10HZ表示1秒10次
Step 3 . 最後一步,給這個 talker.py
檔案加上可執行許可權:
$ chmod +x talker.py
- 1
這樣,一個釋出器就編寫完了。我們不要急著去執行它,現在我們編寫一個訂閱器,來接收這個釋出器釋出的話題:
4. 編寫訊息訂閱器節點程式:
Step 4 . 和釋出器一樣,我們使用wget
命令獲取訂閱器的原始碼 listener.py
:
$ roscd beginner_tutorials/scripts/
$ wget https://raw.github.com/ros/ros_tutorials/indigo-devel/rospy_tutorials/001_talker_listener/listener.py
$ ls
listener.py talker.py
- 1
- 2
- 3
- 4
但是,我還是建議你自己動手寫一下。
好吧,下面我們開始講解 listener.py
裡面的程式碼,這個listener.py
程式的程式碼簡單:
Step 5 . 最後不要忘了給這個listener.py
加可執行許可權:
$ chmod +x listener.py
- 1
5. 執行 :
對於python 來說,我們不需要使用 catkin_make
命令對 ~/catkin_ws
工作空間進行編譯。因為python檔案本身就是可執行檔案(前提是我們給它新增可執行許可權)。
OK,釋出器 和 訂閱器 都建立完了。下面我們執行它們,看看效果:
Step 6 . 新開啟一個終端,先執行 roscore
命令:
$ roscore
- 1
Step 7 . 新開啟一個終端,啟動 釋出器 :
$ rosrun beginner_tutorials talker.py
- 1
Step 8 . 新開啟一個終端,啟動 訂閱器 :
$ rosrun beginner_tutorials listener.py
- 1
執行效果:
Step 9 . 我們來使用 rostopic list
,看看當前的話題有哪些:
$ rostopic list
/chatter
/rosout
/rosout_agg
- 1
- 2
- 3
- 4
其中 /chatter
就是我們在釋出器裡面釋出的 ROS話題。
6. 擴充套件,編寫一個啟動指令碼檔案 :
還記得上一節,我們講的ROS的啟動指令碼檔案吧,下面我們來編寫一個launch檔案,來將 talker.py
和 listener.py
檔案的啟動工作交個這個launch檔案來做:
Step 10 . 來到 beginner_tutorials
程式包的 /launch
路徑下,新建一個 hello_world_topic.launch
檔案:
$ roscd beginner_tutorials/launch
$ gedit hello_world_topic.launch #使用你自己喜歡的文字編輯器
- 1
- 2
Step 11 . 輸入下面的程式碼:
<launch>
<node pkg="beginner_tutorials" name="talker" type="talker.py" />
<node pkg="beginner_tutorials" name="listener" type="listener.py" />
</launch>
- 1
- 2
- 3
- 4
Step 12 . 現在,將之前開啟的終端都關閉,我們啟動這個指令碼: (開一個終端 : Ctrl+Alt+T
)
$ roslaunch beginner_tutorials hello_world_topic.launch
- 1
執行結果:
上面截圖的輸出顯示: talker.py
和 listener.py
指令碼執行成功。但是並沒有出現刷屏的現象。這是為什麼? 為了證明這個指令碼程式真的成功的運行了,我們來試一試:
Step 13 . 重新開一個終端,輸入下面的命令:
$ rosrun list
$ rostopic list
$ rostopic echo /chatter
- 1
- 2
- 3
Step 14 . 現在 Ctrl+C
結束監聽 /chatter
話題。使用 rqt_graph
對當前啟動的節點視覺化:
$ rqt_graph
- 1
這些足以說明,hello_world_topic.launch
啟動指令碼檔案,啟動成功。
總結: 釋出器 和 訂閱器 是很簡單的, 就是簡單的釋出一個 自定義的話題。
我之前使用說過:節點之間通訊的方式有兩種 : 話題(rostopic
) 和 服務(rosservice
)
所以,接下來,我們會講:使用ROS服務來完成ROS版 Hello World 程式的例子。但是在這之前,我們需要學一學:如何建立自定義的ROS訊息和ROS服務,以便 ROS 服務版的 Hello World 程式的編寫。
所以下一講,我們來學習:如何建立自定義的ROS訊息和ROS服務。