contact0 = s[8] contact1 = s[13] moving_s_base = 4 + 5 * moving_leg supporting_s_base = 4 + 5 * supporting_leg hip_targ = [None, None] # -0.8 .. +1.1 knee_targ = [None, None] # -0.6 .. +0.9 hip_todo = [0.0, 0.0] knee_todo = [0.0, 0.0]
时间: 2024-04-03 09:34:43 浏览: 92
这段代码中,通过获取状态s中对应的位置信息,分别得到了两条腿是否有接触(contact0, contact1)的状态。接下来,根据当前的动作,确定移动腿(moving_leg)和支撑腿(supporting_leg)的序号,计算出对应的位置信息的索引(moving_s_base, supporting_s_base)。然后,分别初始化了用于控制舵机的目标位置列表hip_targ和knee_targ。接着,初始化了用于计算控制力的列表hip_todo和knee_todo,初始值为0.0。
相关问题
if state == STAY_ON_ONE_LEG: hip_targ[moving_leg] = 1.1 knee_targ[moving_leg] = -0.6 supporting_knee_angle += 0.03 if s[2] > SPEED: supporting_knee_angle += 0.03 supporting_knee_angle = min(supporting_knee_angle, SUPPORT_KNEE_ANGLE) knee_targ[supporting_leg] = supporting_knee_angle if s[supporting_s_base + 0] < 0.10: # supporting leg is behind state = PUT_OTHER_DOWN if state == PUT_OTHER_DOWN: hip_targ[moving_leg] = +0.1 knee_targ[moving_leg] = SUPPORT_KNEE_ANGLE knee_targ[supporting_leg] = supporting_knee_angle if s[moving_s_base + 4]: state = PUSH_OFF supporting_knee_angle = min(s[moving_s_base + 2], SUPPORT_KNEE_ANGLE) if state == PUSH_OFF: knee_targ[moving_leg] = supporting_knee_angle knee_targ[supporting_leg] = +1.0 if s[supporting_s_base + 2] > 0.88 or s[2] > 1.2 * SPEED: state = STAY_ON_ONE_LEG moving_leg = 1 - moving_leg supporting_leg = 1 - moving_leg
这段代码是状态机的核心部分,根据当前的状态和动作来更新目标位置列表hip_targ和knee_targ。如果当前的状态是STAY_ON_ONE_LEG,说明机器人正在单腿支撑,此时需要将移动腿的hip_targ和knee_targ设为固定的目标位置,同时逐渐增加支撑腿的knee_targ,使其与地面接触的角度变大。如果速度超过一定阈值,还需要进一步增加支撑腿的knee_targ。当支撑腿的角度达到阈值SUPPORT_KNEE_ANGLE后,将移动到下一个状态PUT_OTHER_DOWN。在PUT_OTHER_DOWN状态下,需要将移动腿的hip_targ设为一个较小的值,同时将其knee_targ设为SUPPORT_KNEE_ANGLE,同时保持支撑腿的knee_targ不变。如果移动腿的脚部接触到地面,就转移到下一个状态PUSH_OFF。在PUSH_OFF状态下,需要将移动腿的knee_targ设为与支撑腿的角度相同,同时将支撑腿的knee_targ设为一个较大的值,使其离地面。如果支撑腿的膝盖高度达到一定阈值,或者速度超过一定阈值,就回到STAY_ON_ONE_LEG状态,同时切换移动腿和支撑腿的序号。
if __name__ == "__main__": # Heurisic: suboptimal, have no notion of balance. env = BipedalWalker() env.reset() steps = 0 total_reward = 0 a = np.array([0.0, 0.0, 0.0, 0.0]) STAY_ON_ONE_LEG, PUT_OTHER_DOWN, PUSH_OFF = 1, 2, 3 SPEED = 0.29 # Will fall forward on higher speed state = STAY_ON_ONE_LEG moving_leg = 0 supporting_leg = 1 - moving_leg SUPPORT_KNEE_ANGLE = +0.1 supporting_knee_angle = SUPPORT_KNEE_ANGLE
这段代码是用于测试BipedalWalker游戏(小人行走游戏)的,其中包含以下内容:
1. if __name__ == "__main__"::如果当前文件被作为独立的脚本运行,即没有被其他脚本引用,那么执行下面的代码。
2. env = BipedalWalker():创建一个BipedalWalker对象,即小人行走游戏的环境。
3. env.reset():重置游戏环境,以便开始新的游戏。
4. steps = 0:记录小人已经行走的步数,初始值为0。
5. total_reward = 0:记录小人已经获得的奖励值,初始值为0。
6. a = np.array([0.0, 0.0, 0.0, 0.0]):定义小人的行动向量,初始值为0。
7. STAY_ON_ONE_LEG, PUT_OTHER_DOWN, PUSH_OFF = 1, 2, 3:定义小人的行动状态,分别为“保持单腿站立”、“支撑另一条腿”和“向前跳跃”。
8. SPEED = 0.29:定义小人行走的速度,小于该速度时小人会向前倾。
9. state = STAY_ON_ONE_LEG:初始状态为保持单腿站立。
10. moving_leg = 0:初始时,左腿是运动的腿。
11. supporting_leg = 1 - moving_leg:初始时,右腿是支撑的腿。
12. SUPPORT_KNEE_ANGLE = +0.1:定义小人支撑腿的膝盖角度。
13. supporting_knee_angle = SUPPORT_KNEE_ANGLE:初始时,小人支撑腿的膝盖角度为SUPPORT_KNEE_ANGLE。
总的来说,这段代码是用于测试BipedalWalker游戏的,其中定义了小人的行动向量、行动状态、支撑腿的膝盖角度等参数。该测试代码可以帮助开发人员了解游戏环境和小人的行为规律,以便更好地开发和优化游戏算法和策略。
阅读全文