这份文档面向“第一次做双足机器人强化学习”的场景,目标是帮助你把当前已经能在 ROS 2 Humble + Gazebo Fortress 中运行的机器人,逐步推进到“可以用强化学习训练行走策略,并在 ROS 2 系统中在线运行策略”。
你的完整目标可以拆成四层:
reset() / step(action) / reward / done 这套强化学习接口。我建议采用你现在仓库里的这种分层方式:
guguji_ros2_ws/src/guguji_ros2
负责机器人模型、Gazebo 启动、ROS 2 话题和仿真接口。guguji_rl
负责强化学习训练代码、算法依赖、配置文件、训练输出。这样做的好处:
当前代码已经具备下面这些训练所需的基础接口:
/joint_states
Gazebo 真实关节状态/tf
Gazebo 真实模型 / 连杆位姿/clock
仿真时钟/guguji/command/<joint_name>
每个关节的位置命令接口/world/default/control
Gazebo 世界控制服务,可用于 reset / pause / step这些接口已经足够构成一个最小的强化学习训练环境。
对于双足机器人,不建议一上来就直接训练“向前走”。更稳妥的路线是课程式训练。
目标:
/joint_states 会变化/tf 可以读到机器人底座位姿你可以先运行:
source /opt/ros/humble/setup.bash
cd /home/corvin/Project/guguji_simulation/guguji_ros2_ws
source install/setup.bash
ros2 launch guguji_ros2 gazebo.launch.py gui:=false
另开一个终端执行:
cd /home/corvin/Project/guguji_simulation/guguji_rl
source .venv/bin/activate
python3 scripts/check_env.py --config configs/balance_ppo.yaml
如果你准备正式训练,建议把 Gazebo 改成下面这种启动方式:
ros2 launch guguji_ros2 gazebo.launch.py gui:=false pause:=true
这样训练程序可以通过世界控制服务精确推进仿真步数,训练会更稳定。
目标:
roll / pitch建议先用:
configs/balance_ppo.yamltask.target_forward_velocity = 0.0这个阶段的关键不是“走”,而是“活着且稳定”。
目标:
这个阶段可以继续沿用 balance 配置,但逐步:
目标:
建议从较低目标速度开始,例如:
0.10 m/s0.15 m/s0.25 m/s不要一开始就追求很快,否则双足很容易学成“扑倒式前冲”。
目标:
建议先用:
configs/forward_transition_ppo.yamltask.target_forward_velocity = 0.05这一阶段最好直接从已经训好的平衡模型继续训练,而不是从零开始。
当前代码中已经实现了一套适合入门调试的奖励结构:
alive_bonus
只要没倒就给基础奖励velocity_tracking
鼓励前进速度接近目标值upright
鼓励机器人保持正立height
鼓励基座高度不要塌陷action_rate_penalty
惩罚动作变化过快joint_limit_penalty
惩罚关节长期打到极限lateral_velocity_penalty
惩罚横向乱漂fall_penalty
一旦倒下,给予额外负奖励对于第一次做双足 RL,建议你先只调这几类奖励,不要一下把奖励做得太复杂。
我给你准备的是 PPO 路线,原因是:
但你也要注意:Gazebo 单实例训练速度会比较慢,远慢于 Isaac Gym / Mujoco 这类高并发模拟器。
所以更现实的预期是:
你的机器上已经有 CUDA 驱动,但显卡显存只有 2GB 左右,因此建议这样使用:
training.device: cputraining.device: auto 或 cudapolicy_net_arch、batch_size当前配置文件已经支持:
cpucudaauto不需要改训练代码,只要改 YAML 或命令行参数。
guguji_ros2_ws/src/guguji_ros2/launch/gazebo.launch.py
Gazebo Fortress 启动与桥接guguji_ros2_ws/src/guguji_ros2/urdf/guguji.urdf
Gazebo 插件、关节控制器、关节状态和位姿发布器guguji_rl/guguji_rl/ros2_interface.py
ROS 2 / Gazebo 接口封装guguji_rl/guguji_rl/envs/gazebo_biped_env.py
Gymnasium 环境guguji_rl/guguji_rl/rewards.py
奖励函数guguji_rl/scripts/train.py
PPO 训练guguji_rl/scripts/evaluate.py
加载策略并运行guguji_rl/scripts/run_policy.py
把训练好的策略作为在线控制程序持续运行guguji_rl/scripts/check_env.py
环境检查check_env.py,确认 reset / step / reward 能跑通。balance_ppo.yaml,不要急着训练 walking。forward_transition_ppo.yaml 做轻微前进过渡。/joint_states 和 /tf,检查机器人是否会频繁倒地,是否开始出现轻微向前趋势。walk_ppo.yaml。训练完成后,建议分成两步:
evaluate.py 做短时回放,确认模型文件没有问题。run_policy.py 持续运行策略,让它在当前 Gazebo / ROS 2 系统里不断读取状态并发布关节命令。示例命令:
cd /home/corvin/Project/guguji_simulation/guguji_rl
source .venv/bin/activate
python3 scripts/run_policy.py \
--config configs/walk_ppo.yaml \
--model outputs/<你的实验目录>/final_model.zip \
--deterministic
当前训练脚本已经支持把已有 PPO 模型参数作为课程学习初始化。
示例命令:
cd /home/corvin/Project/guguji_simulation/guguji_rl
source .venv/bin/activate
python3 scripts/train.py \
--config configs/forward_transition_ppo.yaml \
--init-model outputs/<你的平衡实验目录>/final_model.zip
这样做的核心意义是:
你后面大概率会集中修改这些点:
guguji_rl/guguji_rl/rewards.py
调奖励项和权重guguji_rl/guguji_rl/envs/gazebo_biped_env.py
调 observation、done 条件、动作映射guguji_rl/configs/*.yaml
调训练超参数、设备、目标速度guguji_ros2_ws/src/guguji_ros2/urdf/guguji.urdf
调关节范围、PD 增益、Gazebo 控制器参数对双足机器人来说,第一次做强化学习最难的通常不是“算法”,而是下面三件事:
所以你的第一目标不要设成“尽快走得很像人”,而是:
这条路线更稳,也更适合第一次上手。