(2)Gymnasium--CartPole的测试

1、主要参考

(1)

CartPole 强化学习详解1 - DQN_Oxalate-c的博客-CSDN博客

(2)官方文档,推荐!!!!

 Cart Pole - Gymnasium Documentation

2、相关说明

2.1 动作空间

取值{0,1},表示推车被推的固定力的方向。

 注:所施加的力所减少或增加的速度不是固定的,它取决于杆指向的角度。杆子的重心改变了移动它下面的小车所需的能量。

原文:

2.2 观察空间

观察空间是一个4维的数据

 注:虽然上述范围表示每个元素的观测空间的可能值,但它并不反映未终止事件中状态空间的允许值。特别是:

(1)车的x位置(索引0)可以在(-4.8,4.8)之间取值,但如果车离开(-2.4,2.4)范围,则事件终止。

(2)关于极角范围

原文:

 2.3奖励

由于目标是尽可能长时间保持杆子直立,因此每走一步(包括终止步)都会获得+1的奖励。对于CartPole-v1,奖励的阈值是500,对于CartPole-v0,是200。

2.4 起始状态

 2.5回合结束

如果出现以下任何一种情况,插曲结束:

(1)端接:极角大于±12°

(2)终止:小车位置大于±2.4(小车中心到达显示屏边缘)

(3)截断:剧集长度大于500 (v0为200)

3、基于传统PID的控制实现

3.1主要参考

CartPole 强化学习详解1 - DQN_Oxalate-c的博客-CSDN博客

 3.2主要代码

在上面3.1大佬的基础上,使用最新版直接测试了一下,代码如下

import gymnasium as gym

env = gym.make("CartPole-v1", render_mode="human")
observation, info = env.reset()

#参数还要自己调试 
kp = 0.000
kv = -0.002
ka = -0.3
kav = -0.01
ks = -0.000
sum_angle = 0.000
frames = []
 

def CalcAction(obs):
    action = 0 # 0 meanleft, 1 means right
    global sum_angle
    sum = kp * obs[0] + kv * obs[1] + ka * obs[2] + kav * obs[3] + ks * sum_angle
    sum_angle += obs[2]
    if (sum < 0.0):
        action = 1
    else:
        action = 0
    return action

for i in range(1000):
    # action = env.action_space.sample()  # agent policy that uses the observation and info
    action = CalcAction(observation)
    observation, reward, terminated, truncated, info = env.step(action)
 
    if terminated or truncated:
        observation, info = env.reset()
        print(i)
 
env.close()

3.3 测试图

4、直接根据角度进行控制

4.1 主要参考

https://www.iotword.com/12054.html

4.2 主要代码如下

可以看出,跑个40、50步没什么问题

import gymnasium as gym
# env = gym.make("CartPole-v1")
env = gym.make("CartPole-v1",render_mode="human")

print(env.action_space)
#print(env.get_action_meanings())

observation, info = env.reset(seed=42)
print(observation,info)

def action_pos(status): 
    pos, v, ang, va = status
    #print(status)
    if pos <= 0: 
        return 1
    else: 
        return 0 

def action_angle(status): 
    pos, v, ang, va = status
    #print(status)
    if ang > 0: 
        return 1
    else: 
        return 0

steps = 0
for _ in range(1000):
    action = env.action_space.sample()
    observation, reward, terminated, truncated, info = env.step(action_angle(observation))
    # print(observation, reward, terminated, truncated, info)

    if terminated or truncated:
        print("Episode finished after {} steps".format(steps))
        observation, info = env.reset()
        steps = 0
    else:
        steps += 1
        
env.close()


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值