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

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

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

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

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

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

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

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

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

當(dāng)你看到絕大多數(shù)機器人還是通過上面這樣的方式,一點點示教出來的,你會有強烈的感覺:「這就是惡龍!」

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

當(dāng)你看到還有非常多與你我同齡的人在工廠里做著重復(fù)、枯燥的工作的時候,你會有強烈的感覺:「這就是惡龍!」
是的,在機器人領(lǐng)域,還有非常多惡龍。于是,你拿起劍,又興沖沖地上路了。
忽然你發(fā)現(xiàn),你之前學(xué)的都是如何殺死一個「真空中的球形龍」,你不知道應(yīng)該如何殺死一個真正的龍。
所以,你應(yīng)該繼續(xù)學(xué)習(xí)。去找更多的真實史萊姆練手,將之前學(xué)到的劍法應(yīng)用在實際戰(zhàn)場上。
后來,你又遇到了新問題,你之前的寶劍并不具有「工業(yè)級強度」:ROS 經(jīng)成崩、Oroscos的沒有處理 Eigen Alignment、沒有好用的 3D 傳感器、工業(yè)機器人不開放底層接口等等。
于是,你意識到,你需要重新打造自己真正的寶劍。
但是,這不是你一個人可以做到的,你需要一個團隊,有人采煤、有人煉鋼、有人鍛造、有人磨刀……
這時候,不妨來 RVBUST 看看。
七. 參考文獻
[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)載。詳情見轉(zhuǎn)載須知。