我正在使用
pybullet_envs
中的 Walker2D 环境,并且我正在尝试获取 6 个关节角度,以便将它们用于由 Arduino 控制的实际双足机器人。
我尝试过,但没能找到诸如
gym
之类的文档,其中指定了 6 个关节角度的索引,并且它们的值以 rad 为单位进行测量。我发现有人指出在 pybullet_envs
GitHub 文档中评论说联合位置是观察空间的偶数元素。我认为从 Walker2D 环境的每列数组的索引 8 开始,这是正确的。我的问题是我不知道这些值的单位,也不确定它们是否正确。是否有更简单的方法可以使用物理客户端 ID 和机器人 ID 通过环境访问实际值(rad 或 deg)?
我相信我找到了解决方案。
Walker2D 对象有一个名为 jdict 的属性,它是一个包含 Joint 对象的字典。每个 Joint 对象都有自己的 id 作为名为 jointIndex 的属性。
通过关节的 id,可以使用 pybullet 包中的
getJointState()
获得每个关节的状态。返回数组的第一个元素是关节的角度(以弧度为单位?)。 getJointState()
函数所需的输入是机器人 ID 和其状态所需的关节 ID。
示例
env = gym.make('Walker2BulletEnv-v0')
env.reset()
robot_id = env.env.robot.objects[0]
angle = pybullet.getJointState(robot_id, joint_id)[0]
注意:我认为如果您使用多个物理客户端,则还需要客户端 ID,如果有多个机器人,则应该进行一些更改才能获得正确的机器人 ID。