NAO机器人除了我们所熟知的传感器以外,内部还拥有陀螺仪、加速度计和驱动单元。
陀螺仪与加速度计的功能如同人体的内耳,提供了让机器人保持平衡与重力的功能。
驱动器(Actuators)指的是位于NAO机器人各关节上的伺服电机,每个电机上都有一个编码器(Encoder),编码器的功能是测量电机的旋转角度,通过电机的旋转角度,便能知道机器人的手臂或者其他关节正处于什么位置。
刚刚我们提到了驱动器内部有编码器,其功能是检测机器人所有关节(电机)角度的变化。在本节中我们在Choregraphe软件中使用【Python】指令盒,设计一个能够让操作者自由转动机器人的一支手臂,而另一支手臂则会跟着操作者移动轨迹移动的镜像动作指令盒。
双击指令盒,进入指令盒内部构造
Bumper指令盒内部构造(左脚)
Bumper指令盒内部构造(右脚)
碰撞传感器位于NAO机器人双脚的前端。碰撞传感器通过是否被按压或碰撞来感测信号,机器人能通过此功能辨别前方是否有障碍物。
碰撞传感器指令盒有两个布尔值输出,分别是表示左右脚是否被按压。指令盒内部分别有左右脚变量输出,若是其中一只脚被按压,那么输出数值为“1”(True),两只脚都没被按压则会输出“0”(False)。
碰撞传感器位置
双击指令盒,进入指令盒内部构造
Python指令盒内部说明
接着输入Python代码,如下图所示:
import timeclass MyClass(GeneratedClass): def __init__(self)://将需要用到的各个关节做定义 GeneratedClass.__init__(self) self.motion = ALProxy("ALMotion") self.done = False self.stiff = ['RShoulderPitch','RShoulderRoll','RElbowYaw','RElbowRoll'] self.unstiff = ['LShoulderPitch','LShoulderRoll','LElbowYaw','LElbowRoll'] self.origStiffness = self.motion.getStiffnesses(self.unstiff) def onLoad(self): #put initialization code here pass def onUnload(self)://信号未输入时将各关节锁死 self.done = True self.motion.setStiffnesses(self.unstiff,self.origStiffness) def onInput_onStart(self)://信号输入时执行动作 self.motion.setStiffnesses(self.unstiff,0.0) self.done = False while not self.done: vals = self.motion.getAngles(self.unstiff,True) vals[1] = -vals[1] vals[2] = -vals[2] vals[3] = -vals[3] self.motion.setAngles(self.stiff,vals,0.5) time.sleep(0.1) def onInput_onStop(self)://信号输入后暂停时动作 self.onUnload()
本程序通过一个循环来持续测量左手臂关节角度,并在右臂设置相同的角度。利用getAngles函数取得手臂的角度,并使用setAngles函数来设定另一个手臂的角度。
stiff变量指的是将执行镜像动作的手臂(右臂)的关节;
unstiff变量指的是有刚度的手臂(左臂)关节。
所以当左脚的碰撞传感器(Bumpers)被按下时,机器人的关节电机没有上电,处于放松状态,右脚的碰撞传感器(Bumpers)按下后,关节即恢复其刚度。