当前位置: 华文问答 > 数码

如何制作一个机器人?

2013-09-23数码

等这个问题好久了,赶紧强答一波。

先上视频。









https://www.zhihu.com/video/925727570417324032







这是我和大腿同学@黯倦魔女(以下简称腿哥)大三暑假开始制作的一个机器人,属于Ballbot家族,其运动方式用爹妈的话来说就是狮子踩球,或者可以理解成独轮平衡车。Ballbot的始祖是Ralph Hollis教授的CMU Ballbot, 大概长这样(图片来自 Ballbot - Wikipedia):

CMU Ballbot

最初的念头源于某个下午茶后,我和腿哥说起暑假漫漫该如何是好,不如找点乐子造个机器人玩玩。想起之前在IEEE Spectrum上看到的A Robot That Balances on a Ball,呆萌又顺从,大概长这样(图片来自 Ballbot - Wikipedia):

BallIP

便一拍大腿,决定造个这个,代号球波(Qiubot)。。。

接下来回到正题,如何制作一个机器人(球波)。

第0步:找一个金主。(壕们可忽略)

为其重要性,这一步列在最前,因为财力往往决定了制作体验和机器人的性能。但这不一定要最先做,只是需要keep in mind,机器人是个烧钱货,一般造价不菲且十分容易超预算。对于在读的学生来说,最划算的当然是学校买单,既能学到东西又无需降低生活质量,更重要的是可以不用在想法或性能上妥协,零件可挑最贵的买(逃

具体操作方式因人而异,可以参加学校的机器人比赛,社团或者加入实验室。刚开始的时候以上几点对我们都不适用,于是我和腿哥只能自掏腰包,各出一半。一开始我们小心翼翼,零件都挑便宜的买,多少耽误了些进度。等到球波颇具雏形后,我们向学院申请资助,提出造好后可以在学校每年一度的开放日上展示。老师们很开心,表示可提供包养并予以鼓励,敞开膀子干吧少年!

这里给个参考,这是被包养前我们在第一版球波上的花费,总计2000多人民币,虽然不算多,但也将近一个月的伙食。。

获得赞助后,买东西都经学校下单,我们便没再统计花费。没有财务之忧后我们的消费速度直线上升,后来买四个金属万向轮的价格就已经超过了这个数,当然我们的进度也大大加快,花钱毕竟能省时间。

算上不少花在试错上的钱,粗略估计球波总造价在一万人民币左右。这笔钱对大部分学生党来说还是值得心疼的,但对财大气粗的某港校就不值一提了。

技能习得 :淘宝上砍价的能力和一开始就要有烧别人钱的心态

第1步:建模及制图。(机器人构造简单的可略过)

鉴于我和腿哥都是CS出身,没任何机械背景,在直接上手之前我们决定还是先规划一下。本想用经典的SolidWorks画图,无奈我们都是mac用户也没有财力支持正版,于是选择了Autodesk的Fusion 360。后来发现其功能强大不输Solidworks,且学生免费,支持水果,在这里强烈安利一波。

点亮了一些基本的制图技能后发现想象力是最大的限制因素。没学过机械设计,就自己脑补各零件应该有的样子。后来发现其实一开始画错(丑)并不是问题,重要的是之后不断迭代不断改进。

折腾了一个下午第一版的球波设计图诞生了,大概长这样(Ballbot实际上三个轮子足够平衡,为了后面方便写程序就用了四轮):

加材料渲染之后长这样:

我之前在robocon队里呆过,跟里面大触们的图比起来固然是个渣,然而它在两个纯码农的眼里简直骚气冲天。

技能习得 :CAD制图和基本的机械设计

第2步:组装机械部分

终于到了hardcore的部分,手指上的伤疤似乎还在隐隐作痛。

从最简单的做起,第一步是球波的支撑板,也就是上图圆形透明的那块板。我们采用常见亚克力板,买回来后厚着脸皮找机械系的教授借用他们的激光切割机。支撑板get。

第二步,支撑板和电机的连接部分。这个没有现成的部件,我们决定使用3D打印。实验室有台坏掉的3D打印机,一直没人用。于是我们花了一个晚上修好了3D打印机,花了一个晚上调试然后再花一晚上打印。连接部件get。大概长这样:

起初我们设计的时候只考虑其功能,结果因为3D打印机精度不错加上这玩意设计得太尖锐,安装的时候手指没少被割伤,后来学乖了边角都得加光滑过度。然后因为打印材料的热胀冷缩及打印机的精度问题,打出来的零件尺寸跟设计图会有误差,一开始计算尺寸的时候就得把这个考虑进去。还有各种各样的问题,总而言之硬件都是坑。。。

技能习得 :3D打印机的维修调试及花式拧螺丝

第3步:搭建电路部分

终于到了更hardcore的部分,看着照片仿佛还能闻到烧焦的味道。

在把电机安装到支撑板上之前,需要确认电机能按预想地运转。我们使用树莓派(Raspberry pi)作为主控,用gpio接四个电机驱动板,每个驱动板接一个步进电机。选用步进电机是因为它扭矩比较大。电路接好后大概长这样:

一通电,电机就欢快地转了起来。我和腿哥正准备弹冠相庆,电机就越转越慢最后完全停下来了,空气中弥漫着一股塑料烧焦的味道。

一阵紧锣密鼓的调试之后发现因为电流太大,L298N电机驱动板激发了过热保护。而且电线载流量太小,这里一个步进电机就是1.5A,4个就是6A,而有些电路用的还是彩虹(杜邦)线。。。naive了。。。

一阵紧锣密鼓的调试之后发现L298N就是个坑货,我们决定换上一般3D打印机使用的A4988步进电机驱动板。妈妈再也不用担心我宕机了。

换了线换了板后继续试,电机又欢快的转了起来。

于是我们把电机安装到支撑板上









https://www.zhihu.com/video/925751734196924416







再加上IMU,用传感器的姿态控制电机的转速和方向。









https://www.zhihu.com/video/925752220161544192







看上去就只差把球波倒过来调个PID了!!

然而还是太naive。我们发现电机转得并不顺滑,时不时会跳步或者停顿。一阵紧锣密鼓的调试之后发现是因为电机控制代码写得不够实时,用来控制电机的PWM频率不够稳定。改进了代码之后情况有所好转,然而问题还是存在。又一阵紧锣密鼓的调试之后发现问题的关键在于实时的代码跑在一个非实时的操作系统之下,整个系统就还是非实时的。。。于是干脆把控制电机的代码放在Arduino上,树莓派只处理IMU的数据,二者用串口通信。虽然这样也还是不能保证实时性,但效果比之前好多了。

技能习得 :步进电机的使用及硬件花式debug法

第4步:写控制代码

这一步是我们的老本行嘿嘿。。。然而这是一个flag,回过头来看这一步花的时间最多。

为搭建测试环境,我们拆了实验室的一张桌子,这样便获得了一个完美的支架:

???????????

为了不用盲调PID,我们用rosserial接上ROS,再用rqt_plot画出roll和pitch角度的实时曲线,大概长这样:









https://www.zhihu.com/video/925753356033593344







PID调一调,球波居然真的摇摇晃晃站了起来!









https://www.zhihu.com/video/925754013402664960







然而坚持不了多久就会倒下去,怎么调PID都没有用。一阵紧锣密鼓的调试之后并没有解决办法。

这样过了一段有事没事调PID的日子,快要绝望的时候,突然想起可以请教一下Masaaki Kumagai教授,就是前面提到的A Robot That Balances on a Ball的主人。于是抱着试一试的心态给教授发了邮件。没想到教授秒回,并给出了许多建设性意见。

嗯,看来这种摇摇晃晃站不稳的情形教授也遇到过,获得不少心理安慰。接下来需要解决问题。一是教授提到的backlash,我们一阵紧锣密鼓的调试之后发现万向轮轮面与球的接触存在不少间隙,会导致一些起伏,于是决定换上轮面更加完整的全铝合金万向轮,大概长这样

球波的颜值瞬间提高了不少(800软妹币一个的代价。。。)。

然而,换上之后问题更严重了。一是轮子直径增大导致电机提供的扭力不再够用。二是金属的轮子和光滑的保龄球之间摩擦太小。最终结果就是backlash更加严重。

解决方案有二,一是换扭力大的电机(为此重新设计了衔接部分,也更换了驱动板),二是给保龄球加一层塑胶膜(汽车轮毂喷膜)。换上之后颜(cheng)值(ben)再涨二十百分点。

为节省空间把驱动板外壳给拆了

然后是提高控制频率。我们直接摈弃了树莓派(不实时的都是辣鸡。。)换上了Arduino Mega,用频率稳定的interrupt机制输出PWM控制电机。

除此之外,还为IMU设计了一个减震装置(又是一条血路。。。)以减少噪声,虽然后来发现不是很有必要。

升级之后长这样,小伙简直帅气逼人:

这次在直接上手调PID之前我们吸取了教训(这玩意太重,每次扶着调完整个手臂都在抖),打算先测试一下整个系统work不work。

于是我们用第一版球波剩下的零件随手搭了一个二轮平衡车来练习调PID。。。









https://www.zhihu.com/video/925756319938539520







加个遥控









https://www.zhihu.com/video/925756591716851712







然后把电池整合到车上









https://www.zhihu.com/video/925756706204557312







加个盖就可以卖了。。咳咳。。。扯远了

回到球波,把所有东西都整合到一起,吹一口仙气,就可以出炉了!









https://www.zhihu.com/video/925757031527383040







这样,一个机器人(球波)就制作好了。

技能习得 :敢于迭代,敢于推倒重来(尤其是硬件)的大无畏精神

至于你问我这玩意花这么多时间精力搞出来有什么用嘛(被问一万次了)。。。

没事的时候可以跟小伙伴练习传接球(波)









https://www.zhihu.com/video/925764680180461568







(感谢 @龏秂犚 同学的出镜)

然后可以带去参加科技展,逗逗小朋友。

最后还可以给它搭建个网站:qiubot.com 就可以昭告世人(给你捐钱)啦!

后续:拜访祖师爷

来到CMU后有幸拜访了Ralph Hollis教授,一偿夙愿。

他们实验室还有个用电磁驱动轮子(球)的Ballbot,直接省去了电机,整个机器人就只有一个球在底下自己动,可谓脑洞不小。除此之外这位白发苍苍的老爷爷还有一车跟电磁有关的黑科技,鉴于他有商业合作就不放上来了。最后一脸粉丝相地和CMU Ballbot同框一张(教授太高真不是我腿短。。)

后记:制作球波前后近半年有余,从大三暑假到大四下学期。其间也忙着别的比赛,上课,毕业设计和申请学校,中途一度搁置。申请结束后总算有时间了却这桩心事。最后的球波仍有很多可改进之处,但作为一条CS狗从硬件的坑里拉扯出这样一个机器人我要给自己颁发一朵小红花。

造过球波后,越发认为自己搭建一个机器人是学习Robotics的最佳方式,从机械到电子到软件,只有自己踏过坑才能深刻地理解。

回到本问题,题主其实不用担心知识储备不够,只需要敢于跳坑,一个一个解决遇到的问题,自然而然就会积累下宝贵的实践经验和各种乱七八糟的知识,且这样学到的东西才会让你毕生难忘(像炸电池这种事我才不会说。。

完。