腿部与步态 第4课/共30课

🤖 步态基础

行走与对角步态:四足运动的节奏密码

🚶 什么是步态?

步态(Gait)是四足动物移动时各腿的协调模式。步态由两个关键参数定义:

β = tstance / T
φi = Δti / T

🐢 Walk步态(行走)

Walk是最稳定的步态,始终至少有3条腿着地:

特点:最稳定但最慢,适合不平坦地形。任何时刻质心都在支撑三角形内。

🐎 Trot步态(对角快步)

Trot是最常用的四足步态,对角腿成对运动:

特点:效率高,中等速度,需要动态平衡控制。

🏃 Pace与Bound

步态配对方式占空比特点
Pace同侧:(LF+LB) ↔ (RF+RB)0.5侧向不稳定,长颈鹿常用
Bound前后:(LF+RF) ↔ (LB+RB)0.5前后弹跳,松鼠常用
Gallop不对称弹跳<0.5最快,有腾空相

🧮 步态稳定性理论

静态稳定性要求质心投影始终在支撑多边形内:

dmin = min d(CoM_proj, edgei) > 0
Sm = dmin / Lbody

动态稳定性需要考虑惯性效应和ZMP(零矩点):

ZMP = CoM - (z_hat × H_dot) / (m·g)

🧮 仿真:步态时序与稳定性

import math class GaitGenerator: def __init__(self, gait_type='walk', freq=1.0): self.gait_type = gait_type self.freq = freq self.T = 1.0 / freq self.gait_phases = { 'walk': {'RF': 0.25, 'LB': 0.50, 'RB': 0.75}, 'trot': {'RF': 0.50, 'LB': 0.50, 'RB': 0.00}, 'pace': {'RF': 0.00, 'LB': 0.50, 'RB': 0.50}, 'bound': {'RF': 0.50, 'LB': 0.00, 'RB': 0.50}, } self.swing_ratio = { 'walk': 0.25, 'trot': 0.50, 'pace': 0.50, 'bound': 0.50, } def leg_phase(self, leg_name, t): phases = self.gait_phases[self.gait_type] swing_r = self.swing_ratio[self.gait_type] if leg_name == 'LF': offset = 0 else: offset = phases[leg_name] phase_t = (t / self.T + offset) % 1.0 return 1 if phase_t < swing_r else 0 def support_pattern(self, t): legs = ['LF', 'RF', 'LB', 'RB'] pattern = {} for leg in legs: pattern[leg] = 'stance' if self.leg_phase(leg, t) == 0 else 'swing' return pattern def n_support_legs(self, t): p = self.support_pattern(t) return sum(1 for v in p.values() if v == 'stance') def gait_sequence(self, n_steps=20): dt = self.T / n_steps sequence = [] for i in range(n_steps): t = i * dt p = self.support_pattern(t) n = self.n_support_legs(t) sequence.append((t, p, n)) return sequence print("=" * 60) print(" Gait Simulation: Walk / Trot / Pace / Bound") print("=" * 60) for gait in ['walk', 'trot', 'pace', 'bound']: gen = GaitGenerator(gait_type=gait, freq=1.0) print(f"\n [{gait.upper()}] T={gen.T:.2f}s, swing_ratio={gen.swing_ratio[gait]:.0%}") print(f" {'Time':>6s} {'LF':>6s} {'RF':>6s} {'LB':>6s} {'RB':>6s} Support") print(" " + "-" * 50) seq = gen.gait_sequence(8) for t, pattern, n in seq: states = [] for leg in ['LF', 'RF', 'LB', 'RB']: s = pattern[leg] states.append(' S' if s == 'stance' else ' W') print(f" {t:6.3f}s {' '.join(states)} {n}") print("\n" + "=" * 60) print(" Gait Stability Comparison") print("=" * 60) class StabilityAnalysis: def __init__(self, body_L=0.4, body_W=0.2): self.legs = { 'LF': ( body_L/2, body_W/2), 'RF': ( body_L/2, -body_W/2), 'LB': (-body_L/2, body_W/2), 'RB': (-body_L/2, -body_W/2), } def support_polygon_area(self, support_legs): if len(support_legs) < 3: return 0.0 pts = [self.legs[l] for l in support_legs] cx = sum(p[0] for p in pts) / len(pts) cy = sum(p[1] for p in pts) / len(pts) pts.sort(key=lambda p: math.atan2(p[1]-cy, p[0]-cx)) n = len(pts) area = 0 for i in range(n): j = (i+1) % n area += pts[i][0]*pts[j][1] area -= pts[j][0]*pts[i][1] return abs(area) / 2 sa = StabilityAnalysis() for gait in ['walk', 'trot', 'pace', 'bound']: gen = GaitGenerator(gait_type=gait, freq=1.0) min_support = 4 min_area = float('inf') for i in range(100): t = i * gen.T / 100 pattern = gen.support_pattern(t) support = [l for l, s in pattern.items() if s == 'stance'] n = len(support) area = sa.support_polygon_area(support) min_support = min(min_support, n) if n >= 3: min_area = min(min_area, area) else: min_area = 0 stab = "HIGH (static)" if min_support >= 3 else "LOW (need dynamic)" print(f" {gait:6s}: min_support={min_support}, min_area={min_area*1e4:.1f}cm2, stability={stab}") print() print(" OK - Gait simulation complete")

仿真结果:

============================================================ Gait Simulation: Walk / Trot / Pace / Bound ============================================================ [WALK] T=1.00s, swing_ratio=25% Time LF RF LB RB Support -------------------------------------------------- 0.000s W S S S 3 0.125s W S S S 3 0.250s S S S W 3 0.375s S S S W 3 0.500s S S W S 3 0.625s S S W S 3 0.750s S W S S 3 0.875s S W S S 3 [TROT] T=1.00s, swing_ratio=50% Time LF RF LB RB Support -------------------------------------------------- 0.000s W S S W 2 0.125s W S S W 2 0.250s W S S W 2 0.375s W S S W 2 0.500s S W W S 2 0.625s S W W S 2 0.750s S W W S 2 0.875s S W W S 2 [PACE] T=1.00s, swing_ratio=50% Time LF RF LB RB Support -------------------------------------------------- 0.000s W W S S 2 0.125s W W S S 2 0.250s W W S S 2 0.375s W W S S 2 0.500s S S W W 2 0.625s S S W W 2 0.750s S S W W 2 0.875s S S W W 2 [BOUND] T=1.00s, swing_ratio=50% Time LF RF LB RB Support -------------------------------------------------- 0.000s W S W S 2 0.125s W S W S 2 0.250s W S W S 2 0.375s W S W S 2 0.500s S W S W 2 0.625s S W S W 2 0.750s S W S W 2 0.875s S W S W 2 ============================================================ Gait Stability Comparison ============================================================ walk : min_support=3, min_area=400.0cm2, stability=HIGH (static) trot : min_support=2, min_area=0.0cm2, stability=LOW (need dynamic) pace : min_support=2, min_area=0.0cm2, stability=LOW (need dynamic) bound : min_support=2, min_area=0.0cm2, stability=LOW (need dynamic) OK - Gait simulation complete

📊 步态选择指南

场景推荐步态原因
狭窄通道Walk最稳定,精确控制
平坦地面Trot效率最高
松软地面Walk3腿支撑防止下陷
高速追逐Gallop最大速度
楼梯Walk精确落脚
侧向移动Crab Walk侧向稳定

📝 练习

  1. 实现一个Crab Walk步态(侧向行走),定义相位偏移和占空比。
  2. 计算Trot步态在2腿支撑时,质心偏移多少距离会失稳?
  3. 修改Walk的占空比为0.6,观察是否还能保持≥3腿支撑。
  4. 模拟一个1Hz的Trot步态,计算2腿支撑持续时间和3腿过渡时间。
  5. 为什么猫在慢走时用Walk,快跑时用Gallop?从能量效率角度分析。

🎵 步态的数学描述

步态可以用数学精确描述。Muybridge步态图和Hildebrand步态公式是经典工具:

Hildebrand步态公式

步态 = (d1 d2 d3 d4 : q1 q2 q3 q4)

其中 di 是各腿的占空比,qi 是相位顺序。对称步态的占空比相等,不对称步态(如gallop)则不同。

步态图(Gait Diagram)

步态图用横轴表示时间,纵轴表示各腿,着色段表示支撑相。这是步态分析的标准可视化工具。

⚡ 步态转换

机器人需要在不同步态之间切换以适应速度和地形变化:

Walk → Trot 转换

关键约束

📏 步态参数设计

设计步态参数需要平衡多个目标:

参数增大效果减小效果
步频速度提高,但力需求增加更平稳,但速度慢
步长速度提高,但需要更大工作空间更精确,但速度慢
占空比更稳定,但更慢更快,但需动态平衡
抬脚高度越障能力强,但更慢更快,但容易绊脚

🌍 生物步态启发

不同动物选择不同步态的原因:

Froude Number = v² / (g · Lleg)
当 Fr > 0.5 时,动物通常从walk切换到trot
🏆
步态指挥家

掌握Walk/Trot/Pace/Bound四种基本步态的时序和稳定性

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