0
雷鋒網(wǎng)AI科技評(píng)論按,本文轉(zhuǎn)載自公眾號(hào)Nao,作者邱強(qiáng),AI 科技評(píng)論已獲授權(quán)。
我在Github上發(fā)起了一個(gè)開(kāi)源機(jī)器人學(xué)自學(xué)指南,地址是:https://github.com/qqfly/how-to-learn-robotics。
第一版本放在公眾號(hào)里發(fā)出:
目錄
零. 前前言
一. 前言
二. 先修知識(shí)
三. 入門(mén)
四. 實(shí)踐
4.1 動(dòng)手
4.2 Penn's Robotics Specialization
4.3 ROS
五. 進(jìn)階
5.1 數(shù)學(xué)
5.2 Modern Robotics
5.3 控制
5.4 運(yùn)動(dòng)規(guī)劃
5.5 機(jī)器學(xué)習(xí)
5.6 強(qiáng)化學(xué)習(xí)
5.7 最新論文
六. 勇者斗惡龍
七. 參考文獻(xiàn)
零. 前前言
本文中含有不少公式,為了方便編輯,采用的是 Latex 格式書(shū)寫(xiě)。但是,Github Markdown 不支持 Latex,為了方便閱讀,建議采用 Chrome 瀏覽器,并安裝插件 TeX All the Things。安裝后,即可將網(wǎng)頁(yè)上的 Latex 公式轉(zhuǎn)換成大多數(shù)人能看懂的形式。
部分復(fù)雜的公式會(huì)用 在線LaTeX公式編輯器 轉(zhuǎn)換成圖片插入。
本教材寫(xiě)作時(shí)間很短,所以肯定有疏漏。因此放在這里作為一個(gè)開(kāi)源項(xiàng)目,大家可以隨時(shí)修改并提交 Pull Request;有問(wèn)題也可以提 issue。
一. 前言
RVBUST INC. 成立半年有余。面試過(guò)不少?gòu)氖聶C(jī)器人研究的小伙伴后,我發(fā)現(xiàn)一個(gè)問(wèn)題:絕大多數(shù)大陸的畢業(yè)的學(xué)生都不像是「科班出身」的。
當(dāng)然,如果僅從工作教育經(jīng)歷上看 —— 大部分畢業(yè)于機(jī)電、計(jì)算機(jī)專(zhuān)業(yè),甚至是研究機(jī)器人的實(shí)驗(yàn)室,有過(guò)機(jī)器人公司的工作經(jīng)歷 —— 這些人應(yīng)該都算是「專(zhuān)業(yè)選手」。
但是,從面試情況上看,絕大多數(shù)人都不具備機(jī)器人學(xué)的完整知識(shí)體系:畫(huà)電路板的小伙伴不知道怎么進(jìn)行機(jī)器人工作空間分析;設(shè)計(jì)機(jī)構(gòu)的小伙伴不知道怎么把動(dòng)力學(xué)用在控制上;做控制算法的小伙伴不知道什么的構(gòu)型空間(Configuration Space);做運(yùn)動(dòng)規(guī)劃的小伙伴不知道什么是Q-learning;做深度強(qiáng)化學(xué)習(xí)的小伙伴不知道學(xué)習(xí)到的控制指令要怎么讓實(shí)際機(jī)器人運(yùn)動(dòng)起來(lái)。
從我這幾年的學(xué)習(xí)經(jīng)歷上看,我是能理解這一現(xiàn)象的。博士剛?cè)雽W(xué)的時(shí)候,我接下了師兄的 SmartPal 機(jī)器人。靠著師兄的「祖?zhèn)鞔a」,也曾狐假虎威地在外賓面前做過(guò)一些演示:

但是,當(dāng)我后來(lái)真正開(kāi)始看這些「祖?zhèn)鞔a」的時(shí)候,我發(fā)現(xiàn)實(shí)際發(fā)給機(jī)器人的只有幾個(gè)關(guān)節(jié)位置點(diǎn)而已。
「PID 在哪里???」
這是我當(dāng)時(shí)產(chǎn)生的最大疑問(wèn)。這個(gè)代碼邏輯跟我本科玩得四旋翼、智能車(chē)等都完全不一樣!
于是,拿著這個(gè)疑問(wèn),我在實(shí)驗(yàn)室問(wèn)了一圈,沒(méi)有得到答案。即使后來(lái),我選修了好幾門(mén)跟機(jī)器人相關(guān)的研究生課程。經(jīng)過(guò)一年的學(xué)習(xí),我還是沒(méi)有得到答案。
是的,作為國(guó)內(nèi)最早開(kāi)展機(jī)器人研究的院校之一,這里的機(jī)器人研究生課程只教我們?nèi)绾谓?DH 坐標(biāo)系,動(dòng)力學(xué)只是簡(jiǎn)單計(jì)算了一個(gè)平面三連桿。根本沒(méi)有涉及控制、軌跡規(guī)劃的內(nèi)容,甚至連運(yùn)動(dòng)學(xué)逆解也沒(méi)有要求大家計(jì)算。
據(jù)我所知,很多其他研究機(jī)構(gòu)也是如此,機(jī)器人學(xué)這塊還沒(méi)有形成完整的教學(xué)體系。所以,基本上學(xué)生都沒(méi)有接受過(guò)完整的機(jī)器人學(xué)系統(tǒng)教育,只有在做項(xiàng)目的時(shí)候通過(guò)自學(xué)掌握項(xiàng)目所需的內(nèi)容。這也就造就了一大批沒(méi)有算過(guò)機(jī)器人運(yùn)動(dòng)學(xué)逆解的機(jī)器人專(zhuān)業(yè)博碩士生。
當(dāng)然,并不是說(shuō)「運(yùn)動(dòng)學(xué)逆解」、「軌跡插補(bǔ)」之類(lèi)的知識(shí)有多難。我想強(qiáng)調(diào)的是,在大陸,一個(gè)學(xué)生只通過(guò)上課,無(wú)法掌握、甚至是無(wú)法接觸到這些機(jī)器人學(xué)中非?;A(chǔ)的知識(shí)。
當(dāng)然,這一情況在大陸比較普遍,而國(guó)外或者港臺(tái)高校畢業(yè)的學(xué)生,基本上都沒(méi)有這個(gè)問(wèn)題。國(guó)外或者港臺(tái)高校在機(jī)器人學(xué)這塊的教學(xué)體系相對(duì)比較完整,基本上大作業(yè)都會(huì)覆蓋主要的知識(shí)點(diǎn),并且大都要求編程實(shí)現(xiàn)。
雖然,大多數(shù)小伙伴都是「非科班出身」的,但是,根據(jù)我的經(jīng)驗(yàn),大陸的學(xué)生還是非常聰明的,基本只要得到一些簡(jiǎn)單的正確引導(dǎo),就能很快通過(guò)自學(xué)掌握這些知識(shí)。所以,我們不妨來(lái)看看「非科班出身」如何學(xué)習(xí)機(jī)器人學(xué)吧。
二. 先修知識(shí)
當(dāng)然,先修知識(shí)會(huì)隨著研究深度的變換而不同,尤其是數(shù)學(xué),數(shù)學(xué)就像是寫(xiě)輪眼,看同一個(gè)石碑,不同層次的「寫(xiě)輪眼」所看到的內(nèi)容也完全不同。

但是,由于機(jī)器人學(xué)涉及面廣,不同方向所需要的基礎(chǔ)知識(shí)也完全不同,如果一開(kāi)始就陷入「先修知識(shí)」的泥潭中,可能就得不償失了。
所以,我認(rèn)為,可以先列一些真正必須掌握的先修知識(shí),其他的在后續(xù)相應(yīng)部分提及即可:
1.基本的英文:在機(jī)器人方面,目前基本上沒(méi)有非常合適的中文教材可以推薦。寫(xiě)得深入淺出的教材都是國(guó)外的,大家必須學(xué)會(huì)閱讀英文文獻(xiàn)。這個(gè)過(guò)程一開(kāi)始肯定是痛苦的,但是,基本上堅(jiān)持一個(gè)月就會(huì)習(xí)慣了。
2.學(xué)會(huì)使用 VPN。原因同上,基本上有用的資料都需要通過(guò) Goolge 或 Youtube 獲取。
3.線性代數(shù):所有的空間變換、機(jī)器人相關(guān)計(jì)算都依賴(lài)于線性代數(shù),甚至需要有一些基本的"線性空間"思維。對(duì)于線性代數(shù),我首推 Prof. Gilbert Strang 的《Linear Algebra》,在 Youtube 和網(wǎng)易公開(kāi)課上可以找到視頻。這門(mén)課一開(kāi)始就引導(dǎo)大家從空間的角度看待問(wèn)題,而不像國(guó)內(nèi)高校,只要強(qiáng)調(diào)如何計(jì)算。而且,網(wǎng)易公開(kāi)課上有中文字幕,對(duì)于初學(xué)者也還算友好。
4.微積分:機(jī)器人里,所有涉及到導(dǎo)數(shù)、積分、優(yōu)化的地方,都會(huì)有微積分的影子。所以,這門(mén)數(shù)學(xué)課也是一開(kāi)始就繞不開(kāi)的。我沒(méi)有太好的視頻推薦,不妨也看看 Gilbert Strange 的《微積分重點(diǎn)》?
5.理論力學(xué):機(jī)器人學(xué)就是每天與力打交道。但是一般機(jī)器人教材里都不會(huì)仔細(xì)推導(dǎo)空間變換、虛功原理、拉格朗日等力學(xué)理論,而且這些東西又相對(duì)抽象,很多初學(xué)者的自學(xué)過(guò)程就是被截殺在動(dòng)力學(xué)章節(jié)的。當(dāng)然,這部分我也沒(méi)有太好的推薦資料,學(xué)堂在線上有清華高云峰老師的《理論力學(xué)》公開(kāi)課,也可以參考一下。(但至少我當(dāng)年上他的課總是犯困)。
6.Matlab or Python:這兩個(gè)是非常容易上手,且非常方便數(shù)據(jù)可視化的編程語(yǔ)言。大家在學(xué)習(xí)機(jī)器人學(xué)的過(guò)程中,能非常容易地通過(guò)這類(lèi)腳本語(yǔ)言實(shí)現(xiàn)一些算法,從而用于驗(yàn)證自己的推導(dǎo)結(jié)果。當(dāng)然,這兩部分只要掌握基本的矩陣操作和可視化操作就可以了。其他更高級(jí)的用法可以之后再學(xué)習(xí)。Coursera 上很容易找到這兩門(mén)語(yǔ)言的入門(mén)課程 Matlab、Python。
7.控制理論:機(jī)器人學(xué)是離不開(kāi)控制的,但是機(jī)器人學(xué)教材一般不會(huì)過(guò)多介紹這塊。當(dāng)然,目前大多數(shù)工業(yè)機(jī)器人都還是使用比較簡(jiǎn)單的算法,但是,作為研究者,有必要了解一些基本的控制理論,例如 PID、狀態(tài)方程、可觀性、可控性、李雅普諾夫、最優(yōu)控制、一點(diǎn)點(diǎn)非線性控制與一點(diǎn)點(diǎn)智能控制等。這塊我基本是在學(xué)校上課,沒(méi)有太好的公開(kāi)課推薦,可以先試試學(xué)堂在線上的課程。

8.數(shù)字電路與模擬電路:機(jī)器人是一門(mén)實(shí)踐科學(xué),只有當(dāng)你把你推導(dǎo)的公式寫(xiě)成代碼、并最終讓實(shí)際機(jī)器人按照你的想法動(dòng)起來(lái)的時(shí)候,才說(shuō)明你掌握了相關(guān)知識(shí)。數(shù)電模電的知識(shí)可以讓你對(duì)邏輯電路有個(gè)基本了解,不至于后面連為什么電機(jī)前面要加一個(gè)驅(qū)動(dòng)器都不知道;同時(shí),在身邊沒(méi)有實(shí)際機(jī)器人的情況下,自己搭個(gè)小電路做一些控制實(shí)驗(yàn)也是非常方便的。這塊知識(shí)可以隨便找本教材看看,例如我當(dāng)時(shí)上的是唐慶玉老師的教材。
9.一點(diǎn)點(diǎn)單片機(jī):要想制作簡(jiǎn)單的實(shí)驗(yàn)用控制電路,只有數(shù)電模電知識(shí)是不夠的,還要能將這些知識(shí)轉(zhuǎn)換成實(shí)際的電路,并且能將運(yùn)行代碼,那么就需要會(huì)單片機(jī)。對(duì)于單片機(jī),可以網(wǎng)上隨便買(mǎi)一些帶伺服電機(jī)控制教程的最小系統(tǒng)板,學(xué)學(xué) Arduino 或 STM32,當(dāng)然,如果能參加個(gè) RoboMaster 或者飛思卡爾智能車(chē)大賽什么的是最好了,可以對(duì)嵌入式的各個(gè)模塊有個(gè)基本了解。
10.Linux 和 C 語(yǔ)言:現(xiàn)在有了電路部分,我們需要將公式代碼變成電路指令,這就涉及嵌入式的編程了。這塊建議學(xué)一點(diǎn) C 語(yǔ)言。嵌入式對(duì) C 的要求其實(shí)并不高,隨便學(xué)點(diǎn)語(yǔ)法就夠了,例如《C語(yǔ)言入門(mén)》。但是,如果未來(lái)想做一些更加上層的工作,最好一開(kāi)始就把 C 學(xué)好。學(xué)編程,Linux 是個(gè)不錯(cuò)的選擇,所以,這時(shí)候,可以嘗試按照個(gè) Linux 系統(tǒng),在上面學(xué)習(xí) C 語(yǔ)言。
11.基本的3D設(shè)計(jì):在制作實(shí)驗(yàn)平臺(tái)的時(shí)候,經(jīng)常會(huì)遇到需要加工設(shè)計(jì)小零件的情況,這時(shí)候掌握一個(gè)3D設(shè)計(jì)軟件可以大大提高開(kāi)發(fā)速度,例如 SolidWorks 就是個(gè)不錯(cuò)的選擇。配合上 3D 打印機(jī)之類(lèi)的工具就可以實(shí)驗(yàn)快速原型設(shè)計(jì)了。(即使沒(méi)有 3D 打印機(jī),在網(wǎng)上也可以很容易找到 3D 打印服務(wù),把你設(shè)計(jì)的 3D 文件發(fā)過(guò)去就可以了)。
上面這些知識(shí),基本是一個(gè)自動(dòng)化專(zhuān)業(yè)或者機(jī)電專(zhuān)業(yè)大三學(xué)生應(yīng)該達(dá)到的水平。如果對(duì)上述幾部分有了基本了解,就可以開(kāi)始看機(jī)器人學(xué)的知識(shí)了。
三. 入門(mén)
對(duì)于入門(mén)部分,實(shí)際上就是了解如何讓一個(gè)工業(yè)機(jī)器人動(dòng)起來(lái)。這方面其實(shí)研究已經(jīng)非常成熟了,大家看上個(gè)世紀(jì)的教材就行,個(gè)人推薦的是 John Craig 的教材 《Introduction to Robotics: Mechanics and Control》[1],在 Youtube 和網(wǎng)易公開(kāi)課都可以找到斯坦福 Oussama Khatib 大神的視頻,基本與 Craig 的教材內(nèi)容相匹配。

建議從 Craig 的教材開(kāi)始就看英文版本,Google 一下,很容易找到 PDF 版本。作為一本入門(mén)教材,Craig 的教材是相當(dāng)深入淺出的,配合著 Khatib 的視頻,可以快速掌握機(jī)器人學(xué)的基礎(chǔ)。
我常對(duì)剛?cè)雽W(xué)的師弟們說(shuō),「如果你把這本書(shū)的內(nèi)容掌握了,就已經(jīng)超過(guò)實(shí)驗(yàn)室絕大多數(shù)師兄師姐了?!?/p>
然而,真正把教材啃下來(lái)的并不多。
所以,我在這里要換個(gè)說(shuō)法了,「如果你把這本書(shū)的內(nèi)容掌握了,就可以勝任國(guó)內(nèi)絕大多數(shù)機(jī)器人公司的開(kāi)發(fā)工作了。」
// 在 Github 上,我有對(duì) Craig 書(shū)上的內(nèi)容進(jìn)行大概的梳理,在公眾號(hào)中就先省略了。
四. 實(shí)踐
看完 Craig 的書(shū)后,你應(yīng)該對(duì)工業(yè)機(jī)器人的原理有了一個(gè)大概的概念,但是,你缺乏實(shí)際動(dòng)手經(jīng)驗(yàn),不清楚如何將書(shū)上的東西應(yīng)用到實(shí)際機(jī)器人上。機(jī)器人畢竟是一個(gè)實(shí)踐性的學(xué)科,一直停留在理論,不僅無(wú)用、而且無(wú)趣。
4.1 動(dòng)手
如果是本科生的話,非常建議參加一些比賽,如 RoboMaster、飛思卡爾智能車(chē)大賽、電子設(shè)計(jì)大賽等;也可以加入學(xué)校的一些科技組織,例如清華的天空工廠。主要是熟悉各種電子電路、培養(yǎng)動(dòng)手能力。
但是,以我的觀察,很多科技比賽大牛,在理論學(xué)習(xí)上往往比較弱。這主要是因?yàn)榭萍急荣悘?qiáng)調(diào)的是系統(tǒng)能力,決定比賽結(jié)果的往往是一些小 tricks,而非理論知識(shí);而且,比賽容易讓人產(chǎn)生一種虛假的充實(shí)感,每天都很忙碌,但是可能只是在重復(fù)低級(jí)工作。這兩個(gè)原因很容易讓人陷入 local minima,無(wú)法在理論方面更進(jìn)一步。
所以,我有個(gè)不成熟的小建議。參加比賽和學(xué)生科技活動(dòng)的話,有過(guò)兩次完整的經(jīng)歷就夠了。之后應(yīng)該迅速將重點(diǎn)轉(zhuǎn)向理論學(xué)習(xí)。
如果身邊有可以玩的機(jī)器人硬件,也可以嘗試玩一玩,或者在 RobotStudio 里玩 ABB 的機(jī)器人。
4.2 Penn's Robotics Specialization
之后,不妨抽出幾個(gè)月時(shí)間,看看 Coursera 上賓夕法尼亞大學(xué)的 Robotics 專(zhuān)項(xiàng)課程。這個(gè)專(zhuān)項(xiàng)課程與機(jī)械臂或者工業(yè)機(jī)器人關(guān)系不大,但是由于機(jī)器人很多方面是相通的,所以非常建議看一看。
Aerial Robotics:這門(mén)課主要是介紹四旋翼無(wú)人機(jī)的控制問(wèn)題,其中的軌跡規(guī)劃、姿態(tài)描述、控制等對(duì)機(jī)械臂的學(xué)習(xí)非常有幫助。而且,這門(mén)課的作業(yè)質(zhì)量也非常高,提供了基于 Matlab 的數(shù)值仿真模塊,可以讓初學(xué)者直觀地看到自己代碼的控制效果。
Computational Motion Planning:這門(mén)課的水平感覺(jué)不如前一個(gè),但是通過(guò)這門(mén)課可以大概知道機(jī)器人里有 Motion Planning 這個(gè)方向,同時(shí)大作業(yè)也包括了手寫(xiě) A*、PRM、Potential Fileds 等基本的 Motion Planning 算法,同時(shí)大概了解一下 Collision Checking 的基本方法。
Mobility:這部分主要是介紹足式機(jī)器人的控制問(wèn)題。通過(guò)這門(mén)課,一方面可以大致了解足式機(jī)器人控制的發(fā)展脈絡(luò),這樣看起 Boston Dynamics 的視頻也不會(huì)那么一臉懵逼了。同時(shí),更重要的是,掌握機(jī)器人建模與控制的關(guān)系:一個(gè)簡(jiǎn)化的模型,也可能對(duì)控制起非常大幫助。
Perception:這門(mén)課質(zhì)量非常不錯(cuò),基本是介紹相機(jī)模型、多視幾何之類(lèi)的內(nèi)容。這方面內(nèi)容可以對(duì)大家未來(lái)從事 SLAM、3D 視覺(jué)、標(biāo)定等方面的研究非常有幫助。學(xué)完之后,大家就可以做出類(lèi)似《AR原理演示》文章中的效果了:https://v.qq.com/x/page/z0308y9971c.html
Estimation and Learning:這門(mén)課從高斯分布開(kāi)始,介紹了 Kalman Filter、Particle Filter 等在機(jī)器人狀態(tài)估計(jì)中非常有用的工具。而且,這門(mén)課的大作業(yè)會(huì)讓你從零開(kāi)始編寫(xiě) 2D 地圖重建的程序,你可以知道如何利用激光傳感器信息獲得下面這樣的 2D 地圖。
4.3 ROS
到現(xiàn)在為止,你對(duì)機(jī)器人的基礎(chǔ)知識(shí)有了一個(gè)比較完整的脈絡(luò),而且,也用 Matlab 實(shí)現(xiàn)了一些有趣的算法。但是,你發(fā)現(xiàn),機(jī)器人是一個(gè)非常大的系統(tǒng),作為初學(xué)者,不太可能從頭開(kāi)始一步步搭建機(jī)器人所需的各個(gè)算法模塊。這時(shí)候,你就應(yīng)該開(kāi)始擁抱偉大的開(kāi)源世界了。
很多人可能知道,有一個(gè)叫做機(jī)器人操作系統(tǒng)的開(kāi)源項(xiàng)目 (Robot Operating System, ROS)。
對(duì)于學(xué)習(xí) ROS,網(wǎng)上可能有不少教程了。但是,我感覺(jué),對(duì)于很多機(jī)電、自動(dòng)化方向的學(xué)生并不適合直接開(kāi)始看 ROS。因?yàn)樗麄內(nèi)狈镜?Linux、C++ 知識(shí)。所以,我推薦按照如下步驟進(jìn)行學(xué)習(xí):
Linux:如果完全沒(méi)有 Linux 開(kāi)發(fā)經(jīng)驗(yàn),我建議可以先安裝 Ubuntu 系統(tǒng),然后看 UNIX Tutorial for Beginners ,熟悉基本的 Linux 使用方法。
Github:ROS 的大多數(shù)項(xiàng)目都是托管在 Github 上的。所以,非常有必要學(xué)會(huì)使用 Github,學(xué)會(huì)用 git 管理自己的代碼。而且也可以為開(kāi)源項(xiàng)目做些修改。例如可以像我一樣只是刪除多余的分號(hào)。
C++ 基礎(chǔ):如果你沒(méi)有系統(tǒng)學(xué)習(xí)過(guò) C++,建議先把這部分補(bǔ)齊,因?yàn)?ROS 的主要代碼都是 C++ 實(shí)現(xiàn)的。這里,我推薦學(xué)堂在線上清華大學(xué)鄭莉老師的課程《C++語(yǔ)言程序設(shè)計(jì)基礎(chǔ)》和《C++語(yǔ)言程序設(shè)計(jì)進(jìn)階》。當(dāng)然,學(xué)習(xí) C++ 的時(shí)候就可以在 Ubuntu 下進(jìn)行,安裝一個(gè) Visual Studio Code 是個(gè)不錯(cuò)的選擇。
數(shù)據(jù)結(jié)構(gòu):其實(shí),上面的基礎(chǔ)已經(jīng)足夠你學(xué)習(xí) ROS 了,但是,為了未來(lái)的學(xué)習(xí),可以在適當(dāng)時(shí)候?qū)W習(xí)一些數(shù)據(jù)結(jié)構(gòu)的知識(shí)。數(shù)據(jù)結(jié)構(gòu)的話,我推薦學(xué)堂在線上清華鄧俊輝老師 《數(shù)據(jù)結(jié)構(gòu)(上)》與《數(shù)據(jù)結(jié)構(gòu)(下)》。
現(xiàn)在,你就可以大膽地去看 ROS 了。作為開(kāi)源項(xiàng)目,我認(rèn)為最好的教程就是官網(wǎng)的教程 ROS Tutorials。
首先,通過(guò) Beginner Level 和 Intermediate Level 了解 ROS 基本的通訊機(jī)制、學(xué)會(huì)使用 catkin、roslaunch、Rviz 等基本工具。
之后,就可以根據(jù)各自的研究興趣去看不同模塊了。
如果有條件,能夠配合一些 ROS 支持比較好的平臺(tái)進(jìn)行研究的話,可以大大提高學(xué)習(xí)速度。例如 TurtleBot、Baxter、Universal Robot 之類(lèi)的。(這就看每個(gè)人條件了。)
理論上,在 ROS 環(huán)境下,你可以從事絕大多少與實(shí)時(shí)控制無(wú)關(guān)的研究,如 SLAM、Navigation、Motion Planning 等。如果你從事的是更加底層的工作,(如控制器設(shè)計(jì)),目前 ROS 還無(wú)法勝任。(如果不清楚為什么,回顧一下實(shí)時(shí)操作系統(tǒng)、機(jī)器人控制方面的知識(shí))。
五. 進(jìn)階
至此,你已經(jīng)是一個(gè)不錯(cuò)的機(jī)器人工程師了。但是,如果你想從事研發(fā)工作,就需要學(xué)習(xí)更多專(zhuān)業(yè)知識(shí)。當(dāng)然,這部分就跟大家的研究方向關(guān)系比較密切了,我沒(méi)法一一細(xì)說(shuō)。只大概介紹一些。
另外,非常建議入手一本《Springer Handbook of Robotics》[2]。接觸一個(gè)新的領(lǐng)域時(shí),在 Handbook 里找到相應(yīng)的章節(jié),通過(guò)它了解基本的大綱,并利用提供的參考文獻(xiàn)快速補(bǔ)齊知識(shí)。
5.1 數(shù)學(xué)
這時(shí)候,你的數(shù)學(xué)基礎(chǔ)基本不允許你更進(jìn)一步了。所以,你需要補(bǔ)充數(shù)學(xué)知識(shí)。
數(shù)值計(jì)算方法:很多時(shí)候,我們都是通過(guò)計(jì)算機(jī)來(lái)實(shí)現(xiàn)算法功能的,所以,你必須了解基本的數(shù)值計(jì)算方法,如數(shù)值微分、數(shù)值積分等。我沒(méi)有太好的公開(kāi)課資源可以推薦。
凸優(yōu)化:這個(gè)世界很多問(wèn)題都不存在解析解,我們得用優(yōu)化方法來(lái)計(jì)算。所以,你必須了解如何建立優(yōu)化模型,并知道如何用代碼進(jìn)行求解。這里,我推薦 Stanford 的公開(kāi)課《Convex Optimization》
李群李代數(shù):優(yōu)化方法經(jīng)常要使用梯度信息,但是,你發(fā)現(xiàn)很多時(shí)候你不知道怎么定義梯度。李群李代數(shù)是一個(gè)非常經(jīng)典的數(shù)學(xué)工具,可以非常方便描述 SO(3)、SE(3) 空間中的對(duì)象。到這里,你之前對(duì)于四元數(shù)、角速度之類(lèi)的疑問(wèn)將一掃而空。這部分的學(xué)習(xí)資料,我會(huì)在后面補(bǔ)充。
5.2 Modern Robotics

李群李代數(shù)對(duì)于很多工科學(xué)生可能一時(shí)無(wú)法接受。這里,我推薦從 Modern Robotics 開(kāi)始,這是一本面向本科生的教材,非常淺顯。
你可以在網(wǎng)上找到它的所有信息,Coursera 上也有對(duì)應(yīng)的課程:《Modern Robotics》。
上完這門(mén)課,你能掌握旋量(Screw)這一全新的建模方式,同時(shí),你會(huì)發(fā)現(xiàn)機(jī)器人運(yùn)動(dòng)學(xué)、動(dòng)力學(xué)建模變得如此簡(jiǎn)單、干凈。
這時(shí)候,你已經(jīng)觸碰到了一點(diǎn)點(diǎn)李群李代數(shù)。之后就可以去看一些針對(duì)工科生的李群李代數(shù)教材,如《Notes on Differential Geometry and Lie Groups, I & II》
5.3 控制
這時(shí)候,你可能已經(jīng)嘗試搭建過(guò)一些機(jī)器人平臺(tái),了解了一些基本的控制理論。但是,你發(fā)現(xiàn)實(shí)際的機(jī)器人并不理想,動(dòng)力學(xué)模型可能非常不精確。于是,你需要做機(jī)器人的參數(shù)辨識(shí)。于是,你可以去看 Khalil 的教材《Modeling, identification and control of robots》[3]。其中,你需要了解各種濾波算法(計(jì)算加速度)、各種數(shù)值優(yōu)化算法。而且,如果需要對(duì)機(jī)器人的運(yùn)動(dòng)學(xué)參數(shù)進(jìn)行標(biāo)定,你會(huì)發(fā)現(xiàn)李群李代數(shù)可以非常方便地定義各種相關(guān)的雅可比。
現(xiàn)在,你有了一個(gè)相對(duì)精確的動(dòng)力學(xué)模型,但是你發(fā)現(xiàn),在給機(jī)器人控制器做軌跡規(guī)劃的時(shí)候,需要給出速度、加速度約束。你感覺(jué)這其中有什么不對(duì)。是的,機(jī)器人系統(tǒng)中實(shí)際上并不存在什么速度、加速度約束,我們所有的操作都是針對(duì)電機(jī)力矩的。也就是說(shuō),我們只有力矩約束。
那么,問(wèn)題來(lái)了:在力矩約束下,如何讓機(jī)器人實(shí)現(xiàn)最快的運(yùn)動(dòng)。于是你就入了最優(yōu)控制的坑。在這里,各種數(shù)值優(yōu)化方法將非常有用。
現(xiàn)在你能把單獨(dú)的一個(gè)機(jī)器人控制好了,但你發(fā)現(xiàn),機(jī)器人一旦跟環(huán)境發(fā)生接觸,只用機(jī)器人模型就不夠了。你需要對(duì)環(huán)境進(jìn)行建模。但是,環(huán)境是無(wú)法精確建模的。于是,你開(kāi)始學(xué)各種力控、阻抗控制之類(lèi)的內(nèi)容。相應(yīng)地、你就可以實(shí)現(xiàn)一些所謂協(xié)作機(jī)器人的功能了:《聽(tīng)說(shuō)現(xiàn)在協(xié)作機(jī)器人很火,所以我也做了1/7個(gè)》
5.4 運(yùn)動(dòng)規(guī)劃
現(xiàn)在,你能讓機(jī)器人按照你的要求運(yùn)動(dòng)了。但是,你感覺(jué)機(jī)器人還是太難用了,必須人工指定經(jīng)過(guò)的路徑點(diǎn),否則機(jī)器人可能就會(huì)與環(huán)境發(fā)生碰撞。你想,有沒(méi)有可能讓機(jī)器人自己找到這些路徑點(diǎn)。
于是,你來(lái)到了運(yùn)動(dòng)規(guī)劃的領(lǐng)域。
當(dāng)然,一個(gè)很自然的想法是,有沒(méi)有可能直接構(gòu)建一個(gè)目標(biāo)函數(shù),用優(yōu)化的方法計(jì)算出需要的軌跡。但是,世界有時(shí)候并沒(méi)有那么可愛(ài)。運(yùn)動(dòng)規(guī)劃問(wèn)題常常是一個(gè)非凸問(wèn)題,無(wú)法直接求解。所以,對(duì)于機(jī)械臂,可以有各種 Sampling-based 算法;當(dāng)然,也有人將其近似成多個(gè)凸問(wèn)題進(jìn)行優(yōu)化求解,在比較簡(jiǎn)單的場(chǎng)景下效果還算不錯(cuò)。
運(yùn)動(dòng)規(guī)劃的大致介紹可以看我以前寫(xiě)過(guò)的文章:《運(yùn)動(dòng)規(guī)劃 | 簡(jiǎn)介篇》。
當(dāng)然,更詳細(xì)的介紹最好看教材,如《Principles of Robot Motion》[4] 和《Planning Algorithms》[5] 都是不錯(cuò)的教材。
另外,這部分一定要配合著編程來(lái)做。The Open Motion Planning Library 是個(gè)不錯(cuò)的參考,相信你在學(xué) ROS 的時(shí)候也或多或少了解過(guò)一些。
相信只要你理解得足夠深入,便會(huì)理解前面李群李代數(shù)的作用。例如:
(1)運(yùn)動(dòng)規(guī)劃是在 Configuration Space 里進(jìn)行的,而大多數(shù)常見(jiàn)機(jī)構(gòu)的 Configuration Space 都是一個(gè) Lie Group:多關(guān)節(jié)機(jī)器人的關(guān)節(jié)空間(Torus(n)),無(wú)人機(jī)(SE(3)),機(jī)器人末端操作物體的相關(guān)約束(SE(3))。于是,我們只要定義各種 Lie Group 的基本性質(zhì),就可以用統(tǒng)一的規(guī)劃算法來(lái)進(jìn)行規(guī)劃了。具體可以看 Ompl 里 State space 的使用。
(2)當(dāng)我們的規(guī)劃涉及到一些約束,如讓機(jī)器人末端保持水平(拿著一杯水)。一種方法是用傳統(tǒng)的方法。如 OpenRave 里的一個(gè)實(shí)現(xiàn):ConstraintPlanning - 在關(guān)節(jié)空間隨機(jī)采樣一個(gè)點(diǎn),然后投影到最近的任務(wù)空間上,之后用 Jacobian 迭代的方式將隨機(jī)點(diǎn)連接到 RRT 樹(shù)上。

但是,我們可以從另一個(gè)角度看問(wèn)題。機(jī)器人的末端姿態(tài)就是一個(gè)
SE(3) 李群。保持末端水平,可以認(rèn)為是一個(gè) R3 空間與 SO(2) 空間的半直積,這也是一個(gè)李群。于是,我們可以直接在李群內(nèi)或者
Tangent Space 上跑一個(gè) RRT,例如 Tangent Bundle RRT[6]與 AtlasRRT[7]

5.5 機(jī)器學(xué)習(xí)
前面很多工作都是在做建模+辨識(shí)的工作。實(shí)際上還有一大類(lèi)工作是基于數(shù)據(jù)的,也即,給一個(gè)通用模型,用數(shù)據(jù)進(jìn)行學(xué)習(xí)擬合。也就是大家常說(shuō)的機(jī)器學(xué)習(xí)了。
對(duì)于此,我個(gè)人的學(xué)習(xí)路徑如下:
Coursera上吳恩達(dá)的《機(jī)器學(xué)習(xí)》,了解基本的機(jī)器學(xué)習(xí)內(nèi)容。
Geoffrey Hinton 的《Neural Networks for Machine Learning》,之前是在 Coursera 上看的,現(xiàn)在似乎只能在 Youtube 上找到了。這門(mén)課基本可以把幾種經(jīng)典的神經(jīng)網(wǎng)絡(luò)過(guò)一遍。
各種開(kāi)源平臺(tái)。有了前面的基礎(chǔ),也在 Matlab 中實(shí)現(xiàn)過(guò)幾種經(jīng)典機(jī)器學(xué)習(xí)算法,你就可以去嘗試一些深度學(xué)習(xí)開(kāi)源平臺(tái)了,如 TensorFlow。做機(jī)器學(xué)習(xí)的人太多了,所以資料也非常多,在網(wǎng)上非常容易自學(xué)。
當(dāng)然,我們要知道,我們學(xué)機(jī)器學(xué)習(xí),并不是為了轉(zhuǎn)到 DL 方向上,而是用它來(lái)為機(jī)器人研究提供工具的:
智能控制:相信學(xué)習(xí)過(guò)智能控制的小伙伴,應(yīng)該還記得小腦模型之類(lèi)的網(wǎng)絡(luò)在控制中的應(yīng)用;
建模:對(duì)于一些不好建模的地方,有時(shí)候不妨試試機(jī)器學(xué)習(xí)的方法,例如,用神經(jīng)網(wǎng)絡(luò)擬合摩擦力;
視覺(jué):機(jī)器人經(jīng)成需要跟視覺(jué)結(jié)合在一起,而 DL 在視覺(jué)領(lǐng)域發(fā)展迅速,有時(shí)候借用這一工具,可以非??斓卮罱▽?shí)驗(yàn)原型;
強(qiáng)化學(xué)習(xí):這個(gè)下章介紹。
5.6 強(qiáng)化學(xué)習(xí)
如果研究過(guò)強(qiáng)化學(xué)習(xí),肯定會(huì)被其極簡(jiǎn)的理論所折服:所有的理論衍生自一個(gè) Bellman equation。而且,強(qiáng)化學(xué)習(xí)非常符合人的直覺(jué)。因此,很多人認(rèn)為強(qiáng)化學(xué)習(xí)是機(jī)器人的未來(lái)方向。
對(duì)此,我不做過(guò)多評(píng)論。我只大概介紹如何入門(mén)強(qiáng)化學(xué)習(xí)。
首先,就是看書(shū)。Sutton 的《Introduction to reinforcement learning》[8]可以說(shuō)是必讀圣經(jīng)了。
閱讀 Sutton 的書(shū),你可以一步步了解如何從最初的 Bellman 方程推導(dǎo)出 Dynamic Programming、Monte Carlo、TD Learning 等方法。
你知道了強(qiáng)化學(xué)習(xí)就是要通過(guò)不斷嘗試來(lái)學(xué)習(xí)得到一個(gè)從 State 到 Action 的查找表。
于是,你就想,有沒(méi)有可能簡(jiǎn)化這個(gè)查找表,于是,你知道了有 Function Approximation。如果這個(gè)近似函數(shù)是神經(jīng)網(wǎng)絡(luò),那么就是現(xiàn)在很火的 Deep Reinforcement Learing 了。
當(dāng)然,這些不重要。重要的是理解 Markov Decision Processes。你會(huì)發(fā)現(xiàn),它不僅可以用來(lái)解決運(yùn)動(dòng)規(guī)劃問(wèn)題(DP ≈ Dijkstra、Monte Carlo ≈ RRT),還可以用來(lái)解決任務(wù)規(guī)劃問(wèn)題。
5.7 最新論文
至此,你已經(jīng)能夠閱讀絕大多數(shù)最新的論文了。所以,你應(yīng)該關(guān)注類(lèi)似 RSS、ICRA、IROS 等相關(guān)會(huì)議,了解機(jī)器人領(lǐng)域的最新進(jìn)展;通過(guò) IJRR、TRO 等期刊學(xué)習(xí)最新的理論。
當(dāng)然,你也可以通過(guò) Google Scholar 訂閱相應(yīng)的關(guān)鍵詞,它會(huì)不定期將最新的論文推送到你的郵箱。
六. 勇者斗惡龍

自此,你已經(jīng)知道了如何讓一個(gè)機(jī)器人動(dòng)起來(lái),并且深入掌握了研究機(jī)器人某一領(lǐng)域的知識(shí)。然后,你就像一個(gè)剛剛斬殺一只史萊姆的勇者一般,舉著寶劍,時(shí)刻準(zhǔn)備著將寶劍刺入惡龍的胸口。
但是,這時(shí)候有人跑過(guò)來(lái),往你頭上澆了一盆水:
現(xiàn)在隨便一個(gè)公司,花點(diǎn)錢(qián)請(qǐng)人畫(huà)個(gè)機(jī)器人圖紙,找工廠加工出來(lái),買(mǎi)些電機(jī)、減速器之類(lèi)的零部件,套上一個(gè)通用控制器就可以跑了。哪需要什么動(dòng)力學(xué)、最優(yōu)控制、運(yùn)動(dòng)規(guī)劃呀!
就連四大家,機(jī)器人建模用 DH 就夠了,最多做點(diǎn)運(yùn)動(dòng)學(xué)標(biāo)定、動(dòng)力學(xué)辨識(shí),更多精力放在了應(yīng)用集成上。哪需要什么李群李代數(shù)、凸優(yōu)化、強(qiáng)化學(xué)習(xí)呀!
「這世上哪兒有什么惡龍啊!」
然而,我想說(shuō)的是,就機(jī)器人這塊,只要工農(nóng)業(yè)這類(lèi)體力勞動(dòng)沒(méi)有實(shí)現(xiàn)完全的自動(dòng)化,惡龍就存在:

當(dāng)你看到絕大多數(shù)機(jī)器人還是通過(guò)上面這樣的方式,一點(diǎn)點(diǎn)示教出來(lái)的,你會(huì)有強(qiáng)烈的感覺(jué):「這就是惡龍!」

當(dāng)你看到世界上那么多機(jī)器人公司,有著各自形形色色、互不兼容的編程語(yǔ)言、示教器的時(shí)候,你會(huì)有強(qiáng)烈的感覺(jué):「這就是惡龍!」

當(dāng)你看到還有非常多與你我同齡的人在工廠里做著重復(fù)、枯燥的工作的時(shí)候,你會(huì)有強(qiáng)烈的感覺(jué):「這就是惡龍!」
是的,在機(jī)器人領(lǐng)域,還有非常多惡龍。于是,你拿起劍,又興沖沖地上路了。
忽然你發(fā)現(xiàn),你之前學(xué)的都是如何殺死一個(gè)「真空中的球形龍」,你不知道應(yīng)該如何殺死一個(gè)真正的龍。
所以,你應(yīng)該繼續(xù)學(xué)習(xí)。去找更多的真實(shí)史萊姆練手,將之前學(xué)到的劍法應(yīng)用在實(shí)際戰(zhàn)場(chǎng)上。
后來(lái),你又遇到了新問(wèn)題,你之前的寶劍并不具有「工業(yè)級(jí)強(qiáng)度」:ROS 經(jīng)成崩、Oroscos的沒(méi)有處理 Eigen Alignment、沒(méi)有好用的 3D 傳感器、工業(yè)機(jī)器人不開(kāi)放底層接口等等。
于是,你意識(shí)到,你需要重新打造自己真正的寶劍。
但是,這不是你一個(gè)人可以做到的,你需要一個(gè)團(tuán)隊(duì),有人采煤、有人煉鋼、有人鍛造、有人磨刀……
這時(shí)候,不妨來(lái) RVBUST 看看。
七. 參考文獻(xiàn)
[1] John J. Craig. Introduction to Robotics: Mechanics and Control[M]. 1986.
[2] Siciliano, Bruno, and Oussama Khatib, eds. Springer handbook of robotics. Springer, 2016.
[3] Khalil, Wisama, and Etienne Dombre. Modeling, identification and control of robots. Butterworth-Heinemann, 2004.
[4] Choset, Howie M., et al. Principles of robot motion: theory, algorithms, and implementation. MIT press, 2005.
[5] LaValle, Steven M. Planning algorithms. Cambridge university press, 2006.
[6] Kim, Beobkyoon, et al. "Tangent bundle RRT: A randomized algorithm for constrained motion planning." Robotica 34.1 (2016): 202-225.
[7] Jaillet, Léonard, and Josep M. Porta. "Path planning with loop closure constraints using an atlas-based RRT." Robotics Research. Springer, Cham, 2017. 345-362.
[8] Sutton, Richard S., and Andrew G. Barto. Introduction to reinforcement learning. Vol. 135. Cambridge: MIT press, 1998.
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。