Datawhale 算法笔记 AI硬件与机器人大模型 (三)
场景 (Scene)是一个静态的环境,像一个空的舞台。演示 (Demonstration)是在这个舞台上完成一次任务的完整记录,也称为“轨迹 (Trajectory)”。它包含了专家(人类遥操作或最优规划算法)在该场景中为完成特定任务(如“拿起杯子”)而执行的每一步动作和环境状态。演示的主要用途是模仿学习 (Imitation Learning)。常规重播(默认):脚本在每一步执行演示文件中记录的
主题:
- 强化学习与智能决策
- 机器人强化学习框架
- PPO算法在机器人控制中应用
- ManiSkil仿真环境搭建与训练
本文将依然采用QA的形式记录学习笔记。
在教程地址:
datawhalechina/ai-hardware-robotics
没发现强化学习和智能决策的教程,自己找些资料先学习
因此采用倒序去做笔记
ManiSkil仿真环境搭建与训练
Q:什么是ManiSkii?(教程没介绍,自己查的)
A:
ManiSkill 是为机器人操控技能研究而设计的、开源的、大规模的统一基准测试平台。ManiSkill 提供了非常丰富的、标准化的机器人操控任务环境,涵盖了从简单的推、抓、放,到复杂的开关门、使用工具、操作铰链物体等。算法的性能可以在一个统一的、公认的平台上进行公平比较。
它的优点包括:
-
高质量的物理仿真: 它基于高性能物理引擎 SAPIEN 和 NVIDIA PhysX 构建,能够进行逼真、精确的刚体和软体物理仿真。
-
GPU 并行加速:利用 GPU 进行大规模并行仿真。可以同时运行多个仿真环境,加速了强化学习模型的训练过程,将原本可能需要数天的训练缩短到几小时。
-
逼真的视觉渲染: 能生成高质量、照片级的视觉数据,如 RGB 图像、深度图、点云和分割掩码。这对于训练那些需要从“视觉”来理解世界的机器人智能体至关重要。
-
易于使用的接口: 遵循了广泛使用的
gymnasium
(前身为 OpenAI Gym) API 接口,上手非常容易。
ManiSkill 可以在windows上使用,但是较为复杂,建议在Linux上使用cuda进行仿真。使用 ManiSkill 遵循以下几个步骤:安装 -> 创建环境 -> 与环境交互 -> 训练智能体。
第一部分:基本概念与仿真对象
Q1: 在ManiSkill中,“位姿 (Pose)” 具体指什么?它由哪几部分组成?
A1: 位姿 (Pose)指的是物体在三维空间中的 位置 (position) 和 朝向 (orientation) 。在ManiSkill和其底层的SAPIEN引擎中,位姿由一个三维向量表示位置 (x, y, z) 和一个四维的 四元数 (Quaternion) 表示朝向 (w, x, y, z) 共同组成。
Q2: 教程中提到了两种主要的仿真对象:Actor 和 Articulation。它们最根本的区别是什么?
A2:
-
Actor 是一个 单一的的物体。当它受力时,整个物体会一起移动,内部不会发生相对运动。可以把它想象成一块砖、一个杯子。分为缸体和软体,软体可以碰撞变形(需要定义碰撞形状:是物体的“骨骼”或“力场”,是物理引擎用来计算碰撞、摩擦和受力的依据。它的作用是定义物理边界。)
-
Articulation (关节机构) 是由多个 连杆 (Links) 通过 关节 (Joints) 连接而成的 复杂组合体。连杆类似刚体actor,需要关节和另外一个连杆连接。关节可以分为固定转动和滑动。它的各个部分之间可以发生相对运动。例如,一个带抽屉的柜子,抽屉(一个连杆)可以相对于柜体(另一个连杆)滑动(通过滑动关节)。
Q3: Actor 分为动态、运动学和静态三种类型,我应该如何选择?
A3:
-
动态 (Dynamic): 当需要物体完全遵循物理规律时使用。例如,一个需要被机器人抓取的杯子,它需要能够被推动、举起和掉落。这是最消耗计算资源的类型。
-
运动学 (Kinematic): 当物体可以移动但不受外力影响时使用。例如,一个由动画控制的移动平台。它可以推动动态物体,但动态物体无法推动它。
-
静态 (Static): 当物体在仿真开始后完全固定不动时使用,例如墙壁、地板或固定的桌子。这是最节省计算资源、仿真速度最快的类型。
Q4: 关节 (Joint) 有哪几种主要类型?它们分别有什么作用?
A4:
-
固定关节 (Fixed Joint): 将两个连杆牢固地连接在一起,使它们之间没有相对运动,像焊接一样。
-
转动关节 (Revolute Joint): 允许一个连杆绕着一个固定的轴线相对于另一个连杆旋转,就像门的铰链。
-
滑动关节 (Prismatic Joint): 允许一个连杆沿着一个固定的轴线相对于另一个连杆平移(滑动),就像抽屉的滑轨。
第二部分:GPU 仿真
Q5: ManiSkill 如何在 GPU 上实现大规模并行仿真?什么是“子场景 (sub-scene)”?
A5: ManiSkill 将所有环境中的所有对象都加载到 同一个大的 PhysX 物理场景 中。然后,为每个并行的任务实例在这个大场景里划分出一个称为 “子场景 (sub-scene)” 的小工作空间。通过这种方式,GPU可以同时计算成千上万个子场景中的物理交互,从而实现大规模并行。
Q6: 使用子场景进行并行仿真时,需要注意什么潜在问题?
A6: 需要注意 子场景之间的干扰。如果一个子场景中的物体移动范围过大,超出了其工作空间的边界,它可能会进入并影响到相邻的子场景。可能发生在仿真空间较大(如房屋环境)而子场景间距 (spacing
) 设置得过小。
Q7: env.reset
和 env.step
在GPU仿真中的生命周期是怎样的?
A7:
-
env.reset
(重置环境):-
重新配置: 将所有物体加载到场景中。
-
GPU初始化: 初始化GPU内存缓冲区。
-
状态初始化: 在CPU端设置所有对象的初始位姿、关节位置等。
-
数据应用: 将CPU端设置好的初始状态数据传输到GPU缓冲区。
-
数据更新与获取: 在GPU上更新物体状态并准备好生成第一次的观测数据。
-
-
env.step
(单步仿真):-
接收动作 (Action): 获取用户的控制指令。
-
应用控制: 将动作转换为关节目标位置/速度,并将其应用到GPU缓冲区中。
-
推进仿真: 在GPU上执行一步物理计算。
-
获取数据: 从GPU获取更新后的状态,并生成新的观测数据、奖励等。
-
第三部分:控制器与观测
Q8: 什么是控制器 (Controller)?它在机器人控制中扮演什么角色?
A8: 控制器是 用户/策略 与 仿真机器人 之间的接口。它负责将用户提供的抽象动作(例如,“末端执行器向上移动一点”)转换成机器人关节能够理解和执行的底层控制信号(如每个关节的目标位置或目标速度)。控制器直接定义了任务的动作空间。
Q9: PD EE Pose
控制器中的“增量控制 (Incremental Control)”是什么意思?控制坐标系有哪些选择?
A9:
-
增量控制: 意思是输入的动作不是一个绝对的目标位姿,而是一个相对于当前末端执行器位姿的 变化量(增量)。例如,动作
[0.1, 0, 0, 0, 0, 0]
可能意味着“沿X轴正方向移动0.1米”。 -
控制坐标系: 教程提到了平移和旋转的不同参考坐标系,这决定了动作的“方向”是基于哪个参考系。
-
平移: 可以在 根坐标系 (root frame) 或 末端执行器自身坐标系 (body frame) 中进行。
-
旋转: 可以在 根对齐的身体坐标系 或 身体对齐的身体坐标系 中进行。这些组合提供了灵活直观的控制方式。
-
Q10: 我可以从环境中获得哪些类型的观测数据?state
和 pointcloud
模式有什么区别?
A10: 可以获得多种观测数据,通过设置 obs_mode
来选择:
-
state_dict
/state
: 提供 特权信息,如所有物体的精确位姿、机器人的关节角度和速度。state
是state_dict
的扁平化版本。这对于需要完全信息的算法很有用,但在现实世界中通常无法获得。 -
rgb+depth+segmentation
(及其组合): 提供来自虚拟相机的 视觉数据,如彩色图像 (RGB)、深度图 (Depth) 和分割图 (Segmentation)。模拟了现实世界中的传感器。 -
pointcloud
: 将来自一个或多个虚拟相机的数据融合成一个 点云。它直接提供了场景的三维几何信息(点的坐标、颜色等)。
Q11: 如何自定义仿真中的相机,比如提高渲染质量或改变分辨率?
A11: 在创建环境时通过传递配置参数来自定义相机。
-
改变通用属性:
gym.make("PickCube-v1", sensor_configs=dict(width=320, height=240))
可以改变所有传感器相机的分辨率。 -
改变特定相机:
gym.make("PickCube-v1", sensor_configs=dict(camera_0=dict(width=320, height=240)))
只改变名为camera_0
的相机。 -
改变渲染质量:
gym.make("PickCube-v1", human_render_camera_configs=dict(shader_pack="rt"))
可以将用于人类观察的渲染器切换为光线追踪模式,以获得更逼真的画面。
第四部分:可复现性
Q12: 如何保证 ManiSkill 仿真实验结果是可复现的?
A12: 有两种主要方法:
-
通过随机数生成器 (RNG) 和种子: 在调用
env.reset(seed=...)
时提供一个确定的种子或种子列表。ManiSkill 使用_batched_episode_rng
来确保即使在不同数量的并行环境下,只要种子相同,随机化过程(如物体加载、初始位置等)就是确定的。 -
通过环境状态: 您可以保存和加载环境的完整状态(所有物体的位姿、速度、关节角度等)。如果在相同的随机化设置下(使用相同的种子创建环境),加载一个保存好的状态可以精确地恢复到那个时刻的场景。
好的,我们继续使用 QA 形式对 #场景数据集 和 #演示 (Demonstrations) 这部分内容进行分析。
场景数据集、演示与轨迹重播
第一部分:场景数据集 (Scene Datasets)
Q1: ManiSkill 中的“场景数据集”是什么?有什么用?
A1: “场景数据集”是预先构建好的、高质量的交互式三维环境集合,例如厨房、公寓房间等。它们来源于 RoboCasa、ReplicaCAD 和 AI2THOR 等项目。使用这些包含数百个物体的复杂场景,主要目的是为了训练更通用、泛化能力更强的机器人智能体,也可以作为生成合成数据的来源。
Q2: 如何下载和初步探索这些场景?
A2:
-
下载: 使用命令行工具
python -m mani_skill.utils.download_asset
。用--list "scene"
列出所有可下载的场景,或者直接指定名称(如ReplicaCAD
)进行下载。 -
探索: 使用示例脚本
python -m mani_skill.examples.demo_random_action
。通过-e
参数指定一个使用该场景的环境ID(例如"ReplicaCAD_SceneManipulation-v1"
),然后可以用-s
参数指定不同的种子来加载场景中的不同实例。
第二部分:演示 (Demonstrations)
Q3: 什么是“演示 (Demos)”?它和“场景”有什么区别?
A3:
-
场景 (Scene) 是一个静态的环境,像一个空的舞台。
-
演示 (Demonstration) 是在这个舞台上完成一次任务的完整记录,也称为“轨迹 (Trajectory)”。它包含了专家(人类遥操作或最优规划算法)在该场景中为完成特定任务(如“拿起杯子”)而执行的每一步动作和环境状态。演示的主要用途是模仿学习 (Imitation Learning)。
Q4: 演示数据以什么格式存储?包含哪些文件?
A4: 演示数据由两种文件成对组成:
-
HDF5 文件 (
.h5
): 存储了核心的轨迹数据,如每一步的动作 (actions
)、环境状态 (env_states
)、任务是否终止 (terminated
) 等。 -
JSON 文件 (
.json
): 存储了元数据 (Metadata),这是复现环境所必需的信息。它包含了环境ID、初始化参数 (env_kwargs
) 以及每个回合 (episode) 的重置参数 (reset_kwargs
)。
Q5: 为什么原始的演示文件通常不包含图像等观测数据?
A5: 这是为了节省存储空间。完整的观测数据(高清图像或点云)会使文件变得异常庞大。原始演示文件只存储了最核心的环境状态 (env_states) 和动作 (actions)。如果需要图像等观测数据,可以通过“轨迹重播”工具来重新生成。
第三部分:轨迹重播与转换 (Trajectory Replay/Conversion)
Q6: replay_trajectory 这个命令行工具的核心功能是什么?
A6: 是一个功能强大的工具,用于加载一个已有的演示 (.h5 文件),并在仿真器中重新运行这个过程。其核心功能包括:
-
可视化:通过 GUI 实时观看演示过程 (
--vis
)。 -
数据生成:为原始演示补充缺失的数据,例如生成并保存 RGB 图像 (
-o rgb
) 或计算奖励 (--record-rewards
)。 -
格式转换:将演示中的动作从一种控制模式转换为另一种(例如从关节控制
-c pd_joint_pos
转换到末端执行器控制-c pd_ee_delta_pose
)。 -
跨后端重播:将在 CPU 上收集的演示在 GPU 环境中重播,反之亦然。
Q7: 想把一个用关节控制 (pd_joint_delta_pos) 录制的演示,转换成末端执行器控制 (pd_ee_delta_pose) 给模型学习,应该怎么做?
A7: 根据文档说明,直接转换可能不可行。需要进行一个两步转换:
-
第一步: 先将
Bashpd_joint_delta_pos
转换为绝对关节位置控制pd_joint_pos
。python -m mani_skill.trajectory.replay_trajectory \ --traj-path [源文件.h5] \ --target-control-mode pd_joint_pos \ --save-traj
-
第二步: 然后将上一步生成的新文件从
Bashpd_joint_pos
转换为pd_ee_delta_pose
。python -m mani_skill.trajectory.replay_trajectory \ --traj-path [上一步生成的pd_joint_pos.h5] \ --target-control-mode pd_ee_delta_pose \ --save-traj
Q8: 在 CPU 和 GPU 之间重播演示时,为什么要使用 --use-first-env-state 参数?
A8: 因为 CPU 和 GPU 仿真之间存在微小的非确定性差异。即使给定相同的种子,env.reset() 后的初始状态也可能略有不同,导致后续的动作序列产生完全不同的结果(例如失败)。--use-first-env-state 参数会跳过随机重置这一步,直接将环境强制设置为演示文件中记录的第一个环境状态,从而确保重播有一个完全一致的起点。
Q9: 什么是 --use-env-states 参数?它和常规的动作重播有什么不同?
A9:
-
常规重播(默认):脚本在每一步执行演示文件中记录的
action
,让物理引擎自行演算下一步的状态。这可能会因为仿真中的非确定性而导致最终结果与原始演示有偏差。 -
使用
--use-env-states
:脚本会忽略演示中的action
,在每一步都直接将环境“传送”到文件中记录的env_state
。这种方式可以保证重播的画面与原始轨迹完全一致,对于需要精确生成对应观测数据(如RGB图像)的场景至关重要。
运动规划与远程操控
第一部分:运动规划 (Motion Planning)
Q1: ManiSkill 中的“运动规划”是什么?它依赖于哪个核心库?
A1: 在 ManiSkill 中,“运动规划”是一种基于算法的、非学习的方法,用于自动生成机器人从起点到终点的无碰撞运动轨迹。它主要通过一个名为 mplib 的开源库来实现,该库会随着 ManiSkill 一同安装,无需额外操作。
Q2: 提供的运动规划示例是如何解决一个任务的?以 PickCube-v1
为例。
A2: 这种方法的核心思想是将一个复杂的任务分解为一系列简单的子目标。开发者需要手动编写脚本来定义这些步骤。例如,在 PickCube-v1
任务中,脚本将任务分解为:
-
移动到物体上方:规划路径让夹爪移动到立方体正上方,并对齐方向。
-
接近物体:规划路径让夹爪垂直向下移动。
-
抓取:闭合夹爪(这是一个离散动作,非路径规划)。
-
移动到目标点:规划路径将持有物体的夹爪移动到目标位置上方。
mplib
会为每个需要移动的步骤计算出平滑且无碰撞的关节运动轨迹。
Q3: 如何使用 ManiSkill 内置的运动规划方案来生成演示数据?
A3: 可以直接运行提供的示例脚本。例如,要为 PickCube-v1
任务生成演示并保存视频,可以执行以下命令:
python -m mani_skill.examples.motionplanning.panda.run -e "PickCube-v1" --save-video
-
使用
-e
参数指定环境ID。 -
使用
--vis
可以在 GUI 中实时观看。 -
使用
--save-video
会在无头模式(不显示 GUI)下运行并保存视频。 -
运行结束后,生成的轨迹数据会以
.h5
格式保存在demos/motionplanning/<env_id>
文件夹中。
Q4: 这种基于运动规划的方法主要有什么局限性?
A4: 主要局限性有两点:
-
需要大量人工介入:它无法自主学习解决方案,需要工程师为每个任务手动设计、编写和调试分解后的步骤,工作量大且泛化能力差。
-
不适用于动态任务:它假设环境是静态的。如果任务中包含移动的障碍物或需要快速反应,这种预先规划的路径就会失效。
第二部分:远程操控 (Teleoperation)
Q5: ManiSkill 中的“远程操控”是什么?其主要目的是什么?
A5: “远程操控”是让人类用户实时控制仿真环境中的机器人来完成任务。其主要目的是收集高质量的专家演示数据,这些数据随后可以用于模仿学习等机器学习算法的训练。
Q6: 文中介绍的“点击+拖动”远程操控系统如何工作?需要什么硬件?
A6:
-
硬件要求:仅需最基础的显示器、鼠标和键盘。
-
工作方式:
-
运行
python -m mani_skill.examples.teleoperation.interactive_panda
脚本启动。 -
在弹出的 GUI 窗口中,你可以用鼠标直接拖动机器人手臂的末端执行器(夹爪)到你想要的目标位置和姿态。
-
按下键盘上的
n
键,系统会调用运动规划 (mplib) 来生成一条从当前位置到你拖拽位置的平滑轨迹,并执行。
-
Q7: “点击+拖动”系统的常用键盘快捷键有哪些?
A7:
-
g
:切换夹爪状态(抓取/释放)。 -
n
:规划并执行到当前鼠标拖拽设定的目标姿态的动作。 -
c
:完成并保存当前这条轨迹,然后开始一条新的轨迹。 -
q
:退出程序。退出时,所有收集到的轨迹会自动保存到demos/teleop/<env_id>
文件夹。 -
h
:显示帮助菜单,列出所有键盘命令。 -
wasd
+ 鼠标右键:控制摄像机视角。
Q8: “点击+拖动”系统有什么局限性?能用它来收集扔东西的演示吗?
A8: 不能。该系统的主要局限性是仅适用于动力学要求较低的任务(即慢速、精确的移动)和简单的二指夹爪。你可以用它轻松地完成“拾取-放置”类的任务,但无法完成像“扔”立方体这样需要快速、动态爆发力的动作。
好的,我们继续以 QA 形式对 #强化学习 部分进行分析。
强化学习 (Reinforcement Learning)
第一部分:环境设置与 API 兼容性
Q1: 当用 gym.make("PickCube-v1", num_envs=N) 创建环境时,得到的是标准的 Gym 环境吗?
A1: 不是。 默认情况下,ManiSkill 创建的是一个“批处理 (batched)”环境。这意味着所有的输入(如 action)和输出(如 obs, rew)都带有一个批处理维度 N(即并行环境的数量)。这并非标准的 gymnasium 单环境 API。
Q2: 如果我的强化学习库(如 Stable-Baselines3)需要一个标准的、非批处理的 Gym 环境,我该怎么办?
A2: 你需要使用 CPUGymWrapper 这个包装器。它会移除批处理维度,并将所有数据(Torch Tensors)转换为 NumPy 数组。这样处理后,环境的行为就和任何一个普通的 gymnasium 环境完全一样了。
from mani_skill.utils.wrappers.gymnasium import CPUGymWrapper
env = gym.make("PickCube-v1", num_envs=1)
env = CPUGymWrapper(env) # 应用包装器
Q3: 如何让 ManiSkill 兼容那些为标准“向量化环境 (VectorEnv)”设计的强化学习算法?
A3: 可以使用 ManiSkillVectorEnv 包装器。它能将 ManiSkill 原生的批处理环境无缝适配 gymnasium 的 VectorEnv 接口,使得需要 AsyncVectorEnv 或 SyncVectorEnv 的算法可以直接使用。
Q4: ManiSkillVectorEnv 和标准的 gymnasium 向量化环境最主要的区别是什么?
A4: 最关键的区别在于数据的类型和位置。
-
ManiSkillVectorEnv: 为了效率,它返回的所有数据都是在 GPU 上的批处理 PyTorch 张量 (torch.Tensor)。
-
标准 Gym VectorEnv: 通常返回在 CPU 上的批处理 NumPy 数组 (np.ndarray)。
这一点在使用时需要特别注意,因为它能避免不必要的数据在 CPU 和 GPU 之间的来回拷贝,从而提升训练速度。
第二部分:策略评估
Q5: 文档中强调了“正确地”评估策略,其核心要点是什么?
A5: 为了保证公平、标准化的评估,必须遵循两个核心设置:
-
关闭部分重置 (
ignore_terminations=True
): 在评估过程中,即使某个子环境成功或失败,它也不会立刻重置,而是会等到所有并行环境都运行完一个完整的 episode。这确保了所有评估回合的长度一致。 -
高频率场景重构 (
reconfiguration_freq=1
): 在每次reset
时,都强制对环境进行重新配置。如果任务支持对象随机化,这意味着每个评估回合都会面对新的物体形状、大小或初始位置,可以有效检验策略的泛化能力,避免过拟合到单一场景。
Q6: 在这个标准评估流程中,会记录哪些关键指标?
A6: 主要记录以下几个指标来全面衡量策略性能:
-
success_once
: 在一个回合中,任务是否曾经成功过。 -
success_at_end
: 在一个回合的最后一步,任务是否处于成功状态。 -
fail_once
/fail_at_end
: 对应失败情况的指标。 -
return
: 整个回合中累积的总奖励。
第三部分:常见问题与基准
Q7: 在强化学习中,获取图像观测的正确方式是什么?可以使用 env.render() 吗?
A7: 绝对不能使用 env.render()。这是一个常见错误。env.render() 仅用于可视化或录制视频。正确的做法是在创建环境时设置 obs_mode (例如 obs_mode="rgbd"),然后图像观测会作为 obs 的一部分由 env.reset() 和 env.step() 直接返回。
Q8: 当使用图像观测时,我的智能体还能获取到物体的精确坐标等“特权信息”吗?
A8: 不能。只要 obs_mode 不是 state 或 state_dict,ManiSkill 会自动从观测中移除所有特权信息(如物体的真实位姿)。智能体只能获取到模拟传感器(如摄像头、机器人自身的关节编码器)所能感知到的信息,这更贴近现实世界。
Q9: ManiSkill 提供了哪些现成的强化学习算法基准?
A9: ManiSkill 提供了一些已实现并测试过的在线强化学习基准算法,包括:
-
PPO (Proximal Policy Optimization): 已有完整的代码和可查看的结果。
-
SAC (Soft Actor-Critic) 和 TD-MPC2: 正在进行中 (WIP)。
所有基准的训练结果都发布在公开的 wandb 页面上,方便研究者查询和比较。
Q10: 什么是“标准基准 (Standard Benchmark)”?它包含哪些任务?
A10: 这是一个官方推荐的、用于标准化评估和比较算法性能的任务集合。它分为:
-
小集合 (Small Set): 包含 8 个精心挑选的任务,覆盖了多种机器人操控技能,适合计算资源有限的研究者进行快速基准测试。
-
大集合 (Large Set): 包含 50 个任务,仍在开发中。
这些任务都提供了归一化的密集奖励函数,以方便强化学习算法的训练。
以下仅补充框架,因为教程里也没有很详细的内容
强化学习与智能决策
目录 (Directory)
-
核心概念:什么是机器人强化学习 (Robotics RL)
-
1.1 定义与目标
-
1.2 与传统控制方法的区别
-
-
框架三大核心组成部分
-
2.1 智能体 (Agent):机器人的“大脑”
-
2.2 环境 (Environment):机器人的“世界” (仿真 vs. 现实)
-
2.3 交互接口 (Interface):连接大脑与世界的“神经系统”
-
-
机器人RL的特有挑战与解决方案
-
3.1 现实世界的挑战:安全、磨损与数据采集成本
-
3.2 核心解决方案:Sim-to-Real (从仿真到现实)
-
-
典型的技术栈与工具
-
4.1 仿真环境
-
4.2 强化学习算法库
-
4.3 硬件
-
要点 (Key Points)
-
1. 核心概念
-
定义:机器人强化学习是一种让机器人在虚拟或真实环境中,通过不断试错 (Trial and Error),自主学习如何完成特定任务(如抓取、行走)的方法。
-
目标:学习一个最优的策略 (Policy),即在任何状态下,都能做出最佳决策(动作),以最大化长期累积奖励 (Reward)。
-
区别:传统控制依赖精确的数学模型和人工设计的规则;RL 则从数据中学习,能够适应更复杂、非结构化的环境。
-
-
2. 核心组成部分
-
智能体 (Agent):
-
策略 (Policy):智能体的核心,是一个函数或神经网络,决定了在当前状态下应该执行什么动作。学习的目标就是优化这个策略。
-
价值函数 (Value Function):用于评估某个状态或“状态-动作”对的“好坏”程度,帮助策略做出更长远的决策。
-
-
环境 (Environment):
-
仿真环境:如 ManiSkill, Isaac Gym。这是训练的主要场所,可以进行大规模、高速、安全的并行训练。成本极低。
-
真实环境:即物理机器人。用于最终的部署和测试。
-
-
交互接口 (RL Loop):
-
观测 (Observation):环境传递给智能体的状态信息。可以是机器人关节角度、速度等状态(state)信息,也可以是摄像头图像、点云等视觉信息。
-
动作 (Action):智能体根据观测和策略做出的决策,施加到机器人上。例如,控制每个关节的扭矩或目标角度。
-
奖励 (Reward):环境根据智能体执行的动作结果,反馈给智能体的一个标量信号(正分或负分)。这是指导学习方向的唯一信号。
-
-
-
3. 特有挑战与解决方案
-
挑战:在真实机器人上直接训练通常是不现实的,因为试错成本高(可能损坏机器人)、速度慢(无法并行)、效率低(采集一条数据需要真实时间)。
-
Sim-to-Real:这是当前机器人RL的主流范式。
-
核心思想:绝大部分训练在仿真环境中完成,然后将学到的策略迁移到真实机器人上。就像“让模型在虚拟世界里‘上大学’,在现实世界里‘上岗’”。
-
关键技术:域随机化 (Domain Randomization)。为了让模型适应现实世界的不确定性,在仿真中主动增加各种“干扰”,如随机改变物体的颜色、纹理、摩擦系数、灯光、相机位置等。
-
-
-
4. 典型技术栈
-
仿真环境:ManiSkill (SAPIEN), NVIDIA Isaac Gym/Orbit。
-
RL算法库:Stable-Baselines3, Tianshou, RLlib。
-
机器人硬件:Franka Emika Panda, Fetch, UR5 等。
-
PPO算法在机器人控制中应用
目录 (Directory)
-
PPO算法简介:是什么与为什么
-
1.1 定义:一种在线 (On-Policy) 策略优化算法
-
1.2 核心优势:为什么在机器人领域广受欢迎
-
-
PPO的核心思想:“小步快跑”的策略更新
-
2.1 传统策略梯度的问题
-
2.2 PPO的解决方案:Clipped Surrogate Objective
-
-
PPO的架构:演员-评论家 (Actor-Critic)
-
3.1 演员 (Actor):负责决策与行动
-
3.2 评论家 (Critic):负责评估与指导
-
-
PPO在机器人控制中的应用流程
-
4.1 步骤1:定义问题(观测、动作、奖励)
-
4.2 步骤2:搭建仿真环境
-
4.3 步骤3:设计Actor和Critic神经网络
-
4.4 步骤4:训练循环(数据采集与模型更新)
-
4.5 步骤5:部署与测试
-
要点 (Key Points)
-
1. PPO简介
-
定义:PPO (Proximal Policy Optimization, 近端策略优化) 是一种强化学习算法,属于策略梯度 (Policy Gradient) 方法的一种。
-
核心优势:它在数据效率(需要多少数据才能学会)和实现简单性/稳定性之间取得了很好的平衡,因此成为机器人控制等领域最常用、最可靠的基准算法之一。
-
-
2. PPO的核心思想
-
传统策略梯度的问题:更新步长(学习率)难以选择。步长太小,训练太慢;步长太大,策略容易“跑偏”,导致性能突然崩溃。
-
PPO的解决方案:通过一个“裁剪 (Clipping)”机制,限制了每次策略更新的幅度。
-
直观理解:给策略更新戴上一个“缰绳”,确保新的策略不会与旧的策略偏离太远。这使得训练过程更加稳定,像是在一个“信任区域”内小步快跑,既保证了速度,又避免了“摔倒”。
-
-
-
3. PPO的架构:演员-评论家 (Actor-Critic)
-
演员 (Actor):就是策略网络。它接收环境的观测,输出一个动作(或动作的概率分布)。好比一个“运动员”,负责在赛场上比赛。
-
评论家 (Critic):就是价值网络。它接收环境的观测,输出对当前状态的价值评估。它告诉Actor:“你刚才在那个状态下做的动作,长期来看是好是坏?”。好比一个“教练”,在场下评估运动员的表现并给予指导。
-
协同工作:Actor 负责行动并采集数据,Critic 负责评估这些数据,然后共同计算出一个“优势函数 (Advantage)”,用于指导 Actor 的策略更新方向。
-
-
4. 应用流程
-
定义问题:明确机器人要完成的任务。设计合理的观测空间(机器人能“看”到什么)、动作空间(机器人能“做”什么)和奖励函数(如何评判做得好不好)。奖励函数的设计至关重要。
-
环境搭建:使用 ManiSkill 等框架搭建并行的仿真环境。
-
网络设计:分别设计 Actor 和 Critic 的神经网络结构。对于简单状态输入,使用全连接网络(MLP);对于图像输入,使用卷积网络(CNN)。
-
训练循环:
-
数据采集阶段:让当前的 Actor 策略与 N 个并行环境交互,收集一大批轨迹数据((s, a, r, s') 序列)。
-
模型更新阶段:使用收集到的数据,计算优势函数,并根据 PPO 的裁剪目标函数,同时更新 Actor 和 Critic 网络的参数。
-
重复以上两个阶段,直到策略收敛。
-
-
部署测试:将训练好的 Actor 网络(策略)加载到真实机器人或新的测试环境中,检验其性能。
-
-
5. 关键要点
-
超参数敏感:PPO 对学习率、裁剪范围 (clip range)、折扣因子 (gamma) 等超参数较为敏感,需要仔细调优。
-
On-Policy:PPO 是 On-Policy 算法,意味着用于更新模型的数据必须由当前的策略采集。这导致它不能直接使用历史数据(Replay Buffer),数据利用率不如 Off-Policy 算法(如 SAC)。
-
奖励塑形 (Reward Shaping):对于复杂任务,仅在任务成功时给予奖励(稀疏奖励)可能导致模型难以学习。设计一个能够引导机器人逐步完成任务的密集奖励 (Dense Reward) 通常是必要的。
-
机器人强化学习框架
第一阶段:理论基石 (Foundational Knowledge)
目录
1.1 强化学习核心术语 1.2 学习目标:最大化累积奖励 1.3 数学核心:贝尔曼方程与价值函数 1.4 三大算法派系:Value-Based, Policy-Based, Actor-Critic 1.5 核心困境:探索 vs. 利用 (Exploration vs. Exploitation)
要点
-
核心术语:必须牢记 RL 的“通用语言”:智能体 (Agent)、环境 (Environment)、状态/观测 (State/Observation)、动作 (Action) 和 奖励 (Reward)。将它们与机器人场景对应:机器人是Agent,仿真或物理世界是Environment。
-
学习目标:RL 的唯一目标是学习一个策略 (Policy),使得从开始到结束的**累积奖励(回报, Return)**最大化。折扣因子 (Discount Factor, γ) 用于平衡当前奖励和未来奖励的重要性。
-
价值函数:理解状态价值函数 V(s)(处于状态s有多好)和动作价值函数 Q(s, a)(在状态s下执行动作a有多好)。它们是评价决策好坏的基石,也是很多算法的核心。
-
算法派系:
-
Value-Based (基于价值):学习Q函数,然后根据Q值选择最优动作(如Q-Learning, DQN)。适合离散、有限的动作空间。
-
Policy-Based (基于策略):直接学习策略函数本身(如REINFORCE, PPO)。这是机器人领域的主流,因为它可以直接处理连续、高维的动作空间(如控制电机角度)。
-
Actor-Critic (演员-评论家):结合以上两者。Actor(演员)负责输出动作,Critic(评论家)负责评估动作的好坏,是当前最先进、应用最广的架构。PPO、SAC 都是此范畴。
-
-
探索与利用:智能体需要在“执行已知最优动作(利用)”和“尝试未知新动作以发现可能更好的选择(探索)”之间做出权衡。这是所有 RL 算法必须解决的基本问题。
第二阶段:机器人领域特殊性 (Robotics-Specific Concepts)
目录
2.1 问题形式化:将机器人任务翻译成 RL 问题 2.1.1 观测空间 (Observation Space):机器人能“看”什么? 2.1.2 动作空间 (Action Space):机器人能“做”什么? 2.1.3 奖励塑形 (Reward Shaping):如何“教”机器人好坏? 2.2 核心挑战:The Reality Gap) 2.2.1 为什么必须用仿真? 2.2.2 Sim-to-Real:从仿真到现实 2.2.3 关键技术:域随机化 (Domain Randomization)
要点
-
观测空间:分为两类:
-
本体感受 (Proprioceptive):机器人自身的内部状态,如关节角度、速度。这是最基本的信息。
-
外部感受 (Exteroceptive):来自外部传感器的信息,如相机图像、深度图、点云、力矩传感器读数。
-
-
动作空间:机器人控制通常是连续空间。常见的控制方式包括:
-
关节空间控制:直接控制每个关节的目标位置、速度或力矩。
-
末端执行器空间控制 (Cartesian Control):控制机器人夹爪在三维空间中的位置和姿态。奖励塑形:这是机器人RL中最具挑战性和艺术性的部分。
-
稀疏奖励 (Sparse Reward):仅在任务最终成功时给予+1奖励。简单但极难学习。
-
密集奖励 (Dense Reward):在任务的每一步都根据进展给予连续的奖励。例如,夹爪离目标越近,奖励越高。密集奖励能有效引导学习,是成功的关键。
-
-
-
Sim-to-Real:这是现代机器人RL的标准范式。因为在真实世界训练成本高、速度慢、风险大。
-
域随机化:为了让仿真训练出的策略能适应真实的物理世界,在训练时主动给仿真环境增加大量变化和噪声。例如,随机改变桌面的颜色、摩擦力,随机调整灯光亮度,随机给机器人施加一个外力。核心思想:在足够多样化的“混乱”仿真环境中训练出的策略,会更鲁棒,更能适应真实世界的未知性。
第三阶段:关键技术与进阶算法 (Key Techniques & Advanced Algorithms)
目录
3.1 提升数据效率 3.1.1 On-Policy vs. Off-Policy 3.1.2 经验回放 (Experience Replay) 3.2 从“专家”学习:模仿学习 (Imitation Learning) 3.2.1 行为克隆 (Behavioral Cloning, BC) 3.2.2 逆强化学习 (Inverse RL) 与生成对抗模仿学习 (GAIL) 3.3 离线强化学习 (Offline RL)
要点
-
On-Policy vs. Off-Policy:
-
On-Policy (在线策略):如PPO。用来训练的数据必须是当前策略产生的。简单稳定,但数据利用率低(“过河拆桥”)。
-
Off-Policy (离线策略):如SAC, DDPG。可以使用历史数据进行训练。数据利用率高,通常更适合需要大量数据的机器人任务,尤其是在真实世界微调时。
-
-
经验回放:Off-Policy 算法的核心技术。将采集到的数据存入一个大的“回放缓冲区 (Replay Buffer)”,训练时从中随机采样,打破数据相关性,提升训练稳定性和数据效率。
-
模仿学习:当奖励函数难以设计时,直接从专家演示(如人类遥操作的轨迹)中学习是一种强大的捷径。
-
行为克隆:最简单的方法,直接将“观测”到“动作”的映射当作一个监督学习问题来训练。优点是简单快速,缺点是泛化能力差,容易累积误差。
-
高级方法 (GAIL等):尝试学习专家演示背后的奖励函数或目标,比BC更鲁棒。
-
-
离线RL:完全从一个固定不变的数据集中学习策略,学习过程中不与环境进行任何新的交互。这对于利用已有的大量机器人操作数据非常有价值。
第四阶段:实践工具与工作流 (Practical Tools & Workflow)
目录
4.1 仿真环境的选择 4.2 强化学习库的选择 4.3 标准工作流程 4.4 评估与调试
要点
-
仿真环境:
-
NVIDIA Isaac Gym / Orbit:基于GPU并行计算,速度极快,适合大规模训练。
-
ManiSkill (SAPIEN):支持GPU并行,提供大量高质量的交互式任务和视觉渲染。
-
MuJoCo / PyBullet:轻量级,社区成熟,是传统的标准选择。
-
-
RL库:
-
Stable-Baselines3 (SB3):基于PyTorch,API友好,文档完善,非常适合初学者入门和快速验证。
-
Tianshou, RLlib:更灵活、功能更强大的框架,支持更复杂的分布式训练和算法研究。
-
-
标准工作流程:
-
在仿真中定义任务:搭建环境,设计观测、动作和奖励。
-
选择算法并调参:从PPO或SAC开始,在仿真中进行超参数调优。
-
大规模仿真训练:利用GPU并行,在加入了域随机化的环境中进行数百万甚至数十亿步的训练。
-
Sim-to-Real迁移:将仿真中训练好的策略模型直接部署到真实机器人上。
-
(可选)真实世界微调:使用少量真实世界数据,对策略进行微调。
-
-
评估与调试:不要只看累积奖励。重点关注任务成功率、泛化能力(在未见过的场景中的表现)。使用
Wandb
等工具记录训练曲线,可视化策略行为。
第五阶段:前沿方向 (Advanced Topics)
目录
5.1 分层强化学习 (Hierarchical RL) 5.2 模型基强化学习 (Model-Based RL) 5.3 多任务与元学习 (Multi-Task & Meta-RL) 5.4 机器人基础模型 (Foundation Models for Robotics)
要点
-
分层RL:将复杂长时程任务(如“做一杯咖啡”)分解为“高层策略(决定子目标)”和“低层策略(执行子目标)”,提升解决复杂问题的能力。
-
模型基RL:尝试学习一个环境的动态模型(“世界模型”),然后利用这个模型进行内部规划或生成额外训练数据,有望大幅提升数据效率。
-
多任务与元学习:让一个智能体同时学习多个不同任务,并具备快速适应新任务的能力(“学会如何学习”)。
-
机器人基础模型:当前最前沿的方向。借鉴大语言模型 (LLM) 的思想,尝试用海量的、多模态的机器人数据(图像、语言、动作)训练一个能处理多种任务的通用机器人策略模型(如 Google RT-2, Gato)。
更多推荐
所有评论(0)