用Python做一只真·多足机器人,钢铁蜈蚣能弯曲还能蠕动
大数据文摘出品
来源:declanoller
编译:徐玲、李世林、陈若朦
足式机器人是如今机器人设计的热点,相较于轮式和履带式机器人,足式设计的优势在于其极强的地形通过能力。
你一定见过模仿人类的两足机器人、犬型和马型的四足机器人、近来爆红的蜘蛛型六足机器人,那你有想过再多来几条腿吗?
控制行走一直是足式机器人的一大设计难点,腿越多则移动越困难。然而,一位名叫Adimin的外国小哥用python做了一只可爬行可弯曲的蜈蚣型机器人。
问:为什么要做设计成蜈蚣型呢?
小哥答:蜈蚣在体型上具有相当的长度,而通过向上弯曲身体还可以具有一定的高度。但是重点是——从来没人做过!蜈蚣机器人够酷、够怪、够有趣!
让“蜈蚣”蠕动起来:双伺服旋转的腿
为实现“蜈蚣”的移动,同时考虑到电力需求,Adimin设计了腿在水平和垂直方向上的旋转功能,分别命名为hip servo 和ankle servo。
于是,腿就能在两个方向上蠕动起来!
此处的所有伺服均由PCA9685 PWM分支板控制——这是一个I2C器件,允许同时控制多达16个伺服器,既便宜又实用。
考虑腿的数量和“蜈蚣”身体的的连接方式,Adimin小哥将主体平台部分设计得较大,给腿的添加留出更多空间;同时在前后两端采取铰链设计(采用金属齿轮MG 996R),不仅能实现身体长度的延伸,还能完成向上弯曲的动作。
“蜈蚣”弯曲起来!
用Python制作多足机器人
“蜈蚣”运动的控制代码是一个分层的类结构。
最基本的单元是Servo部分,使用这部分功能可以直接控制伺服器。
代码中更高级的部分是Leg,其中包含了两个Servo对象,分别用来控制之前提到的 “hip” 和 “ankle” 伺服系统,根据其自身leg_index(2*leg_index和2*leg_index + 1)为它们分配正确的板索引值。
LegPair部分与之Leg类似类似,其中创建了两个Leg对象分别控制左右。
1. b = DriverBoard(args.addr, 16) 2. 3. if args.N_pairs > 4: 4. b_front = DriverBoard(40, 8) 5. 6. pairs = [] 7. for i in range(args.N_pairs): 8. if i < 4: 9. lp = LegPair(b, i) 10. else: 11. lp = LegPair(b_front, i-4) 12. 13. pairs.append(lp) 14. 15. start = time() 16. while True: 17. for p in pairs: 18. p.increment_ankles()
让我们来看看这段代码的功能——“蜈蚣”弹跳起来了!
其实,让“蜈蚣”实现行走的部分是increment _ankles()函数。为了解释这一点,让我们回到Servo class。
伺服系统的主要工作是循环移动。为了控制伺服装置的位置,需要向它发送一个特定占空比的脉宽调制(PWM)信号。接下来,我们要找到对应于该点的脉宽调制,即中点脉宽调制(mid_pwm),使它围绕一个点振荡。然后,定义一个脉宽调制幅度(pwm_amplitude),该幅度会决定它在这个循环中相对于中点上下移动的距离。于是,让“蜈蚣”循环移动起来只需通过以下代码:
pwm = int(self.pwm_mid + pwm_amplitude*sin(self.phase + self.phase_offset))
如果要让一条腿以我们预期的“行走”方式运动,hip和ankle伺服系统不可能做完全相同的运动。让我们将运动参数化成x和y,加上时间变量t,构成一个正弦函数,令x(t)=y(t)=sin(ωt),便可以得到下面这个运动曲线:
为了实现行走,则还需要您给其中一个变量提供相位偏移(如上面的代码所示),最终得到一个圆。
在伺服系统的相位偏移变量设计中,Adimin表示分层设置实在是太炫酷了——它能使多条腿连贯运动!
每个腿的伺服对象之间需要一定的相位偏移,而每条腿相对于其他腿也存在相位偏移。因此,我们需要给每个LegPair对象一个高级的相位偏移量,然后每个部分将相应的偏移量分配给它的低级对象。
除了上下跳动以外,Python还能实现“蜈蚣”的其他运动方式:
1. b = DriverBoard(args.addr, 16) 2. 3. if args.N_pairs > 4: 4. b_front = DriverBoard(40, 8) 5. 6. sleep(0.5) 7. pairs = [] 8. for i in range(args.N_pairs): 9. if i < 4: 10. lp = LegPair(b, i) 11. else: 12. lp = LegPair(b_front, i-4) 13. 14. if i%2 == 1: 15. lp.set_phase_offset(pi) 16. pairs.append(lp) 17. 18. start = time() 19. time_limit = args.runtime 20. 21. while True: 22. for p in pairs: 23. p.increment()
自然生物学为机器人设计提供了黄金标准,我们需仍要很长时间才能制造出完成一切动物行为动作的多足机器人。而另一方面,机器人不受生物学的限制,这意味着它们总有可能学习动物天生就不会的新行为。