ROS系列文整理

由於Robot Operating System(ROS)的中文資源還幾乎不存在(2012年),決定先撒下一點麵包屑,之後有寫出新的也會依序整理到這上面。 我覺得機器人在能源不出現問題之前,是必然崛起的一個領域。機器人的存在可以幫助人類變得更好,被解放的生產力能夠聚焦到更為重要的議題上 – 永續發展,公平正義,世界均富等等,而要在機器人產業做出能推動世界進步的成果,我認為ROS是一個很重要的工具。 現在(2015年)已經多了不少中文資源,大家可以參考ROS網站中文版。另外,最近同實驗室的同學黃昭霖也開始寫一些他自己的筆記、還有一位朋友最近也開始寫ROS on Jetson的學習筆記(覺得台灣還是很有希望!)。如果你需要問問題,去ROS Answers絕對是不二選擇(因為有很多ROS的開發者會到上面回答問題),或者可以去這個中文社群或另一個中文社群逛逛。 對學習ROS有興趣的朋友來說,能有多一些資源參考總是好的。希望之後有心做ROS的人學習愉快: D ———————————————– ROS tutorials系列 (Beginner Level) 我的tutorial不詳細go through整個tutorial原文,而是就我認為重要之處詳加說明,而且有些東西原文寫得很清楚就不必重複寫了。換句話說,我仍預期你看下面這系列文章時要搭配原文看,才會比較完整。 0. 什麼是ROS?要怎麼使用ROS? (玩ROS前必看!我盡量寫得淺顯,不是工程師應該也看得懂XD) 1. 淺談ROS file system 2. 新增ROS package 3. 建立ROS packages 4. 了解ROS Node 5. 了解ROS Topics 6. 了解ROS Service跟Parameters 7. 使用rqt_console跟roslaunch 8. 使用rosed來編輯檔案 9. 建立自己的msg檔或srv檔 10.撰寫一個publisher跟subscriber(上手ROS Topic) 11.撰寫一個service跟client(上手ROS Service) 12.使用rosbag記錄和播放資料 13.使用roswtf來幫忙debug 14.探索ROS wiki 15.下一步是什麼? ———————————————– ROS觀念文… Read More ROS系列文整理

Qualcomm也在做機器人!

最近因緣際會,看到相關的訊息,發現Qualcomm已經做出支援ROS的開發板了,核心的處理器是Qualcomm® Snapdragon™ 600處理器(採用ARM指令集架構),支援的開發板包含Inforce 6xxx系列的SBC(Single-Board Computer),例如:Inforce Computing 6410™ Single Board Computer 跟 Inforce Computing 6410 Plus™ Single Board Computer。 先列出一些我自己好奇的問題: Qualcomm為什麼要做這件事? ROS怎麼運行的?是不是有porting? 怎麼寫出可以在Qualcomm SBC上面執行的ROS程式? Snapdragon™ 600處理器的硬體規格大概是什麼等級?能負荷多少運算量? 接下來是我理出的答案: 1.眾所皆知,Qualcomm是做通訊晶片的IC設計大廠,依賴著智慧型手機市場的大幅增加,Qualcomm的晶片也賣得嚇嚇叫(畢竟手機都需要好的通訊功能啊,尤其是多媒體傳輸需求不斷增加),不過問題是,如果智慧型手機成長停滯了、其他IC設計廠追上來了該怎麼辦? 如果Qualcomm沒有收一收不做了的打算,那就得再尋找下一個會大量用到他們設計的IC的產品,而機器人是其中一個選項。 2.Qualcomm跟OSRF合作,把比較重要的package(450個以上)移植到ARM指令集架構的硬體上(其實就是運行在Ubuntu for ARM的環境之下,可以參考ROS wiki上的UbuntuArm頁面),所以他們確實有做porting,但是我找不到他們的程式碼,不知道他們是怎麼實作的。 3.安裝方面可以參考IFC 6410的guide。而在寫程式方面,因為Qualcomm跟OSRF已經做了porting,所以使用者在撰寫程式的時候並不會跟寫PC上運行的ROS程式有任何差別,看起來在編譯的時候會有些許差別,但資料實在還太少,不太知道詳細步驟,我想2016年應該就會釋出開發套件讓大家玩了。 4.根據這個網頁,如果是用IFC 6410的SBC,都有1.7 GHz Quad Core Qualcomm® Krait™ CPU的運算能力,還可以執行gmapping讓我覺得滿驚訝的,也許在不久的將來真的可以用小型開發板來當作機器人的運算中樞,然後VSLAM、Object Recognition等feature都能讓不同的IC來處理。

跟藝術的初次真實相遇

今天到Asian Art Museum真的是很幸運,原本已經打算要離開,但突然被一個義工搭訕問說要不要聽當代藝術展的導覽(順便打個廣告,他說以前只有展傳統藝術,但博物館近幾年一直在購入當代作品,所以很新),想想時間也還夠,那就擁抱這個機會吧~結果一開始就幫助我稍微了解一個很重要的入門問題–到底要怎麼看當代藝術? 他提到,當代藝術跟傳統藝術的一個大差異在於,當代藝術家常常是帶著強烈的意圖(intention)在進行創作,而且很喜歡融入自己的生命經驗,所以作品中會有很多線索來呈現藝術家想要表達的事情。就拿下面這張Third Time to Yellow Mountain來說,在聽導覽前的我眼中是完全看不出個所以然的XD 但是懷抱著揣測藝術家動機的心情來看的話,就會從題目和表現形式中得到更多線索,例如為什麼他要將畫作命名為第三次到黃山? 將重點放在”三”的話,就讓我聯想到古人說的:”見山是山,見山不是山,見山又是山”。之所以要命名為第三次到黃山,也許是想表達見山又是山的境界,才進而創作出這幅畫。(但也許他根本沒想到這句話,根本我腦補XDD) 對我來說,我覺得第二次觀看之所以會見山不是山是源於對細節的迷戀,使得觀者不只有對山這個抽象層級的認知,而是更注意山裡面的細節,但是,隨著再一次的觀看,這些細節又重新構成了一座山。這也是為什麼這位藝術家可以用抽象的形式來表現黃山吧,因為對細節的通透理解使得他可以把每個細節的主要觀念抽象出來表示。 這種有趣的詮釋方式居然在這次的相會中巧妙地被激發出來,真的是很難預料。至於怎麼去欣賞這些色塊和結構等等,那就是另外一回事了哈哈= = 另外,我們後來也討論到craft跟art的差異,現場有一位女士提到一個觀點:”Art invites you to contemplate, to view, and to think about it. Craft, on the other hand, does not invite you to interact with it.”,這兩者之間的界線可以很清晰,也可以很模糊,跟製作者的動機有相當大的關係。

ROS tutorials 系列(11) – Writing a Simple Service and Client

原文: (因為C++版本跟Python版本的內容差不多,還有Examine那篇也只有幾個指令,所以乾脆一併寫,不過我主要只會就C++那篇的內容來說明,因為其他東西大同小異) http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28c%2B%2B%29 http://wiki.ros.org/ROS/Tutorials/WritingServiceClient%28python%29 http://wiki.ros.org/ROS/Tutorials/ExaminingServiceClient 延續上一篇的教學,這一篇也cover到程式撰寫的部分,不過這次是使用ROS Service相關的API, ———————————————————————————— 1.1 Writing a Service Node 這邊要撰寫的service滿簡單的,他負責作的事情就是,當收到client傳來的兩個數字時,計算這兩個數字相加後的結果,再回傳給client。所以這邊要實現的功能就是讓Service Node可以接收到client傳來的訊息,呼叫一個callback function,在這個callback function裡面把兩個數字相加,然後再回傳給client。 接下來我們就看看怎麼用程式實作這件事情。 首先init跟NodeHandle的部分都跟上一篇的初始化過程相同,比較不同的地方在於,這邊利用NodeHandle產生了一個ServiceServer的物件,這個物件負責的就是提供一個叫做”add_two_ints”的service,並且指定callback function是add(…),這邊要注意的是,在add(…)裡面我們並沒有看到明顯地傳回response(就是res變數)的程式碼,這是因為ROS API實作上幫忙處理掉這件事情,所以我們要做的就只是指定res應該是什麼,不需要多寫一行把res傳出去。 1.2 Writing a Client Node 上一節已經講完Service Node要做的事情,那Client Node要做的事情應該就滿清楚的了。 這邊比較不容易了解的地方大概就是”beginner_tutorials::AddTwoInts srv;”,大家可以把這個物件想成兩個node在實際進行service傳輸時的訊息物件,所以也才會有下面兩行assign req的內容的程式碼,因為指定好request是client的責任。 最後實際執行的部分就由client.call(srv)來做,這邊鼓勵大家去改一下Server的部分,試著亂填res,看看client會發出什麼訊息,有這種自己動手玩的體驗比較容易弄懂整個系統的運作原理。 1.3 Building your nodes 這一小節的編譯大家應該都滿熟悉了,就不額外說明啦。 Again,第三篇(Examine那篇)的原文有cover到怎麼執行剛剛編譯完成的執行檔,大家執行起來應該沒什麼問題。相信在看完這兩篇並動手操作過後,大家都怎麼使用ROS的API有初步的概念了,其實大多數ROS package中使用ROS的部分都不難,難的還是在於裡面的演算法,等你有機會去摸到一些程式碼,你就會了解我的意思了。

ROS tutorials 系列(15) – Where Next?

原文: http://wiki.ros.org/ROS/Tutorials/WhereNext 這一篇是官方教學文件中,beginner level裡的最後一篇,很高興可以把這些文章都提供一些我自己的學習經驗跟comment,希望這些文章可以幫助更多人入門,然後如果你有興趣,也可以去看看intermediate level的文章(雖然這些文章對於基本功能的使用者應該暫時不會有太大的幫助)。 ———————————————————————————— 1.1 Launching a Simulator 模擬器是一個很好玩的東西,因為你只要有電腦,就可以模擬自己的一隻機器人,這大幅地降低了學習的成本,此外,就算你有機器人,用模擬器先測試演算法也可以避免損壞硬體,好處多多。 甚至,如果你想做自己的機器人,如果能先模擬機器人的行為,先確保機構設計等等的沒有問題,再進行加工跟組裝,絕對會比作出來才發現硬體設計不良還要節省成本。 1.3 Understanding TF 這一小節的敘述滿中肯的,如果你要做自己的機器人,那你一定要了解tf跟urdf(只要建立好urdf,就可以用robot_state_publisher自動發佈機器人的tf tree)。 1.4 Going Deeper 看到這邊,相信你已經有能力使用ROS來進行一些更深入的學習了,我滿推薦這個問題中Devon Ash的回答,如果有機會推薦可以看看。

ROS tutorials 系列(14) – Navigating the ROS wiki

原文: http://wiki.ros.org/ROS/Tutorials/NavigatingTheWiki 這篇教學雖然跟寫程式和使用ROS沒有直接關係,但裡面清楚說明了ROS wiki的編排方式,有一些東西是平常我們直接用Google搜尋會忽略的頁面,如果你能夠了解wiki,有時候會比較容易找到自己需要的資料。 ———————————————————————————— 2. Basics 這邊都只是簡單的敘述,就不說明了,我自己曾經覺得wiki好用的經驗是,如果你需要了解某個package的API,那你只需要到某個package頁面的側邊攔,尋找Code API的link就可以找到,這樣找常常比直接用google搜尋還方便。 不過現在有些新的package的文件都在github上面了,所以還是要兩者搭配一起看比較好。 3. Advanced 比較有趣的是第三小節,這一小節很簡略地說明了要怎麼開啟一個新的ROS wiki。 不過如果你真的需要建立自己的wiki page,可能還是先參考怎麼release一個package跟這一篇教學會比較好。

ROS tutorials 系列(13) – Getting started with roswtf

原文: http://wiki.ros.org/ROS/Tutorials/Getting%20started%20with%20roswtf roswtf是一個可以幫忙debug的工具,如果你發現自己的系統有問題,但你又沒有概念要怎麼debug,那就可以利用roswtf看能不能多獲得一些可以幫助debug的線索。 ———————————————————————————— 1.1 Checking your installation & 1.3 Errors 在這兩小節中,可以看出roswtf可以幫助檢查安裝跟路徑設定等等的有沒有大問題,如果你的環境設定有些異常,就可以用它來看看問題出在哪。 1.2 Trying it online roswtf也可以在系統運行時啟動,所以對於在runtime的情況下debug也會有幫助,不過要注意的是,這個工具畢竟不是萬能的,最好把它當成一個debug線索來源(或有時候它提供的資訊也未必有用),不要把它當作解藥可能會是比較好的做法。

ROS tutorials 系列(10) – Writing a Simple Publisher and Subscriber

原文: (因為C++版本跟Python版本的內容差不多,還有Examine那篇也只有幾個指令,所以乾脆一併寫,不過我主要只會就C++那篇的內容來說明,因為其他東西大同小異) http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28python%29 http://wiki.ros.org/ROS/Tutorials/ExaminingPublisherSubscriber 這一篇教學總算cover到比較需要寫程式的部分,主要就是教大家怎麼寫兩個node,並透過topic傳輸。接下來就來看看這個程式要怎麼寫。 ———————————————————————————— 1.1 Writing the Publisher Node 這邊提到的publisher就是負責把資料丟到topic的那個node。這一小節的重點實際上是在1.1.2小節的詳細解釋裡面,我就比較重要的地方增加一點說明。 基本上,include “ros/ros.h”這一步就是讓你的程式可以成為ROS Node的一個起點,因為要成為ROS Node,你的程式就必須呼叫ROS提供的API,所以你必須先include ros.h,才能開始使用ROS的API。 接下來的問題就是,怎麼使用ROS的API? 原本的tutorial裡面已經講得滿清楚了,其實就是用ros::init()跟ros::NodeHandle來初始化你的node,然後你就可以用NodeHandle初始化publisher的物件,之後再呼叫publisher物件的publish()就可以把資料丟出去了。 看到後面大家可能會有個疑惑,就是不知道為什麼要注意發佈的頻率? 我自己的經驗是,如果publisher跟subscriber指定的頻率不一致,就會漏收很多資料,導致機器人的行為怪怪的(這個bug曾經卡了我一天,因為怎麼看都覺得程式碼沒問題,但機器人都不會按照我要的路徑行走,後來才發現送trajectory跟收trajectory的node頻率不一致) 1.2 Writing the Subscriber Node 這一小節應該比較好理解,程式主要要做的事情就是讓subscriber收到資料之後,呼叫callback function把收到的資料印出來,之所以要這樣設計也很單純,因為你在寫程式的時候根本不可能知道什麼時候會收到資料,所以你當然也就不可能先在main裡面指定好什麼時候要收資料。 Again,1.2.2才是重點,這邊比較要注意的是ros::spin()這個函式,如果你的listener程式裡面沒有這一行,那你一執行listener,程式就會立刻跑完,因為程式該執行的東西都已經執行完了。為了避免這件事情,就需要ros::spin(),他在做的事情有點像是while(ros::ok()),但還是讓你的callback function可以被呼叫。 1.3 Building your nodes 這一小節只是在教大家怎麼進行編譯的步驟,應該就不太需要再多說明了。 最後,第三篇的原文有cover到怎麼執行剛剛編譯完成的執行檔,我想這個應該就不需要再多加註解了。