使用-Python-进行机器人学-类人形-AI
使用 Python 进行机器人学:类人形 AI
原文:
towardsdatascience.com/train-humanoid-robots-with-ai-and-python/
简介
类人形机器人是形状和运动方式类似于人类身体的机器,旨在与人类并肩工作并交互使用我们的工具。它们仍然是一种新兴技术,但预测到 2050 年将有数十亿个类人形机器人。目前,最先进的原型包括NEO by 1XTech,Optimus by Tesla,Atlas by Boston Dynamics,以及G1 by China’s Unitree Robotics。
机器人执行任务有两种方式:手动控制(当你特别编程它必须做什么时)或人工智能(它通过尝试学习如何做事)。特别是,强化学习允许机器人通过试错学习最佳动作以实现目标,因此它可以通过奖励和惩罚来适应不断变化的环境,而不需要预定义的计划。
实际上,让一个真正的机器人学习执行一项任务是非常昂贵的。因此,最先进的方法是在模拟中进行学习,数据生成快且成本低,然后将其知识转移到真实机器人上(“模拟到真实”/“模拟优先”方法)。这使得在模拟环境中并行训练多个模型成为可能。
市场上最常用的 3D 物理模拟器有:PyBullet(初学者) , Webots(中级), MuJoCo(高级), 和 Gazebo (专业人士)。您可以使用它们中的任何一个作为独立软件,或者通过Gym,这是一个由 OpenAI 制作的库,用于开发基于不同物理引擎的强化学习算法。
在这个教程中,我将展示如何使用人工智能构建一个类人形机器人的 3D 模拟。我会展示一些可以轻松应用于其他类似情况的实用 Python 代码(只需复制、粘贴、运行),并逐行带注释地解释代码,以便您可以复制这个示例(文章末尾有完整代码的链接)。
设置
环境是一个模拟空间,其中代理可以交互并学习执行任务。它有一个定义的观察空间(代理接收的信息)和动作空间(可能的动作集合)。
我将使用 Gym (pip install gymnasium) 来加载由 MuJoCo 制作的 默认环境之一(具有接触的多关节动力学,pip install mujoco).
import gymnasium as gym
env = gym.make("Humanoid-v4", render_mode="human")
obs, info = env.reset()
env.render()

智能体是一个可以像人类一样移动的 3D 双足机器人。它有 12 个 链接(固体身体部分)和 17 个 关节(柔性身体部分)。您可以在这里查看完整的描述。
在开始新的模拟之前,你必须使用 obs, info = env.reset() 重置环境。该命令返回有关智能体初始状态的信息。info 通常包括有关机器人的额外信息。

虽然 obs 是智能体所看到的(即通过传感器),但 AI 模型需要处理这些观察结果来决定采取什么行动。

通常,所有 Gym 环境 都具有相同的结构。首先要检查的是 动作空间,即所有可能动作的集合。对于人形模拟,一个动作代表对其 17 个关节之一施加的力(在-0.4 到+0.4 的范围内表示推力的方向)。
env.action_space

env.action_space.sample()

一个模拟至少应该覆盖一个 回合,即智能体与环境交互的完整运行,从开始到终止。每个回合是一个 reset() -> step() -> render() 的循环。让我们举一个例子,运行一个单回合,人形智能体执行 随机动作,所以不是 AI。
import time
env = gym.make("Humanoid-v4", render_mode="human")
obs, info = env.reset()
reset = False #reset if the humanoid falls or the episode ends
episode = 1
total_reward, step = 0, 0
for _ in range(240):
## action
step += 1
action = env.action_space.sample() #random action
obs, reward, terminated, truncated, info = env.step(action)
## reward
total_reward += reward
## render
env.render() #render physics step (CPU speed = 0.1 seconds)
time.sleep(1/240) #slow down to real-time (240 steps × 1/240 second sleep = 1 second)
if (step == 1) or (step % 100 == 0): #print first step and every 100 steps
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
## reset
if reset:
if terminated or truncated: #print the last step
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
obs, info = env.reset()
episode += 1
total_reward, step = 0, 0
print("------------------------------------------")
env.close()


随着回合的进行和机器人的移动,我们会收到一个 奖励。在这种情况下,如果智能体保持站立或向前移动,则奖励为正,如果它跌倒并接触地面,则是一个负惩罚。奖励是 AI 最重要的概念,因为它定义了目标。它是我们在每次动作后从环境中获得的反馈信号,指示该动作是否有用。因此,它可以用来通过强化学习优化机器人的决策。
强化学习
在模拟的每一步,智能体观察当前情况(即其在环境中的位置),决定采取行动(即移动其一个关节),并收到一个正面或负面的响应(奖励,惩罚)。这个循环一直重复,直到模拟结束。强化学习是一种机器学习类型,通过试错使智能体最大化奖励。因此,如果成功,机器人将知道最佳的行动方案。
从数学上讲,强化学习基于马尔可夫决策过程,其中未来只取决于当前情况,而不是过去。简单来说,代理不需要记住之前的步骤来决定下一步做什么。例如,机器人只需要知道它的当前位置和速度来选择下一步,它不需要记住它是如何到达那里的。
强化学习的一切都是关于最大化奖励。因此,构建模拟的全部艺术在于设计一个真正反映你想要的奖励函数(在这里的目标不是摔倒)。最基本的强化学习算法在接收到积极奖励后更新首选动作列表。这种发生速度是学习率:如果这个数字太高,代理将过度纠正,而如果太低,它将不断犯同样的错误,学习过程痛苦缓慢。
首选动作的更新也受到探索率的影响,这是随机选择的发生频率,基本上是 AI 的好奇心水平。通常,在开始时相对较高(当代理一无所知时),随着时间的推移,随着机器人利用其知识,它会逐渐衰减。
import gymnasium as gym
import time
import numpy as np
env = gym.make("Humanoid-v4", render_mode="human")
obs, info = env.reset()
reset = True #reset if the humanoid falls or the episode ends
episode = 1
total_reward, step = 0, 0
exploration_rate = 0.5 #start wild
preferred_action = np.zeros(env.action_space.shape) #knowledge to update with experience
for _ in range(1000):
## action
step += 1
exploration = np.random.normal(loc=0, scale=exploration_rate, size=env.action_space.shape) #add random noise
action = np.clip(a=preferred_action+exploration, a_min=-1, a_max=1)
obs, reward, terminated, truncated, info = env.step(action)
## reward
total_reward += reward
if reward > 0:
preferred_action += (action-preferred_action)*0.05 #learning_rate
exploration_rate = max(0.05, exploration_rate*0.99) #min_exploration=0.05, decay_exploration=0.99
## render
env.render()
time.sleep(1/240)
if (step == 1) or (step % 100 == 0):
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
## reset
if reset:
if terminated or truncated:
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
obs, info = env.reset()
episode += 1
total_reward, step = 0, 0
print("------------------------------------------")
env.close()


显然,这对于像人形机器人这样的复杂环境来说太基础了,因此即使代理更新了首选动作,它也会继续摔倒。
深度强化学习
当动作和奖励之间的关系是非线性的,你需要神经网络。深度强化学习可以通过利用深度神经网络的强大功能来处理高维输入并估计动作的预期未来奖励。
在 Python 中,使用深度强化学习算法最简单的方法是通过StableBaseline,这是一个包含最著名模型的集合,已经预先实现并准备好使用。请注意,有StableBaseline(使用TensorFlow编写)和StableBaselines3(使用PyTorch编写)。如今,每个人都使用后者。
pip install torch
pip install stable-baselines3
最常用的深度强化学习算法之一是 PPO(近端策略优化),因为它简单且稳定。PPO 的目标是最大化总预期奖励,同时对此策略进行小幅度更新,保持增长稳定。
我将使用StableBaseline在Gym人形机器人环境中训练 PPO。有几件事情需要记住:
-
我们不需要以图形方式渲染环境,因此训练可以以加速的速度进行。
-
Gym环境必须包裹在
DummyVecEnv中,以便与StableBaseline向量格式兼容。 -
关于神经网络模型,PPO 使用多层感知器(
MlpPolicy)进行数值输入,卷积神经网络(CnnPolicy)进行图像处理,以及一个组合模型(MultiInputPolicy)用于混合类型的观察。 -
由于我没有渲染人形机器人,我发现查看TensorBoard上的训练进度非常有用,这是一个用于实时可视化统计的工具包(
pip install tensorboard)。我创建了一个名为“logs”的文件夹,我可以在终端上运行tensorboard --logdir=logs/来本地提供仪表板服务(http://localhost:6006/)。
from stable_baselines3 import PPO
from stable_baselines3.common.vec_env import DummyVecEnv
## environment
env = gym.make("Humanoid-v4") #no rendering to speed up
env = DummyVecEnv([lambda:env])
## train
print("Training START")
model = PPO(policy="MlpPolicy", env=env, verbose=0,
learning_rate=0.005, ent_coef=0.005, #exploration
tensorboard_log="logs/") #>tensorboard --logdir=logs/
model.learn(total_timesteps=3_000_000, #1h
tb_log_name="model_humanoid", log_interval=10)
print("Training DONE")
## save
model.save("model_humanoid")

训练完成后,我们可以在渲染环境中加载新的模型并进行测试。现在,智能体将不再更新首选动作。相反,它将使用训练好的模型来预测给定当前状态的最佳下一步动作。
env = gym.make("Humanoid-v4", render_mode="human")
model = PPO.load(path="model_humanoid", env=env)
obs, info = env.reset()
reset = False #reset if the humanoid falls or the episode ends
episode = 1
total_reward, step = 0, 0
for _ in range(1000):
## action
step += 1
action, _ = model.predict(obs)
obs, reward, terminated, truncated, info = env.step(action)
## reward
total_reward += reward
## render
env.render()
time.sleep(1/240)
if (step == 1) or (step % 100 == 0): #print first step and every 100 steps
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
## reset
if reset:
if terminated or truncated: #print the last step
print(f"EPISODE {episode} - Step:{step}, Reward:{reward:.1f}, Total:{total_reward:.1f}")
obs, info = env.reset()
episode += 1
total_reward, step = 0, 0
print("------------------------------------------")
env.close()

请注意,在整个教程中,我们没有特别编程让机器人保持站立。我们并没有控制智能体。机器人只是在对其环境奖励函数的反应。实际上,如果你对 RL 模型进行更长时间的训练(即 3000 万步),你会发现机器人不仅能够完美站立,还能向前行走。因此,当涉及到使用 AI 训练智能体时,3D 世界的设计及其规则比构建机器人本身更为重要。
结论
本文是一个教程,旨在介绍MuJoCo和Gym,以及如何为机器人创建 3D 模拟。我们使用人形环境来学习强化学习的基础。我们训练了一个深度神经网络来教会机器人如何不跌倒。将会有更多关于更高级机器人的新教程。
本文章的完整代码:GitHub
希望您喜欢这篇文章!欢迎联系我提问、反馈或分享您有趣的项目。
👉 让我们连接 👈

[^((所有图片均为作者所有,除非另有说明))]

浙公网安备 33010602011771号