如何讓機器人走到指定的地點?這可真是個大哉問。首先我們必須了解我們人類與機器人在看待這個世界上,所存在之本質上的差異。
機器人是活在絕對(absolute)的世界裡,事事要求精準。但我們人類卻是以相對(relative)的概念來與周遭環境互動。舉例來說,當要走出房間時,我們不需要知道與房門的實際距離是多少公分或公尺,更不需要知道與房門的方位角是幾度,一切都只要有個概略就可以了。機器人就不行了,由於機器人行進的距離是由輪胎直徑與馬達編碼器來決定,因此機器人需要處在一個相對單純的環境中才能正常運作。如果地表材質改變(例如從柏油路移動到爛泥巴地)使得摩擦係數改變,那機器人的行進效果一定會和原本的設定不一樣。
有的朋友可能會建議「幫機器人裝個攝影機當作眼睛不就好了嗎?」可惜的是,機器視覺領域尚在發展階段,機器人所收到的攝影機影像實際上是一張張的圖片,要讓機器人從二維圖片中發展「深度」與「空間」的概念,非常地不容易。再者,要能從影像中辨識物體是透過計算畫面中特定形狀或顏色的像素集合來達成的。例如追蹤紅球時,如果畫面左側中紅色像素比例較高,代表紅球位於攝影機的左前方,機器人需左轉修正。另一方面如果紅色像素占整體畫面比例提高,代表紅球與機器人的距離縮短了,反之則代表紅球愈來愈遠了,快點前進找球吧!以下為一個讓機器人隨著紅色物體左右搖擺的影片(使用MindSensors公司的NXT-cam攝影機)。
影片:
有興趣的讀者可參考筆者另一篇MAKER專文<淺談智慧型手持裝置結合機器人的應用?Android + 樂高NXT>
在開始移動之前,機器人必須先了解「我在那裡(起點)?」接著延伸到「我要去的目標在那裡(終點)?」其中又包含了「目標有多遠(距離)?」、「目標在我的那一個方向(方位角)?」以及「如何移動(路徑規劃)?」測量距離可使用簡易的超音波感測器即可達到一定的效果,或著您可改用高精度的雷射測距儀(Laser range finder)即可取得更精確的距離量測結果。讓機器人了解當下所面對的方向需使用指南針感測器(compass sensor),但現在的智慧型手機都有三軸的姿態感測器(compass sensor),這時候只要將姿態感測器值平放於機器人頂端就可將姿態感測器Z軸軸向變化做為機器人指向參考。
最後也是本專案的關鍵,兩點之間最近距離是直線沒錯,但這條直線路徑事實上不存在。我們必須考慮到現實環境,所以機器人真實的移動路徑必然是曲曲折折(請您試著出門直直走不轉彎,看看多久會撞到牆)。Google Map可說是目前最強大的地圖資訊,有強大的導航與街景功能(現在連亞馬遜河雨林都有「街景」囉…)。透過Google Map 所規劃的路線,機器人就能了解要到達目標點所需經過的折點以及相關距離與轉角資訊。如果能讓機器人跟著Google Map所規劃出來的路線行走的話,那麼機器人應該會更聰明也更能貼近我們的需求才對。
綜合以上的想法,筆者決定寫一個Android程式來整合Google Map與機器人控制,讓機器人可以接收手機所計算完成的距離與方位角並順利沿著Google Map規劃路線移動。我們將這個程式命名為NXT Navigation,圖1為程式主畫面。
以上就是本專案的初始想法,接著讓我們來看看整體的思考流程:
1.取得Android裝置當下座標設為起點,或在Google Map中自行選定起點。
2.在Google Map中選定終點。
3.將起點與終點座標送出給Google Map進行路徑規劃。收到路徑之後取得各折點座標,並計算各折點之間的距離與方位。
4.與機器人連線,同時將距離與方位轉換為樂高機器人馬達轉動圈數。出發!
技術限制
1.手持式裝置GPS晶片定位精度並不高,約在30至50m左右(對!您沒有看錯)。換言之,您的Android裝置在十字路口兩端所取得的座標基本上沒有太大的差異。
2.不同經緯度地區中,座標計算方式也不同。本專案機器人只放在台灣台北市的街道中,且機器人行進範圍和其他交通工具相較之下非常小,因此不考慮經緯度差異。本專案中使用了Android中Location類別中的bearingTo()以及distanceTo()等指令來計算機器人應轉動角度以及移動距離。
3.假設地表材質不改變,摩擦係數變化不大,因此不考慮機器人打滑問題。本專案機器人第一版使用輪胎(直徑5.6公分),但效果不佳所以改為履帶。請看下三圖為機器人機構設計改進過程:
圖9 改用履帶後,抓地力顯著提升
4.之所以使用樂高機器人是因為可透過NXT Direct Command來直接控制機器人動作,樂高機器人支援NXT Direct Command這套特殊的資料傳輸格式,機器人只要接收到正確的格式就能執行對應的動作,例如讀取主機/感測器資訊、控制馬達或強制關閉電源等等。換句話說我們可以不用編寫機器人端程式就能控制機器人!有時候您甚至得為此多學一套程式語言,NXT Direct Command真的為您省下不少功夫。
5.在程式中使用Google Map API需自行申請Key並匯入您的Android專案,詳細申請辦法請參閱本文末相關連結之<如何取得Maps API Key >。
設備需求
相關連結
Android開發者網站,需由此下載Android SDK
如何取得Maps API Key
http://code.google.com/intl/zh-TW/android/add-ons/google-apis/mapkey.html
如何計算兩個GPS座標點之間距離
http://4rdp.blogspot.com/2008/05/gps.html (研發養成所)
http://4rdp.blogspot.com/2011/09/great-circle-sailing.html (研發養成所)
http://www.movable-type.co.uk/scripts/latlong.html
LEGO® MIDSTORMS 官方網站之NXT Direct Command文件
請下載藍牙開發套件(Bluetooth Developer Kit),解壓縮後的「Appendix 2-LEGO MINDSTORMS NXT Direct commands.pdf」。
http://mindstorms.lego.com/en-us/support/files/default.aspx
影片
索取
如需本專案原始碼,請寫信至service@cavedu.com索取。
本文章刊登於《ROBOCON》國際中文版01。更多出版資訊請上《ROBOCON》國際中文版01