概要
小龟主控板设计了一套基于舵机并行的运动模型。基于这个接口,可以快速实现多个舵机的并行联动。
小龟主控板的舵机接口是并行执行接口,也就是同时提交两行舵机指令,会同步执行。
而不是象传统的串行代码那样,先等待第一行舵机指令结束,再执行第二行舵机指令。
基础概念
管脚集
在机器人结构中,通常每个结构单元都会由多个舵机组成,我们将这些多个舵机对应的管脚集,称为管脚集。
如:机械臂是由S1、S2、S3三个舵机组成,那么机械臂的管脚集是 [S1, S2, S3];
如:机器狗尾巴是由A1、S7两个舵机组成,那么尾巴的管脚集是 [A1, S7];
动作节点集
我们知道一个动作(比如:抬腿)可以分解成多个节点,比如先抬膝盖到指定高度,然后再抬小腿到指定高度两个阶段组成。
我们将这两个阶段称为两个节点,一组节点组成了一个完整的动作。
单独每个节点的格式如:
[节点耗时, 节点停留, 舵机1的目标角度,舵机2的目标角度, ......]
分别意义如下:
节点耗时:代表期望用多少秒,将所有舵机旋转到目标角度。如果本节点内有多个舵机,则多个舵机都会消耗相同的时间到达指定角度;
节点停留:代表所有舵机到达本节点目标角度后,保持现有角度停留多少秒;
舵机N的目标角度:和管脚集对应的每个舵机期望旋转到的目标角度;
节点集则是由多个单一节点组合而成的数组集合:
[[节点1耗时, 节点1停留, 舵机1的目标角度1,舵机2的目标角度1, ......],
[节点2耗时, 节点2停留, 舵机1的目标角度2,舵机2的目标角度2, ......], ....]
小龟主控板的舵机操控就一个统一的接口 car.servo
具体说明如下
单舵机单角度运动
语法:
- car.servo(管脚, 目标角度, 旋转耗时)
说明:
旋转指定管脚上的舵机到目标角度。
参数:
- 管脚:管脚的标准名称
- 目标角度:单位度,期望舵机最终到达的角度
- 旋转耗时:单位秒,期望舵机用多少时间完成从当前角度到达期望的目标角度的旋转工作。
范例:
#用5秒钟时间,将舵机A1从当前角度位置旋转到90度位置。
car.servo(A1, 90, 5)
#用1.5秒钟时间,将舵机S1从当前角度位置旋转到0度位置。
car.servo(S1, 0, 1.5)
单舵机连片运动
语法:
- car.servo(管脚, 动作节点集, 重复动作时长)
- car.servo(管脚, 动作节点集)
说明:
旋转指定管脚上的舵机到目标角度。
参数:
- 管脚:管脚的标准名称
- 动作节点集:参考本文动作节点介绍篇章
- 重复动作时长:单位秒,重复整个动作多长时间后才结束。(本参数缺省的场合,为动作仅执行一次)
范例:
#按这个次序旋转A1管脚上的舵机:
#1、先用3秒钟时间旋转到0度,然后停留1秒钟;
#2、接着用1秒钟时间旋转到180度,不做停留;
#3、最后用3秒钟时间旋转舵机到95度。
car.servo(A1, [
[3,1,0],
[1,0,180],
[3,0,95],
])
多舵机连片运动
语法:
- car.servo(管脚集, 动作节点集, 重复动作时长)
- car.servo(管脚集, 动作节点集)
说明:
旋转指定管脚上的舵机到目标角度。
参数:
- 管脚集:管脚集合,参考本文管脚集定义介绍篇章。
- 动作节点集:参考本文动作节点介绍篇章。
- 重复动作时长:单位秒,重复整个动作多长时间后才结束。(本参数缺省的场合,为动作仅执行一次)
范例:
#按下面次序依次同步旋转S1、S2、S3三个舵机:
#步骤1:用3.5秒钟时间,同时将S1旋转到0度、S2旋转到0度、S3旋转到0度,旋转完成后,并停留1秒钟;
#步骤2:用2秒钟时间,同时将S1旋转到180度、S2旋转到120度、S3旋转到90度,旋转完成后,并停留1.5秒钟;
#步骤3:用5秒钟时间,同时将S1旋转到30度、S2旋转到90度、S3旋转到180度,旋转完成后,并停留1秒钟;
car.servo([S1, S2, S3], [
[3.5, 1, 0, 0, 0],
[2, 1.5, 180, 120, 90],
[5, 1, 30, 90, 180]
])