机器人控制分享
0 前言
本文主要为有意向学习机器人控制的低年级本科生提供一些学习材料和学习思路,高年级本科生根据目前自己的学习进度和研究方向酌情参考即可。
特别说明:本文中提到的机器人控制,均指的是足式机器人、工业机械臂、无人机等的控制,软体机器人、微纳机器人等的控制不在本文讨论范围内。
1 机器人控制主要是在做什么
首先,我在这里提供一些视频,来让对这个方向没有概念的同学们有一些认知:
- 波士顿动力 (Boston Dynamics) 合集:https://www.bilibili.com/video/BV1hp411d7tV?p=2
- 无人机打乒乓球:https://www.bilibili.com/video/BV1Gt4y1y7nN?spm_id_from=333.337.search-card.all.click
- 工业机器人 (机械臂) 搬运工作:https://www.bilibili.com/video/BV12Q4y1Y7pD?spm_id_from=333.337.search-card.all.click
- [夹带私货] CLEAR Lab 双足机器人近期成果:https://www.bilibili.com/video/BV1154y1V7WN?spm_id_from=333.999.0.0
- [夹带私货] CLEAR Lab 四足机器人爬楼梯:https://www.bilibili.com/video/BV11f4y1v7kM?spm_id_from=333.999.0.0
- [夹带私货] CLEAR Lab 四足机器人 Push Recovery 实验:https://www.bilibili.com/video/BV1dT4y1y76x?spm_id_from=333.999.0.0
为方便大家观看,以上视频素材均来自 Bilibili,如果大家感兴趣,在上述视频的相关推荐中就有更多视频可以查看。
通过观看这些视频,我们已经对机器人控制是在做什么有了一个大概的认知:即让一个机器人系统可靠的运行,并完成我们指定的任务,例如让四足机器人爬楼梯,让一台机械臂抓取一个物体并将它放到指定的地方上,等等。我们就以让一台机械臂抓取物体并放在指定的地方这一任务为例来做出进一步说明:在机器人控制中,我们需要设计控制器来保证机器人系统的稳定运行,通俗来讲就是我们需要让机械臂怎么动,它就能够怎么动,这一步通常被称为 low-level control 或者 low-level tracking;与此同时,我们还要将实际任务建模为数学问题(通常是一个优化问题)并求解,例如机械臂如何运动才可以抓起物体,又如何移动才可以将这个物体放到指定的位置,这一步通常被称为规划 (planning),或者上层的运动规划 (high-level motion planning)。注意:为了方便大家理解,以上的分析只是采用了一种观点,不过这种做法在机器人控制中还是非常常见的。
那么接下来,就要聊聊我们如何进行学习,才可以具备控制机器人的能力了。
2 基本功
在这一部分,我为大家梳理了一下大家需要掌握的基本功,分为数学基础、控制理论基础、机器人建模基础、以及工程技能这四个模块,在每一部分中,我给出了大家在南科大需要学或者可以学到的课程,并在必要的时候给大家提供一些参考材料,包括视频以及一些非常棒的公开课等等。
注意:
- 为了保证一定的全面性,下文中提到的内容会比较丰富,大家一定要根据自己的实际情况进行取舍,优先学习我没有标注“选学”或者“有余力选修”这样字眼的条目。
- 另外,本文是在保证一定的通用性基础上来写的,由于各个研究方向之间的不同,建议大家进入课题组后再根据实际情况(例如听取导师和师兄师姐的建议)对于自己的学习方案做更加适合自己的调整。在大家尚未进入课题组之前,可以先完全按照我下面提供的模块进行学习,至少是不会在大方向上跑偏的。
- 以下四个模块之间不具备先后关系,对于学校里开设的课程,大家可以通过查看培养方案中的先修要求来确定学习顺序。
2.1 数学基础
在学习专业理论之前,我们首先需要打好的就是数学基本功。在机器人工程专业的培养方案 (2017级) 中,我们必修的数学课一共有四门:微积分、线性代数、概率论与数理统计、常微分方程。这四门课大家一定要扎扎实实的学好,这些课程所采用的教材也都是非常不错的教材,如果有时间能好好阅读([2.1.1] - [2.1.4] 这四本书)是最好的(尤其是对于大一的同学来说,不要畏惧读全英文教材,一开始读得慢是很正常的,如果在大一学微积分和线性代数的时候读完 [2.1.1] 和 [2.1.2] 这两本书,那么后面各位看英文文献的速度会快很多)。另外,优化方面的内容其实也非常重要,但是对于许多本科生来讲,啃掉 [2.1.5] 这本书略有难度,而机器人工程专业的工程优化基础这门专业选修课则可以为大家提供不少优化方面的背景,推荐大家选择修读。如果学有余力,则可以自学 [2.1.10]。
[2.1.6]-[2.1.8] 为大家分别提供了三组视频,如果初学微积分、线性代数、概率论与数理统计感到抽象不好理解时可以分别看看这三组视频,[2.1.9] 是 [2.1.2] 的作者在 MIT 开设的线性代数基础课,大一的同学可以作为辅助参考学习,课程主页里可以下载他们的作业、Quiz 与 考试的题目和答案,方便大家练习。[2.1.10] 则是对应 [2.1.5] 的凸优化课程,大家在学有余力的情况下再考虑选学。[2.1.11] 是一门数值分析课程,它可以帮助大家理解在实际工程中,我们是如何求解一个方程、导数、积分等等的,同样为选学内容,且在本科阶段优先级不高,大家根据自己的时间谨慎考虑。
我在最后给出了一篇讲解矩阵求导技术的文章 [2.1.12],大家在学完微积分和线性代数后即可以看懂这篇文章。矩阵求导在我们后面实际应用中还是比较常见的,大家掌握文章中的内容就可以对各种矩阵函数进行求导了。
[2.1.1] (George B. Thomas, Jr, etc.) Thomas' Calculus (13th Edition) https://rodrigopacios.github.io/mrpacios/download/Thomas_Calculus.pdf
[2.1.2] (Gilbert Strang) Linear Algebra and Its Application (4th Edition) https://ia802906.us.archive.org/18/items/StrangG.LinearAlgebraAndItsApplications45881001/%5BStrang_G.%5D_Linear_algebra_and_its_applications%284%29%5B5881001%5D.pdf
[2.1.3] (John A.Rice) Mathematical Statistics and Data Analysis (3rd Edition) http://home.ustc.edu.cn/~liweiyu/documents/[Duxbury%20Advanced]%20John%20A.%20Rice%20-%20Mathematical%20Statistics%20and%20Data%20Analysis%203ed%20(Duxbury%20Advanced)%20%20%20(2006,%20Duxbury%20Press).pdf
[2.1.4] (John Polking, etc.) Differential Equations with Boundary Value Problems (2nd Edition)
[2.1.5] (Stephen Boyd, edt.) Convex Optimization https://web.stanford.edu/~boyd/cvxbook/bv_cvxbook.pdf
[2.1.6] (3Blue1Brown) 微积分的本质:https://space.bilibili.com/88461692?spm_id_from=333.337.0.0
[2.1.7] (3Blue1Brown) 线性代数:https://www.bilibili.com/video/BV1ys411472E?spm_id_from=333.999.0.0
[2.1.8] (3Blue1Brown) 概率论:https://space.bilibili.com/88461692/channel/seriesdetail?sid=1528924
[2.1.9] (MIT 18.06) 课程主页: https://ocw.mit.edu/courses/18-06-linear-algebra-spring-2010/ \ 带中文字幕的课程录像:https://www.bilibili.com/video/BV1zx411g7gq?spm_id_from=333.337.search-card.all.click
[2.1.10] (Stanford EE364) https://web.stanford.edu/class/ee364a/
[2.1.11] (Stanford Math128A) http://persson.berkeley.edu/math128a/ 课程录像: https://www.bilibili.com/video/BV1gv411j7rd?p=12
[2.1.12] (知乎-矩阵求导术) https://zhuanlan.zhihu.com/p/24709748
2.2 控制理论基础
在这一部分,大家需要对控制理论有一个基本的认知,主要涉及如下几门课:
信号与系统:这门课是大家的专业基础必修课,其实这门课的内容在后面用到的不是太多,但是通过这门课大家掌握好三大变换(傅里叶变换、拉普拉斯变换、z变换)也是非常有必要的。
控制工程基础:同样是专业基础必修课,这应该是能让大家第一次开始真正接触控制的一门课,但其实这门课的部分内容和专业课内的其他课程有些许重复。通过这门课程大家应该掌握好像稳态误差、超调量这样的基本概念,会分析一阶、二阶系统,了解PID控制的原理等。大家最好能在仿真或实际环境中调一个PID控制器感受一下,可以理解地更加深刻。这里推荐一本教材,大家在上课的同时可以同步阅读:
[2.2.1] (Franklin, etc.) Feedback Control of Dynamic Systems https://www.daslhub.org/unlv/courses/00coursesUsb/labviewCourseDevelopment/labview-0X-LeadLag/Franklin%20PE%206th%20-%20textbook%20but%20perhaps%20too%20much%20-%20no%20simple%20Lag%20control%20example.pdf
现代控制与最优估计:讲授状态空间表示法、可控性、可观性等现代控制理论的基本概念,以及卡尔曼滤波、线性二次型调节器(LQR)等重要内容,虽然是专业选修课,但是对于想搞控制的同学来说这门课必修。这门课程已经制作成了公开课并发布在了B站:https://space.bilibili.com/474380277/channel/seriesdetail?sid=291615 。 课程主页:https://www.wzhanglab.site/teaching/moderncontrolestimation/ 。 这门课程不提供额外的参考资料,大家能将老师所讲内容全部消化吸收即可。
线性系统:据说后面会有老师开这门课,开课后这门课对于大家来说也是在学有余力的情况下选择修读。
2.3 机器人建模理论基础
在这一部分,大家主要需要掌握的理论背景为坐标系与坐标变换,以及机器人的运动学和动力学模型。他们是我们对机器人进行规划和控制的基础,这一部分的内容基本都有在机器人建模与控制这门专业核心课中讲到,但是如果大家学有余力的话,建议大家旁听高等机器人控制这门研究生课的前半部分(即运动学与动力学部分)作为补充。这两门课所讲授内容的主要区别有如下几点:
- 高等机器人控制中所讲授的理论是基于“旋量理论”,这套理论相对于机器人建模与控制中给出的框架多了不少数学概念,但是从掌握并应用这套理论的层面来看,我们不需要先去完全掌握这些数学背景,直接学习这一套建模方法即可。
- 在对于正运动学部分的介绍中,机器人建模与控制所讲授的内容基于传统的D-H参数法,而高等机器人控制这门课所讲授的内容则基于更具有实际应用价值的指数积 (Product of Exponential, PoE) 法。
- 在对于动力学部分的介绍中,机器人建模与控制这门课详细介绍了能量法,而高等机器人控制这门课则略过了能量法,用另一种更简洁的方式阐释了机器人的动力学模型。
总而言之,机器人建模与控制这门课的内容非常重要,大家一定要认真学好;对于学有余力的同学建议去旁听高等机器人控制这门课的运动学与动力学部分,对于实践和阅读一些文献都会更有帮助。此外,掌握好机器人建模与控制这门课的内容对于大家理解高等机器人控制这门课中的内容也会有帮助。
同样,高等机器人控制这门课已经制作成公开课并发布在了B站: https://space.bilibili.com/474380277/channel/collectiondetail?sid=214337。顺便也附上课程主页,跟着做作业对于知识点的理解会更加深刻:https://www.wzhanglab.site/teaching/mee-5114-advanced-control-for-robotics/。
最后我在这一部分给出三本参考文献:第一本是机器人建模与控制的教材,后面两本是高等机器人控制的其中两本参考材料。这里给大家的建议是:[2.3.1] 这本书在上课的时候最好能跟着仔细阅读一遍,后面两本书则为选读,具体试自己的能力而定,在理解课程所讲授内容的基础上,建议可以先尝试阅读 [2.3.3] 这本书的前面几章,主要考量还是我们在实际应用中会使用一些机器人动力学库,例如 Pinocchio、RBDL 等,这些库的实现大都是基于 [2.3.3] 这本书(包括算法以及一些符号约定),但是在本科阶段,没有时间阅读这本书也没有关系。
[2.3.1] (Spong) Robot Modeling and Control https://www.researchgate.net/profile/Mohamed_Mourad_Lafifi/post/How_to_avoid_singular_configurations/attachment/59d6361b79197b807799389a/AS%3A386996594855942%401469278586939/download/Spong+-+Robot+modeling+and+Control.pdf
[2.3.2] (Lynch K M, Park F C) Modern Robotics http://hades.mech.northwestern.edu/images/2/2e/MR-largefont-v2.pdf
[2.3.3] (Featherstone) Rigid Body Dynamics Algorithms https://github.com/create3000/titania/blob/master/Papers/%5B2008%20Featherstone%5D%20Rigid%20Body%20Dynamics%20Algorithms.pdf
另外,高等机构动力学这门课也讲解了基于旋量理论的机器人建模方法,感兴趣且学有余力的同学亦可选修。
2.4 工程技能
在学习理论的同时,工程能力也是我们不能忽视的,在这个部分,我就着重介绍通常情况下我们需要的一些工程技能。需要注意的是,掌握这些工程技能不需要去上多少多少课,最重要的还是大家要多去实践!
Linux:学会使用 Linux 系统对于我们来说是非常必要的,不过大家也并不需要花太多精力在这个上面。我们只需要会安装系统、了解常用的命令(例如如何安装和删除软件、如何进入一个目录、如何添加环境变量等)、会安装配置第三方库即可,这一部分我并不推荐大家去看整本整本的书籍。如果同学们是按部就班学习,掌握机器人操作系统这门课上教给大家的命令即可,如果是提前自己学习,那么可以去B站上找一找入门的视频,跟着敲一敲命令体会一下即可,等到自己使用时忘记某个命令就直接百度这个命令是什么就可以了。
C++:在实际的机器人系统上,考虑到运行效率等问题,大部分情况下我们都采用的是 C++。因此掌握 C++ 对于同学们来说是很有必要的,由于大家在大一的计算机程序设计基础这门课上已经掌握的编程的基本思维以及类和对象的基本概念,那么我们对于另外一门编程语言的学习就会快很多。在入门阶段,我们最重要的就是掌握 C++ 的基本语法和指针这样一个在C++中非常重要的东西,下面我给大家推荐两本入门书籍供大家参考:
[2.4.1] (Kenneth A.Reek 著,徐波 译) C和指针 https://github.com/auspbro/ebook-c/blob/master/C%E5%92%8C%E6%8C%87%E9%92%88(%E7%AC%AC%E4%BA%8C%E7%89%88)%E9%AB%98%E6%B8%85%E5%85%A8%E7%89%88469%E9%A1%B5.pdf
[2.4.2] (Stephen Prata 著, 张海龙 袁国忠 译) C++ Primer Plus https://www.roboxx.ltd/wp-content/uploads/2021/08/C-Primer-Plus%E7%AC%AC6%E7%89%88%E4%B8%AD%E6%96%87%E7%89%88.pdf
另外,大家也应该学会使用 gcc,[2.4.3] 为大家提供了一个入门级文章,大家只需要看到第6节以前即可,由于实际工程所包含的源代码文件以及使用的外部库均较多,因此我们通常借助 CMake (见下一条) 来完成。
[2.4.3] (知乎-gcc入门) https://zhuanlan.zhihu.com/p/76930507
在入门 C++ 后,大家就可以熟悉一些我们常用的库了,例如 Eigen (可以用来进行线性代数、矩阵、向量操作等运算的库)、Pinocchio (可以用来进行机器人的运动学与动力学计算,在学习完机器人建模与控制后使用) 等等
CMake: CMake 是一个跨平台的安装 / 编译工具,它能用简单的语句描述所有平台的安装 / 编译过程。我们在入门 C++ 后,就应当同步学习 Cmake 的使用,同样,关于这一部分我为大家找到了一个入门级的文章,大家可以跟着实践一下,如果需要更加深入,大家也应该具备相关搜集资料的能力。
[2.4.4] (知乎-CMake入门) https://zhuanlan.zhihu.com/p/500002865
MATLAB: MATLAB是一款商业数学软件,主要用于数值计算,然而 MATLAB 还提供了丰富的不同学科和领域的工具箱,例如控制系统的分析设计、信号处理、图像与视频处理等等;与此同时,这些工具箱还配有详细的文档说明,包括函数的使用方法以及所涉及的基本原理;另外,MATLAB 语言语法简单、文档齐全、入门迅速,这可以让我们非常快捷地实现一些简单的功能或者验证一些想法。
其实单就机器人的仿真来说,其实学习 MATLAB 不是必要的,但是我们在学习控制理论或者数学原理的时候,经常会遇到一些 MATLAB 的仿真实例,因此会用 MATLAB 对于我们理论部分的学习还是非常有帮助的。网上有许多实例帮助大家入门,如果实在觉得学习困难或者找不到合适的材料,可以选修我们系的 MATLAB 工程应用这门课,相信通过一学期的学习大家一定可以掌握 MATLAB 的基本使用。
[2.4.5] (MATLAB 官方网站) MATLAB - 技术计算语言 产品信息 - MATLAB & Simulink (mathworks.cn)
另外需要说明的一点是,MATLAB 需要占用本地较多的存储空间,如果同学们在本地安装使用 MATLAB 有困难,可以使用 [MATLAB Online](MATLAB Online - MATLAB & Simulink (mathworks.cn))。
嵌入式系统与微机原理:这一部分的知识和技能不是特别核心和必需,但是如果有同学想要 DIY 一个自己的小机器人,那么就需要掌握这一部分的知识了。这块的资料网上同样很多,且笔者并不熟悉这一部分,因此同学们如有需要则得自行搜索学习材料。
ROS:ROS 是用于编写机器人软件程序的一种具有高灵活性的软件架构。它包含了大量工具软件、库代码和约定协议,旨在简化跨机器人平台创建复杂、鲁棒的机器人行为这一过程的难度与复杂度。然而由于一些局限性,现在许多的实际工程并没有使用 ROS,但 ROS 中一些好用的小工具和特性也会让一些工程人员在自己的项目中用到它。因此至少掌握 ROS 的基本机制和用法还是有必要的,但是在一开始不必过于深入地追究其中的小细节与小组件,在需要的时候根据自身已有的积累去搜集材料学习即可。当同学们认真学习完机器人操作系统这门专业核心课后应当有这个能力。
Python:我其实思考了很久要不要将它放进清单中,因为它并不是完全必需的,但是因为 Python 语法简单且易于使用,并且在有了程序设计基础后,入门 Python 对于大家来说是非常快的(毫不夸张地说,甚至半天到一天),因此我还是把它加了进来。因为实现相同的功能写 Python 所需的时间比 C++ 少不少,因此大家也可以用 Python 来快速验证自己的想法,尤其是在许多仿真器 (例如 Mujoco, Drake) 与第三方库 (例如 Pinocchio) 都提供 Python 接口的情况下。另外,如果大家要接触或用到计算机视觉、机器学习等方面的内容时,也有许多代码是使用 Python 完成的,因此在必要的时候大家还是可以略微花些时间熟悉一下 Python,同时熟悉两个大家可能会常用到的库:Numpy 与 Matplotlib。
3 更进一步
此时大家已经有了相当的基础,不管是从理论层面还是工程层面;上了不少的课程,其中还做了一些课程 project;另外不少同学也加入了课题组,了解了课题组的研究方向或者有了自己的研究内容,那么接下来就需要大家去阅读自己研究方向相关的文献了,起初可以是导师或者师兄师姐推荐的文献,但是大家也应该慢慢学会自己有了问题后去查找并筛选相关的文献,在一开始先对自己的方向有一个整体的认知。到了这一步后,大家也很清楚自己需要做什么、还缺什么等等这些问题了,也可以在第二节的基础上按照自己的想法点亮技能树了。
另外,表达这样一个看似无关的东西也很重要。大家需要有意识地培养自己的演讲能力与写作能力,即如何能将自己的想法、观点或者工作清晰地讲给别人听或者写出来。此外,如果有有余力,也可以学习一下 Latex 的使用。
最后,搜集材料和总结材料的能力也很关键,大家应该慢慢积累了一些搜集材料的地方与方法,因此遇到新的知识或者问题,也拥有了一定的能力去独自搞定它。