內(nèi)容整理自網(wǎng)絡(luò),編輯:付斌
前言
很多朋友私信問我對機器人和人工智能感興趣,該怎么展開學(xué)習(xí)。最近稍微有點空,我寫寫我的看法。
機器人學(xué)的核心問題是做好和物理世界的交互?,F(xiàn)在主流的機器人學(xué)分支里,處理與物理世界的交互的學(xué)科分為三類:傳感器和處理算法(激光雷達,多目視覺,融合算法);多剛體系統(tǒng)動力學(xué)控制(工業(yè)機器人動力學(xué)控制和接觸力控制);機器人自主移動(locomotion不知道該怎么翻譯,輪式、足式、飛行等移動機器人的研究)。我建議對機器人學(xué)有興趣的同學(xué)著重在這幾個問題上面。
另外,根據(jù)世界第一的機器人教育機構(gòu)卡耐基梅隆大學(xué)的機器人學(xué)博士的課程分類方式(http://www.ri.cmu.edu/education/COSAug2016.pdf),機器人學(xué)有四個核心領(lǐng)域:
感知。視覺傳感器、圖像傳感器、觸覺和力傳感器、慣導(dǎo)等。
認知。人工智能、知識表達、規(guī)劃、任務(wù)調(diào)度、機器學(xué)習(xí)等。
行為。運動學(xué)、動力學(xué)、控制、manipulation和locomotion等。
數(shù)學(xué)基礎(chǔ)。最優(yōu)估計、微分幾何、計算幾何、運籌學(xué)等。
結(jié)合卡耐基梅隆大學(xué)的核心課程要求,我覺得我定義的機器人學(xué)核心問題算是基本沒跑偏的。本文后面談到的機器人項目都是以上述觀點和課程要求為基礎(chǔ)。
一些可能有爭議性的觀點:
機器人學(xué)是富人的活動。雖然工業(yè)越來越發(fā)達,但好的開發(fā)板和電機還是非常貴。如果要下定決心學(xué)習(xí)機器人學(xué)并且做出實物,你必須找到做實物出來的資金。要么是自己花錢,要么就得找學(xué)校的機器人社團,或者找什么愿意資助年輕人學(xué)習(xí)的貴人。另外現(xiàn)在沒有任何一本完整的書可以教你怎么造一個四旋翼空中機器人或者大狗機器人,你需要參考十幾本不同的教科書,這些書不管中文版還是英文版都很貴。
機器人學(xué)是屠龍之術(shù)。這話是Ninebot創(chuàng)始人說的。雖然最近幾年,平衡車、掃地機器人、多旋翼飛行器讓機器人學(xué)開始進入人們的生活,但是可行的商業(yè)應(yīng)用還是很少,而且已有的機器人和理論都還很難解決好與物理世界交互這件事情。所以一定要確保自己在機器人學(xué)這個道路上同時練好了能去其他行當吃飯的技能,比如編程、機械設(shè)計和硬件設(shè)計。也要做好心理準備,接受自己有可能在學(xué)會屠龍之術(shù)以后幾年都造不出對社會有用的東西的事實。
基于上述所說的觀點,如果是已經(jīng)工作之后才想要學(xué)習(xí)機器人的話,可能已經(jīng)太遲了,因為很可能興趣戰(zhàn)勝不了客觀限制因素。如果作為興趣去學(xué)習(xí),只能學(xué)到做巡線小車和舵機機械臂什么的,可能也滿足不了中二病的創(chuàng)造欲。
個人認為機器人學(xué)是一個艱苦的道路,想要成為一個獨擋一面的機器人工程師需要多年理論和實踐的同步訓(xùn)練。理論學(xué)習(xí)和動手實踐的過程還要互相排好時間表,在做某個實踐項目的同時去學(xué)習(xí)最相關(guān)理論往往可以達到事半功倍的效果,但是同時那些不太相關(guān)的理論會看起來非常枯燥,因此如何妥善安排自己的實踐項目也是很重要的事情。
這篇文章里我計劃介紹一個電子工程、機械工程和計算機專業(yè)學(xué)生從大學(xué)一年級到研究生二年級的機器人學(xué)習(xí)計劃,基本是我對自己過去學(xué)習(xí)方式的一個總結(jié)。按照這個方法來學(xué)習(xí),能夠成為一個能力全面,但是稍微偏軟件一點的機器人工程師。這個六年的學(xué)習(xí)計劃,估算下來,全年中每天在上課和完成課程要求之外要投入學(xué)習(xí)時間6-8個小時,這些時間一方面用于閱讀課程知識的英文教材,一方面用于閱讀其他學(xué)科的教材,一方面用于實踐項目。
機器人工程師在大型項目里的定位類似于飛機系統(tǒng)里的總體設(shè)計師。和機械工程師、硬件工程師、軟件工程師、算法工程師、控制工程師比起來,機器人工程師參與某個具體技術(shù)的時間較少,但是能夠聽得懂所有工程師說的話,能夠作為不同模塊間的協(xié)調(diào)人,帶領(lǐng)整個團隊去攻堅。當然如果機器人工程師能夠在一個領(lǐng)域達到那個領(lǐng)域的工程師的優(yōu)秀水平,肯定更好。
由于時間倉促,再加上個人水平有限,文章中如有紕漏和錯誤,恭請讀者指出,謝謝。如果同學(xué)還有什么想知道的內(nèi)容和教材,也歡迎留言交流。
大一
剛上大一,你的機器人生涯開始了。先看看學(xué)校的校園網(wǎng)能不能翻墻,不能的話自己去買個一年一百多塊錢的VPN,先確保自己能上Google,不要心疼VPN的錢,這能讓你在之后的職業(yè)生涯里節(jié)省上萬塊錢。然后去注冊一個gmail賬號,再注冊stackoverflow賬號,再注冊github的賬號,再注冊CSDN賬號,注冊完登錄上去逛逛,暫時先不要問為什么。
英語水平一定程度上會是機器人工程師水平的限制因素,英語是同學(xué)們在大學(xué)最該努力學(xué)的一門課,而且不止要把它當成課,要當成一種技能,當成生活的一部分。當你開始努力學(xué)習(xí)一些高級的機器人知識以后,有可能會非常難以找到中文的參考資料,這個時候如果啃不下英文的資料,進步速度和眼界就會受到很大影響。因此大一的時候要多看看紅寶書,看看美劇。
不管是什么專業(yè)背景的同學(xué),大學(xué)一年級一定要上好的課是微積分和線性代數(shù)。線性代數(shù)的重要性需要特別強調(diào)。一般來說,優(yōu)秀的工程師和科學(xué)家在職業(yè)生涯中要學(xué)至少五次線性代數(shù),大一學(xué)一遍、學(xué)凸優(yōu)化的時候?qū)W一遍、學(xué)線性系統(tǒng)的時候?qū)W一遍、學(xué)機器學(xué)習(xí)的時候?qū)W一遍……如果在第一遍學(xué)的時候就看到對的書,刷到對的題,那么以后的學(xué)習(xí)會輕松很多。
網(wǎng)上有很多對于如何學(xué)好線性代數(shù)的討論,比如知乎問題如何理解線性代數(shù)? - 數(shù)學(xué)學(xué)習(xí)。Matrix67大神的文章隨記:我們需要怎樣的數(shù)學(xué)教育?也很有啟發(fā)。我個人對學(xué)習(xí)線性代數(shù)的建議是兩本書,一本叫做《Linear Algebra Done Right》,另一本叫做《Linear Algebra Done Wrong》(https://www.math.brown.edu/~treil/papers/LADW/book.pdf),我比較喜歡的是Done Wrong這本書,第一它是免費的,第二只需要讀前6章兩百頁就夠了,第三它頁邊距很大,打印出來有很多空白做練習(xí)題。另外一個較好的教材是麻省理工公開課:線性代數(shù)。不論如何,學(xué)線性代數(shù)一定要用國外的教材,千萬不要用國內(nèi)的教材。啃英文書很累,但是考慮到之后還要啃更多的英文書,線性代數(shù)已經(jīng)算是很入門的了,一定要啃下來,同時還要刷足夠多的課后題。
學(xué)完線性代數(shù)以后,一個自然而然的問題就是怎么能用計算機自己去計算矩陣的乘法、向量的乘法、向量的內(nèi)積。因此引入了編程的學(xué)習(xí)。
不管同學(xué)的專業(yè)是什么,一定要在大學(xué)一年級盡早開始學(xué)編程。至于用哪種語言開始學(xué)習(xí)編程,我推薦Python,比較好的教材是麻省理工學(xué)院公開課:計算機科學(xué)及編程導(dǎo)論,比較好的Python開發(fā)學(xué)習(xí)環(huán)境是Anacoda (http://www.continuum.io/downloads)。熟悉Python以后,同學(xué)就可以開始玩玩Python的數(shù)值計算包Numpy,這個時候線性代數(shù)題基本上也刷的差不多,可以通過Numpy幫助自己解決線性代數(shù)問題了。
對任何人來說,Python是一把瑞士軍刀,你可以用他干很多東西,比如自動回復(fù)郵件、自動收集信息。但是真要去造機器人,合適的工具并不是瑞士軍刀,而是C/C++這樣簡單粗暴的錘子和螺絲刀般的工具。在學(xué)習(xí)Python學(xué)到一定程度的時候(比如你聽說有一種叫做cython的東西),最好開始學(xué)習(xí)C,而且要強迫自己練習(xí)用C的一維數(shù)組和指針來實現(xiàn)矩陣的加法、乘法、求逆等操作。之所以有高級的Python或者Java(不要問我Java哪里高級了)這些語言以后我們還需要去學(xué)C,是因為機器人上常用的不是完整的電腦,而是計算量有局限的嵌入式系統(tǒng),嵌入式系統(tǒng)開發(fā)基本只能用C或者更低級的語言。
學(xué)習(xí)C我個人入門用的是清華大學(xué)出版的《C++語言程序設(shè)計》。雖然這個書標題是C++,但其實沒什么太大問題。不過國內(nèi)的C語言教材都有個巨大的問題是不引導(dǎo)學(xué)生去用Linux。近年來更好的一個教材是http://songjinshan.com/akabook/zh/index.html,這個網(wǎng)站的教材非常好,因為他教育學(xué)生用Linux環(huán)境作為程序編譯的環(huán)境,而且還引入了一些計算機體系結(jié)構(gòu)的介紹。
IT行業(yè)的程序員都會爭論高級語言和低級語言哪個好,Linux和Windows哪個好,而對于機器人工程師來說,從現(xiàn)在到可預(yù)見的未來里,C是最好的語言,Linux是最好的操作系統(tǒng),這都毋庸置疑。甚至對于Linux的發(fā)行版該選哪個,我們都是很少有質(zhì)疑的:Ubuntu(The leading OS for PC, tablet, phone and cloud)。原因是機器人操作系統(tǒng)ROS(ROS.org | Powering the world’s robots)是基于Ubuntu開發(fā)的,因此在Ubuntu上運行最穩(wěn)定。注意Ubuntu出了一個中文版叫做Kylin,個人感覺比較坑,建議大家不要裝中文版。Ubuntu 作為一個開源操作系統(tǒng),總是在快速迭代,2016年8月比較穩(wěn)定的版本是14.04和16.04,建議同學(xué)安裝14.04。
當你把C學(xué)得差不多,開始要學(xué)寫包含多個頭文件的程序時,一定要同時學(xué)習(xí)makefile的知識。這時候要上網(wǎng)去搜“Makefile詳解”(Makefile詳解(超級好)_mingw吧)這篇文章看。
我自己在大學(xué)一年級的時候還學(xué)習(xí)了HTML和Javascript,到大一結(jié)束的時候已經(jīng)能夠熟練用Javascript手寫一些動態(tài)頁面。我個人覺得HTML和Javascript也是機器人工程師必備的技術(shù),而不只是軟件工程師的玩具。這是因為web技術(shù)實際上已經(jīng)滲透到了編程的方方面面,比如json開始是Javascript里的一種object定義的方式,但現(xiàn)在已經(jīng)成為了一種很標準的數(shù)據(jù)交互、參數(shù)配置的格式。另外AJAX能夠幫助初學(xué)者理解一定的網(wǎng)絡(luò)技術(shù)原理,而網(wǎng)絡(luò)技術(shù)也是機器人工程師必備的技能。再者,制作GUI(圖形用戶界面)是常規(guī)debug的辦法,而近年來一個流行的趨勢是用webkit嵌入程序用HTML和Javascript作為圖形界面的后端,而在機器人操作系統(tǒng)ROS(ROS.org | Powering the world’s robots)里,通過rosbridge可以非常方便地把機器人程序的數(shù)據(jù)傳遞到websocket上,這句話看不懂沒關(guān)系,反正你知道學(xué)學(xué)HTML和Javascript很重要就是了。更重要的是,HTML文檔背后的DOM (Document Object Model)深刻地體現(xiàn)了面向?qū)ο蟮乃枷?。大學(xué)中的面向?qū)ο蟪绦蛟O(shè)計一般都講C++,在我看來應(yīng)該講HTML和Javascript。這一點不細說了,如果同學(xué)們?nèi)W(xué)習(xí)HTML和Javascript,自然會體會到。學(xué)習(xí)HTML和Javascript比較好的資料是http://www.w3schools.com/,把網(wǎng)站左側(cè)的“Learn HTML”、“Learn CSS”、“Learn Javascript”和“Learn JQuery”學(xué)完就行,別的部分還有很多花哨的技術(shù),沒有必要去學(xué)了。為了培養(yǎng)自己對Javascript的興趣,可以上three.js / examples跪著看看熱鬧。
以上介紹的這些知識點、書和資料應(yīng)該在大一期間就全部看完,然后利用大一的暑假好好鞏固這些知識。比如開始用HTML和Javascript做一個自己的個人主頁,刷一刷編程的題目,學(xué)用Python的奇技淫巧(比方說做一個自己的個人主頁)。另外還可以抽時間學(xué)學(xué)數(shù)學(xué)知識,比如開始看看代數(shù)和離散數(shù)學(xué)。我大一的時候看到了兩篇文章,認識到了數(shù)學(xué)的重要性,一個是MIT的CV大牛林達華寫的[轉(zhuǎn)]MIT牛人解說數(shù)學(xué)體系,另一個是前Goolge研究員吳軍博士寫的《數(shù)學(xué)之美》(數(shù)學(xué)之美 (豆瓣))。當時林達華還在MIT讀博士,而《數(shù)學(xué)之美》還沒有成書。兩篇文章看完以后我感覺自己整個人對數(shù)學(xué)的認識上了一個新的層次,此后一直在注意提高自己的數(shù)學(xué)水平,幾年下來覺得收益很大。在之后的介紹里我還會多次強調(diào)需要學(xué)的數(shù)學(xué)知識和對應(yīng)的教材。
大二
上大二的時候,你已經(jīng)會了基本的編程知識和基本的數(shù)學(xué)知識。大二這一年應(yīng)該投入在嵌入式系統(tǒng)的學(xué)習(xí)中,同時繼續(xù)拓展自己多方面的能力。學(xué)校的機器人社團,比如做Robocon,RoboMasters的團隊應(yīng)該在招新了,趕快去加入,有了學(xué)長學(xué)姐的指導(dǎo)以及同輩朋友的鞭策,應(yīng)該會進步的快一點。
大二應(yīng)該掌握的技能:Solidworks畫基本的機械圖,基本的數(shù)字電路知識、數(shù)模轉(zhuǎn)換,51單片機、AVR單片機、STM32單片機原理,UART、SPI、I2C、CAN等協(xié)議的原理和數(shù)據(jù)收發(fā),STM32開發(fā)板的使用,電機轉(zhuǎn)動和驅(qū)動的原理,PID的原理,調(diào)試四輪機器人底盤的移動,基本的傳感器如陀螺儀、碼盤、紅外線、超聲波的原理和讀取方式,網(wǎng)絡(luò)知識如配置IP配置路由器等,微電子焊接,金工技術(shù)。我在知乎回答如果程序員每天都淺嘗輒止地學(xué)一些不同的新技術(shù),長久以往,人會變成什么樣子呢? - YY碩的回答里談過機器人工程師需要的技能數(shù)量是IT行業(yè)全棧工程師技能數(shù)量的三倍以上,這些技能的基礎(chǔ)都應(yīng)該在大二開始積累。
如果同學(xué)們的專業(yè)是機械工程相關(guān),那么大二的時候要深入學(xué)習(xí)solidworks做圖,買機械加工手冊學(xué)習(xí)各種機械的奇技淫巧。你的專業(yè)知識還不足以讓你進行縝密的受力分析,不過你可以盡量多做一些機械結(jié)構(gòu)出來感受它們的樂趣。
如果同學(xué)們的專業(yè)是硬件、電路相關(guān),那么大二的時候要深入學(xué)習(xí)Altium Designer做圖、制板、焊板。你要從現(xiàn)在開始,就給自己積累一個工作記錄,可以就是簡單的txt文件,記錄你做過所有板子的bug、解決方案、學(xué)到的原理圖、PCB layout的注意事項等等。積累很多年以后,你的這個工作記錄會值很多錢。
學(xué)習(xí)這些技能的最好的方式,就是參加自己學(xué)校機器人社團的訓(xùn)練和方案設(shè)計。一般來說,學(xué)校的機器人社團招新之后會有訓(xùn)練和測試,讓新人分組去做機器人,這個過程中如果愿意努力學(xué),提高得會很快。如果你所在的大學(xué)是機器人比賽強校,比如西安交通大學(xué),電子科技大學(xué),哈爾濱工業(yè)大學(xué),華中科技大學(xué),東北大學(xué)等等(排名不分先后,沒有提到你們學(xué)校名字的話我表示抱歉),那么你很幸運,你們學(xué)校的機器人社團有很好的積淀,有很多資源可以幫助你學(xué)習(xí)。基本上只要天天泡實驗室,保證自己每天只睡6-7個小時(但還是要多去跑步、游泳保持身體健康),勤于向?qū)W長學(xué)姐請教,那么一定會提高得很快。
大二階段特別要強調(diào)的是對動手能力的培養(yǎng),包括機械材料的加工、電路焊接、制作導(dǎo)線和接頭、連接路由器、配置網(wǎng)絡(luò)、做網(wǎng)線等等。機械加工的工具有螺絲刀、鋸、鉆、錘子、車床、銑床、鉆床,進階選手可以學(xué)一下氧焊,這個比較危險,我沒嘗試過;電路焊接的工具有焊機、焊錫、洗板水、松香、吸錫器;制作導(dǎo)線的工具有剪子、剝線鉗、夾頭鉗、網(wǎng)線鉗各種鉗;網(wǎng)絡(luò)配置就是連連路由器插插網(wǎng)線,但是Linux系統(tǒng)下配置網(wǎng)絡(luò)有時會非常麻煩,一定要多積累這方面的知識,因為將來你造的機器人多半會頂著一個無線路由器跑來跑去,甚至有的機器人上各個模塊自己就能組起一個小局域網(wǎng)。這些技能的熟練掌握需要你花很多時間去做真正能用的機器人來練手。
對于該選擇造一個怎么樣的“真正能用的機器人”練手,最好的選擇肯定是機器人比賽中的機器人。如果參加Robocon,你會跟著學(xué)長學(xué)姐們學(xué)著造有人那么高的巨大機械;如果參加RoboMasters,你會學(xué)著造比汽車還要靈活的機器人以及快速發(fā)彈的機構(gòu)。其他一些小型的比賽比如飛思卡爾智能車,也是很好的訓(xùn)練,因為飛思卡爾智能車已經(jīng)發(fā)展得很成熟,參加這個比賽的參賽資料就夠?qū)W一陣子的,學(xué)完以后能夠獲得比較多的機器人技能。
如果沒有太多學(xué)校機器人社團的資源,同學(xué)們還有一些小型的比賽比如挑戰(zhàn)杯、大創(chuàng)比賽等等可以選擇,以三五個人的小團隊參與這些比賽。如果同學(xué)所在的學(xué)校連這些比賽都不組織大家參與,那就只好自己花錢了。國內(nèi)開源機器人社區(qū)有很多資源可以利用來學(xué)習(xí),比如自己買Arduino STEM educational Robot kits Building Platform的各種開發(fā)套件做簡單的機器人。Arduino的開發(fā)環(huán)境可能有些人不喜歡,因為它對硬件做了一級封裝,如果更希望接觸到單片機的本質(zhì),可以自己買STM32開發(fā)板學(xué)習(xí)。俗話說,沒有什么嵌入式系統(tǒng)是一塊STM32實現(xiàn)不了的,如果有,就用兩塊。STM32是ARM Cortex?M家族中最為廣泛應(yīng)用的一款單片機,在網(wǎng)上也有很多的教材和開發(fā)板可供選擇。在國內(nèi)著名的電子論壇STM32/8 分論壇帖子清單 (amoBBS 阿莫電子論壇)上,有很多參考資料,有問題也可以在這里和大家討論學(xué)習(xí)。
如果你很想?yún)⒓訖C器人比賽,身邊也恰好有一些志同道合的小伙伴,但是學(xué)校不支持。沒關(guān)系,來找我,我盡量通過大疆的關(guān)系說服你們學(xué)校支持你們參加RoboMasters。
雖然你是以機器人比賽為主線在探索機器人技術(shù),但是要時刻記得,機器人比賽給你的理論方面的訓(xùn)練很差,還會讓你養(yǎng)成一些壞習(xí)慣,比如凡事都希望用一些糙猛快的辦法來解決。由于通常整個團隊都沒有太多的項目管理經(jīng)驗,到比賽前一段時間才會加緊功夫去做機器人,很多時候就會用“山寨”的辦法去處理機器人的故障。比如說某個承重結(jié)構(gòu)用久了會彎,為了趕比賽的進度,就拿錘子敲直了、再加一條輔助的結(jié)構(gòu)在旁邊繼續(xù)用,而沒有細致地去做建模、受力分析,思考是什么原因?qū)е鲁兄亟Y(jié)構(gòu)會變形。再比如說調(diào)PID參數(shù)就是生調(diào)亂改,而沒有基于機器人的動力學(xué)模型去估測參數(shù)的大概范圍。
大二的暑假,有可能你跟著學(xué)校的機器人隊參加了一些機器人比賽。這是一個反思總結(jié)的好時機,為什么機器人隊取得了這樣那樣的成績?整個團隊怎樣才能更有效率?明年如何繼續(xù)招新?暑假要把時間花在技術(shù)積累上面,這個時候可以回頭思考思考之前準備比賽時用糙猛快的辦法解決的問題如何能夠細致地去解決。
如果大二的暑假沒有參加機器人比賽,可以做一個舵機機器人,比如6條腿的蜘蛛,比如碼垛機器人。舵機是機器人工程師的好朋友,一定要好好掌握。
另外你其他方面的能力也不能落下。大二結(jié)束的時候,你的Linux應(yīng)該用的很熟練了,除了makefile,你也用起了cmake。你也應(yīng)該開始理解Github存在的意義,因為你已經(jīng)上去讀了很多別人的代碼,你也把自己的一些課程設(shè)計和小項目放在了Github上面。另外大二基本上了本專業(yè)一些比較難的基礎(chǔ)課程,比如自動控制原理、機器學(xué)習(xí)、概率統(tǒng)計、材料和力學(xué)等課程,同學(xué)們會看到這些課程里又用到了線性代數(shù)和微積分的知識,以及建模的知識。這時候可以把大一的物理、線性代數(shù)和微積分再翻出來看看。
同學(xué)的學(xué)校應(yīng)該給大二到大三的學(xué)生有開設(shè)面向?qū)ο蟮某绦蛟O(shè)計,一般用Java或C++教授。在面向?qū)ο蟮某绦蛘n里面,一定要積累3000行左右的代碼的開發(fā)經(jīng)驗。經(jīng)典的面向?qū)ο蟪绦蛟O(shè)計的練習(xí)通常是寫游戲,比如俄羅斯方塊,吃豆人等等,一定要自己能夠做到完全手寫一個完整的項目出來。
另外你可以開始學(xué)習(xí)Matlab當中的神器Simulink了。在大二這一年的學(xué)習(xí)中,你可能在不少課程里多多少少用到了Matlab。假設(shè)你已經(jīng)在我的推薦下喜歡上了Python,你可能會覺得Matlab的計算工具沒有比Python強多少;假設(shè)你自己在別人的推薦下喜歡上了mathematica(Mathematica 到底有多厲害? - Wolfram Mathematica),你可能會覺得和Mathematica這種神一樣的語言比起來,Matlab弱爆了。但是要注意的是,Matlab最強大的工具是Simulink,通過它你幾乎可以仿真一切的物理系統(tǒng)和控制系統(tǒng)。我建議同學(xué)可以通過Simulink實現(xiàn)一個倒立擺,然后理解Matlab的強大之處。對此我強烈推薦一個很好的教材(http://ctms.engin.umich.edu/CTMS/index.php?example=Introduction§ion=SimulinkControl),它詳細介紹了一些經(jīng)典的控制系統(tǒng)如何分析以及用Simulink實現(xiàn)。然后我再強烈推薦一個講Simulink里面一個更加和物理仿真貼近的工具Simscape(Control of an Inverted Pendulum on a Cart)的文章。閱讀并實現(xiàn)了這兩篇文章里的內(nèi)容,同學(xué)應(yīng)該會對倒立擺有了比較深刻的認識。倒立擺是機器人學(xué)中一個非常重要的模型,因為火箭、導(dǎo)彈、雙足機器人、四足機器人,基本都是倒立擺的變形。你自己實現(xiàn)出來的simulink模型一定要存好,以后可能還會再拿出來仔細看。
如果你按照我之前說的方法探索了一些HTML和Javascript的技術(shù),那么JQuery,bootstrap,AngularJS你已經(jīng)多多少少知道是怎么回事了。web后端的技術(shù),比如PHP和MySQL,也可以了解一下,LAMP要學(xué)會怎么配置。如果有同學(xué)找你幫忙寫小網(wǎng)站,盡量去幫個忙,幫別人做網(wǎng)站是提高自己系統(tǒng)編程能力的好練習(xí)。在做網(wǎng)站的過程中你可能還會順便學(xué)一學(xué)如何用Photoshop和Illustrator讓網(wǎng)站顯得更漂亮。這些技能有最好,沒空學(xué)也沒關(guān)系。
大三
大三開始的時候,你可以在學(xué)校的機器人隊里擔(dān)任重要角色了,或者能夠帶領(lǐng)一個小團隊參加小型的機器人比賽。你在系里甚至院里都小有名氣了,可能有的人叫你大神,有的人覺得你技術(shù)還不錯。但是一定要記得你現(xiàn)在的水平放到別的地方應(yīng)該不算什么。每年我都往大疆的RoboMasters夏令營招進100個和你現(xiàn)在的水平相當?shù)耐瑢W(xué)。
大三一定要培養(yǎng)出自己一個人獨立造出一個完整機器人的能力,比如一個Robocon水平的機器人,或者一個RoboMasters的戰(zhàn)車,或者一個四旋翼飛行器。
Robocon水平的機器人,涉及大量的機械設(shè)計,單片機開發(fā),電機驅(qū)動的開發(fā),碼盤和超聲波等傳感器的讀取,底盤運動學(xué)的計算,PID調(diào)試,任務(wù)調(diào)度邏輯的調(diào)試,舵機控制。RoboMasters的戰(zhàn)車的機械部分簡單一些,但是還需要進行云臺的控制、發(fā)彈系統(tǒng)的控制、功率控制等方面的知識,另外你也可以不搞這些部分,學(xué)習(xí)學(xué)習(xí)視覺識別和自動打擊,那么就要開始研究OpenCV(OpenCV | OpenCV)了。
四旋翼飛行器的機械部分最簡單,但是算法比較復(fù)雜。對于大三學(xué)生來說,從零開始一步到位寫一個穩(wěn)定的飛控比較困難,因為飛控里面有很多細小的知識點要注意。目前我沒有發(fā)現(xiàn)什么比較好的書籍推薦,已有的一些關(guān)于四旋翼系統(tǒng)的書要么太淺(上來就教你焊電路),要么太深(上來就教你state estimation),聽說 @Liu Top的exbot小組在寫一個教材,我是非常期待的。學(xué)習(xí)四旋翼飛行器有下面幾個步驟:
第一步:自己調(diào)一個小四軸飛起來
現(xiàn)在開源社區(qū)的人言必pixhawk,其實我覺得從學(xué)習(xí)的角度來說,pixhawk太貴,而且不適合學(xué)習(xí),我比較推薦的是 首頁-第七實驗室 這家淘寶店賣的STM32F405飛控,買回來以后自己再隨便買個機架(比如大疆F450)、接收機和遙控,就能按照飛控板附帶的學(xué)習(xí)資料、調(diào)試軟件飛起來。
第二步:看硬件圖、讀代碼
chiplab7的飛控板附帶一大堆學(xué)習(xí)資料,對加速度計、陀螺和磁感計都有很仔細的解釋,硬件鏈路圖也很詳細。chiplab7淘寶掌柜的又很認真負責(zé),我學(xué)用的時候,發(fā)現(xiàn)代碼有bug和看不懂的地方,都可以直接找掌柜問。
看完代碼以后,對一個飛控系統(tǒng)的基本模塊:姿態(tài)解算、控制解算、混控輸出、遙控器處理、嵌入式處理就很明白了。然而這里面有很多技術(shù)是需要另外學(xué)習(xí)的。除了基本的嵌入式編程以外,還有要把大二大三學(xué)的信號處理方面的知識再撿起來看看。因為飛行器在空中有振動,會讓加速度計產(chǎn)生噪聲,為了把這些噪聲去除掉,需要對加速度計給出的信號做低通濾波處理,如何選擇濾波器的參數(shù)呢?如果濾波濾得太狠,延遲就會比較大,對控制的表現(xiàn)會有影響;如果濾波濾得不夠,可能會有一些低頻的噪聲偶爾會出現(xiàn),導(dǎo)致加速度計的觀測不能用。另外最重要的是要理解姿態(tài)解算和控制解算這兩塊知識。chiplab7的飛控板的代碼采用的是最簡單的互補濾波算法做為姿態(tài)解算模塊,然后控制解算是對歐拉角的三個角度做閉環(huán)PID控制,基本都是基礎(chǔ)的基礎(chǔ)了。
第三步:小修小改加深理解
chiplab7的飛控是靠氣壓計定高的,飛行效果非常奔放。這時候可以淘寶買個20塊錢的超聲波模塊,然后自己寫個高度環(huán)去穩(wěn)定飛控的定高表現(xiàn)。
我覺得這個過程至關(guān)重要,因為高度控制相對來說是個比較直觀理解PID控制的方式,而且chiplab7的飛控加高度控制非常好加。工作量不大,因為改善效果很顯著,所以可以讓人很有成就感,加深繼續(xù)學(xué)習(xí)的樂趣。
第四步:理解核心的數(shù)學(xué)和控制知識
這一部分大三是肯定來不及學(xué)的,但是我還是在這里列出來,因為這些知識你之后都需要慢慢學(xué),我也會在之后不斷重復(fù)提到這些知識點。
姿態(tài)解算和控制解算涉及的知識有:
1. 剛體姿態(tài)的表示、運動學(xué)方程和動力學(xué)方程。主要是對牛頓-歐拉方程的認識和理解、剛體姿態(tài)的歐拉角表示法、姿態(tài)與角速度的關(guān)系等等。
這部分說復(fù)雜不復(fù)雜,說簡單也不簡單,我同樣是沒有找到一本完整的書全都介紹過的,是學(xué)了好幾個不同的書和論文以后搞明白的?,F(xiàn)在看起來是從維基百科入手比較靠譜。
2. 自動控制原理。講PID的書和文章就多了去了,沒有太多復(fù)雜的書。
3. 線性估計基本原理。其實就是互補濾波:Reading a IMU Without Kalman: The Complementary Filter 。拿這個關(guān)鍵詞百度各種搜就會了。
第五步:重頭開始造輪子
知乎著名網(wǎng)友vczh曾經(jīng)說過,學(xué)習(xí)要抱著勇于造輪子的心態(tài)才能進步。所以在熟悉了別人飛控基礎(chǔ)上,可以自己重頭造一個飛控的輪子。可以自己從芯片開始重新畫一個飛控板,讀讀STM32的芯片手冊、讀讀各種傳感器的芯片手冊,自己手畫一個飛控的原理圖、做PCB layout、制板自己焊元件,全套花不了1000塊錢,能夠加深很多對硬件的理解。這一部分如果大三沒空,也可以不搞了。
制造整個機器人的過程中要特別重視文檔的積累。在你大三末期,你可能隨著學(xué)校的機器人隊備戰(zhàn)比賽,你可能主力負責(zé)一臺機器人。你應(yīng)該自己列一個excel表格,把機器人用了幾顆螺絲,幾根導(dǎo)線,每個零件的規(guī)格是什么,都列出來。這個表格一方面可以用來幫助團隊管理機器人的物料,一方面也是你自己的經(jīng)驗技術(shù)積累,將來你做的其他機器人可能多多少少都是Robocon、RoboMasters機器人的變形。
另一個積累是建一個自己的buglist,buglist包括什么呢,可以像冷大這樣:做控制、機器人等算法工程師是怎樣一種體驗? - 冷哲的回答,就簡單把一些自己的發(fā)生過的問題和最后的解決辦法羅列下來。比如說“杜邦線接插位不穩(wěn)固容易脫開,接好后應(yīng)該用電工膠布再裹一圈”,“外發(fā)給淘寶加工的機械圖紙,要特別注意和加工商溝通有沒有漏掉一些細節(jié),如沉頭螺絲孔,關(guān)鍵的倒角”等等。你也可以幫其他機器人的問題也做這樣的記錄。buglist可以就是一個簡單的文本文件,如果你一直往里面積累自己工作中的記錄,等你將來工作了,這個文件可能會值很多錢。
大三的時候?qū)W校應(yīng)該會開設(shè)軟件工程的課程。不管你是不是這個專業(yè),上不上這門課,都應(yīng)該主動去聽一聽,甚至跟著課程的設(shè)計作業(yè)一起做一做。軟件工程我覺得是機器人工程師必須具備的意識,因為一個機器人系統(tǒng)里涉及大量的硬件系統(tǒng)和軟件功能,軟件的部分往往還會涉及不同的語言、不同的編譯環(huán)境、不同的開發(fā)工具鏈。幾個人合作的話,大家的專業(yè)背景、編程習(xí)慣都不相同,這就導(dǎo)致不同的代碼和模塊之間的協(xié)議溝通非常復(fù)雜,必須盡早用UML和其他軟件工程的工具幫助團隊理解和互相溝通。
大三的時候?qū)W校應(yīng)該還會開設(shè)操作系統(tǒng)原理和嵌入式系統(tǒng)原理的課程,而大二的時候講過計算機組成原理(所謂的微機原理)。從大三開始同學(xué)需要開始體會實時操作系統(tǒng)和非實時操作系統(tǒng)的區(qū)別、原理以及使用時需要注意的地方。這是一個比較雜的知識點,我目前沒有找到很好的教材去介紹。在STM32上,有freeRTOS,uCOS,Vxworks這么幾種實時操作系統(tǒng);Linux是一種非實時操作系統(tǒng),但是可以通過打補丁變成實時操作系統(tǒng)。這些操作系統(tǒng)的細節(jié)在機器人開發(fā)中都會多多少少被涉及到,同學(xué)們可以隨時上Google和CSDN去查大神們的介紹。
另外特別重要的一點是機器人系統(tǒng)里的嵌入式平臺都有燒壞的可能性,有可能在某個嵌入式Linux平臺上面辛辛苦苦寫了一個多月代碼,這個平臺突然燒壞了,代碼也就丟了。因此你的機器人如果有嵌入式Linux系統(tǒng)在里面,一定要盡早頂起來路由器,代碼定時提交SVN或者git。
大三的暑假你可能會作為學(xué)校機器人隊的主力去參賽了。備戰(zhàn)比賽和參賽是一件磨練心性的事情。我在學(xué)生時代體會過和勝利擦肩而過的痛苦,體會過沒機會再來一年的遺憾;也在負責(zé)大疆RoboMasters比賽的過程中被那些痛苦和遺憾的學(xué)生當做發(fā)泄的對象,非常有感觸。我覺得參加機器人比賽,很努力,然后失敗了,是一件讓人快速成長的事情。同學(xué)如果有機會,一定應(yīng)該參加至少一屆機器人比賽。
大三的暑假你也可以選擇來參加大疆的RoboMasters夏令營,關(guān)于夏令營大家可以看這個知乎問答了解更多:參加Robomasters 2016夏令營是怎樣一種體驗? - DJI 大疆創(chuàng)新。每年我們都在全國范圍內(nèi)尋找有一定技術(shù)基礎(chǔ)的學(xué)生,讓他們一起分組做一個自動機器人的挑戰(zhàn)。這個夏令營,作為組織負責(zé)人,不謙虛地說,我覺得應(yīng)該是全世界范圍內(nèi)最好的技術(shù)類夏令營。
大三的暑假有一件很重要的事情就是思考自己大四應(yīng)該干什么。一般來說,你現(xiàn)在的能力保本校研究生肯定沒有問題,當然你也可以選擇考其他學(xué)校的研究生或者出國留學(xué)。雖然說你現(xiàn)在能力已經(jīng)很全面了,但是你還需要2-3年的時間全面提升自己更多的能力,才能邁向卓越之路。不管是出國還是保研,最重要的目的是給自己爭取到未來2-3年能夠在一個優(yōu)秀的環(huán)境中安心提升自己,有比較好的學(xué)習(xí)資源,能夠參與到一些不錯的項目中去??赡芷渌行┬挟?,出國留學(xué)始終是比在國內(nèi)待著更好的選擇,但是機器人行業(yè)并不是這樣。我們國家這兩年在機器人方面提高也很快,而且我們國家現(xiàn)在比較有錢。就像我開始說的那樣,機器人是富人的活動,現(xiàn)在你在國內(nèi)也能找到一些很有錢的實驗室可以造比較牛逼的機器人。另外國外很多比較強的機器人公司也都在做比較敏感的軍方項目,去找實習(xí)可能比較受限制。
出國去學(xué)機器人學(xué)方面的知識你有很多不錯的選擇,比如世界第一的機器人研究院卡耐基梅隆大學(xué),或者麻省理工學(xué)院的CSAIL實驗室。北美傳統(tǒng)計算機四大名校(麻省理工學(xué)院,卡耐基梅隆大學(xué),斯坦福大學(xué),加州大學(xué)伯克利分校)里,除了斯坦福大學(xué)熱火朝天在搞人工智能以外,其他幾個學(xué)校的機器人研究都很不錯。除了四大名校,你還有很多其他的選擇,就像我開始說的那樣,機器人是富人的活動,如果想接觸到最好的機器人資源,你要選擇有錢的實驗室,而不是有名的實驗室。
另外你還需要在大三的尾巴上選定自己將來的細分研究方向,而且開始往這個方向深挖,也就是我在文章開始提到的感知、認知、行為幾個方向。當然同時你也不能放松其他方面的知識,尤其是數(shù)學(xué)基礎(chǔ)。我在大三的暑假專門找數(shù)學(xué)系的同學(xué)給我開了個數(shù)學(xué)小講座,學(xué)習(xí)了一點抽象代數(shù)的知識,對我后來學(xué)習(xí)密碼學(xué)幫助很大。同時我也讀了一些拓撲方面的教材(有一本很神奇的書叫做Topopogy Without Tearshttp://www.topologywithouttears.net/),這樣才理解了為什么數(shù)學(xué)分析要用奇怪的符號去解釋一些看起來很淺顯的道理。
大三階段的機器人工程師該學(xué)什么基礎(chǔ)數(shù)學(xué)是眾說紛紜的,在我看來,你要基本掌握“群是什么”,能夠用代數(shù)的眼光去證明”det(AB) = det(A)det(B)”,還要能理解“用一張紙就可以變出克萊因瓶”(當然是在四維空間里)。另外,你這個時候也要能夠意識到自己需要再學(xué)一遍線性代數(shù)。
大四
大四開始了,你可以開始深挖自己的研究方向,同時也要開始學(xué)一些高級一點的通用技術(shù)和理論,這時候你和一般的機械、電子、計算機學(xué)生就不太一樣了,你雖然也在狂編程,但也在狂學(xué)習(xí)物理和數(shù)學(xué)。通用技術(shù)包括ROS,simulink,gazebo和Vrep等工具。通用理論包括,再學(xué)一遍線性代數(shù),學(xué)學(xué)凸優(yōu)化、數(shù)值計算、旋轉(zhuǎn)表示法等方面的知識。這些知識你在大四僅僅只能開一個頭,因為你的大四要實習(xí)、畢業(yè)、考研、畢設(shè),你會非常地忙。有些人會在大四進實驗室和老師發(fā)論文,我個人覺得發(fā)論文這件事沒必要操之過急。你的整個大學(xué)期間應(yīng)該用在廣泛涉獵各種各樣的知識上面,而不是深入某一個細小的研究問題。
大四可以開始讀一些著名入門書籍,我把這些書不分先后地列出來,你沒有必要全部去讀,而且每本書先讀前幾章就夠了,能讀多少盡量讀多少。
概率機器人學(xué),https://www.amazon.com/Probabilistic-Robotics-Intelligent-Autonomous-Agents/dp/0262201623
凸優(yōu)化,https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf
線性系統(tǒng)理論,https://www.amazon.com/Linear-System-Electrical-Computer-Engineering/dp/0199959579
Multiple View Geometry in Computer Vision,Multiple View Geometry in Computer Vision
線性估計,https://www.amazon.com/Linear-Estimation-Thomas-Kailath/dp/0130224642
《機器學(xué)習(xí)》,周志華老師的書。
An Invitation to 3-D Vision,https://www.eecis.udel.edu/~cer/arv/readings/old_mkss.pdf
Modern Control Systems,https://www.amazon.com/Modern-Control-Systems-12th-Richard/dp/0136024580
Rigid Body Dynamics,http://authors.library.caltech.edu/25023/1/Housner-HudsonDyn80.pdf。說實話剛體動力學(xué)理論我沒有找到特別好的書。但是剛體動力學(xué)理論很重要。
Feedback Systems: An Introduction for Scientists and Engineers,F(xiàn)BSwiki
就像我開始說的那樣,這些書,大部分特別貴,還好有一些業(yè)界良心的作者放出了他們書的電子版。當然你也可以去一些名字都不能說的網(wǎng)站去找影印版。
在讀上面這些書的時候,matlab,python都要放在手邊,然后把書里面的知識盡量實踐出來。很多教科書里都會在章節(jié)后面的習(xí)題里放一些寫明是用matlab做的習(xí)題,要盡量多做一些這樣的題。
你可能早就聽說了ROS的大名,但是最好不要在大四之前去碰它。因為ROS用了很多操作系統(tǒng)和網(wǎng)絡(luò)的底層技術(shù)。我在知乎回答高手可以談?wù)凴OS機器人操作平臺開發(fā)的一些經(jīng)驗嗎? - YY碩的回答里有簡單的介紹。ROS的設(shè)計目標是把機器人的控制和傳感器處理的軟件和它的硬件隔離開,用上ROS以后,你可以方便地用到很多能直接跑的軟件代碼。但是ROS從入門到精通需要至少一年以上的時間,你必須不斷地用,不斷地嘗試新的代碼和硬件,才能對它熟悉起來。
ROS的可視化工具Rviz里面對于機器人旋轉(zhuǎn)的表示用的是四元數(shù),而在你之前研究四旋翼飛行器時,里面的代碼表示旋轉(zhuǎn)用的是歐拉角,做姿態(tài)解算用的可能是四元數(shù)。這個時候要開始有意識地去學(xué)習(xí)旋轉(zhuǎn)表示法之間的區(qū)別和聯(lián)系。
要重視大四期間的實習(xí)和畢業(yè)設(shè)計。很多大四的學(xué)生畢業(yè)設(shè)計都會非常頹地做一下,我覺得是不好的。要把做畢業(yè)設(shè)計的過程看做一個正式的項目。這個項目除了做好技術(shù)方面的工作,也要做好展示方面的工作。中國工程師的一大特點是,不會表達自己,可能做的東西水平很高,但是做出PPT就會犯字體花哨不正式、一頁上面字太多,圖文沒有聯(lián)系等表達上的問題。通過PPT介紹、展示自己的成果在工程師的職業(yè)生涯的任何一個階段都非常重要,它甚至也一定程度上限制了機器人工程師能夠達到的高度。只有能夠把自己的成果清晰地表達給自己的團隊,才能獲得其他人的反饋、通過溝通提高團隊的整體凝聚力和知識水平,這樣自己在團隊能夠獲得更多的認可,有助于團隊整體工作效率的提高。我每年去參加幾次學(xué)術(shù)會議,都在會議上感覺到一些中國的科研人員走到國際上以后,演講能力很差就會導(dǎo)致他們的科研成果不受重視。當然其他國家的科研人員也是這樣。
為了寫出美觀的技術(shù)報告和畢業(yè)論文,你可以開始學(xué)習(xí)Latex。Latex作為國際國內(nèi)第一寫作神器,學(xué)習(xí)資料在網(wǎng)上有很多。Latex的學(xué)習(xí)和使用同樣也是需要不斷地熟能生巧,多寫多練就熟悉了。寫畢業(yè)論文有個問題是怎么做出精美的矢量圖,我推薦Draw Freely | Inkscape,一個比Illustrator更輕量化、但是有些功能反而更強大的免費軟件。
對于那些想申請出國留學(xué)的同學(xué),你要做一個自己個人的成果展示,用網(wǎng)頁的形式呈現(xiàn)比較好。把自己Github鏈接(如果你按我說的,大學(xué)第一天就申請Github賬號,現(xiàn)在已經(jīng)是一個三年的老油條了)、做過的機器人視頻、寫過的技術(shù)報告和文章(最好是英文的)放在上面。
關(guān)于畢業(yè)設(shè)計的選題,我推薦這么幾個:
手寫雙目視覺里程計。涉及到圖像處理、特征匹配、位置解算、空間變換等等。
手寫四旋翼飛行器基于GPS的軌跡規(guī)劃。涉及到深挖四旋翼飛行器的運動原理、IMU原理、軌跡生成和優(yōu)化等。
造一個被推了也不會倒的雙足舵機機器人。涉及到舵機控制、倒立擺建模、動力學(xué)分析、PID控制、IMU原理等。
深度學(xué)習(xí)訓(xùn)練一個小車追人跑。涉及到深度學(xué)習(xí)工具包使用、數(shù)據(jù)集采集、數(shù)據(jù)集分析、小車控制等。
機械臂給人端茶倒水。這個相對來說土豪一點,因為能直接拿來用的機械臂都很貴,這個要看實驗室有沒有條件了。涉及到多自由度機械臂原理的學(xué)習(xí)、工具包的使用、軌跡規(guī)劃等等。
這幾個項目要做好,都要持續(xù)投入三個月以上的時間以及一定的資金,每一個都是理論多于實踐。當然同學(xué)們自己也可以自己選擇自己的畢業(yè)設(shè)計題目,但是最好還是選做出來能跑能飛的東西,同時避免選擇需要花大量時間去擰螺絲、焊板子的題目,盡量買現(xiàn)成的電機、開發(fā)板、3D打印結(jié)構(gòu),大四要多給自己留時間去看書和寫代碼。
大四到研究生之前的暑假,最好去一些比較不錯的機器人公司實習(xí)一下,比如說大疆。當然你也可以繼續(xù)做機器人比賽,比如RoboMasters和大疆的飛行器比賽。
研究生一年級
研究生的時候,你的目標比較清晰了,就是做一種機器人至少兩年時間,并從中發(fā)掘出可以發(fā)表論文的知識點。上面我給出的書單里面,你要開始精讀里面的幾本。
如果做機器人視覺定位、傳感器融合方面的研究,1、4、5、7四本書一定要精讀。
如果做控制系統(tǒng)的研究,3、8、9、10一定要精讀。
如果做規(guī)劃算法的研究,那么還要讀其他偏CS一些的書,比如講A* search,random forest,圖論方面知識的教材。由于我在這方面造詣不深,就不托大了。
如果學(xué)習(xí)隨機系統(tǒng)的控制和最優(yōu)控制,除了1、2、3,還要讀一本神書Stochastic models estimation and control(https://www.cs.unc.edu/~welch/kalman/media/pdf/maybeck_ch1.pdf)。
如果研究機器人視覺定位,幾種常用的定位算法:PTAM(Parallel Tracking and Mapping for Small AR Workspaces (PTAM)),ROS的標配VO(viso2_ros - ROS Wiki),SVO(GitHub - uzh-rpg/rpg_svo: Semi-direct Visual Odometry),LSD-SLAM(http://vision.in.tum.de/research/vslam/lsdslam)ORB-SLAM(GitHub - raulmur/ORB_SLAM2: Real-Time SLAM for Monocular, Stereo and RGB-D Cameras, with Loop Detection and Relocalization Capabilities),都必須自己學(xué)習(xí)之后全部跑一遍。只會用OpenCV的函數(shù)和這些工具包并不能說明你會視覺定位,必須要能自己手寫出一個能用的才算。國內(nèi)有一個很厲害的SLAM專家叫高翔,他的博客要關(guān)注一下:機器人 - 標簽。由于SLAM這兩年很火,研究的人很多,所以網(wǎng)上可以參考的資料也很多,比如https://github.com/hcdth011/ROS-Hydro-SLAM,就在ROS上實現(xiàn)了幾種定位算法的對比。
我現(xiàn)在非常不建議同學(xué)們選擇從四旋翼飛行器的動力學(xué)控制里找問題作為研究課題。因為四旋翼飛行器的特點已經(jīng)被研究透了。目前國際上對多旋翼飛行器的研究主要集中在造一些奇葩形狀的飛行器,以及給多旋翼飛行器上安裝一個機械臂去做力控制,這樣做就對多旋翼飛行器控制的動力學(xué)造成了一些影響。因此需要同學(xué)對動力學(xué)和多自由度機械臂控制有比較深的認識。
自動導(dǎo)航和駕駛是這兩年的熱點,一方面汽車的自動化是大勢所趨,另一方面多旋翼飛行器異軍突起,產(chǎn)生了很多對自動飛行的需求。除了機器人視覺定位算法以外,同學(xué)還需要學(xué)習(xí)其他的傳感器,以及這些傳感器與視覺定位算法怎么融合。這里面有很多坑,比如計算量的問題,怎么保證融合算法不崩,怎么處理傳感器的延時等等,都需要同學(xué)結(jié)合自己的項目去踩,坑踩得多了才能成長。如果大家想找一個多旋翼飛行器平臺研究自動導(dǎo)航,我推薦大疆的M100,我已經(jīng)在知乎回答RoboMasters2015夏令營是怎樣的? - YY碩的回答里吹過一波M100,前面說過的今年夏令營的知乎回答參加Robomasters 2016夏令營是怎樣一種體驗? - DJI 大疆創(chuàng)新里也有人幫我吹了一波。
一些大學(xué)里學(xué)過的知識點,是必須結(jié)合研究生期間的項目的需求弄得很清楚的,比如三大變換(傅里葉變換,拉普拉斯變換,Z變換),旋轉(zhuǎn)表示法(歐拉角、四元數(shù)、旋轉(zhuǎn)矩陣),數(shù)值計算怎么防止矩陣出現(xiàn)數(shù)值問題等等。除了自己的項目,還需要把凸優(yōu)化、卡爾曼濾波還有多自由度機械臂的控制學(xué)習(xí)一下。這三個領(lǐng)域的知識,是任何一種機器人都會用的到比較難的知識。
凸優(yōu)化和凸優(yōu)化的各種變形是非常重要的知識,因為各行各業(yè)里的研究問題,多半是會建立一個優(yōu)化問題去解決的。上面提到的《Convex Optimization》https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf,也是一本神書,同學(xué)們一定要認真讀一讀。Matlab、Python、C++都有一些現(xiàn)成的工具包可以幫助你解優(yōu)化問題,不過最好同學(xué)們能自己手寫一些基本的優(yōu)化算法,比如gradient descend,barrier method等等。另外現(xiàn)在主流的SLAM算法,后端都是通過一種叫做g2o的優(yōu)化算法來出效果的。而且g2o能夠整合bundle adjustment 和structure-from-motion這兩大計算機視覺里的關(guān)鍵問題,可以說是一種很好的計算思想了,非常有必要學(xué)習(xí)一下g2o。
卡爾曼濾波在上面書單里的1和3都有提到,同時在神書Stochastic models estimation and control(https://www.cs.unc.edu/~welch/kalman/media/pdf/maybeck_ch1.pdf)也有相當多的篇幅??柭鼮V波有好幾種證明的方法,同學(xué)最好能自己學(xué)會1-2種。
多自由度的機械臂的難點在于機械臂的運動學(xué)正反解、運動學(xué)控制和動力學(xué)控制,基本是一個建模分析和數(shù)值算法實現(xiàn)的問題。如果你所在的學(xué)校沒有一個財力雄厚的機器人實驗室的話,你基本上沒有機會接觸到多自由度的機械臂。這時候之前學(xué)到的Simulink和就要學(xué)的Gazebo就派上用場了,你可以用Simscape里面的剛體搭一個多自由度機械臂,然后通過Simulink仿真去學(xué)習(xí)機械臂的控制;也可以用Gazebo的URDF語言寫一個機械臂,然后通過Gazebo和ROS的接口去控制機械臂;也可以用ROS里面的著名工具包MoveIt! Motion Planning Framework,不過MoveIt的問題是,他只能仿真運動學(xué),而不能仿真動力學(xué)。工業(yè)領(lǐng)域?qū)Χ嘧杂啥鹊臋C械臂控制通常用一個叫做D-H表示法的建模工具(Denavit),這個東西我并不太會。我只會向同學(xué)們推薦我導(dǎo)師的著作《A mathematical introduction to robotic manipulation》(http://www.cds.caltech.edu/~murray/books/MLS/pdf/mls94-complete.pdf)。
有一個非常神奇的事實:《A mathematical introduction to robotic manipulation》這本機械臂控制領(lǐng)域的著名教材的第二章和計算機視覺領(lǐng)域的著名教材《An Invitation to 3-D Vision》的第二章基本是一樣的,都在講旋轉(zhuǎn)表示法。這是因為所有的旋轉(zhuǎn)表示法都可以歸納為一種優(yōu)雅的李群結(jié)構(gòu):SO(3)群。而計算機視覺和機械臂控制都涉及到理解剛體的旋轉(zhuǎn),事實上用計算系統(tǒng)去觀測和控制所有的剛體構(gòu)成的系統(tǒng),理解旋轉(zhuǎn)都是很關(guān)鍵的問題。旋轉(zhuǎn)表示法應(yīng)該作為研究生階段的一個重要學(xué)習(xí)的知識點。
李群和李代數(shù)是剛體旋轉(zhuǎn)表示背后的數(shù)學(xué)理論,如果想要深挖一些,可以看這篇文章An elementary introduction to groups and representations的前50頁(http://www.cmls.polytechnique.fr/perso/renard/Hall_Group.pdf)。這是我自己讀著覺得最好的文章,當然網(wǎng)上也有很多其他的介紹。
研究生階段還要培養(yǎng)的一個能力是借助各種工具仿真機器人系統(tǒng)的能力。顯然地,很多機器人系統(tǒng)真的造出來的話造價昂貴,需要在實際制造之前寫一個比較真實的仿真系統(tǒng)出來測試算法。我覺得做仿真系統(tǒng)的能力直接衡量了機器人工程師的技術(shù)水平。當你開始要搭一個仿真系統(tǒng)的時候,第一步是通過歐拉方程和牛頓方程確定剛體的運動特點,甚至要自己寫剛體二階微分方程;第二步是確定剛體之間的互聯(lián)關(guān)系,設(shè)計不同類型的關(guān)節(jié),如果有軟性連接需要加入彈簧阻尼模型;第三步是確定被仿真的剛體系統(tǒng)會不會和外界產(chǎn)生碰撞或者其他形式的力,如果有的話,需要設(shè)計合適的接觸力和摩擦力仿真的模型。多旋翼飛行器的仿真是很簡單的,不需要考慮什么接觸力。但是多自由度機械臂基本都需要仿真接觸力,不和物理世界去交互的機械臂只有很小的實用意義。而能夠自行運動locomotion系統(tǒng),比如雙足、多足機器人,則涉及到更多的接觸力,多到接觸力都會影響仿真系統(tǒng)的數(shù)值穩(wěn)定性。搭建一個仿真系統(tǒng)需要很強的系統(tǒng)建模能力和數(shù)值分析的能力,雖然Simulink、Gazebo、Vrep提供了不同程度的工具簡化你的工作,但是要讓仿真系統(tǒng)能夠穩(wěn)定運行,必須要能深入其中的細節(jié)。有些看起來很高大上的仿真工具,比如Nvida的PhysX,在仿真的時候是忽略掉科里奧利力的,如果不理解仿真的本質(zhì),可能就會忽略這一個重要的缺陷。
研究生二年級
你的學(xué)習(xí)計劃接近尾聲。現(xiàn)在你已經(jīng)進入了一個很好的狀態(tài):看到一個機器人,能夠很果斷地分析出它用了什么傳感器、執(zhí)行器、計算平臺大概是什么量級,他的執(zhí)行機構(gòu)能夠承受多少力量??吹揭粋€新的算法,能夠大約判斷清楚它的執(zhí)行流程,在什么環(huán)節(jié)做了優(yōu)化??吹揭粋€新的沒學(xué)過的知識,能夠分析出它和你以前學(xué)過的什么知識有聯(lián)系,你還需要再學(xué)什么才能弄明白這個知識點。
研究生二年級要深化第一年學(xué)到的那些技術(shù)和知識,要做到完整地讀過四五本書,五十篇以上的論文。你已經(jīng)積累了幾萬行代碼的經(jīng)驗,也能熟練地談?wù)撜l家的電機回差小,誰家的電機線性程度好。
你這個時候可以去寫作一些論文,也可以開始學(xué)習(xí)一些更高級的技術(shù)和工具,比如用FPGA和GPU優(yōu)化算法、魔改Linux內(nèi)核、玩玩液壓系統(tǒng)、了解更多機器學(xué)習(xí)的知識比如強化學(xué)習(xí)等等。你也可以從計算機圖形學(xué)或者計算力學(xué)里面找到一些幫助你更好進行機器人仿真和系統(tǒng)分析的工具。由于你懂很多機器人方面的知識,你可以給學(xué)校的機器人隊做指導(dǎo),或者帶隊參加一些比較有挑戰(zhàn)性的機器人比賽。
寫到這里,我就不可能給出很多不同領(lǐng)域的指導(dǎo)了,因為隨著學(xué)習(xí)的進一步深化,我自己熟悉的領(lǐng)域也在收縮。我只能對幾個領(lǐng)域給出我的意見。
對視覺定位和傳感器融合來說,SLAM急需新的突破,目前通過幾何約束去實現(xiàn)loop closure看起來已經(jīng)走入了死路,沒法有更多的發(fā)展了,下一步可行的方向是與深度學(xué)習(xí)進行結(jié)合。具體的一些介紹可以閱讀行業(yè)中大牛的一篇文章http://www.computervisionblog.com/2016/01/why-slam-matters-future-of-real-time.html,記述了幾個業(yè)界大牛們最新的觀點。傳感器融合技術(shù),目前還有很多問題可以探索,因為傳感器的延時、不均勻的信號,會給定位系統(tǒng)造成困擾,如何去除這些干擾,需要建立比較復(fù)雜的非線性優(yōu)化問題,具體可以關(guān)注香港科技大學(xué)Shaojie Shen的工作。
對于多自由度機械手和機器人的locomotion來說,這里面還有非常多可以探索的研究問題。我前面提過接觸力和摩擦力很難仿真,大神告訴我現(xiàn)在沒有任何一種工具和理論能把接觸力和摩擦力正確仿真出來,因此如何在機器人系統(tǒng)里妥善處理對這些力的控制,就是很難的問題了?,F(xiàn)在業(yè)界的一個前沿發(fā)展方向,也是利用機器學(xué)習(xí)技術(shù)來幫助機器人學(xué)會處理這些外力,不過人類目前最優(yōu)秀的多自由度機器人系統(tǒng),Berkeley的Brett機器人,疊幾塊積木就要用十分鐘(New ‘deep learning’ technique enables robot mastery of skills via trial and error),顯然還有很多提升的空間。這方面的問題同學(xué)可以關(guān)注知乎大神@戴泓楷@周佳驥。
最后我想再強調(diào)一遍表達能力的重要性。你可以從自己帶的課程和機器人隊入手,把自己這幾年來學(xué)過的知識做成PPT講給學(xué)生們聽,然后讓他們給你反饋。多做這樣的練習(xí),提升自己做演講的能力,這將來會讓你受益匪淺。
研究生二年級之后,你可以準備進機器人公司工作了,也可以根據(jù)你自己感興趣的研究方向申請博士接著努力。由于你已經(jīng)掌握了廣博的知識和技能,你的職業(yè)生涯將會大有作為。
結(jié)束語
我從2008年展開自己的機器人生涯。那一年波士頓動力剛剛發(fā)布他們的大狗機器人,Python還是很小眾的語言,Ubuntu 8.04還很不穩(wěn)定,Chrome還沒有多少人知道。在之后的幾年中我目擊了深度神經(jīng)網(wǎng)絡(luò)的復(fù)興,看到波士頓動力的機器人日漸強大,經(jīng)歷了ROS的起源和繁榮,幫助了大疆的崛起,深深為這個產(chǎn)業(yè)的未來感到激動。我希望這篇文章能夠幫助更多的年輕人進入機器人學(xué)的海洋,為未來機器人學(xué)的繼續(xù)發(fā)展貢獻力量。