1. 项目缘起:当“下一步做什么”遇上双足机器人
“What Do I Build Next?” 这个问题,几乎是每个创客、硬件爱好者或机器人发烧友在完成一个项目后,都会面临的甜蜜烦恼。它背后是探索的欲望、对未知的好奇,以及将想法变为现实的冲动。如果你恰好对机器人、Raspberry Pi和Python编程感兴趣,那么“PiSloth a Biped robot”这个标题,无疑是一个极具诱惑力的答案。它不是一个遥不可及的实验室项目,而是一个你可以亲手从零搭建,并看着它“活”起来的双足机器人。
PiSloth这个名字本身就很有趣。“Pi”自然指的是其大脑——树莓派(Raspberry Pi),这个信用卡大小的微型计算机以其强大的生态和易用性,成为了无数创客项目的核心。“Sloth”意为树懒,这暗示了它的步态可能不是那种迅捷如风的类型,而是更偏向于稳定、缓慢、甚至带点憨态可掬的步态。这种设计哲学非常聪明,因为对于入门级双足机器人来说,稳定性和可控性远比速度重要。一个走得慢但稳的机器人,能让你有更多时间观察、调试和理解其运动原理,而不是忙着从地上把它捡起来。
双足机器人(Biped robot)是机器人学中一个经典且迷人的分支。它模仿人类的行走方式,其核心挑战在于如何在只有两个细小支撑点(脚)的情况下,动态地保持平衡并实现前进。这涉及到传感器数据读取、姿态解算、逆运动学计算、舵机控制等一系列软硬件协同工作。对于学习者而言,搭建一个双足机器人是理解机器人运动控制、反馈系统乃至简单人工智能的绝佳实践项目。
那么,PiSloth适合谁?它非常适合有一定Python基础,对电子电路和机械结构有初步了解,并渴望挑战更复杂、更有成就感的项目的朋友。你不需要是机器人专家,但需要准备好投入时间、耐心和一点点动手能力。接下来,我将为你拆解构建PiSloth所需的核心技术栈、硬件选型、软件框架以及那些教程里不会写的“坑”,手把手带你将这个想法变为桌面上的现实。
2. 核心硬件解剖:从树莓派到“骨骼”与“肌肉”
构建一个能动的双足机器人,硬件是它的物理躯体。PiSloth的硬件系统可以清晰地分为三大部分:控制中枢、动力执行机构以及感知与供电系统。每一部分的选择都直接关系到机器人的性能、成本和开发难度。
2.1 控制中枢:为什么是树莓派?
树莓派是PiSloth的“大脑”。市面上常见的单片机(如Arduino、ESP32)也能控制机器人,但选择树莓派有以下几个决定性优势:
- 强大的计算与多任务能力:双足机器人的平衡控制算法(如PID控制、滤波算法)和步态规划需要一定的计算量。树莓派运行完整的Linux操作系统,可以轻松处理这些任务,同时还能运行图像识别、语音交互等更高级的应用,为机器人留下巨大的扩展空间。这是单片机难以比拟的。
- 丰富的生态与便捷的开发:树莓派原生支持Python,而Python在科学计算、机器学习和硬件控制(通过GPIO库)方面拥有极其丰富的库(如NumPy, SciPy, OpenCV)。这意味着你可以用熟悉的语言快速搭建原型,调试过程也更直观(可以直接在派上写代码、看日志)。
- 外设接口与网络连接:树莓派自带USB、HDMI、以太网/Wi-Fi/蓝牙。你可以方便地连接键盘鼠标显示器进行现场调试,也可以通过SSH远程登录,甚至让机器人通过Wi-Fi接收指令或传输传感器数据。
型号选择建议:对于PiSloth,树莓派3B+或树莓派4B(2GB内存版)是性价比之选。它们的GPIO引脚、计算性能完全足够,且功耗相对可控。不需要追求最新的树莓派5,除非你计划集成非常复杂的视觉AI模型。
2.2 动力与骨骼:舵机、支架与连接件
这是机器人的“肌肉”和“骨骼”,决定了它如何运动以及运动范围。
舵机(伺服电机):这是机器人的关节。双足机器人至少需要每条腿3个自由度(髋部俯仰、髋部横滚、膝盖),共6个舵机。更复杂的设计会为脚踝增加自由度,以实现更细腻的平衡。对于PiSloth这类教育/创客项目,推荐使用数字舵机,而非廉价的模拟舵机。
- 为什么是数字舵机?数字舵机内部有微处理器,接收PWM(脉冲宽度调制)信号后,能更精确、更快地定位到指定角度,并且堵转时发热更小,扭矩保持更好。这对于需要快速响应和精确角度控制的步行机器人至关重要。
- 关键参数:扭矩(kg·cm)、速度(秒/60°)、电压(通常4.8V-6.8V)、尺寸。髋关节需要较大的扭矩(如20kg·cm以上)来支撑身体和运动惯性,膝关节次之。速度不宜过慢,否则步态会显得非常迟滞。
- 品牌参考:SpringRC、Futaba、Hitec等都是可靠品牌。国内一些厂家如“银燕”也有性价比不错的数字舵机。
机械结构:这是最体现“手工”魅力的部分。你有两个主要选择:
- 3D打印结构:这是最灵活、成本可控的方式。你可以在Thingiverse、Cults3D等网站找到开源的双足机器人模型(如“Biped Robot”、“SpotMicro”的变种),下载STL文件后打印。材料建议使用PLA+或PETG,它们比普通PLA更坚固、耐冲击。你需要设计或寻找适配你舵机型号(通常是标准舵机尺寸)的支架、连接杆和脚板。
- 激光切割亚克力/椴木板结构:这种方式精度高,加工快,但设计需要更精确的图纸(如DXF文件)。亚克力板美观但较脆,椴木板更轻且有韧性,是不错的选择。
- 核心原则:结构设计必须考虑重心。机器人的重心(通常是电池和树莓派的位置)应尽可能低,并且在双脚支撑面内或上方,这能极大提高静态和动态稳定性。
2.3 感知与能源:电源与传感器的选型考量
电源系统:这是项目的“血液系统”,也是最容易出问题的地方。
- 分压供电:绝对不能直接用一块电池同时给树莓派和舵机供电!舵机在启动和堵转时会产生巨大的电流尖峰和电压骤降,这足以导致树莓派重启或损坏。标准做法是双电源系统:
- 一路:使用一块大容量、高放电率的2S或3S锂聚合物电池(7.4V或11.1V),通过一个大电流BEC(电池消除器电路)模块降压至6V(或舵机额定电压),专门给所有舵机供电。
- 另一路:使用一块5V USB移动电源或通过一个独立的5V BEC/降压模块从主电池降压,专门给树莓派供电。确保两个电源的“地”(GND)连接在一起。
- 电池选择:舵机数量多,耗电大,建议选择2200mAh以上、25C以上放电率的锂电池。同时务必配备平衡充电器。
- 分压供电:绝对不能直接用一块电池同时给树莓派和舵机供电!舵机在启动和堵转时会产生巨大的电流尖峰和电压骤降,这足以导致树莓派重启或损坏。标准做法是双电源系统:
传感器(可选但强烈推荐):
- 惯性测量单元:这是实现动态平衡的“小脑”。一个MPU6050模块(包含三轴加速度计和三轴陀螺仪)价格不到20元,却能提供关键的姿态数据。通过软件滤波(如互补滤波或卡尔曼滤波)融合加速度和陀螺仪数据,可以实时估算机器人的俯仰角和横滚角,用于平衡反馈控制。
- 超声波或红外测距:用于简单的避障或测距,增加互动性。
- 摄像头:树莓派官方摄像头,为后续的视觉巡线、人脸跟踪等AI功能预留接口。
3. 软件框架搭建:从零到一的控制逻辑
硬件组装好比造好了身体,软件则是赋予其灵魂。PiSloth的软件架构可以自底向上分为三层:硬件驱动层、核心控制层和用户交互层。
3.1 环境准备:为树莓派配置Python舞台
拿到树莓派后,第一件事是安装操作系统。推荐使用Raspberry Pi Imager工具,选择“Raspberry Pi OS (Legacy, 32-bit)”版本,它更稳定且资源占用少。烧录完成后,进行基本配置(地区、语言、Wi-Fi),并务必启用SSH和I2C接口(在sudo raspi-config中设置)。
接下来是Python环境。树莓派OS通常预装了Python 3。我们需要安装关键的库:
# 更新系统 sudo apt update && sudo apt upgrade -y # 安装Python包管理工具pip(如果未安装) sudo apt install python3-pip -y # 安装GPIO控制库,用于控制舵机信号线 sudo apt install python3-rpi.gpio -y # 安装科学计算和数据处理库 sudo apt install python3-numpy python3-scipy -y # 或者用pip安装(版本可能更新) pip3 install numpy scipy # 安装用于MPU6050等I2C设备通信的库 sudo apt install python3-smbus -y pip3 install mpu6050-raspberrypi # 一个MPU6050的专用库 # 安装用于PWM信号生成更稳定的库(比RPi.GPIO的软件PWM更好) pip3 install adafruit-circuitpython-servokit注意:直接使用RPi.GPIO库生成PWM信号控制舵机,在树莓派负载高时可能出现抖动。
adafruit-circuitpython-servokit库利用了硬件PWM,信号更稳定,强烈推荐。
3.2 舵机控制基础:理解PWM与角度映射
舵机控制的核心是PWM信号。舵机有三根线:电源(VCC,接6V)、地(GND)、信号(Signal)。信号线接收一个周期约为20ms(50Hz)的脉冲,脉冲的高电平宽度(脉宽)决定了舵机转动的角度。通常,脉宽范围在500μs(0.5ms)到2500μs(2.5ms)之间,对应0度到180度。
但是,不同品牌舵机的实际中位和范围可能有微小差异。因此,第一步是校准。写一个简单的测试程序,让每个舵机在最小、中间、最大脉宽下转动,观察实际角度,并记录下对应你所需物理角度的脉宽值。建立你自己的角度-脉宽映射表或函数。
使用adafruit-circuitpython-servokit的示例:
from adafruit_servokit import ServoKit import time # 初始化,假设使用16通道的PCA9685板(常见舵机驱动板),或直接指定树莓派引脚 # 这里示例使用PCA9685,I2C地址0x40 kit = ServoKit(channels=16, address=0x40) # 假设舵机接在通道0 servo_num = 0 # 校准:找到你的舵机实际对应的脉宽范围(单位:微秒) # 这些值需要你通过实验确定 min_pulse = 500 max_pulse = 2500 # 设置舵机脉宽范围 kit.servo[servo_num].set_pulse_width_range(min_pulse, max_pulse) # 转动到90度(中间位置) kit.servo[servo_num].angle = 90 time.sleep(1) # 转动到0度 kit.servo[servo_num].angle = 0 time.sleep(1) # 转动到180度 kit.servo[servo_num].angle = 180 time.sleep(1)3.3 姿态感知:MPU6050的数据融合
MPU6050通过I2C接口与树莓派连接(SDA接GPIO2, SCL接GPIO3)。原始数据(加速度和角速度)噪声大且存在漂移,不能直接使用。
互补滤波是一种简单有效的融合算法。其思想是:陀螺仪积分得到的角度短期可靠但长期会漂移;加速度计测得的角度长期稳定但短期噪声大。将它们结合,用高通滤波器滤掉加速度计的低频噪声(即快速变化的部分),用低通滤波器滤掉陀螺仪的高频漂移(即长期变化的部分)。
下面是一个极简的互补滤波实现示例:
import time from mpu6050 import mpu6050 sensor = mpu6050(0x68) # MPU6050的默认I2C地址 # 初始化角度 pitch = 0.0 roll = 0.0 # 互补滤波系数(需调试,通常alpha接近1,表示更信任陀螺仪) alpha = 0.98 dt = 0.01 # 采样时间间隔,假设循环能保证0.01秒 while True: start_time = time.time() # 读取数据 accel_data = sensor.get_accel_data() # 单位: g gyro_data = sensor.get_gyro_data() # 单位: deg/s # 1. 从加速度计计算俯仰和横滚角(单位:弧度) acc_pitch = math.atan2(accel_data['y'], math.sqrt(accel_data['x']**2 + accel_data['z']**2)) acc_roll = math.atan2(-accel_data['x'], accel_data['z']) # 转换为度 acc_pitch_deg = math.degrees(acc_pitch) acc_roll_deg = math.degrees(acc_roll) # 2. 从陀螺仪计算角度变化(积分) # 注意:陀螺仪数据是角速度,需要乘时间得到角度变化量 gyro_pitch_rate = gyro_data['x'] # 根据你的传感器安装方向调整轴 gyro_roll_rate = gyro_data['y'] # 3. 互补滤波融合 pitch = alpha * (pitch + gyro_pitch_rate * dt) + (1 - alpha) * acc_pitch_deg roll = alpha * (roll + gyro_roll_rate * dt) + (1 - alpha) * acc_roll_deg print(f"Pitch: {pitch:.2f}°, Roll: {roll:.2f}°") # 控制循环频率 elapsed = time.time() - start_time sleep_time = dt - elapsed if sleep_time > 0: time.sleep(sleep_time)通过这个循环,你就能得到相对稳定的机器人俯仰和横滚角度,这是平衡控制的基础。
4. 步态设计与逆运动学:让机器人“走”起来
这是双足机器人最核心、也最有趣的部分。我们如何将“前进”这个指令,分解成六个舵机一系列角度变化的序列?
4.1 步态规划:设计一个步行周期
一个简单的步行周期可以分解为以下几个阶段(以一条腿为主动腿为例):
- 双足支撑期:机器人重心从后脚向前脚转移。
- 单足支撑期(摆动相):后脚(摆动腿)抬起、向前摆动、放下。
- 双足支撑期:重心转移到刚放下的前脚。
- 单足支撑期:另一条腿成为摆动腿,重复步骤2。
我们需要为这个周期中的每一个时刻,计算出每条腿髋关节(俯仰、横滚)和膝关节的目标角度。一种直观的方法是关键帧动画法:
- 定义几个关键姿态,例如:站立、重心左移、抬右腿、右腿前摆、右腿放下、重心右移……
- 为每个关键姿态,手动设定或计算6个舵机的角度。
- 在关键帧之间进行插值(线性或曲线),生成平滑的角度变化序列。
4.2 逆运动学:从脚掌位置到关节角度
手动设定每个舵机角度非常繁琐,且不直观。更优雅的方法是使用逆运动学。我们只关心脚掌末端在空间中的位置(相对于髋关节),然后通过数学公式反推出大腿和小腿需要转动的角度。
对于一条腿,我们可以将其简化为一个在矢状面(侧面)和冠状面(正面)运动的2自由度或3自由度连杆系统。
以矢状面(侧面)的2自由度腿为例: 假设大腿长度L1,小腿长度L2。我们希望脚掌末端位于相对于髋关节的坐标(x, z)(x向前,z向下)。
- 计算末端到髋关节的距离:
d = sqrt(x^2 + z^2) - 检查是否可达:如果
d > (L1 + L2)或d < |L1 - L2|,则该位置无法到达。 - 计算膝关节角度
θ2(使用余弦定理):cosθ2 = (x^2 + z^2 - L1^2 - L2^2) / (2 * L1 * L2)θ2 = arccos(cosθ2)# 注意:通常得到的是弯腿的补角,需要根据机构调整 - 计算大腿角度
θ1:β = atan2(z, x)ψ = arccos((L1^2 + d^2 - L2^2) / (2 * L1 * d))θ1 = β - ψ(或β + ψ,取决于机构朝向)
这样,给定一个脚掌目标位置(x, z),我们就能算出膝关节和髋关节俯仰舵机的角度。髋关节的横滚角度则用于在冠状面内移动重心,可以通过一个简单的比例关系根据期望的躯干倾斜角度来设定。
4.3 代码实现:一个简单的步行循环
结合逆运动学和步态规划,我们可以用代码描述一个步行循环:
import math import time class BipedLeg: def __init__(self, l1, l2): self.l1 = l1 # 大腿长 self.l2 = l2 # 小腿长 def ik(self, x, z): """逆运动学:计算给定脚掌位置(x,z)时的关节角度(弧度)""" d = math.sqrt(x**2 + z**2) if d > (self.l1 + self.l2) or d < abs(self.l1 - self.l2): print("目标位置不可达!") return None, None # 计算膝关节角度 (θ2) cos_theta2 = (x**2 + z**2 - self.l1**2 - self.l2**2) / (2 * self.l1 * self.l2) # 防止浮点误差导致acos域错误 cos_theta2 = max(-1.0, min(1.0, cos_theta2)) theta2 = math.acos(cos_theta2) # 计算大腿角度 (θ1) beta = math.atan2(z, x) psi = math.acos((self.l1**2 + d**2 - self.l2**2) / (2 * self.l1 * d)) theta1 = beta - psi # 此公式适用于图示机构,可能需要调整符号 # 转换为度并返回(注意:实际舵机零点可能需要偏移) return math.degrees(theta1), math.degrees(theta2) # 初始化腿模型(单位:厘米) leg = BipedLeg(l1=8.0, l2=8.0) # 定义步态关键点(脚掌相对于髋关节的位置) # 假设机器人面朝x轴正方向,z轴垂直向下。 gait_positions = [ (0, -15), # 站立,脚在髋关节正下方15cm (3, -14), # 重心前移,脚略微抬起 (6, -12), # 继续前移并抬高 (8, -14), # 脚向前伸出准备落地 (5, -15), # 脚落地,重心开始转移 (0, -15), # 回到中立位 ] # 控制舵机(假设已初始化kit对象) hip_pitch_channel = 0 knee_channel = 1 for pos in gait_positions: theta1, theta2 = leg.ik(pos[0], pos[1]) if theta1 is not None: # 注意:计算出的角度可能需要偏移才能映射到舵机的实际角度范围 kit.servo[hip_pitch_channel].angle = theta1 + 90 # 举例:加上90度偏移 kit.servo[knee_channel].angle = theta2 time.sleep(0.2) # 等待舵机运动到指定位置这只是一个单腿的简化示例。实际的双足步行需要协调两条腿,并加入基于IMU数据的平衡反馈。
5. 平衡控制与反馈:从“能走”到“走得稳”
开环的步态(即预先编好动作序列)只能在绝对平坦、坚硬的地面上勉强行走。任何微小的不平整或干扰都会导致机器人摔倒。要让PiSloth真正稳起来,必须引入闭环反馈控制。
5.1 PID控制:平衡的“直觉”
PID(比例-积分-微分)控制器是工程中最经典的反馈控制算法。我们可以用它来根据IMU测得的姿态角误差,实时调整步态或关节角度。
- 比例:当前误差有多大,就按比例施加多大的纠正力。误差越大,纠正力越大。
- 积分:累积历史误差。用于消除静态误差(例如一直朝一边偏)。
- 微分:误差变化的趋势。用于抑制振荡,让系统更快稳定。
在PiSloth中,我们可以用一个PID控制器来控制躯干的俯仰角。设定点(Setpoint)是我们期望的俯仰角(比如0度,直立)。测量值(Process Value)是MPU6050融合计算出的实际俯仰角。控制器的输出可以用于:
- 调整步态:当身体前倾时,加快摆动腿向前的速度,或调整脚掌落地点。
- 调整踝关节角度(如果有):直接像人一样“踮脚”或“勾脚”来补偿。
- 调整髋关节角度:微调支撑腿的姿势。
一个简单的俯仰角PID控制代码框架:
class PIDController: def __init__(self, Kp, Ki, Kd): self.Kp = Kp self.Ki = Ki self.Kd = Kd self.prev_error = 0 self.integral = 0 self.dt = 0.01 # 控制周期 def compute(self, setpoint, pv): error = setpoint - pv # 比例项 P = self.Kp * error # 积分项(抗积分饱和) self.integral += error * self.dt I = self.Ki * self.integral # 微分项 derivative = (error - self.prev_error) / self.dt D = self.Kd * derivative self.prev_error = error output = P + I + D return output # 初始化PID控制器(参数需要耐心调试!) pid_pitch = PIDController(Kp=1.0, Ki=0.01, Kd=0.1) desired_pitch = 0.0 # 期望保持直立 while walking: current_pitch = get_filtered_pitch() # 从IMU获取当前俯仰角 correction = pid_pitch.compute(desired_pitch, current_pitch) # 将修正量应用到步态上,例如调整摆动腿的落脚点x坐标 # gait_x_offset = base_x + correction * gain_factor # 然后通过逆运动学计算新的关节角度并发送给舵机5.2 调试的艺术:参数整定与观察
PID参数调试是门实践艺术,没有万能公式。建议遵循以下步骤:
- 先调P:将I和D设为0。逐渐增大P,直到机器人开始对倾斜有明显、快速的纠正反应,但又不至于剧烈振荡。
- 再调D:增加D值可以抑制由P引起的振荡,让动作更“柔和”、稳定。但D值太大会导致系统反应迟钝。
- 最后调I:如果机器人存在静态误差(始终无法完全回到0度),则缓慢增加I值来消除它。I值过大会导致“积分饱和”,引起系统超调和震荡。
- 反复微调:这是一个“观察-调整-测试”的循环。用
print语句实时输出角度和PID输出值,是理解系统行为的宝贵手段。
5.3 状态机管理:让机器人有条不紊
一个完整的机器人控制系统应该是基于状态机的。例如,机器人可以有以下状态:INIT(初始化)、STANDING(站立)、BALANCING(平衡调整)、WALKING_FORWARD(前进)、TURNING(转弯)、FALLEN_DETECTED(跌倒检测)等。
状态机确保了行为的有序和逻辑清晰。例如,只有当处于STANDING状态且收到前进指令时,才切换到WALKING_FORWARD状态,并启动相应的步态生成器和平衡控制器。在WALKING_FORWARD状态下,如果IMU检测到倾斜角超过安全阈值,则立即切换到BALANCING状态尝试恢复,若恢复失败则进入FALLEN_DETECTED状态并停止所有电机。
6. 进阶优化与扩展:让PiSloth更智能
当基本的行走和平衡实现后,你可以考虑以下方向让PiSloth变得更强大、更有趣。
6.1 上位机与控制界面
通过Wi-Fi,你可以用电脑或手机上的程序控制机器人。在树莓派上运行一个简单的Web服务器(如使用Flask框架)或Socket服务器。上位机程序发送指令(如forward,stop,turn_left,speed 50),树莓派接收后解析并改变机器人的状态和行为。
# 一个极简的Flask控制API示例 from flask import Flask, request app = Flask(__name__) @app.route('/command', methods=['POST']) def handle_command(): cmd = request.json.get('cmd') if cmd == 'forward': robot_state = 'WALKING_FORWARD' # ... 触发行走线程 return {'status': 'walking forward'} elif cmd == 'stop': robot_state = 'STANDING' # ... 停止运动 return {'status': 'stopped'} # ... 其他命令 return {'status': 'unknown command'} if __name__ == '__main__': app.run(host='0.0.0.0', port=5000) # 树莓派IP:50006.2 视觉感知与交互
连接树莓派官方摄像头,使用OpenCV库,你可以实现许多功能:
- 颜色跟踪:让机器人跟着一个特定颜色的球走。
- 人脸检测:让机器人转向并“看”着人。
- 二维码识别:让机器人走到指定的二维码地点。
- 视觉SLAM(高级):构建环境地图并自主导航。
这需要引入多线程或异步编程,让视觉处理循环与控制循环并行运行,并通过线程安全的队列或变量进行通信。
6.3 步态优化与能量效率
最初的步态可能很僵硬、耗能。你可以通过以下方式优化:
- 使用样条曲线插值:代替简单的线性插值,让关节角度变化更平滑,运动更拟人。
- 零力矩点预观控制:更高级的算法,通过规划脚底压力中心轨迹来保证动态平衡。
- 引入足底力传感器:在脚底安装FSR(力敏电阻)或薄膜压力传感器,直接感知着地状态和压力分布,实现更柔顺的落地控制。
7. 避坑指南与实操心得
回顾整个PiSloth的构建过程,以下是我总结的、在教程中不常被提及的“血泪教训”:
- 电源噪声是万恶之源:舵机引起的电压波动是导致树莓派死机、IMU数据跳变的最常见原因。务必使用独立的稳压模块为树莓派供电,并在电源线上并联大容量(如1000μF)的电解电容和多个0.1μF的陶瓷电容进行滤波。舵机电源线也应尽量粗短。
- 机械结构的刚性至关重要:3D打印件或亚克力连接处如果有丝毫晃动,都会被舵机放大,导致机器人颤抖、定位不准甚至损坏齿轮。关键承重部位可以加厚设计、添加加强筋,或者使用金属舵盘和螺丝。组装后,用手轻轻扭动关节,不应有可见的间隙。
- 接地!接地!接地!:确保树莓派、舵机驱动板、传感器、电池的“地”(GND)都良好地连接在一起,共地是保证信号正常传输的基础。
- 舵机中位校准是第一步:在安装舵机到支架上之前,先用程序让所有舵机转到90度(或其他定义的中位),然后再安装连杆。这能确保你的逆运动学计算基准是正确的。
- 调试时循序渐进:不要一上来就写完整的步行程序。按这个顺序测试:a) 单个舵机转动;b) 单条腿的逆运动学(用手拖动脚掌,看关节是否跟随计算值运动);c) 静态姿态平衡(用手推机器人,看PID反馈是否使其抵抗);d) 最后才是完整的步态。
- IMU的安装位置与滤波:MPU6050应尽量安装在机器人的重心位置,并牢固固定。任何松动都会引入剧烈振动噪声。互补滤波的
alpha系数和采样时间dt需要根据实际运动频率仔细调整。dt最好通过高精度计时器(如time.perf_counter())来精确控制。 - 代码的实时性:避免在控制循环中使用
print输出大量调试信息,这会严重拖慢循环速度,导致控制失效。可以将调试信息写入内存队列,另起一个线程低速打印或通过网络发送。
构建PiSloth这样的双足机器人是一个系统工程,它融合了机械、电子、编程和算法。过程中你会遇到无数挫折——舵机烧了、结构断了、代码跑飞了、机器人走两步就劈叉了。但每一次调试成功,看到它颤颤巍巍又坚定地迈出一步时,那种成就感是无与伦比的。这不仅仅是完成了一个项目,更是亲手将一个关于行走的梦想,从概念变成了在桌面上蹒跚前行的现实。