記事のディレクトリ
まず、フレーム
強化学習の基本的な考え方によると、我々はエージェントのセクションと対話するために、ビルドシミュレーション環境を必要とします。各サイクルは、以下の手順が必要です。
- 環境を初期化します:インポートに関連するモデルを含めて、動態パラメータ等を設定
- アクションの実行生成された動きモデルを作るためにアクションエージェントを:
- リターン・ステータスとインセンティブ:現在の状態を取得し、報酬値を計算するために、再度アクションを実行した後、エージェントに戻りました
したがって、我々はそれを機能する環境の枠組みを含める必要があります。
class Cheetah(object):
def __init__(self):
'''
初始化参数
'''
pass
def reset(self):
'''
环境复位
'''
pass
def step(self):
'''
执行动作
'''
pass
def get_observe(self):
'''
获取当前状态
'''
pass
def reward(self):
'''
计算奖励值
'''
pass
あなたは報酬関数の一部を無視することができますので、ここでは、強化学習の一部と見なされていません
1、__init__
ここでは、次のように初期化する必要があります。
- pybulletクライアント:標準を使用してpybullet
- motor_id:モータ角度を設定するために使用される、対応する番号は便宜のために直接与えられている関節の様々なタイプの、区別する必要があります。
- セット重力
- パラメータを設定:
addUserDebugParameter
このAPIは、ユーザー定義のパラメータを提供し、私は腰の角度を設定するためにここにいます - 角度設定:
resetDebugVisualizerCamera
このAPIは、私の中で、カメラの姿勢を設定することができpybulet練習の記事は、その使用を導入しています
私たちは、クラスの初期化を呼び出す必要がある場合にはreset()
、ミニチーターのスタンスを設定する機能を
def __init__(self):
# self.pybullet_client = self._pybullet_client = bc.BulletClient(connection_mode=pybullet.GUI)
self.pybullet_client = pybullet
self.pybullet_client.connect(self.pybullet_client.GUI)
self.pybullet_client.setAdditionalSearchPath(pybullet_data.getDataPath())
self.motor_id_list = [0, 1, 2, 4, 5, 6, 8, 9, 10, 12, 13, 14]
self.pybullet_client.setGravity(0, 0, -9.8)
# self.upper_angle = self.pybullet_client.addUserDebugParameter("upper_angle", 0, 1, 0.4)
self.pybullet_client.resetDebugVisualizerCamera(0.2, 45, -30, [1, -1, 1])
self.reset()
2、reset
- インポートグラウンド
- インポートmini_cheetahモデル
- 関節の情報を印刷します:
getNumJoints
関節の情報を取得します - コール
reset_pos()
各脚のスタンスを設定する機能を
def reset(self):
init_position = [0, 0, 0.5]
self._ground_id = self.pybullet_client.loadURDF('plane.urdf')
self.quadruped = self.pybullet_client.loadURDF(
"mini_cheetah/mini_cheetah.urdf",
init_position,
useFixedBase=False)
num_joints = self.pybullet_client.getNumJoints(self.quadruped)
for i in range(num_joints):
print(self.pybullet_client.getJointInfo(self.quadruped, i))
for i in range(4):
self.reset_pos(i, 0.7853982)
3、step
ここでの唯一のデモ以来、その機能を動的に時間に応じてmini_cheetah地上高(sin関数)を達成するように調整され、より高度な操作コマンドのno使用することは、ありません。
readUserDebugParameter
このAPIは、ユーザーが指定したパラメータを読み込むのに適して__init__
機能が初期化されている、我々は、スライダーの地上高を調整するsin関数を同時に飲まないように注意してくださいすることができます。
def step(self):
t = 0
while 1:
t += 0.001
angle = 0.4 * np.sin(t) + 0.5
# angle = self.pybullet_client.readUserDebugParameter(self.upper_angle)
for i in range(4):
self.reset_pos(i, angle)
self.pybullet_client.stepSimulation()
4、reset_pos
セット足のスタンスは、setJointMotorControl2
コントロールジョイントは、このAPIのを介して実行されているとして、このAPIのpybulletは、最も一般的に使用されます。APIは、それぞれ股関節と膝角度制御のために、ここで利用します。
def reset_pos(self, leg_id, angle):
l1 = 208
l2 = 180
hip_angle = 0.0
upper_angle = -angle
# 离地高度L与髋关节角度alpha的关系,在数学问题-初始姿态这篇文章介绍过该公式
L = l1 * np.cos(angle) + np.sqrt(-l1 ** 2 * np.sin(angle) ** 2 + l2 ** 2)
gamma = np.arccos((-l1 ** 2 + L ** 2 + l2 ** 2) / (2 * L * l2))
beta = angle + gamma
self.pybullet_client.setJointMotorControl2(self.quadruped,
jointIndex=self.motor_id_list[3 * leg_id],
controlMode=self.pybullet_client.POSITION_CONTROL,
targetPosition=hip_angle)
self.pybullet_client.setJointMotorControl2(self.quadruped,
self.motor_id_list[3 * leg_id + 1],
self.pybullet_client.POSITION_CONTROL,
targetPosition=upper_angle)
self.pybullet_client.setJointMotorControl2(self.quadruped,
self.motor_id_list[3 * leg_id + 2],
self.pybullet_client.POSITION_CONTROL,
targetPosition=beta)
5、実行
if __name__ == '__main__':
env = Cheetah()
env.step()
:今だけでなく、我々はプログラムの実行方法を見て
、動的効果を: