1. 程式人生 > >如何成為一名機器人工程師

如何成為一名機器人工程師

本文是作者對自己過去學習方式的一個總結,介紹了一個電子工程、機械工程和計算機專業學生從大學一年級到研究生二年級的機器人學習計劃,值得所有人借鑑的總結包括學生和職場人士,一定會給你的學習和工作以及職業規劃有所啟發。

編者按:本文作者YY碩,原文標題《機器人工程師學習計劃》,來自知乎。全文篇幅較長,請收藏閱讀。

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

前言

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

兩年前,我在知乎回答如何定義「機器人」? - YY碩的回答中試圖給機器人做出一個比較仔細的定義,我覺得機器人和人工智慧最大的區別在於是否要和物理世界進行互動。今年初在另一篇知乎回答裡對機器人或人工智慧的研究會幫助我們更好的瞭解人類自己嗎? - YY碩的回答我說到感測器是和物理世界互動的基礎。後來,我又在知乎回答有哪些與控制、機器人等相關的 quotes? - YY碩的回答中提到莫拉維克悖論(Moravec's paradox),談到了機器人學裡公認的難題是在物理世界中實現類人的活動能力。

把之前的回答再翻出來是為了支援以下觀點:機器人學的核心問題是做好和物理世界的互動。現在主流的機器人學分支裡,處理與物理世界的互動的學科分為三類:感測器和處理演算法(鐳射雷達,多目視覺,融合演算法);多剛體系統動力學控制(工業機器人動力學控制和接觸力控制);機器人自主移動(locomotion不知道該怎麼翻譯,輪式、足式、飛行等移動機器人的研究)。我建議對機器人學有興趣的同學著重在這幾個問題上面。

另外,根據世界第一的機器人教育機構卡耐基梅隆大學的機器人學博士的課程分類方式

https://www.ri.cmu.edu/wp-content/uploads/2017/01/COSAug2016.pd

,機器人學有四個核心領域:

  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的團隊應該在招新了,趕快去加入,有了學長學姐的指導以及同輩朋友的鞭策,應該會進步的快一點。

640?wx_fmt=jpeg

編者注: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.phpexample=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個和你現在的水平相當的同學。

640?wx_fmt=jpeg

編者注:大疆RoboMasters夏令營是大疆為理工科學生和機器人愛好者量身打造的暑期科研活動,從2013年開始舉辦。通過自主報名的形式召集百餘名各大高校的學生,在大疆總部進行一個月的專案訓練,由香港科技大學的教授以及行業行業精英進行指導並分組,最後各組之間將自己的研究成果進行驗證。

大三一定要培養出自己一個人獨立造出一個完整機器人的能力,比如一個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 大疆創新。每年我們都在全國範圍內尋找有一定技術基礎的學生,讓他們一起分組做一個自動機器人的挑戰。這個夏令營,作為組織負責人,不謙虛地說,我覺得應該是全世界範圍內最好的技術類夏令營。

640?wx_fmt=jpeg

編者注:圖為挑戰機器人抓取娃娃並準備投入相應顏色框中,此過程機器人為全自動執行,機器人需要通過視覺識別娃娃的顏色與框的顏色。

大三的暑假有一件很重要的事情就是思考自己大四應該幹什麼。一般來說,你現在的能力保本校研究生肯定沒有問題,當然你也可以選擇考其他學校的研究生或者出國留學。雖然說你現在能力已經很全面了,但是你還需要2-3年的時間全面提升自己更多的能力,才能邁向卓越之路。不管是出國還是保研,最重要的目的是給自己爭取到未來2-3年能夠在一個優秀的環境中安心提升自己,有比較好的學習資源,能夠參與到一些不錯的專案中去。可能其他有些行當,出國留學始終是比在國內待著更好的選擇,但是機器人行業並不是這樣。我們國家這兩年在機器人方面提高也很快,而且我們國家現在比較有錢。就像我開始說的那樣,機器人是富人的活動,現在你在國內也能找到一些很有錢的實驗室可以造比較牛逼的機器人。另外國外很多比較強的機器人公司也都在做比較敏感的軍方專案,去找實習可能比較受限制。

出國去學機器人學方面的知識你有很多不錯的選擇,比如世界第一的機器人研究院卡耐基梅隆大學,或者麻省理工學院的CSAIL實驗室。北美傳統計算機四大名校(麻省理工學院,卡耐基梅隆大學,斯坦福大學,加州大學伯克利分校)裡,除了斯坦福大學熱火朝天在搞人工智慧以外,其他幾個學校的機器人研究都很不錯。除了四大名校,你還有很多其他的選擇,就像我開始說的那樣,機器人是富人的活動,如果想接觸到最好的機器人資源,你要選擇有錢的實驗室,而不是有名的實驗室。

另外你還需要在大三的尾巴上選定自己將來的細分研究方向,而且開始往這個方向深挖,也就是我在文章開始提到的感知、認知、行為幾個方向。當然同時你也不能放鬆其他方面的知識,尤其是數學基礎。我在大三的暑假專門找數學系的同學給我開了個數學小講座,學習了一點抽象代數的知識,對我後來學習密碼學幫助很大。同時我也讀了一些拓撲方面的教材(有一本很神奇的書叫做Topopogy Without Tearshttp://www.topologywithouttears.net/),這樣才理解了為什麼數學分析要用奇怪的符號去解釋一些看起來很淺顯的道理。

大三階段的機器人工程師該學什麼基礎數學是眾說紛紜的,在我看來,你要基本掌握“群是什麼”,能夠用代數的眼光去證明"det(AB) = det(A)det(B)",還要能理解“用一張紙就可以變出克萊因瓶”(當然是在四維空間裡)。另外,你這個時候也要能夠意識到自己需要再學一遍線性代數。

大四

大四開始了,你可以開始深挖自己的研究方向,同時也要開始學一些高階一點的通用技術和理論,這時候你和一般的機械、電子、計算機學生就不太一樣了,你雖然也在狂程式設計,但也在狂學習物理和數學。通用技術包括ROS,simulink,gazebo和Vrep等工具。通用理論包括,再學一遍線性代數,學學凸優化、數值計算、旋轉表示法等方面的知識。這些知識你在大四僅僅只能開一個頭,因為你的大四要實習、畢業、考研、畢設,你會非常地忙。有些人會在大四進實驗室和老師發論文,我個人覺得發論文這件事沒必要操之過急。你的整個大學期間應該用在廣泛涉獵各種各樣的知識上面,而不是深入某一個細小的研究問題。

大四可以開始讀一些著名入門書籍,我把這些書不分先後地列出來,你沒有必要全部去讀,而且每本書先讀前幾章就夠了,能讀多少儘量讀多少。

1. 《概率機器人學》,

https://www.amazon.com/Probabilistic-Robotics-Intelligent-Autonomous-Agents/dp/0262201623

2. 《凸優化》,

https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf

3. 《線性系統理論》,

https://www.amazon.com/Linear-System-Electrical-Computer-Engineering/dp/0199959579

4.Multiple View Geometry in Computer Vision

5.《線性估計》 ,

https://www.amazon.com/Linear-Estimation-Thomas-Kailath/dp/0130224642

6. 《機器學習》,周志華老師的書。

7. An Invitation to 3-D Vision,

https://www.eecis.udel.edu/~cer/arv/readings/old_mkss.pdf

8.Modern Control Systems,

https://www.amazon.com/Modern-Control-Systems-12th-Richard/dp/0136024580

9.Rigid Body Dynamics,

http://authors.library.caltech.edu/25023/1/Housner-HudsonDyn80.pdf。說實話剛體動力學理論我沒有找到特別好的書。但是剛體動力學理論很重要。

10.Feedback Systems

An Introduction for Scientists and Engineers,FBSwiki

就像我開始說的那樣,這些書,大部分特別貴,還好有一些業界良心的作者放出了他們書的電子版。當然你也可以去一些名字都不能說的網站去找影印版。

在讀上面這些書的時候,matlab,python都要放在手邊,然後把書裡面的知識儘量實踐出來。很多教科書裡都會在章節後面的習題裡放一些寫明是用matlab做的習題,要儘量多做一些這樣的題。