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