1. 程式人生 > >大疆技術總監:如何用六年成為一個全能的機器人工程師

大疆技術總監:如何用六年成為一個全能的機器人工程師

  機器人學的核心問題是做好和物理世界的互動。現在主流的機器人學分支裡,處理與物理世界的互動的學科分為三類:感測器和處理演算法;多剛體系統動力學控制;機器人自主移動。

  智慧機器人會成為未來世界的災難嗎?對機器人或人工智慧的研究會幫助我們更好的瞭解人類自己嗎?人工智慧將會怎樣影響我們的生活?諸如此類的問題及文章早已屢見不鮮。但機器人控制如何入門?如何成為一個合格的機器人工程師?這類的問題似乎還沒有一個最全面的答案。在機器人成為熱門話題的當下,作為大學生,要如何制定一個高效全面的機器人學習計劃呢?小編為廣大“機器人狂熱粉”推薦一篇大疆無人機智慧導航技術總監楊碩的“機器人工程師學習計劃”,或許讀完本文可使機器人工程師學習事半功倍!

  前言很多朋友私信問我對機器人和人工智慧感興趣,該怎麼展開學習。最近稍微有點空,我寫寫我的看法。

  兩年前,我在知乎回答【如何定義“機器人”?】的問題中試圖給機器人做出一個比較仔細的定義,我覺得機器人和人工智慧最大的區別在於是否要和物理世界進行互動。今年初在另一篇知乎“機器人或人工智慧的研究會幫助我們更好的瞭解人類自己嗎?”回答中,我說到感測器是和物理世界互動的基礎。後來,我又在知乎“有哪些與控制、機器人等相關的 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。原因是機器人作業系統ROS是基於Ubuntu開發的,因此在Ubuntu上執行最穩定。注意Ubuntu出了一箇中文版叫做Kylin,個人感覺比較坑,建議大家不要裝中文版。Ubuntu 作為一個開源作業系統,總是在快速迭代,2016年8月比較穩定的版本是14.04和16.04,建議同學安裝14.04。

  當你把C學得差不多,開始要學寫包含多個頭檔案的程式時,一定要同時學習makefile的知識。這時候要上網去搜“Makefile詳解”這篇文章看。

  我自己在大學一年級的時候還學習了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”學完就行,別的部分還有很多花哨的技術,沒有必要去學了。

  以上介紹的這些知識點、書和資料應該在大一期間就全部看完,然後利用大一的暑假好好鞏固這些知識。比如開始用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這種神一樣的語言比起來,Matlab弱爆了。但是要注意的是,Matlab最強大的工具是Simulink,通過它你幾乎可以模擬一切的物理系統和控制系統。我建議同學可以通過Simulink實現一個倒立擺,然後理解Matlab的強大之處。閱讀並實現了這兩篇文章裡的內容,同學應該會對倒立擺有了比較深刻的認識。倒立擺是機器人學中一個非常重要的模型,因為火箭、導彈、雙足機器人、四足機器人,基本都是倒立擺的變形。你自己實現出來的simulink模型一定要存好,以後可能還會再拿出來仔細看。

  如果你按照我之前說的方法探索了一些HTML和Javascript的技術,那麼JQuery,bootstrap,AngularJS你已經多多少少知道是怎麼回事了。web後端的技術,比如PHP和MySQL,也可以瞭解一下,LAMP要學會怎麼配置。如果有同學找你幫忙寫小網站,儘量去幫個忙,幫別人做網站是提高自己系統程式設計能力的好練習。在做網站的過程中你可能還會順便學一學如何用Photoshop和Illustrator讓網站顯得更漂亮。這些技能有最好,沒空學也沒關係。

#p#四年獨立製造機器人#e#

  大三

  大三開始的時候,你可以在學校的機器人隊裡擔任重要角色了,或者能夠帶領一個小團隊參加小型的機器人比賽。你在系裡甚至院裡都小有名氣了,可能有的人叫你大神,有的人覺得你技術還不錯。但是一定要記得你現在的水平放到別的地方應該不算什麼。每年我都往大疆的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等工具。通用理論包括,再學一遍線性代數,學學凸優化、數值計算、旋轉表示法等方面的知識。這些知識你在大四僅僅只能開一個頭,因為你的大四要實習、畢業、考研、畢設,你會非常地忙。有些人會在大四進實驗室和老師發論文,我個人覺得發論文這件事沒必要操之過急。你的整個大學期間應該用在廣泛涉獵各種各樣的知識上面,而不是深入某一個細小的研究問題。

  你可能早就聽說了ROS的大名,但是最好不要在大四之前去碰它。因為ROS用了很多作業系統和網路的底層技術。我在知乎回答高手可以談談ROS機器人操作平臺開發的一些經驗嗎? - YY碩的回答裡有簡單的介紹。ROS的設計目標是把機器人的控制和感測器處理的軟體和它的硬體隔離開,用上ROS以後,你可以方便地用到很多能直接跑的軟體程式碼。但是ROS從入門到精通需要至少一年以上的時間,你必須不斷地用,不斷地嘗試新的程式碼和硬體,才能對它熟悉起來。

  ROS的視覺化工具Rviz裡面對於機器人旋轉的表示用的是四元數,而在你之前研究四旋翼飛行器時,裡面的程式碼表示旋轉用的是尤拉角,做姿態解算用的可能是四元數。這個時候要開始有意識地去學習旋轉表示法之間的區別和聯絡。

  要重視大四期間的實習和畢業設計。很多大四的學生畢業設計都會非常頹地做一下,我覺得是不好的。要把做畢業設計的過程看做一個正式的專案。這個專案除了做好技術方面的工作,也要做好展示方面的工作。中國工程師的一大特點是,不會表達自己,可能做的東西水平很高,但是做出PPT就會犯字型花哨不正式、一頁上面字太多,圖文沒有聯絡等表達上的問題。通過PPT介紹、展示自己的成果在工程師的職業生涯的任何一個階段都非常重要,它甚至也一定程度上限制了機器人工程師能夠達到的高度。只有能夠把自己的成果清晰地表達給自己的團隊,才能獲得其他人的反饋、通過溝通提高團隊的整體凝聚力和知識水平,這樣自己在團隊能夠獲得更多的認可,有助於團隊整體工作效率的提高。我每年去參加幾次學術會議,都在會議上感覺到一些中國的科研人員走到國際上以後,演講能力很差就會導致他們的科研成果不受重視。當然其他國家的科研人員也是這樣。

  為了寫出美觀的技術報告和畢業論文,你可以開始學習Latex。Latex作為國際國內第一寫作神器,學習資料在網上有很多。Latex的學習和使用同樣也是需要不斷地熟能生巧,多寫多練就熟悉了。寫畢業論文有個問題是怎麼做出精美的向量圖,我推薦Draw Freely | Inkscape,一個比Illustrator更輕量化、但是有些功能反而更強大的免費軟體。

  對於那些想申請出國留學的同學,你要做一個自己個人的成果展示,用網頁的形式呈現比較好。把自己Github連結(如果你按我說的,大學第一天就申請Github賬號,現在已經是一個三年的老油條了)、做過的機器人視訊、寫過的技術報告和文章(最好是英文的)放在上面。

  大四到研究生之前的暑假,最好去一些比較不錯的機器人公司實習一下,比如說大疆。當然你也可以繼續做機器人比賽,比如RoboMasters和大疆的飛行器比賽。

  研究生一年級

  研究生的時候,你的目標比較清晰了,就是做一種機器人至少兩年時間,並從中發掘出可以發表論文的知識點。

  如果做規劃演算法的研究,那麼還要讀偏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的起源和繁榮,幫助了大疆的崛起,深深為這個產業的未來感到激動。我希望這篇文章能夠幫助更多的年輕人進入機器人學的海洋,為未來機器人學的繼續發展貢獻力量。