4本足のロボットミニチーターシミュレーション環境(a)のフレーム構造を構築するために最初から

まず、フレーム

ここに画像を挿入説明
強化学習の基本的な考え方によると、我々はエージェントのセクションと対話するために、ビルドシミュレーション環境を必要とします。各サイクルは、以下の手順が必要です。

  • 環境を初期化します:インポートに関連するモデルを含めて、動態パラメータ等を設定
  • アクションの実行生成された動きモデルを作るためにアクションエージェントを:
  • リターン・ステータスとインセンティブ:現在の状態を取得し、報酬値を計算するために、再度アクションを実行した後、エージェントに戻りました

したがって、我々はそれを機能する環境の枠組みを含める必要があります。

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()

:今だけでなく、我々はプログラムの実行方法を見て
ここに画像を挿入説明
、動的効果を:
ここに画像を挿入説明

44元記事公開 ウォンの賞賛283 ビューに10万+を

おすすめ

転載: blog.csdn.net/weixin_41045354/article/details/104772011