机器人手记:给硅基生命造一具躯体

从运动学到 ROS2,记录把一堆电机、传感器和代码变成'能动的东西'的过程

为什么机器人比纯软件难一个数量级

写软件时,世界是离散的、确定的、可回滚的——git reset --hard 能解决大部分人生难题。

机器人不一样:

  • 电机有惯性,地面有摩擦,传感器有噪声
  • 没有 Ctrl+Z。机械臂撞到人,就是撞到了
  • 宇宙不会抛出异常,它直接抛出你的机器人

物理世界是最严格的代码审查员。

运动学:机器人的"几何直觉"

正运动学(FK):已知各关节角度,求末端在哪里。

$$\mathbf{x} = f(\boldsymbol{\theta}), \quad \boldsymbol{\theta} = [\theta_1, \theta_2, \dots, \theta_n]^T$$

逆运动学(IK)才是硬菜:已知想让末端去 $\mathbf{x}$,反求各关节该转多少。

$$\boldsymbol{\theta} = f^{-1}(\mathbf{x})$$

问题在于 $f^{-1}$ 通常没有解析解,甚至有无穷多解——你的手可以伸到同一个杯子,肘部却可以摆出完全不同的姿势。机器人得自己"决定"怎么动,这里面全是优化问题。

一个两轮小车的速度分解

差速驱动是入门第一课。左轮 $v_l$、右轮 $v_r$、轮距 $L$:

$$v = \frac{v_r + v_l}{2}, \qquad \omega = \frac{v_r - v_l}{L}$$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import math

def diff_drive(v_l, v_r, L, x=0.0, y=0.0, theta=0.0, dt=0.1):
    """一步航位推算:由轮速更新位姿"""
    v = (v_r + v_l) / 2.0
    w = (v_r - v_l) / L
    theta += w * dt
    x += v * math.cos(theta) * dt
    y += v * math.sin(theta) * dt
    return x, y, theta

看着简单?等轮胎打滑、编码器丢脉冲、地面有个 2° 的斜坡,你就明白为什么机器人博士要读五年。

ROS2:机器人的神经系统

把机器人拆成节点(Node),节点之间用话题(Topic)发消息:

1
[摄像头节点] --/image_raw--> [视觉节点] --/cmd_vel--> [底盘节点] --> 电机

ROS2 相比 ROS1 的杀手锏是 DDS 通信——去中心化的发布订阅,天生为分布式实时系统而生。之前 ROS1 那个 roscore 单点故障,终于进了历史垃圾堆。

物理彩蛋:倒立摆

机器人学的"Hello World"不是走路,是倒立摆——一根杆子立在移动小车上不许倒。

它是不稳定平衡点问题:$\theta = 0$ 处势能最高,任何微扰都会发散,必须持续反馈控制。这和人生一样——所谓稳定,不过是持续的主动纠偏。

折腾清单

  • 攒一台差速底盘,跑通 SLAM(gmapping → Cartographer)
  • 给机械臂写 IK 求解器,先数值解再解析解
  • 倒立摆实物:电位器测角度 + PID 调参地狱
  • 终极目标:把 LLM 接上机器人,让它听懂"帮我把桌上的可乐拿过来"
使用 Hugo 构建
主题 Stack 由 Jimmy 设计