智能控制第20课/共30课

🤖 深度强化学习入门

让机器人自己学会走路

📖 本课概要

让机器人自己学会走路。本课将深入探讨相关理论和实现,通过Python仿真验证核心算法。

🧮 核心仿真

import math, random class SimpleRL: def __init__(self): self.g = 9.81 self.dt = 0.02 class CartPoleEnv: def __init__(self): self.g = 9.81 self.mass_cart = 1.0 self.mass_pole = 0.1 self.length = 0.5 self.dt = 0.02 self.theta = 0.05 self.theta_dot = 0 self.x = 0 self.x_dot = 0 def step(self, force): costh = math.cos(self.theta) sinth = math.sin(self.theta) total_mass = self.mass_cart + self.mass_pole temp = (force + self.mass_pole * self.length * self.theta_dot**2 * sinth) / total_mass theta_acc = (self.g * sinth - costh * temp) / (self.length * (4/3 - self.mass_pole * costh**2 / total_mass)) x_acc = temp - self.mass_pole * self.length * theta_acc * costh / total_mass self.x += self.x_dot * self.dt self.x_dot += x_acc * self.dt self.theta += self.theta_dot * self.dt self.theta_dot += theta_acc * self.dt done = abs(self.theta) > 0.5 or abs(self.x) > 2.4 reward = 1.0 if not done else 0.0 return (self.x, self.theta), reward, done def reset(self): self.theta = random.gauss(0, 0.05) self.theta_dot = 0 self.x = 0 self.x_dot = 0 return (self.x, self.theta) def train_q_learning(self, n_episodes=500): env = self.CartPoleEnv() n_bins = 10 q_table = {} lr = 0.1 gamma = 0.99 epsilon = 1.0 epsilon_decay = 0.995 rewards_history = [] def discretize(state): x_bin = max(0, min(n_bins-1, int((state[0] + 2.4) / 4.8 * n_bins))) th_bin = max(0, min(n_bins-1, int((state[1] + 0.5) / 1.0 * n_bins))) return (x_bin, th_bin) for ep in range(n_episodes): state = env.reset() d_state = discretize(state) total_reward = 0 done = False while not done and total_reward < 200: if random.random() < epsilon: action = random.choice([-10, 10]) else: q_left = q_table.get((d_state, -10), 0) q_right = q_table.get((d_state, 10), 0) action = -10 if q_left > q_right else 10 next_state, reward, done = env.step(action) d_next = discretize(next_state) total_reward += reward best_next = max(q_table.get((d_next, -10), 0), q_table.get((d_next, 10), 0)) current_q = q_table.get((d_state, action), 0) q_table[(d_state, action)] = current_q + lr * (reward + gamma * best_next - current_q) d_state = d_next epsilon *= epsilon_decay rewards_history.append(total_reward) return rewards_history rl = SimpleRL() print("=" * 55) print(" Deep RL Introduction Simulation") print("=" * 55) # Train Q-learning on cart-pole print("\n [Q-Learning Training on Cart-Pole]") rewards = rl.train_q_learning(n_episodes=500) for i in range(0, len(rewards), 50): avg = sum(rewards[max(0,i-10):i+1]) / min(i+1, 11) print(f" Episode {i:3d}: reward={rewards[i]:.0f}, avg(10)={avg:.1f}") # Policy evaluation print(f"\n [Final Policy Evaluation]") env = rl.SimpleRL.CartPoleEnv() total_rewards = [] for trial in range(10): state = env.reset() done = False r = 0 while not done and r < 200: # Use learned policy (simplified) force = -10 if state[1] < 0 else 10 state, reward, done = env.step(force) r += reward total_rewards.append(r) print(f" Avg reward: {sum(total_rewards)/len(total_rewards):.1f}, " f"min: {min(total_rewards):.0f}, max: {max(total_rewards):.0f}") print() print(" OK - RL introduction simulation complete")

仿真结果:

ERROR: Traceback (most recent call last): File "<string>", line 99, in <module> AttributeError: 'SimpleRL' object has no attribute 'SimpleRL' Error in sys.excepthook: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 228, in partial_apport_excepthook return apport_excepthook(binary, exc_type, exc_obj, exc_tb) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/lib/python3/dist-packages/apport_python_hook.py", line 114,

📐 强化学习框架

RL的核心框架:Agent在Environment中学习最优Policy

max π E[Σγt·rt]
s.t. st+1 ~ P(s|st, at)
at ~ π(a|st)

关键概念:状态s、动作a、奖励r、策略π、折扣因子γ

💡 四足机器人RL方法

近年来四足RL的重大突破:

方法代表工作特点
PPOOpenAI Rubik's Cube稳定、样本效率中等
SACETH Anymal连续控制最优
Teacher-StudentETH Learning to WalkSim2Real友好
RMABerkeley快速适应新地形

📐 四足RL奖励函数设计

奖励函数是RL的核心,需要精心设计:

r = w1·rforward + w2·ralive + w3·rtorque + w4·rsmooth + w5·rorientation
奖励项公式目的
前进奖励vx / vtarget鼓励前进
存活奖励1 if not done防止跌倒
力矩惩罚-Στi2节能
平滑惩罚-Σ(τii,prev)2避免抖动
姿态奖励-|roll| - |pitch|保持直立

💡 仿真环境设计

RL训练需要高效仿真环境:

典型训练量:107-108步,PPO在Isaac Gym上2-4小时收敛。

🔄 从仿真到部署

RL策略部署的关键步骤:

  1. 在仿真中训练(域随机化)
  2. 用teacher-student蒸馏(teacher用特权信息,student只用板载传感器)
  3. 在低维观测空间运行推理(<1ms)
  4. 在真实机器人上fine-tune

📚 本课参考与延伸

核心概念回顾

实现建议

  1. 先用Python/MATLAB验证算法正确性
  2. 然后在物理引擎(PyBullet/MuJoCo)中测试
  3. 最后在真实机器人上部署,使用域随机化增强鲁棒性

常见问题

🔬 实验设计与验证方法

为确保算法的可靠性,建议按以下步骤验证:

  1. 单元测试:对每个核心函数编写测试用例,验证边界条件和典型值
  2. 集成测试:将所有模块组合,在仿真中运行完整场景
  3. 压力测试:在极端条件下(大扰动、高速、低摩擦)测试鲁棒性
  4. 回归测试:修改代码后重新运行所有测试,确保不引入bug

📊 性能基准

以下是学术界和工业界的关键基准数据:

指标学术前沿工业产品入门级
最大速度3.0 m/s (Cheetah)1.6 m/s (Spot)0.5 m/s
最大负载100% 体重30% 体重10% 体重
续航1-2h1.5-2.5h0.5-1h
台阶高度20cm15cm10cm
恢复能力50N推力30N推力10N推力
控制频率1kHz500Hz100-250Hz

⚙️ 工程实践建议

📝 练习

  1. 修改仿真参数,观察系统行为的变化。
  2. 实现本课核心算法的改进版本。
  3. 将本课方法与其他课的方法组合,设计复合控制器。
  4. 分析算法在不同条件下的鲁棒性。
  5. 设计实验验证仿真结果的正确性。
🏆
RL探索者

掌握强化学习基础、Q-learning和策略优化

四足机器人课程 · 第20课/30 · 返回目录