开源中国造物社区近期推出了「AI 造物大赏」月度系列活动,首期亮相的第三代灵动四足机器狗 LinkDog 成了焦点。这类桌面级四足机器人不再是实验室专属——开源社区、廉价算力和模块化舵机让个人创客也能做出能跑、能看、能决策的实体 AI 项目。这篇文章拆解桌面四足机器狗的技术栈,并给出一份可以直接跑起来的步态控制示例。
四足机器狗的核心技术栈
一只能自主行动的四足机器狗,至少要解决三个问题:
- 运动控制:12 个舵机(每腿 3 关节)的协调驱动,步态生成与姿态平衡。
- 感知输入:IMU 倾角反馈、足端触地检测、可选的视觉传感器。
- 决策推理:从传感器数据到动作输出的闭环,传统用状态机,现在越来越多项目引入小型神经网络或 LLM 指令解析。
LinkDog 第三代在运动层做了步态优化,让小体型机器狗在桌面场景下也能稳定行走和转向。感知层依赖 IMU 做姿态校正,决策层则预留了 AI 模块接口——这正是「AI 造物大赏」强调的方向:硬件本体 + AI 加持,而不是纯遥控。
步态生成:从数学到代码
四足机器狗最基础的运动是 trot 步态——对角两腿同步抬起、同步落地,类似马的小跑。核心参数有三个:
| 参数 | 含义 | 典型桌面级取值 |
|---|---|---|
stride |
单步前进距离(mm) | 20–40 |
lift |
足端抬起高度(mm) | 15–25 |
period |
一个步态周期时长(ms) | 300–500 |
下面是一份基于 Python 的 trot 步态生成器,输出 12 个关节的目标角度,可以直接接入舵机驱动层:
import math
import time
# ── 机器狗几何参数(按你的实际尺寸修改)──────────────────
LEG_SEGMENTS = [38, 32] # 大腿、小腿长度 (mm)
HIP_OFFSETS = [55, 40, 35] # 前左、前右、后左、后右 的髋关节 x 坐标
# ── 步态参数 ────────────────────────────────────────────
STRIDE = 30 # mm
LIFT = 20 # mm
PERIOD = 400 # ms
STANCE_Y = -50 # 站立时足端 y 坐标(相对髋关节)
# ── 足端轨迹生成 ─────────────────────────────────────────
def foot_trajectory(phase, is_swing):
"""
phase: 0~1, 当前步态周期进度
is_swing: True=摆动相(抬腿),False=支撑相(触地推进)
返回足端 (x_offset, y_offset) 相对站立位置
"""
if is_swing:
x = STRIDE * (1 - 2 * phase) # 从前到后
y = LIFT * math.sin(math.pi * phase) # 抛起弧线
else:
x = STRIDE * (2 * phase - 1) # 从后到前推进
y = 0
return x, y
# ── 逆运动学:足端坐标 → 三个关节角度 ────────────────────
def ik(dx, dy, segs=LEG_SEGMENTS):
"""dx, dy: 足端相对髋关节的偏移,返回 (hip, knee, ankle) 角度(弧度)"""
target_y = STANCE_Y + dy
target_x = dx
L1, L2 = segs
dist = math.hypot(target_x, target_y)
# 距离超出可达范围时钳位
dist = min(dist, L1 + L2 - 1)
dist = max(dist, abs(L1 - L2) + 1)
knee_angle = math.acos((L1**2 + L2**2 - dist**2) / (2 * L1 * L2))
hip_angle = math.atan2(target_x, -target_y) - \
math.acos((L1**2 + dist**2 - L2**2) / (2 * L1 * dist))
ankle_angle = hip_angle + knee_angle - math.pi # 保持足端朝下
return hip_angle, knee_angle, ankle_angle
# ── Trot 步态:对角腿同步 ─────────────────────────────────
LEG_LABELS = ["FL", "FR", "BL", "BR"] # 前左、前右、后左、后右
SWING_PAIRS = { # trot: 对角同步
0: True, # FL swing
1: False, # FR stance
2: False, # BL stance
3: True, # BR swing
}
def trot_step(phase):
"""给定 phase(0~1),返回 12 个关节角度的字典"""
angles = {}
for i, label in enumerate(LEG_LABELS):
# 摆动相和支撑相各占半个周期,摆动相在前半段
is_swing = SWING_PAIRS[i]
local_phase = phase if is_swing else phase
# 支撑相相位对齐:也在 0~1 内推进
if not is_swing:
local_phase = phase
dx, dy = foot_trajectory(local_phase, is_swing)
hip, knee, ankle = ik(dx, dy)
angles[f"{label}_hip"] = round(math.degrees(hip), 1)
angles[f"{label}_knee"] = round(math.degrees(knee), 1)
angles[f"{label}_ankle"] = round(math.degrees(ankle), 1)
return angles
# ── 模拟运行:打印 5 个步态帧 ──────────────────────────────
if __name__ == "__main__":
for step in range(5):
phase = step / 5
cmd = trot_step(phase)
print(f"--- phase={phase:.2f} ---")
for leg in LEG_LABELS:
h = cmd[f"{leg}_hip"]
k = cmd[f"{leg}_knee"]
a = cmd[f"{leg}_ankle"]
print(f" {leg}: hip={h}° knee={k}° ankle={a}°")
运行方式:
python trot_gait.py
输出是每个步态帧下 12 个关节的目标角度。把这些角度映射到舵机 PWM 命令,机器狗就能走起来。你需要根据实际舵机安装方向调整角度符号和偏移量。
加一层 AI:让机器狗听懂指令
步态生成是"肌肉",AI 决策是"大脑"。一个轻量做法是在步态控制器上层加一个指令解析模块——用本地小模型或规则引擎把自然语言指令转成步态参数:
# ── 简易指令解析器(可替换为本地 LLM 推理)───────────────
COMMAND_MAP = {
"前进": {"stride": 30, "lift": 20, "period": 400, "direction": 0},
"快跑": {"stride": 45, "lift": 15, "period": 250, "direction": 0},
"慢走": {"stride": 15, "lift": 25, "period": 600, "direction": 0},
"左转": {"stride": 20, "lift": 20, "period": 400, "direction": -30},
"右转": {"stride": 20, "lift": 20, "period": 400, "direction": 30},
"停下": {"stride": 0, "lift": 0, "period": 0, "direction": 0},
}
def parse_command(text: str) -> dict:
"""从自然语言提取步态参数,未匹配则默认停下"""
for key, params in COMMAND_MAP.items():
if key in text:
return params
return COMMAND_MAP["停下"]
# 使用示例
cmd = parse_command("向前快跑")
print(cmd) # {'stride': 45, 'lift': 15, 'period': 250, 'direction': 0}
如果要接入真正的 LLM(比如通过 Ollama 跑本地 qwen2.5:1.5b),可以把 parse_command 替换成模型调用,让机器狗理解更复杂的指令如"绕过桌上的杯子走到左边"。
参赛与落地的几个实操建议
开源中国造物社区的「AI 造物大赏」不限硬件品牌和开发平台,这意味着你可以用 ESP32 + MicroPython、树莓派 + Python、甚至是 Jetson Nano + CUDA 来做。几个值得注意的点:
硬件选型
- 12 个舵机建议用总线舵机(如 STM32-based serial bus servo),PWM 舵机接线太乱且刷新率受限。
- IMU 用 MPU6050 足够做姿态反馈,BNO085 更省心(自带融合算法)。
- 主控至少要能跑 Python:ESP32-S3 或树莓派 Zero 2W 是成本最低的起点。
AI 模块接入
- 本地推理优先:Ollama + 小参数模型,延迟可控,不依赖网络。
- 视觉感知可选:USB 摄像头 + OpenCV 做障碍检测,比深度相机便宜得多。
- 别一开始就搞端到端 RL,先用规则 + 参数调节把步态跑稳,再考虑学习型控制器。
参赛提交
- 录一段完整的自主决策视频(不是纯遥控),这是评审区分"AI 加持"和"普通遥控车"的关键。
- 开源你的步态代码和硬件图纸,社区评审对可复现性权重很高。
- 写清楚 AI 模块的输入输出链路:传感器 → 决策 → 步态参数 → 舵机,缺一环就不完整。
桌面级四足机器狗的技术门槛已经降到了个人创客可触及的范围。步态生成有成熟的数学基础,逆运动学几十行代码就能跑,AI 决策层可以从规则引擎起步再逐步升级。「AI 造物大赏」提供了一个展示和交流的入口——如果你有一只自己调出来的机器狗,现在就是秀出来的时机。