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