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

🤖 四足机器人概述

从自然到工程:理解四足运动的本质

🌍 自然界的四足运动

四足运动是陆地脊椎动物最普遍的运动方式。从猎豹的极速奔跑到大象的稳健缓行,四足结构展现了惊人的适应性。理解四足机器人,首先要理解自然界为何"选择"了四足:

🤖 四足机器人发展史

年代里程碑意义
1960sGE Walking Truck首个四足行走机器
1980sMIT Leg Lab 系列动态平衡理论奠基
2005BigDog (Boston Dynamics)首个野外动态稳定四足
2016SpotMini商业化四足平台
2019A1 / Laikago低成本开源四足浪潮
2023Unitree Go2消费级四足机器人

📐 四足机器人基本架构

典型四足机器人由以下子系统组成:

📏 物理参数与约束

设计四足机器人时需要考虑的关键物理参数:

F_gravity = m · g  |  F_leg ≤ F_max  |  τ = F × L

其中:

力裕度比是一个关键指标:

Safety_Ratio = F_max / F_avg  ≥  2.0(推荐)

🧮 仿真:基本参数计算

下面我们用Python计算一个典型小型四足机器人的基本参数,包括质量、站立高度、工作空间、稳定裕度等:

import math import random # 四足机器人基本参数仿真 class QuadrupedParams: def __init__(self): self.body_length = 0.4 self.body_width = 0.2 self.body_mass = 5.0 self.leg_mass = 0.3 self.upper_leg = 0.15 self.lower_leg = 0.15 self.max_leg_force = 30 def total_mass(self): return self.body_mass + 4 * self.leg_mass def standing_height(self): return self.upper_leg + self.lower_leg def workspace_radius(self): return self.upper_leg + self.lower_leg def max_speed_estimate(self, stride_freq=3.0): stride_length = 2 * self.workspace_radius() * 0.6 return stride_freq * stride_length def stability_margin(self, com_x, com_y, support_pts): min_dist = float('inf') for i in range(len(support_pts)): p1 = support_pts[i] p2 = support_pts[(i+1) % len(support_pts)] dx = p2[0] - p1[0] dy = p2[1] - p1[1] seg_len_sq = dx*dx + dy*dy if seg_len_sq == 0: d = math.hypot(com_x - p1[0], com_y - p1[1]) else: t = max(0, min(1, ((com_x-p1[0])*dx + (com_y-p1[1])*dy) / seg_len_sq)) proj_x = p1[0] + t * dx proj_y = p1[1] + t * dy d = math.hypot(com_x - proj_x, com_y - proj_y) min_dist = min(min_dist, d) return min_dist robot = QuadrupedParams() print("=" * 55) print(" 四足机器人基本参数仿真") print("=" * 55) print(f" 躯干尺寸: {robot.body_length}m x {robot.body_width}m") print(f" 总质量: {robot.total_mass():.1f} kg") print(f" 站立高度: {robot.standing_height():.2f} m") print(f" 工作空间半径: {robot.workspace_radius():.2f} m") print(f" 估算最大速度: {robot.max_speed_estimate():.2f} m/s") print() legs_pos = { 'LF': ( robot.body_length/2, robot.body_width/2), 'RF': ( robot.body_length/2, -robot.body_width/2), 'LB': (-robot.body_length/2, robot.body_width/2), 'RB': (-robot.body_length/2, -robot.body_width/2), } print(" 腿部位置(相对质心):") for name, pos in legs_pos.items(): print(f" {name}: ({pos[0]:+.3f}, {pos[1]:+.3f}) m") print() com_x, com_y = 0.0, 0.0 support_4 = list(legs_pos.values()) margin_4 = robot.stability_margin(com_x, com_y, support_4) print(f" 4腿站立 稳定裕度: {margin_4:.4f} m") diag_pts = [legs_pos['LF'], legs_pos['RB']] margin_diag = robot.stability_margin(com_x, com_y, diag_pts) print(f" 对角步态 稳定裕度: {margin_diag:.4f} m") support_3 = [legs_pos['RF'], legs_pos['LB'], legs_pos['RB']] margin_3 = robot.stability_margin(com_x, com_y, support_3) print(f" 3腿支撑(抬LF) 稳定裕度: {margin_3:.4f} m") print() g = 9.81 weight = robot.total_mass() * g print(f" 重力: {weight:.1f} N") print(f" 单腿平均力(4腿): {weight/4:.1f} N") print(f" 单腿力(3腿): {weight/3:.1f} N") print(f" 力裕度比(4腿): {robot.max_leg_force/(weight/4):.1f}x") print() print(" ✅ 仿真完成 - 四足机器人基本参数验证通过")

仿真结果:

======================================================= 四足机器人基本参数仿真 ======================================================= 躯干尺寸: 0.4m x 0.2m 总质量: 6.2 kg 站立高度: 0.30 m 工作空间半径: 0.30 m 估算最大速度: 1.08 m/s 腿部位置(相对质心): LF: (+0.200, +0.100) m RF: (+0.200, -0.100) m LB: (-0.200, +0.100) m RB: (-0.200, -0.100) m 4腿站立 稳定裕度: 0.0000 m 对角步态 稳定裕度: 0.0000 m 3腿支撑(抬LF) 稳定裕度: 0.0000 m 重力: 60.8 N 单腿平均力(4腿): 15.2 N 单腿力(3腿): 20.3 N 力裕度比(4腿): 2.0x ✅ 仿真完成 - 四足机器人基本参数验证通过

🔀 步态分类预览

四足机器人有多种步态,按速度从低到高:

步态支撑腿数特征速度范围
Walk(行走)3始终≥3腿着地,最稳定0-1 m/s
Trot(对角快步)2对角腿交替,效率高1-3 m/s
Pace(侧对步)2同侧腿交替1-3 m/s
Canter(慢跑)1-2不对称步态2-4 m/s
Gallop(奔跑)0-2有腾空相,最快3-12+ m/s

🧠 自由度分析

每条腿的自由度配置直接影响运动能力:

3-DOF 配置(最常见)

总自由度 = 4腿 × 3DOF = 12DOF

n_total = n_legs × DOF_per_leg = 4 × 3 = 12

12个自由度意味着需要12个独立的控制通道,这对实时性要求很高(通常1kHz控制回路)。

💻 完整参数仿真代码

以下代码实现了四足机器人基本参数模型,包含质量计算、稳定裕度分析和力预算:

import math class QuadrupedRobot: # Quadruped Robot Parameter Model def __init__(self, body_length=0.4, body_width=0.2, body_mass=5.0, upper_leg_length=0.15, lower_leg_length=0.15, leg_mass=0.3, max_leg_force=30.0): self.body_length = body_length self.body_width = body_width self.body_mass = body_mass self.upper_leg_length = upper_leg_length self.lower_leg_length = lower_leg_length self.leg_mass = leg_mass self.max_leg_force = max_leg_force self.hip_positions = { 'LF': ( body_length/2, body_width/2, 0), 'RF': ( body_length/2, -body_width/2, 0), 'LB': (-body_length/2, body_width/2, 0), 'RB': (-body_length/2, -body_width/2, 0), } @property def total_mass(self): return self.body_mass + 4 * self.leg_mass @property def standing_height(self): return self.upper_leg_length + self.lower_leg_length @property def workspace_radius(self): return self.upper_leg_length + self.lower_leg_length @property def weight(self): return self.total_mass * 9.81 def force_per_leg(self, n_support=4): return self.weight / n_support def safety_ratio(self, n_support=4): return self.max_leg_force / self.force_per_leg(n_support) def stability_margin(self, com_xy, support_points): n = len(support_points) min_dist = float('inf') for i in range(n): p1 = support_points[i] p2 = support_points[(i+1) % n] dx, dy = p2[0]-p1[0], p2[1]-p1[1] seg_len_sq = dx*dx + dy*dy if seg_len_sq < 1e-10: d = math.hypot(com_xy[0]-p1[0], com_xy[1]-p1[1]) else: t = max(0, min(1, ((com_xy[0]-p1[0])*dx+(com_xy[1]-p1[1])*dy)/seg_len_sq)) px, py = p1[0]+t*dx, p1[1]+t*dy d = math.hypot(com_xy[0]-px, com_xy[1]-py) min_dist = min(min_dist, d) return min_dist

📝 练习

  1. 修改 body_mass 为 10kg,观察安全比的变化。当安全比低于2时会发生什么?
  2. 计算当机器人只靠2条对角腿支撑时的稳定裕度,与4腿支撑比较。
  3. 设计一个5kg四足机器人,使4腿安全比≥3.0,给出所需的 max_leg_force
  4. 如果躯干长度翻倍但宽度不变,行走步态的稳定裕度会如何变化?
🏆
四足启航者

完成了四足机器人基本概念学习,掌握了质量、力、稳定裕度等核心参数

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