1. 程式人生 > >ROS Indigo beginner_Tutorials-10 編寫 ROS 話題版的 Hello World 程式(Python版)

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服務。