十分鐘快速認識 ROS (Robot Operating System)

本文是 AI 神經網路自走車 第四篇,用最簡易的方式來讓大家認識 ROS 這個強大的機器人開發框架,之後我們會使用 ROS 來完成我們自走車的高層控制。

什麼是 ROS?

ROS 全名為 Robot Operating System,提供一個框架讓 developer 開發機器人相關應用。

ROS 開始於 2007 年,由機器人社群一起合作開發的 open source project,目前最新版本為 ROS2,兩者基礎架構不同所以不相容,初學的話建議直接學習 ROS2,因為他的架構和開發的方式都優於 ROS V1。

雖然名稱上帶有 Operating System,但他其實不是 OS,所以還是需要依賴於 Linux 、Windows 或者 macOS 系統。安裝上可以直接透過 Binary Package、Building from Source,或者是 Docker 直接啟動。如何用 Docker 啟動 ROS2 應用 一文將會分享如何用最方便的 Docker 使用 ROS2。

我可以用 ROS 做什麼?

雖然名稱上翻譯起來是「機器人操作系統」,但其實可以利用於其他非機器人的領域。比如說 nVidia 在 github 上開源了一個 ros2_trt_pose 的 repository,在 nVidia jetson 平台上利用 ROS 結合相機模組,以及預先透過 pyTorch 訓練好的模型,完成及時的人體姿態偵測。

看到這邊你可能會懷疑,如果只是要做姿態偵測,直接透過 python 或 openCV 去相機模組抓圖片餵給 pyTorch 即可,為何還要透過 ROS 框架繞一圈去撰寫呢?主要還是利用 ROS 框架內建的鬆耦合以及 topic publish subscribe 的機制。

什麼是鬆耦合?

延伸剛剛提到的 ros2_trt_pose,我們現在想要透過相機模組擷取影像,除了要餵給模型去預測姿勢之外,還要另外將影像串流給使用者。所以分析起來總共有三件事:

  1. 擷取相機模組的影像
  2. 影像傳送給模型預測
  3. 影像串流給使用者

如果用 openCV 之類的套件寫的話,原先的作法可能會是循序的,先做 1 然後做 2,並寫在同一份和擷取影像有關的 py 檔裡。今天你要增加 3 的功能,可能也會在同一份 py 檔裡面繼續擴充所需的邏輯。

cam = cv2.VideoCapture(0)

# 1. 擷取相機模組的影像
ret, img = cam.read()

# 2. 影像傳送給模型預測
cleaned_data = clean_img(img)
predict(cleaned_data)

# 3. 影像串流給使用者
sm_img = compress(img)
stream_to_user(sm_img)

但假設今天如果後面繼續增加十件需要相機模組影像的任務,那一份 py 檔會變得非常冗長,而且大部分和相機模組不相干的邏輯都散亂在裡面,彼此不相干又獨立,維護起來非常麻煩。

cam = cv2.VideoCaptrue(0)
ret, img = cam.read()

cleaned_data = clean_img(img)
predict(cleaned_data)

sm_img = compress(img)
stream_to_user(img)

img_1 = xxx(img)
task_1(img_1)
img_2 = yyy(img)
task_2(img_2)
img_3 = zzz(img)
task_3(img_3)
img_4 = aaa(img)
task_4(img_4)
.....
task_10(img_10)

如果引入鬆耦合的架構,就好像廣播一樣,由相機模組大聲喊出目前擷取到的影像 binary code,所有想要監聽的人自己聽到後抄下來,分頭去執行自己的任務。這樣相機模組的程式就不需要知道所有監聽的人的細節,只需要專注在自己該做的事情即可。

cam = cv2.VideoCaptrue(0)
ret, img = cam.read()
# 專注在擷取影像後,把影像發布出去即可
publish(img)

關於鬆耦合的開發架構這邊點到為止,簡單做一個小結論,在機器人領域裡因為會使用很多感測器,每個感測器的資料可能有不只一個模組需要,為了開發和維護容易,因此引入鬆耦合的架構。ROS 即是以此為主要特性的框架,解決機器人應用程式開發維護的問題。

什麼是 ROS nodes?

前面提到了鬆耦合架構,我們就更進一步的來了解 ROS 是如何實現的。

ROS 中最基本的單元叫做 node,可以想像成一個模組,他負責的事情很專一,甚至只負責一件事情。

比如說 camera_node 就是負責從相機模組擷取影像後發布。motor_node 監聽其他 node 發布的控制訊號,再與硬體的 PWM 馬達模組溝通控制轉速。又或者是 auto_drive_node,他接收 camera_node 發布的影像後,透過 pyTorch 訓練好的模型來預測自走車要往哪裡前進。

由剛剛舉例可以得知,nodes 彼此間其實會溝通的,他們是用什麼方式溝通的呢?

什麼是 ROS topics?

Topics 就是 ROS 實現鬆耦合的靈魂人物。一個 Topic 可以想像成 slack 的一個 channel 或者是 line 的群組。任何一個人可以在裡面發布訊息,在裡面的其他人也都能接收到一樣的訊息。

十分鐘快速認識 ROS (Robot Operating System)
取自官方文件

因為中間訊息的配發和訂閱是由 ROS 負責,所以發訊息的人 (node) 不用管收訊息的人 (node) 是誰或者是收到了沒,只要將訊息發出即可,如此就能實現鬆耦合的架構。

還有其他沒提到的嗎?

ROS 還有其他的元件,如 service、parameters、以及 actions,這些我覺得可以算是比較擴展的應用。一開始如果能熟悉 nodes 和 topics 就能做出很多有趣的專案。有興趣想要立刻了解的朋友可以前往官方文件閱讀:
Understanding ROS 2 services
Understanding ROS 2 parameters
Understanding ROS 2 actions

接下來我們就會一起學習 如何使用 Docker 跑 ROS2 應用? 以及 如何開發第一個 ROS2 應用。如果覺得我文章內容對你有幫助的話,請在文章後面幫我按 5 個讚!讓我知道大家都喜歡什麼內容哦!

AI 神經網路自走車
上一篇:如何用 Raspberry pi pico 做 I2C Slave? 使用 MicroPython 與 Raspberry pi
下一篇:如何使用 Docker 跑 ROS2 應用?

Written by J
雖然大學唸的是生物,但持著興趣與熱情自學,畢業後轉戰硬體工程師,與宅宅工程師們一起過著沒日沒夜的生活,做著台灣最薄的 intel 筆電,要與 macbook air 比拼。 離開後,憑著一股傻勁與朋友創業,再度轉戰軟體工程師,一手扛起前後端、雙平台 app 開發,過程中雖跌跌撞撞,卻也累計不少經驗。 可惜不是那 1% 的成功人士,於是加入其他成功人士的新創公司,專職開發後端。沒想到卻在採前人坑的過程中,拓寬了眼界,得到了深層的領悟。