11年前,专门给电影电视做动画控制系统的马特-丹顿(也是《星球大战》中机器人BB-8的创造者和操作者之一)制作出了µBug:
2014年,Max.K看到了这些机器人的视频,也很喜欢,这种有机的、像昆虫一样的动作很少有机器人能做到,本来打算买一个玩玩的,无奈商店和论坛早已下线。没办法,他试着找到了一些流传的文档资料,决定自己做一个。
在做到步行模拟器期间,Max遇到了一些障碍,因为屡次碰壁,搁置了这个项目。
今年年初,波士顿动力的机器人大火,对腿部机器人非常着迷的作者又把这个项目挖了出来,并最后在上个月完成了机器人的制作。
六条腿的机器人与四足机器人相比,有一个很大的优势——腿多。
它可以抬起三条腿,而让剩下的三条腿形成一个稳定的三角架,可以一定程度上消除不断转移重量和平衡的需要。
简单介绍
ZeroBug是一个3D打印的微伺服六足机器人,由树莓派 Zero和STM32F103驱动。
Pi Zero负责输入和前端处理,让机器人可以通过鼠标、键盘、多点触摸或是简单的蓝牙游戏手柄进行控制。
为了让机器人行走,使用STM32来处理腿部运动、反运动学并控制18个舵机。所有计算都以50Hz的速度运行,让Hexapod能够平稳地、高精度地移动。
外观部分的框架全部由3D打印。
主要特点
- 定制的运动引擎
- 紧凑的CAD设计和3D打印部件
- 通过websocket提供键盘、鼠标和多点触摸输入的网络接口
- 支持蓝牙游戏控制器
- 拥有可以操纵物体的爪子
- 使用标准的业余舵机(至少在全球芯片短缺的情况下),建造成本低廉
Github上的PCB布局、源代码和STLs:https://github.com/CoretechR/Zerobug
材料
- 1 × - STM32F103C8T6
- 1 × - 树莓派 Zero W
- 20 × - EMAX ES08A II 微型舵机
- 1 × - 定制电路板
- 1 × - 恩智浦PCA9685 PWM驱动器
- 1 × - MPU6050
- 1 × - 2600mAh 6V NIMH电池(目前未使用)
步行仿真模拟
其实我在2014年的时候,做过一个四足机器人,不过犯了一个错误,就是在不知道软件如何完成的情况下就设计组装了硬件部分。
对于这个项目,我想在将时间和金钱投入到物理原型之前,确定可以让机器人正常行走,而要做到这一点,最好的办法就是使用模拟。
我没有使用专门的机器人模拟器,而是决定再次使用Processing,因为之前已经用它给四足机器人创建过了一个模拟器。Processing是一种与Arduino非常相似的编程语言和IDE,只是它是基于Java而不是C++。对我来说,最大的好处之一是这两种语言非常相似,为Processing桌面应用程序开发的代码可以很容易地移植到Arduino上,只需稍作修改即可。
我从一个非常简单的机器人腿部运动的动画开始,然后越来越复杂,直到六足都能够正常运动。
下面是开发过程的一个小的动图:
整个模拟最困难的部分是弄清运动方式。
由于运动的速度、方向和旋转都是变量,六足必须确定在某一特定时间将哪些腿移动到什么位置。
现在我实现的运动引擎是这样工作的:
每条腿都有树状坐标,一个默认位置,一个起始位置和它的当前位置。
默认位置是这条腿将尝试恢复的坐标。当每条腿处于默认位置时,机器人就处于一个中性姿势。当六足机器人开始行走时,它的腿首先与身体相反地移动的,这意味着在腿部着地时,要转移起始位置和当前位置。很显然,如果腿不迈步,它们会很快超过其运动范围。为了确定哪条腿要抬起来,这边采用了步态序列,这只不过是一个查找表,说明哪条腿可以在序列中的什么时间迈出一步。如果轮到一条腿迈步,起始坐标就被冻结,这条腿现在沿着起始坐标与默认位置之间的路径前进,直到到达目标。
步高是由沿该路径的进展决定的,使腿以倒抛物线的形状移动。当代码在步态序列中循环时,每条腿都会试图追上身体的运动,从而到达它们的默认位置。
这是我能想到的最简单的方法了,足以让机器人顺利地移动。
在开发了这个运动功能之后,剩下部分就比较容易实现了。
为了使六足机器人静态地移动和旋转,腿部坐标要围绕身体的中心点进行平移/旋转。为了确定腿部关节的角度,需要计算反运动学。虽然这听起来很复杂,但这只是必须对每条腿进行的基本数学方程式。
对于模拟器来说,用Processing的3D渲染来显示六足,既可以是钢丝网,也可以是其后来的CAD文件。控制机器人是通过鼠标和键盘完成的,可以很方便让我们在不需要任何硬件的情况下感受到机器人行走的样子。
硬件部分
仿真完成后,是时候开始硬件部分的制作了。
我开始设计单腿的零件,并寻找合适的电机。
由于这个六足机器人需要18个电机,它们决定了机器人的总成本。于是,我选择了一些便宜的Emax ES08A II微型伺服电机。
相对于它们的尺寸来讲,它们性能算是相当强大的了,而且塑料齿轮到目前为止看起来还是保持良好。
虽然它们是 "微型 "的,但这些舵机也会消耗大量的电流。
我本来打算先用锂电池,但后来改用NIMH电池。一个很明显的好处是,6个1.2V的NIMH电池可以很好地增加到6V电压,而这恰好是舵机需要的。锂电池则需要加一个电压调节器,而高电流的需求只会使项目不必要地复杂化。
为了驱动舵机,需要18个PWM输出。
起初,我尝试找到一个有足够IO的微控制器来直接连接舵机。Teensy 4.0可能是一个很好的选项。然而,机器人的空间非常有限,Teensy板似乎并不合适。
STM32F103是下一个不错的选择,因为它与Arduino兼容,而且我之前也已经积累了一些使用宏键盘的经验。
由于IO和定时器有限,一个PCA9685 PWM驱动器被用来控制16个舵机,而剩下的4个舵机可以由STM32本身处理。
下面是运行在宏键盘原型上的hexapod软件,
选择好了微控制器后,机器人仍然没有办法从外部进行控制。
为了给它增加无线连接,我决定加入树莓派 Zero W。
对于基于Pi Zero的Zerobot机器人,我已经创建了网络界面的软件,我想增加一个蓝牙游戏控制器应该也不成问题,选定了最重要的部件后,开始继续制作PCB。
在ZeroBug板上,微控制器和树莓派是通过UART连接的。我使用的是一个底部入口的针座。这可以让装配更紧凑,而不必焊接树莓派;STM32可以使用其USB接口进行编程,而树莓派则使用其WIFI连接,通过SSH或VNC浏览器访问。
为组件供电也是比较麻烦的事情,因为我希望能够用USB连接或电池为电路板供电。这可以通过创建一个二极管-OR电路来实现(见下图)。
在只连接USB的情况下,Pi提供(几乎)5V的电压,无论如何它在内部会降到3.3V。此外,STM32也有自己的3.3V稳压器。当接上电池时,它通过一个简单的反极性保护直接为舵机供电。一个额外的5V LDO为树莓派和微控制器供电。
在实际使用中,效果很好。只有在电池电量很低的情况下,树莓派才可能在快速运动中复位,由于这个原因,我正在用STM32测量电池电压。
在确定部件的方向时,必须考虑下面几个方面:
- USB插座必须容易接近。
- 伺服连接器的位置必须尽量减少电线的长度。
为了使树莓派的天线不受电机和电池的影响,我不得不将它指向地面。
最后,摄像头的连接器朝向机器人的前面,这样以后就可以安装一个摄像头。我忽略了舵机的针头有多长,连同舵机插头一起,它们太大,没办法装入机器人,也是这个原因,后来不得不把伺服电缆焊接上去。
我设法在两层板上装下所有的元件,甚至还为MPU6050运动传感器和一个用于I2C OLED显示的连接器留出了空间。
这个连接器在测试时很方便,因为OLED屏幕可以显示腿部的状态,而不需要给舵机供电。
在等待PCB到达的时候,我继续设计六足的腿和身体的3D打印部件。
我以马特-丹顿的uBug的比例做参考,结果发现,在不影响腿部运动范围的情况下,我可以勉强减去几毫米。
所有的机械部件都是在Fusion360中设计的,可以用最小的支撑物打印。
为了防止机器人滑倒,还给他们做了一些灵活的TPU“袜子”,可以扣在腿上。
还在机器人的前面添加了一个可选的爪子。这个地方本来是用来放摄像机的,不过,感觉用爪子来移动物体比一个摇晃的摄像机要更有意思。
软硬件结合
将运动代码从Processing模拟移植到STM32上相对简单,不过还是必须添加一些安全检查,防止机器人出意外,把腿缠住了。
微控制器管理着运动、旋转、IK和其他一切的计算,只需不到20ms。
当然,还是有很大的优化空间的,让它运行得更流畅。
我写了一个简单的协议用于通过UART控制STM32。这个协议可以用来接收来自USB或树莓派 Zero的命令。
树莓派运行一个python脚本,处理Websocket通信、UART和pygame,一旦客户端连接到Pi,就会加载一个网站,可以用键盘、鼠标或触摸输入来控制六足机器人。
Pygame允许与游戏控制器进行蓝牙连接。树莓派翻译命令,并通过串口将它们发送到STM32上。Pi还发送一个周期性的心跳信号,所以STM32可以在树莓派冻结的情况下停止舵机。
这种树莓派和微控制器的组合效果非常好。控制六足机器人非常有意思,特别是你用Xbox控制器。
最后
总的来说,我对这个项目的完成度还是非常满意的。六足机器人可以像我希望的那样行走,并能以很好的精度进行控制。
开发过程并不总是像阅读这篇文档记录看起来那样顺利。实际上,我在2014年就开始了模拟仿真部分的工作,由于沮丧而搁置了整个项目,只是在几年后才把它挖出来。就在今年年初,我才有了动力去完成这个项目。现在回想起来,ESP32可能是树莓派和STM32的可能替代品。不过,性能和与游戏控制器的兼容性可能也是一个问题。