全方位行走
现在,NAO使用来自其关节传感器的反馈信息来保持行走平稳,免受各种小干扰的影响,并可以抵消躯干在向前和横向平面里的摆动。
NAO可以在多种地面上行走,诸如地毯、瓷砖地和木制地板等。NAO还可以在不同质地的地面间转换。然而,由于机器人假设地面大致是平坦的,因此大的障碍物仍可让NAO摔倒。我们希望能够在以后的版本中对此加以改进。
行走引擎
NAO行走时使用一个简单的动态模块(线性倒摆),这个模式受Kajita et al1的研究成果的启发,并使用二次编程法(Quadratic programming)2。
NAO迈出的每一步都包括一个双腿支撑和一个单腿支撑的阶段。双腿支撑阶段的用时占每一步用时的三分之一。脚摆动轨迹使用SE3插值。预览控制器(preview controller)用时0.8秒。行走由一个用时0.6秒的双腿支撑阶段进行初始化,并以同样的阶段结束。
脚步规划器
行走进程使用的基本脚步规划器不受命令(如setWalkTargetVelocity、walkTo和stepTo)的影响。它使用一个简单的投影,如下图所示,包括一个由x和y轴的转换以及一个围绕垂直z轴的转动。
注释: |
为了避免计划时双脚碰撞,脚向内转动相应地受到脚分离的限制。 当脚分离为最小值(Minimum Foot Separation)时,转动的最大允许值为最小向内转动值(Minimum Inner Turn)。 当处于最大脚分离时,即最小脚分离+沿Y轴最大步长(Maximum Step Y),最大允许转动值为最大脚步Theta(Maximum Step Theta)。 在这些值之间,每步的转动都为线性插值。 |
---|
默认行走参数
目前,默认行走参数是固定的,无法自定义。
姿势常量
名称 | 值 | 说明 |
---|---|---|
Torso Height | 0.315米 | 躯干平均高度 |
Foot Separation | 0.095米 | 沿横向Y轴的参考脚分离 |
步法保护常量
名称 | 值 | 说明 |
---|---|---|
Minimum Inner Turn (最小向内转动) | 0.050弧度 | 避免转动时双脚碰撞 |
Minimum Foot Separation (最小脚分离) | 0.085米 | 避免横向移动时双脚碰撞 |
脚步常量
名称 | 值 | 说明 |
---|---|---|
Maximum Step X | 0.040米 | 沿X轴的最大步长 |
Maximum Step Y | 0.040米 | 沿Y轴的最大步长 |
Maximum Step Theta | 0.349弧度 | 沿Z轴的最大脚步转动 |
Maximum Step Frequency | 2.38 Hz | 最大步频 |
Minimum Step Frequency | 1.67 Hz | 最小步频 |
得到这些结果的条件:最高行走速度为9.52cm/s(直走和横走),最高转动速度为42°/s。
手臂动作
行走时手臂动作的幅度取决于步频和步长。行走时可随时启动或停止手臂的动作。
# Example showing how to disable left arm motions during a walk leftArmEnable = False rightArmEnable = True proxy.setWalkArmsEnable(leftArmEnable, rightArmEnable) # disable right arm motion after 10 seconds time.sleep(10) rightArmEnable = False proxy.setWalkArmsEnable(leftArmEnable, rightArmEnable)
# Example showing how to get the enabled flags for the arms result = proxy.getWalkArmsEnable() print 'LeftArmEnabled: ', result[0] print 'RightArmEnabled: ', result[1]
自定义手臂动作
行走时,任何用户的手臂命令都优先于默认的手臂动作。这样,您就可以在行走时自由地控制机器人的手臂。如果默认手臂动作启用,这些动作会在您结束控制后继续进行。
# Example showing smooth arm motions during the walk process # Enable arm motions proxy.setWalkArmsEnable(True, True) # Start walkking X = 0.8 Y = 0.0 Theta = 0.0 Frequency =1.0 proxy.setWalkTargetVelocity(X, Y, Theta, Frequency) # Wait time.sleep(4.0) # User arm motions ( a punch in the air ) import math TO_RAD = math.pi/180 Arm1 = [-40, 25, 0, -40, 0, 0] Arm1 = [ x * TO_RAD for x in Arm1] Arm2 = [-40, 50, 0, -80, 0, 0] Arm2 = [ x * TO_RAD for x in Arm2] proxy.angleInterpolationWithSpeed("LArm",Arm1, 0.8) proxy.angleInterpolationWithSpeed("LArm",Arm2, 0.8) proxy.angleInterpolationWithSpeed("LArm",Arm1, 0.8) # Wait time.sleep(3.0) # End the walk X = 0.0 Y = 0.0 Theta = 0.0 motionProxy.setWalkTargetVelocity( X, Y, Theta, Frequency)
参考书目
1 S. Kajita and K. Tani. Experimental study of biped dynamic walking in the linear inverted pendulum mode. IEEE Int. Conf. on Robotics and Automation, 1995.
2 P-B. Wieber. Trajectory free linear model predictive control for stable walking in the presence of strong perturbation. IEEE Int. Conf. on Humanoids, 2006.