機器人學的核心問題是做好和物理世界的交互。現(xiàn)在主流的機器人學分支里,處理與物理世界的交互的學科分為三類:傳感器和處理算法;多剛體系統(tǒng)動力學控制;機器人自主移動。
智能機器人會成為未來世界的災難嗎?對機器人或人工智能的研究會幫助我們更好的了解人類自己嗎?人工智能將會怎樣影響我們的生活?諸如此類的問題及文章早已屢見不鮮。但機器人控制如何入門?如何成為一個合格的機器人工程師?這類的問題似乎還沒有一個最全面的答案。在機器人成為熱門話題的當下,作為大學生,要如何制定一個高效全面的機器人學習計劃呢?小編為廣大“機器人狂熱粉”推薦一篇大疆無人機智能導航技術總監(jiān)楊碩的“機器人工程師學習計劃”,或許讀完本文可使機器人工程師學習事半功倍!
前言很多朋友私信問我對機器人和人工智能感興趣,該怎么展開學習。最近稍微有點空,我寫寫我的看法。
兩年前,我在知乎回答【如何定義“機器人”?】的問題中試圖給機器人做出一個比較仔細的定義,我覺得機器人和人工智能最大的區(qū)別在于是否要和物理世界進行交互。今年初在另一篇知乎“機器人或人工智能的研究會幫助我們更好的了解人類自己嗎?”回答中,我說到傳感器是和物理世界交互的基礎。后來,我又在知乎“有哪些與控制、機器人等相關的 quotes?”的回答中提到莫拉維克悖論(Moravec‘s paradox),談到了機器人學里公認的難題是在物理世界中實現(xiàn)類人的活動能力。
把之前的回答再翻出來是為了支持以下觀點:機器人學的核心問題是做好和物理世界的交互。現(xiàn)在主流的機器人學分支里,處理與物理世界的交互的學科分為三類:傳感器和處理算法(激光雷達,多目視覺,融合算法);多剛體系統(tǒng)動力學控制(工業(yè)機器人動力學控制和接觸力控制);機器人自主移動(locomotion不知道該怎么翻譯,輪式、足式、飛行等移動機器人的研究)。建議對機器人學有興趣的同學著重在這幾個問題上面。
另外,根據(jù)世界第一的機器人教育機構卡耐基梅隆大學的機器人學博士的課程分類方式(http://www.ri.cmu.edu/education/COSAug2016.pdf),機器人學有四個核心領域:
1、感知。視覺傳感器、圖像傳感器、觸覺和力傳感器、慣導等。
2、認知。人工智能、知識表達、規(guī)劃、任務調度、機器學習等。
3、行為。運動學、動力學、控制、manipulation和locomotion等。
4、數(shù)學基礎。最優(yōu)估計、微分幾何、計算幾何、運籌學等。
結合卡耐基梅隆大學的核心課程要求,我覺得我定義的機器人學核心問題算是基本沒跑偏的。本文后面談到的機器人項目都是以上述觀點和課程要求為基礎。
一些可能有爭議性的觀點:1、機器人學是富人的活動。雖然工業(yè)越來越發(fā)達,但好的開發(fā)板和電機還是非常貴。如果要下定決心學習機器人學并且做出實物,你必須找到做實物出來的資金。要么是自己花錢,要么就得找學校的機器人社團,或者找什么愿意資助年輕人學習的貴人。另外現(xiàn)在沒有任何一本完整的書可以教你怎么造一個四旋翼空中機器人或者大狗機器人,你需要參考十幾本不同的教科書,這些書不管中文版還是英文版都很貴。
2、機器人學是屠龍之術。這話是Ninebot創(chuàng)始人說的。雖然最近幾年,平衡車、掃地機器人、多旋翼飛行器讓機器人學開始進入人們的生活,但是可行的商業(yè)應用還是很少,而且已有的機器人和理論都還很難解決好與物理世界交互這件事情。所以一定要確保自己在機器人學這個道路上同時練好了能去其他行當吃飯的技能,比如編程、機械設計和硬件設計。也要做好心理準備,接受自己有可能在學會屠龍之術以后幾年都造不出對社會有用的東西的事實。
3、基于上述所說的觀點,如果是已經(jīng)工作之后才想要學習機器人的話,可能已經(jīng)太遲了,因為很可能興趣戰(zhàn)勝不了客觀限制因素。如果作為興趣去學習,只能學到做巡線小車和舵機機械臂什么的,可能也滿足不了中二病的創(chuàng)造欲。
個人認為機器人學是一個艱苦的道路,想要成為一個獨擋一面的機器人工程師需要多年理論和實踐的同步訓練。理論學習和動手實踐的過程還要互相排好時間表,在做某個實踐項目的同時去學習最相關理論往往可以達到事半功倍的效果,但是同時那些不太相關的理論會看起來非常枯燥,因此如何妥善安排自己的實踐項目也是很重要的事情。
這篇文章里我計劃介紹一個電子工程、機械工程和計算機專業(yè)學生從大學一年級到研究生二年級的機器人學習計劃,基本是我對自己過去學習方式的一個總結。按照這個方法來學習,能夠成為一個能力全面,但是稍微偏軟件一點的機器人工程師。這個六年的學習計劃,估算下來,全年中每天在上課和完成課程要求之外要投入學習時間6-8個小時,這些時間一方面用于閱讀課程知識的英文教材,一方面用于閱讀其他學科的教材,一方面用于實踐項目。
機器人工程師在大型項目里的定位類似于飛機系統(tǒng)里的總體設計師。和機械工程師、硬件工程師、軟件工程師、算法工程師、控制工程師比起來,機器人工程師參與某個具體技術的時間較少,但是能夠聽得懂所有工程師說的話,能夠作為不同模塊間的協(xié)調人,帶領整個團隊去攻堅。當然如果機器人工程師能夠在一個領域達到那個領域的工程師的優(yōu)秀水平,肯定更好。
由于時間倉促,再加上個人水平有限,文章中如有紕漏和錯誤,恭請讀者指出,謝謝。如果同學還有什么想知道的內容和教材,也歡迎留言交流。
大一
剛上大一,你的機器人生涯開始了。先看看學校的校園網(wǎng)能不能翻墻,不能的話自己去買個一年一百多塊錢的VPN,先確保自己能上Google,不要心疼VPN的錢,這能讓你在之后的職業(yè)生涯里節(jié)省上萬塊錢。然后去注冊一個gmail賬號,再注冊stackoverflow賬號,再注冊github的賬號,再注冊CSDN賬號,注冊完登錄上去逛逛,暫時先不要問為什么。
英語水平一定程度上會是機器人工程師水平的限制因素,英語是同學們在大學最該努力學的一門課,而且不止要把它當成課,要當成一種技能,當成生活的一部分。當你開始努力學習一些高級的機器人知識以后,有可能會非常難以找到中文的參考資料,這個時候如果啃不下英文的資料,進步速度和眼界就會受到很大影響。因此大一的時候要多看看紅寶書,看看美劇。
不管是什么專業(yè)背景的同學,大學一年級一定要上好的課是微積分和線性代數(shù)。線性代數(shù)的重要性需要特別強調。一般來說,優(yōu)秀的工程師和科學家在職業(yè)生涯中要學至少五次線性代數(shù),大一學一遍、學凸優(yōu)化的時候學一遍、學線性系統(tǒng)的時候學一遍、學機器學習的時候學一遍……如果在第一遍學的時候就看到對的書,刷到對的題,那么以后的學習會輕松很多。
網(wǎng)上有很多對于如何學好線性代數(shù)的討論,比如知乎問題如何理解線性代數(shù)? - 數(shù)學學習。Matrix67大神的文章隨記:我們需要怎樣的數(shù)學教育?也很有啟發(fā)。我個人對學習線性代數(shù)的建議是兩本書,一本叫做《Linear Algebra Done Right》,另一本叫做《Linear Algebra Done Wrong》(https://www.math.brown.edu/~treil/papers/LADW/book.pdf),我比較喜歡的是Done Wrong這本書,第一它是免費的,第二只需要讀前6章兩百頁就夠了,第三它頁邊距很大,打印出來有很多空白做練習題。另外一個較好的教材是麻省理工公開課:線性代數(shù)。不論如何,學線性代數(shù)一定要用國外的教材,千萬不要用國內的教材。啃英文書很累,但是考慮到之后還要啃更多的英文書,線性代數(shù)已經(jīng)算是很入門的了,一定要啃下來,同時還要刷足夠多的課后題。
學完線性代數(shù)以后,一個自然而然的問題就是怎么能用計算機自己去計算矩陣的乘法、向量的乘法、向量的內積。因此引入了編程的學習。
不管同學的專業(yè)是什么,一定要在大學一年級盡早開始學編程。至于用哪種語言開始學習編程,我推薦Python,比較好的教材是麻省理工學院公開課:計算機科學及編程導論,比較好的Python開發(fā)學習環(huán)境是Anacoda (http://www.continuum.io/downloads)。熟悉Python以后,同學就可以開始玩玩Python的數(shù)值計算包Numpy,這個時候線性代數(shù)題基本上也刷的差不多,可以通過Numpy幫助自己解決線性代數(shù)問題了。
對任何人來說,Python是一把瑞士軍刀,你可以用他干很多東西,比如自動回復郵件、自動收集信息。但是真要去造機器人,合適的工具并不是瑞士軍刀,而是C/C++這樣簡單粗暴的錘子和螺絲刀般的工具。在學習Python學到一定程度的時候(比如你聽說有一種叫做cython的東西),最好開始學習C,而且要強迫自己練習用C的一維數(shù)組和指針來實現(xiàn)矩陣的加法、乘法、求逆等操作。之所以有高級的Python或者Java(不要問我Java哪里高級了)這些語言以后我們還需要去學C,是因為機器人上常用的不是完整的電腦,而是計算量有局限的嵌入式系統(tǒng),嵌入式系統(tǒng)開發(fā)基本只能用C或者更低級的語言。
學習C我個人入門用的是清華大學出版的《C++語言程序設計》。雖然這個書標題是C++,但其實沒什么太大問題。不過國內的C語言教材都有個巨大的問題是不引導學生去用Linux。近年來更好的一個教材是http://songjinshan.com/akabook/zh/index.html,這個網(wǎng)站的教材非常好,因為他教育學生用Linux環(huán)境作為程序編譯的環(huán)境,而且還引入了一些計算機體系結構的介紹。
IT行業(yè)的程序員都會爭論高級語言和低級語言哪個好,Linux和Windows哪個好,而對于機器人工程師來說,從現(xiàn)在到可預見的未來里,C是最好的語言,Linux是最好的操作系統(tǒng),這都毋庸置疑。甚至對于Linux的發(fā)行版該選哪個,我們都是很少有質疑的:Ubuntu。原因是機器人操作系統(tǒng)ROS是基于Ubuntu開發(fā)的,因此在Ubuntu上運行最穩(wěn)定。注意Ubuntu出了一個中文版叫做Kylin,個人感覺比較坑,建議大家不要裝中文版。Ubuntu 作為一個開源操作系統(tǒng),總是在快速迭代,2016年8月比較穩(wěn)定的版本是14.04和16.04,建議同學安裝14.04。
當你把C學得差不多,開始要學寫包含多個頭文件的程序時,一定要同時學習makefile的知識。這時候要上網(wǎng)去搜“Makefile詳解”這篇文章看。
我自己在大學一年級的時候還學習了HTML和Javascript,到大一結束的時候已經(jīng)能夠熟練用Javascript手寫一些動態(tài)頁面。我個人覺得HTML和Javascript也是機器人工程師必備的技術,而不只是軟件工程師的玩具。這是因為web技術實際上已經(jīng)滲透到了編程的方方面面,比如json開始是Javascript里的一種object定義的方式,但現(xiàn)在已經(jīng)成為了一種很標準的數(shù)據(jù)交互、參數(shù)配置的格式。另外AJAX能夠幫助初學者理解一定的網(wǎng)絡技術原理,而網(wǎng)絡技術也是機器人工程師必備的技能。再者,制作GUI(圖形用戶界面)是常規(guī)debug的辦法,而近年來一個流行的趨勢是用webkit嵌入程序用HTML和Javascript作為圖形界面的后端,而在機器人操作系統(tǒng)ROS(ROS.org | Powering the world’s robots)里,通過rosbridge可以非常方便地把機器人程序的數(shù)據(jù)傳遞到websocket上,這句話看不懂沒關系,反正你知道學學HTML和Javascript很重要就是了。更重要的是,HTML文檔背后的DOM (Document Object Model)深刻地體現(xiàn)了面向對象的思想。大學中的面向對象程序設計一般都講C++,在我看來應該講HTML和Javascript。這一點不細說了,如果同學們去學習HTML和Javascript,自然會體會到。學習HTML和Javascript比較好的資料是http://www.w3schools.com/,把網(wǎng)站左側的“Learn HTML”、“Learn CSS”、“Learn Javascript”和“Learn JQuery”學完就行,別的部分還有很多花哨的技術,沒有必要去學了。
以上介紹的這些知識點、書和資料應該在大一期間就全部看完,然后利用大一的暑假好好鞏固這些知識。比如開始用HTML和Javascript做一個自己的個人主頁,刷一刷編程的題目,學用Python的奇技淫巧(比方說做一個自己的個人主頁)。另外還可以抽時間學學數(shù)學知識,比如開始看看代數(shù)和離散數(shù)學。我大一的時候看到了兩篇文章,認識到了數(shù)學的重要性,一個是MIT的CV大牛林達華寫的[轉]MIT牛人解說數(shù)學體系,另一個是前Goolge研究員吳軍博士寫的《數(shù)學之美》(數(shù)學之美 (豆瓣))。當時林達華還在MIT讀博士,而《數(shù)學之美》還沒有成書。兩篇文章看完以后我感覺自己整個人對數(shù)學的認識上了一個新的層次,此后一直在注意提高自己的數(shù)學水平,幾年下來覺得收益很大。在之后的介紹里我還會多次強調需要學的數(shù)學知識和對應的教材。
大二
上大二的時候,你已經(jīng)會了基本的編程知識和基本的數(shù)學知識。大二這一年應該投入在嵌入式系統(tǒng)的學習中,同時繼續(xù)拓展自己多方面的能力。學校的機器人社團,比如做Robocon,RoboMasters的團隊應該在招新了,趕快去加入,有了學長學姐的指導以及同輩朋友的鞭策,應該會進步的快一點。
大二應該掌握的技能:Solidworks畫基本的機械圖,基本的數(shù)字電路知識、數(shù)模轉換,51單片機、AVR單片機、STM32單片機原理,UART、SPI、I2C、CAN等協(xié)議的原理和數(shù)據(jù)收發(fā),STM32開發(fā)板的使用,電機轉動和驅動的原理,PID的原理,調試四輪機器人底盤的移動,基本的傳感器如陀螺儀、碼盤、紅外線、超聲波的原理和讀取方式,網(wǎng)絡知識如配置IP配置路由器等,微電子焊接,金工技術。我在知乎回答如果程序員每天都淺嘗輒止地學一些不同的新技術,長久以往,人會變成什么樣子呢? - YY碩的回答里談過機器人工程師需要的技能數(shù)量是IT行業(yè)全棧工程師技能數(shù)量的三倍以上,這些技能的基礎都應該在大二開始積累。
如果同學們的專業(yè)是機械工程相關,那么大二的時候要深入學習solidworks做圖,買機械加工手冊學習各種機械的奇技淫巧。你的專業(yè)知識還不足以讓你進行縝密的受力分析,不過你可以盡量多做一些機械結構出來感受它們的樂趣。
如果同學們的專業(yè)是硬件、電路相關,那么大二的時候要深入學習Altium Designer做圖、制板、焊板。你要從現(xiàn)在開始,就給自己積累一個工作記錄,可以就是簡單的txt文件,記錄你做過所有板子的bug、解決方案、學到的原理圖、PCB layout的注意事項等等。積累很多年以后,你的這個工作記錄會值很多錢。
學習這些技能的最好的方式,就是參加自己學校機器人社團的訓練和方案設計。一般來說,學校的機器人社團招新之后會有訓練和測試,讓新人分組去做機器人,這個過程中如果愿意努力學,提高得會很快。如果你所在的大學是機器人比賽強校,比如西安交通大學,電子科技大學,哈爾濱工業(yè)大學,華中科技大學,東北大學等等(排名不分先后,沒有提到你們學校名字的話我表示抱歉),那么你很幸運,你們學校的機器人社團有很好的積淀,有很多資源可以幫助你學習。基本上只要天天泡實驗室,保證自己每天只睡6-7個小時(但還是要多去跑步、游泳保持身體健康),勤于向學長學姐請教,那么一定會提高得很快。
大二階段特別要強調的是對動手能力的培養(yǎng),包括機械材料的加工、電路焊接、制作導線和接頭、連接路由器、配置網(wǎng)絡、做網(wǎng)線等等。機械加工的工具有螺絲刀、鋸、鉆、錘子、車床、銑床、鉆床,進階選手可以學一下氧焊,這個比較危險,我沒嘗試過;電路焊接的工具有焊機、焊錫、洗板水、松香、吸錫器;制作導線的工具有剪子、剝線鉗、夾頭鉗、網(wǎng)線鉗各種鉗;網(wǎng)絡配置就是連連路由器插插網(wǎng)線,但是Linux系統(tǒng)下配置網(wǎng)絡有時會非常麻煩,一定要多積累這方面的知識,因為將來你造的機器人多半會頂著一個無線路由器跑來跑去,甚至有的機器人上各個模塊自己就能組起一個小局域網(wǎng)。這些技能的熟練掌握需要你花很多時間去做真正能用的機器人來練手。
對于該選擇造一個怎么樣的“真正能用的機器人”練手,最好的選擇肯定是機器人比賽中的機器人。如果參加Robocon,你會跟著學長學姐們學著造有人那么高的巨大機械;如果參加RoboMasters,你會學著造比汽車還要靈活的機器人以及快速發(fā)彈的機構。其他一些小型的比賽比如飛思卡爾智能車,也是很好的訓練,因為飛思卡爾智能車已經(jīng)發(fā)展得很成熟,參加這個比賽的參賽資料就夠學一陣子的,學完以后能夠獲得比較多的機器人技能。
如果沒有太多學校機器人社團的資源,同學們還有一些小型的比賽比如挑戰(zhàn)杯、大創(chuàng)比賽等等可以選擇,以三五個人的小團隊參與這些比賽。如果同學所在的學校連這些比賽都不組織大家參與,那就只好自己花錢了。國內開源機器人社區(qū)有很多資源可以利用來學習,比如自己買Arduino STEM educational Robot kits Building Platform的各種開發(fā)套件做簡單的機器人。Arduino的開發(fā)環(huán)境可能有些人不喜歡,因為它對硬件做了一級封裝,如果更希望接觸到單片機的本質,可以自己買STM32開發(fā)板學習。俗話說,沒有什么嵌入式系統(tǒng)是一塊STM32實現(xiàn)不了的,如果有,就用兩塊。STM32是ARM Cortex?M家族中最為廣泛應用的一款單片機,在網(wǎng)上也有很多的教材和開發(fā)板可供選擇。在國內著名的電子論壇STM32/8 分論壇帖子清單 (amoBBS 阿莫電子論壇)上,有很多參考資料,有問題也可以在這里和大家討論學習。
如果你很想?yún)⒓訖C器人比賽,身邊也恰好有一些志同道合的小伙伴,但是學校不支持。沒關系,來找我,我盡量通過大疆的關系說服你們學校支持你們參加RoboMasters。
雖然你是以機器人比賽為主線在探索機器人技術,但是要時刻記得,機器人比賽給你的理論方面的訓練很差,還會讓你養(yǎng)成一些壞習慣,比如凡事都希望用一些糙猛快的辦法來解決。由于通常整個團隊都沒有太多的項目管理經(jīng)驗,到比賽前一段時間才會加緊功夫去做機器人,很多時候就會用“山寨”的辦法去處理機器人的故障。比如說某個承重結構用久了會彎,為了趕比賽的進度,就拿錘子敲直了、再加一條輔助的結構在旁邊繼續(xù)用,而沒有細致地去做建模、受力分析,思考是什么原因導致承重結構會變形。再比如說調PID參數(shù)就是生調亂改,而沒有基于機器人的動力學模型去估測參數(shù)的大概范圍。
大二的暑假,有可能你跟著學校的機器人隊參加了一些機器人比賽。這是一個反思總結的好時機,為什么機器人隊取得了這樣那樣的成績?整個團隊怎樣才能更有效率?明年如何繼續(xù)招新?暑假要把時間花在技術積累上面,這個時候可以回頭思考思考之前準備比賽時用糙猛快的辦法解決的問題如何能夠細致地去解決。
如果大二的暑假沒有參加機器人比賽,可以做一個舵機機器人,比如6條腿的蜘蛛,比如碼垛機器人。舵機是機器人工程師的好朋友,一定要好好掌握。
另外你其他方面的能力也不能落下。大二結束的時候,你的Linux應該用的很熟練了,除了makefile,你也用起了cmake。你也應該開始理解Github存在的意義,因為你已經(jīng)上去讀了很多別人的代碼,你也把自己的一些課程設計和小項目放在了Github上面。另外大二基本上了本專業(yè)一些比較難的基礎課程,比如自動控制原理、機器學習、概率統(tǒng)計、材料和力學等課程,同學們會看到這些課程里又用到了線性代數(shù)和微積分的知識,以及建模的知識。這時候可以把大一的物理、線性代數(shù)和微積分再翻出來看看。
同學的學校應該給大二到大三的學生有開設面向對象的程序設計,一般用Java或C++教授。在面向對象的程序課里面,一定要積累3000行左右的代碼的開發(fā)經(jīng)驗。經(jīng)典的面向對象程序設計的練習通常是寫游戲,比如俄羅斯方塊,吃豆人等等,一定要自己能夠做到完全手寫一個完整的項目出來。
另外你可以開始學習Matlab當中的神器Simulink了。在大二這一年的學習中,你可能在不少課程里多多少少用到了Matlab。假設你已經(jīng)在我的推薦下喜歡上了Python,你可能會覺得Matlab的計算工具沒有比Python強多少;假設你自己在別人的推薦下喜歡上了mathematica,你可能會覺得和Mathematica這種神一樣的語言比起來,Matlab弱爆了。但是要注意的是,Matlab最強大的工具是Simulink,通過它你幾乎可以仿真一切的物理系統(tǒng)和控制系統(tǒng)。我建議同學可以通過Simulink實現(xiàn)一個倒立擺,然后理解Matlab的強大之處。閱讀并實現(xiàn)了這兩篇文章里的內容,同學應該會對倒立擺有了比較深刻的認識。倒立擺是機器人學中一個非常重要的模型,因為火箭、導彈、雙足機器人、四足機器人,基本都是倒立擺的變形。你自己實現(xiàn)出來的simulink模型一定要存好,以后可能還會再拿出來仔細看。
如果你按照我之前說的方法探索了一些HTML和Javascript的技術,那么JQuery,bootstrap,AngularJS你已經(jīng)多多少少知道是怎么回事了。web后端的技術,比如PHP和MySQL,也可以了解一下,LAMP要學會怎么配置。如果有同學找你幫忙寫小網(wǎng)站,盡量去幫個忙,幫別人做網(wǎng)站是提高自己系統(tǒng)編程能力的好練習。在做網(wǎng)站的過程中你可能還會順便學一學如何用Photoshop和Illustrator讓網(wǎng)站顯得更漂亮。這些技能有最好,沒空學也沒關系。
評論
查看更多