如何成为⼀个全能的机器⼈⼯程师
⼤疆技术总监:如何⽤六年成为⼀个全能的机器⼈⼯程师
gre培训费用  机器⼈学的核⼼问题是做好和物理世界的交互。现在主流的机器⼈学分⽀⾥,处理与物理世界的交互的学科分为三类:传感器和处理算法;多刚体系统动⼒学控制;机器⼈⾃主移动。
  智能机器⼈会成为未来世界的灾难吗?对机器⼈或⼈⼯智能的研究会帮助我们更好的了解⼈类⾃⼰吗?⼈⼯智能将会怎样影响我们的⽣活?诸如此类的问题及⽂章早已屡见不鲜。但机器⼈控制如何⼊门?如何成为⼀个合格的机器⼈⼯程师?这类的问题似乎还没有⼀个最全⾯的答案。在机器⼈成为热门话题的当下,作为⼤学⽣,要如何制定⼀个⾼效全⾯的机器⼈学习计划呢?⼩编为⼴⼤“机器⼈狂热粉”推荐⼀篇⼤疆⽆⼈机智能导航技术总监杨硕的“机器⼈⼯程师学习计划”,或许读完本⽂可使机器⼈⼯程师学习事半功倍!
  前⾔很多朋友私信问我对机器⼈和⼈⼯智能感兴趣,该怎么展开学习。最近稍微有点空,我写写我的看法。
  两年前,我在知乎回答【如何定义“机器⼈”?】的问题中试图给机器⼈做出⼀个⽐较仔细的定义,我觉得机器⼈和⼈⼯智能最⼤的区别在于是否要和物理世界进⾏交互。今年初在另⼀篇知乎“机器⼈或⼈⼯智能的研究会帮助我们更好的了解⼈类⾃⼰吗?”回答中,我说到传感器是和物理世界交互的基础。后来,我⼜在知乎“有哪些与控制、机器⼈等相关的 quotes?”的回答中提到莫拉维克悖论(Moravec‘s paradox),谈到了机器⼈学⾥公认的难题是在物理世界中实现类⼈的活动能⼒。
  把之前的回答再翻出来是为了⽀持以下观点:机器⼈学的核⼼问题是做好和物理世界的交互。现在主流的机器⼈学分⽀⾥,处理与物理世界的交互的学科分为三类:传感器和处理算法(激光雷达,多⽬视觉,融合算法);多刚体系统动⼒学控制(⼯业机器⼈动⼒学控制和接触⼒控制);机器⼈⾃主移动(locomotion不知道该怎么翻译,轮式、⾜式、飞⾏等移动机器⼈的研究)。建议对机器⼈学有兴趣的同学着重在这⼏个问题上⾯。
  1、感知。视觉传感器、图像传感器、触觉和⼒传感器、惯导等。
  2、认知。⼈⼯智能、知识表达、规划、任务调度、机器学习等。
  3、⾏为。运动学、动⼒学、控制、manipulation和locomotion等。
freescale
  4、数学基础。最优估计、微分⼏何、计算⼏何、运筹学等。
  结合卡耐基梅隆⼤学的核⼼课程要求,我觉得我定义的机器⼈学核⼼问题算是基本没跑偏的。本⽂后⾯谈到的机器⼈项⽬都是以上述观点和课程要求为基础。
在线视频转音频
  ⼀些可能有争议性的观点:1、机器⼈学是富⼈的活动。虽然⼯业越来越发达,但好的开发板和电机还是⾮常贵。如果要下定决⼼学习机器⼈学并且做出实物,你必须到做实物出来的资⾦。要么是⾃⼰花钱,要么就得学校的机器⼈社团,或者什么愿意资助年轻⼈学习的贵⼈。另外现在没有任何⼀本完整的书可以教你怎么造⼀个四旋翼空中机器⼈或者⼤狗机器⼈,你需要参考⼗⼏本不同的教科书,这些书不管中⽂版还是英⽂版都很贵。
  2、机器⼈学是屠龙之术。这话是Ninebot创始⼈说的。虽然最近⼏年,平衡车、扫地机器⼈、多旋翼飞⾏器让机器⼈学开始进⼊⼈们的⽣活,但是可⾏的商业应⽤还是很少,⽽且已有的机器⼈和理论都还很难解决好与物理世界交互这件事情。所以⼀定要确保⾃⼰在机器⼈学这个道路上同时练好了能去其他⾏当吃饭的技能,⽐如编程、机械设计和硬件设计。也要做好⼼理准备,接受⾃⼰有可能在学会屠龙之术以后⼏年都造不出对社会有⽤的东西的事实。
  3、基于上述所说的观点,如果是已经⼯作之后才想要学习机器⼈的话,可能已经太迟了,因为很可能兴趣战胜不了客观限制因素。如果作为兴趣去学习,只能学到做巡线⼩车和舵机机械臂什么的,可
能也满⾜不了中⼆病的创造欲。
  个⼈认为机器⼈学是⼀个艰苦的道路,想要成为⼀个独挡⼀⾯的机器⼈⼯程师需要多年理论和实践的同步训练。理论学习和动⼿实践的过程还要互相排好时间表,在做某个实践项⽬的同时去学习最相关理论往往可以达到事半功倍的效果,但是同时那些不太相关的理论会看起来⾮常枯燥,因此如何妥善安排⾃⼰的实践项⽬也是很重要的事情。
  这篇⽂章⾥我计划介绍⼀个电⼦⼯程、机械⼯程和计算机专业学⽣从⼤学⼀年级到研究⽣⼆年级的机器⼈学习计划,基本是我对⾃⼰过去学习⽅式的⼀个总结。按照这个⽅法来学习,能够成为⼀个能⼒全⾯,但是稍微偏软件⼀点的机器⼈⼯程师。这个六年的学习计划,估算下来,全年中每天在上课和完成课程要求之外要投⼊学习时间6-8个⼩时,这些时间⼀⽅⾯⽤于阅读课程知识的英⽂教材,⼀⽅⾯⽤于阅读其他学科的教材,⼀⽅⾯⽤于实践项⽬。
  机器⼈⼯程师在⼤型项⽬⾥的定位类似于飞机系统⾥的总体设计师。和机械⼯程师、硬件⼯程师、软件⼯程师、算法⼯程师、控制⼯程师⽐起来,机器⼈⼯程师参与某个具体技术的时间较少,但是能够听得懂所有⼯程师说的话,能够作为不同模块间的协调⼈,带领整个团队去攻坚。当然如果机器⼈⼯程师能够在⼀个领域达到那个领域的⼯程师的优秀⽔平,肯定更好。
  由于时间仓促,再加上个⼈⽔平有限,⽂章中如有纰漏和错误,恭请读者指出,谢谢。如果同学还有
什么想知道的内容和教材,也欢迎留⾔交流。
  ⼤⼀
  刚上⼤⼀,你的机器⼈⽣涯开始了。先看看学校的校园⽹能不能,不能的话⾃⼰去买个⼀年⼀百多块钱的VPN,先确保⾃⼰能上Google,不要⼼疼VPN的钱,这能让你在之后的职业⽣涯⾥节省上万块钱。然后去注册⼀个gmail账号,再注册stackoverflow账号,再注册github的账号,再注册CSDN账号,注册完登录上去逛逛,暂时先不要问为什么。
  英语⽔平⼀定程度上会是机器⼈⼯程师⽔平的限制因素,英语是同学们在⼤学最该努⼒学的⼀门课,⽽且不⽌要把它当成课,要当成⼀种技能,当成⽣活的⼀部分。当你开始努⼒学习⼀些⾼级的机器⼈知识以后,有可能会⾮常难以到中⽂的参考资料,这个时候如果啃不下英⽂的资料,进步速度和眼界就会受到很⼤影响。因此⼤⼀的时候要多看看,看看美剧。
  不管是什么专业背景的同学,⼤学⼀年级⼀定要上好的课是微积分和线性代数。线性代数的重要性需要特别强调。⼀般来说,优秀的⼯程师和科学家在职业⽣涯中要学⾄少五次线性代数,⼤⼀学⼀遍、学凸优化的时候学⼀遍、学线性系统的时候学⼀遍、学机器学习的时候学⼀遍……如果在第⼀遍学的时候就看到对的书,刷到对的题,那么以后的学习会轻松很多。
  学完线性代数以后,⼀个⾃然⽽然的问题就是怎么能⽤计算机⾃⼰去计算矩阵的乘法、向量的乘法、向量的内积。因此引⼊了编程的学习。
  对任何⼈来说,Python是⼀把瑞⼠军⼑,你可以⽤他⼲很多东西,⽐如⾃动回复邮件、⾃动收集信息。但是真要去造机器⼈,合适的⼯具并不是瑞⼠军⼑,⽽是C/C++这样简单粗暴的锤⼦和螺丝⼑般的⼯具。在学习Python学到⼀定程度的时候(⽐如你听说有⼀种叫做cython的东西),最好开始学习C,⽽且要强迫⾃⼰练习⽤C的⼀维数组和指针来实现矩阵的加法、乘法、求逆等操作。之所以有⾼级的Python或者Java(不要问我Java哪⾥⾼级了)这些语⾔以后我们还需要去学C,是因为机器⼈上常⽤的不是完整的电脑,⽽是计算量有局限的嵌⼊式系统,嵌⼊式系统开发基本只能⽤C或者更低级的语⾔。
  IT⾏业的程序员都会争论⾼级语⾔和低级语⾔哪个好,Linux和Windows哪个好,⽽对于机器⼈⼯程师来说,从现在到可预见的未来⾥,C是最好的语⾔,Linux是最好的操作系统,这都⽏庸置疑。甚⾄对于Linux的发⾏版该选哪个,我们都是很少有质疑的:Ubuntu。原因是机器⼈操作系统ROS是基于Ubuntu开发的,因此在Ubuntu上运⾏最稳定。注意Ubuntu出了⼀个中⽂版叫做Kylin,个⼈感觉⽐较坑,建议⼤家不要装中⽂版。Ubuntu 作为⼀个开源操作系统,总是在快速迭代,2016年8⽉⽐较稳定的版本是14.04和16.04,建议同学安装14.04。
  当你把C学得差不多,开始要学写包含多个头⽂件的程序时,⼀定要同时学习makefile的知识。这时候要上⽹去搜“Makefile详解”这篇⽂章看。
  以上介绍的这些知识点、书和资料应该在⼤⼀期间就全部看完,然后利⽤⼤⼀的暑假好好巩固这些知识。⽐如开始⽤HTML和Javascript做⼀个⾃⼰的个⼈主页,刷⼀刷编程的题⽬,学⽤Python的奇技淫巧(⽐⽅说做⼀个⾃⼰的个⼈主页)。另外还可以抽时间学学数学知识,⽐如开始看看代数和离散数学。我⼤⼀的时候看到了两篇⽂章,认识到了数学的重要性,⼀个是MIT的CV⼤⽜林达华写的[转]MIT⽜⼈解说数学体系,另⼀个是前Goolge研究员吴军博⼠写的《数学之美》(数学之美 (⾖瓣))。当时林达华还在MIT读博⼠,⽽《数学之美》还没有成书。两篇⽂章看完以后我感觉⾃⼰整个⼈对数学的认识上了⼀个新的层次,此后⼀直在注意提⾼⾃⼰的数学⽔平,⼏年下来觉得收益很⼤。在之后的介绍⾥我还会多次强调需要学的数学知识和对应的教材。
  ⼤⼆
  上⼤⼆的时候,你已经会了基本的编程知识和基本的数学知识。⼤⼆这⼀年应该投⼊在嵌⼊式系统的学习中,同时继续拓展⾃⼰多⽅⾯的能⼒。学校的机器⼈社团,⽐如做Robocon,RoboMasters的团队应该在招新了,赶快去加⼊,有了学长学的指导以及同辈朋友的鞭策,应该会进步的快⼀点。
  ⼤⼆应该掌握的技能:Solidworks画基本的机械图,基本的数字电路知识、数模转换,51单⽚机、A
VR单⽚机、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条腿的蜘蛛,⽐如码垛机器⼈。舵机是机器⼈⼯程师的好朋友,⼀定要好好掌握。
directoryindex是什么意思
  另外你其他⽅⾯的能⼒也不能落下。⼤⼆结束的时候,你的Linux应该⽤的很熟练了,除了makefile,你也⽤起了cmake。你也应该开始理解Github存在的意义,因为你已经上去读了很多别⼈的代码,你也把⾃⼰的⼀些课程设计和⼩项⽬放在了Github上⾯。另外⼤⼆基本上了本专业⼀些⽐较难的基础课程,⽐如⾃动控制原理、机器学习、概率统计、材料和⼒学等课程,同学们会看到这些课程⾥⼜⽤到了线性代数和微积分的知识,以及建模的知识。这时候可以把⼤⼀的物理、线性代数和微积分再翻出来看看。
  同学的学校应该给⼤⼆到⼤三的学⽣有开设⾯向对象的程序设计,⼀般⽤Java或C++教授。在⾯向对象的程序课⾥⾯,⼀定要积累3000⾏左右的代码的开发经验。经典的⾯向对象程序设计的练习通常是写游戏,⽐如俄罗斯⽅块,吃⾖⼈等等,⼀定要⾃⼰能够做到完全⼿写⼀个完整的项⽬出来。
  另外你可以开始学习Matlab当中的神器Simulink了。在⼤⼆这⼀年的学习中,你可能在不少课程⾥多多少少⽤到了Matlab。假设你已经在我的推荐下喜欢上了Python,你可能会觉得Matlab的计算⼯具没有⽐Python强多少;假设你⾃⼰在别⼈的推荐下喜欢上了mathematica,你可能会觉得和Mathematica这种神⼀样的语⾔⽐起来,Matlab弱爆了。但是要注意的是,Matlab最强⼤的⼯具是Simulink,通过它你⼏乎可以仿真⼀切的物理系统和控制系统。我建议同学可以通过Simulink实现⼀个倒⽴摆,然后理解Matlab的强⼤之处。阅读并实现了这两篇⽂章⾥的内容,同学应该会对倒⽴摆有了⽐较深刻的认识。倒⽴摆是机器⼈学中⼀个⾮常重要的模型,因为⽕箭、导弹、双⾜机器⼈、四⾜机器⼈,基本都是倒⽴摆的变形。你⾃⼰实现出来的simulink模型⼀定要存好,以后可能还会再拿出来仔细看。
  如果你按照我之前说的⽅法探索了⼀些HTML和Javascript的技术,那么JQuery,bootstrap,AngularJS你已经多多少少知道是怎么回事了。web后端的技术,⽐如PHP和MySQL,也可以了解⼀下,LAMP要学会怎么配置。如果有同学你帮忙写⼩⽹站,尽量去帮个忙,帮别⼈做⽹站是提⾼⾃⼰系统编程能⼒的好练习。在做⽹站的过程中你可能还会顺便学⼀学如何⽤Photoshop和Illustrator让⽹站显得更漂亮。这些技能有最好,没空学也没关系。
#p#四年独⽴制造机器⼈#e#
  ⼤三
  ⼤三开始的时候,你可以在学校的机器⼈队⾥担任重要⾓⾊了,或者能够带领⼀个⼩团队参加⼩型的机器⼈⽐赛。你在系⾥甚⾄院⾥都⼩有名⽓了,可能有的⼈叫你⼤神,有的⼈觉得你技术还不错。但是⼀定要记得你现在的⽔平放到别的地⽅应该不算什么。每年我都往⼤疆的RoboMasters夏令营招进100个和你现在的⽔平相当的同学。
  ⼤三⼀定要培养出⾃⼰⼀个⼈独⽴造出⼀个完整机器⼈的能⼒,⽐如⼀个Robocon⽔平的机器⼈,或者⼀个RoboMasters的战车,或者⼀个四旋翼飞⾏器。
  Robocon⽔平的机器⼈,涉及⼤量的机械设计,单⽚机开发,电机驱动的开发,码盘和超声波等传感器的读取,底盘运动学的计
算,PID调试,任务调度逻辑的调试,舵机控制。RoboMasters的战车的机械部分简单⼀些,但是还需要进⾏云台的控制、发弹系统的控制、功率控制等⽅⾯的知识,另外你也可以不搞这些部分,学习学习视觉识别和⾃动打击,那么就要开始研究OpenCV(OpenCV | OpenCV)了。
  四旋翼飞⾏器的机械部分最简单,但是算法⽐较复杂。对于⼤三学⽣来说,从零开始⼀步到位写⼀个
稳定的飞控⽐较困难,因为飞控⾥⾯有很多细⼩的知识点要注意。⽬前我没有发现什么⽐较好的书籍推荐,已有的⼀些关于四旋翼系统的书要么太浅(上来就教你焊电路),要么太深(上来就教你state estimation),听说 @Liu Top的exbot⼩组在写⼀个教材,我是⾮常期待的。学习四旋翼飞⾏器有下⾯⼏个步骤:
  第⼀步:⾃⼰调⼀个⼩四轴飞起来
  现在开源社区的⼈⾔必pixhawk,其实我觉得从学习的⾓度来说,pixhawk太贵,⽽且不适合学习,我⽐较推荐的是 ⾸页-第七实验室这家淘宝店卖的STM32F405飞控,买回来以后⾃⼰再随便买个机架(⽐如⼤疆F450)、接收机和遥控,就能按照飞控板附带的学习资料、调试软件飞起来。
最好的python入门教材  第⼆步:看硬件图、读代码
  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⽐赛的过程中被那些痛苦和遗憾的学⽣当做发泄的对象,⾮常有感触。我觉得参加机器⼈⽐赛,很努⼒,然后失败了,是⼀件让⼈快速成长的事情。同学如果有机会,⼀定应该参加⾄少⼀届机器⼈⽐赛。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。