基于Stewart平台与PD控制的球体平衡机器人设计与实现
2026/5/28 20:14:05 网站建设 项目流程

1. 项目概述与核心思路

在机器人设计与控制领域,构建一个能够实时响应、动态平衡的机械系统,是检验从机械结构、电子硬件到控制算法全链路能力的绝佳试金石。我这次分享的项目,就是一个基于Stewart平台(又称六自由度并联平台)的球体平衡机器人。简单来说,它的目标就是让一个球在平台上无论如何滚动,都能被平台“接住”并稳稳地控制在中心。

这个项目的魅力在于,它完美融合了机械设计、运动学、实时视觉处理和反馈控制。Stewart平台本身是一个经典的并联机构,由上下两个平台通过六根可伸缩的支链连接。通过精确控制这六根支链的长度(在我们的项目中,由六个舵机驱动连杆实现),上平台(即承载球体的平台)可以在三维空间内实现六个自由度的运动:沿X、Y、Z轴的平移和绕这三个轴的旋转。为了实现球体平衡,我们引入了Pixy2摄像头作为“眼睛”,实时追踪红色球体的位置。控制系统的大脑是一块Teensy 4.1微控制器,它接收摄像头数据,计算球体位置与平台中心的偏差(误差)以及球体的运动速度,然后通过一套PD(比例-微分)控制算法,计算出平台需要倾斜的角度。最后,通过逆运动学方程,将这个倾斜角度转换为六个舵机需要转动的具体角度,驱动平台做出相应动作,从而抵消球的运动趋势,使其稳定。

整个系统就像一个极其敏捷的杂技演员,用一个小托盘接住不断滚动的弹珠。它不仅是一个炫酷的演示,更是一个学习机器人学核心概念的绝佳实践项目,涉及硬件集成、传感器数据处理、控制理论应用和实时系统编程。

2. 核心硬件选型与设计解析

2.1 Stewart平台机械结构设计

Stewart平台的结构设计是整个项目的物理基础。我采用了经典的上平台(动平台)、下平台(静平台)通过六组“伺服舵机-连杆”支链连接的形式。上平台是一块8x8英寸的透明聚碳酸酯板,为球体提供光滑的支撑面。下平台(基板)则用于固定所有电子设备和六个舵机。

关键设计点在于支链的布局与运动学约束。六个舵机均匀分布在下平台,每个舵机的输出轴通过一个25齿的舵盘连接到一个3D打印的“连杆一”(Link 1)。连杆一的另一端通过一个可调节长度的推杆连接件(M3x120mm推杆)与球头关节(由M3拉杆和螺母模拟)相连,最终连接至上平台的边缘。这种设计使得每个支链本质上是一个由舵机驱动的旋转副,通过连杆将舵机的旋转运动转换为推杆末端的空间运动,从而推动或拉动上平台。

为什么选择这种推杆结构?首先,推杆长度可微调,这对于实际装配中不可避免的机械误差补偿至关重要。其次,球头关节(或等效结构)提供了必要的万向自由度,避免了结构内部的过约束,确保平台运动顺滑,不会卡死。在3D打印零件设计时,我特别关注了轴承孔和连接处的间隙,预留了约0.2-0.3mm的装配公差,以保证运动流畅又不至于过于松旷。

2.2 关键电子元器件选型考量

电子部分的核心是感知、计算和执行。

  1. 视觉传感器:Pixy2摄像头Pixy2是我选择的核心传感器。它的最大优势在于内置了颜色识别算法,能直接在芯片上处理图像,通过颜色签名(Color Signature)快速识别目标,并通过UART或SPI等接口直接输出目标块的坐标、大小等数据,极大减轻了主控MCU的图像处理负担。对于这个需要每秒处理数十帧图像进行实时控制的项目来说,这种“傻瓜式”的视觉方案比使用OpenCV处理普通摄像头流要高效和稳定得多。我将球体和平台四个角的标记物都设计为红色,就是为了让Pixy2能稳定识别。

  2. 主控制器:Teensy 4.1在Arduino Uno、ESP32和Teensy之间,我选择了Teensy 4.1。决定性因素是它的性能。Teensy 4.1搭载了600MHz的ARM Cortex-M7处理器,其计算能力远超常见的AVR或ESP32-S3。在平衡控制中,我们需要在极短周期内(目标约10ms)完成:读取摄像头数据、进行PD控制计算、解算六自由度的逆运动学(涉及三角函数和矩阵运算)、生成六个舵机的PWM控制信号。Teensy 4.1的强大算力能轻松应对这些任务,确保控制环路延迟最小,这是实现稳定平衡的关键。

  3. 执行器:JX CLS6336HV 35kg数字舵机舵机的选择直接决定了平台的响应速度和承载能力。我选择了JX CLS6336HV,主要看中两点:高速度和高扭矩。其0.14秒/60°的速度参数意味着它能快速响应控制信号。35kg.cm的扭矩足以驱动平台及球体快速改变姿态。舵机需要工作在7.4V电压下以获得最佳性能,这正好与我们选用的2S锂电池匹配。一个重要的细节是,所有六个舵机必须是同一型号,且最好进行一致性测试,否则微小的性能差异会导致平台运动不协调。在实际使用前,我建议对每个舵机进行中位点校准。

  4. 舵机控制器:Pololu Maestro 6通道控制器为什么需要独立的舵机控制器?Teensy 4.1的PWM输出引脚有限,且直接驱动多个大电流舵机可能干扰核心芯片的稳定运行。Pololu Maestro是一款专用的多通道舵机控制器,它通过串口接收来自Teensy的位置指令,然后独立生成精确的PWM信号控制舵机。它内置了轨迹规划功能,可以让舵机运动更平滑。更重要的是,它直接连接电池,为大电流舵机供电,并通过板载稳压器为Teensy提供干净的5V电源,实现了电源隔离,提高了系统稳定性。

  5. 电源系统:2S锂聚合物电池选用一块2S(7.4V)6200mAh的锂电池。高容量保证了足够的运行时间。整个系统的功耗主要来自六个舵机,尤其在快速运动时瞬时电流很大。电池通过一个XT60接口和开关连接到Pololu Maestro,由Maestro统一进行电源分配。

注意:电源布线是高频坑点。务必使用足够粗的导线(如18AWG)连接电池、开关和Maestro。所有舵机的电源线也应尽量短而粗,并在靠近Maestro电源输入端的位置并联一个大容量(如470μF)的电解电容,以缓冲舵机动作引起的电压骤降,防止系统复位。

2.3 电路设计与信号逻辑

整个电路的连接需要仔细处理电平匹配和信号流。

核心信号流:Pixy2摄像头(通过USB或串口)将球体坐标发送给Teensy 4.1 -> Teensy运行控制算法,计算出六个舵机的目标角度 -> Teensy通过串口TX/RX引脚将目标角度指令发送给Pololu Maestro -> Maestro控制六个舵机移动到指定位置。

电平转换的必要性:这里存在一个关键细节。Teensy 4.1的逻辑电平是3.3V,而Pololu Maestro的串口逻辑电平是5V。如果直接将3.3V的TX信号连接到Maestro的RX,在高压下可能无法被可靠识别为高电平,导致通信失败。因此,必须使用一个双向逻辑电平转换器(LLC)。Teensy的TX引脚连接到LLC的低压侧,LLC的高压侧输出5V信号给Maestro的RX;反之,Maestro的TX的5V信号也需经LLC降压至3.3V再送给Teensy的RX。

电路搭建实操心得

  • 使用面包板或原型板:建议先在半块原型板上焊接好Teensy、电平转换器、以及必要的排针接口。这比飞线可靠得多。
  • 插拔式连接:对于Pixy2、Maestro与主板的连接,强烈建议使用杜邦线或现成的舵机延长线。这便于调试和更换模块。
  • 共地:确保Teensy、Maestro、Pixy2(如果由外部供电)和逻辑电平转换器的GND都连接在一起,形成共同的参考地,这是电路正常工作的基础。

3. 软件架构与控制算法实现

3.1 系统软件框架与库依赖

整个项目的代码运行在Arduino IDE环境下(需安装Teensyduino插件)。软件框架主要分为三层:

  1. 驱动层:负责与硬件通信。包括Pixy2库用于获取视觉数据,PololuMaestro库用于通过串口控制Maestro舵机控制器。
  2. 算法层:核心控制逻辑。包含StewartKinematics类(处理逆运动学计算)和PDController类(实现PD控制算法)。
  3. 应用层:主程序Ball_Balance.ino,负责初始化硬件、循环读取数据、调用算法、输出控制量。

在开始编程前,必须通过Arduino库管理器或手动安装Pixy2PololuMaestro这两个库。安装后,在示例代码中熟悉其基本用法,例如如何初始化Pixy2并获取目标块数据,如何设置Maestro串口通信并发送目标位置指令。

3.2 逆运动学:从平台姿态到舵机角度

这是将期望的平台空间运动转换为具体舵机动作的数学桥梁。对于我们的Stewart平台,已知的是上平台(动平台)相对于下平台(静平台)的位姿(包括位置和欧拉角),需要求解的是六根支链的长度变化。而在我们由舵机驱动的结构中,支链长度变化体现在舵机轴的旋转角度上。

推导思路简述

  1. 建立坐标系:在下平台(基座)和上平台(动平台)上分别建立坐标系{B}和{P}。
  2. 定义几何参数:测量或设计确定上、下平台各铰链点(舵机输出轴中心点和平台连接点)在各自坐标系中的位置向量。
  3. 计算支链向量:当上平台有一个位姿变换(由旋转矩阵R和平移向量p描述)时,上平台的铰链点在世界坐标系中的新位置可以通过p + R * (上平台铰链点向量)计算得到。那么,第i根支链的向量就等于:上平台铰链点新位置 - 下平台对应铰链点位置
  4. 求解舵机角度:在我们的设计中,支链长度并非直接驱动,而是由舵机旋转通过连杆机构间接控制。因此,需要根据支链向量的长度和方向,结合连杆的几何关系(构成一个三角形),利用余弦定理反解出舵机轴需要转动的角度。

在实际代码中,我将这些几何参数(铰链点坐标、连杆长度等)定义为常量。编写一个函数,例如calculateServoAngles(float roll, float pitch, float yaw, float x, float y, float z),输入期望的平台姿态角(roll, pitch, yaw)和微小平移量(x, y, z),函数内部完成上述矩阵和三角运算,最终输出一个包含六个舵机目标角度的数组。

实操心得:运动学参数的测量与校准。理论计算依赖于精确的机械尺寸。但3D打印和装配总会引入误差。因此,代码中必须为每个舵机引入一个“偏移量(Offset)”参数。通过手动微调,让所有舵机在“零位”时,平台处于水平状态。这个校准过程至关重要,是后续平衡控制的前提。

3.3 PD控制算法:让球体稳定在中心

PD控制器是使系统稳定的“大脑”。其输入是误差,输出是控制量(即平台需要倾斜的角度)。

  1. 误差计算:Pixy2返回球体在图像中的坐标(ball_x, ball_y)。在系统校准阶段,我们已经获取了平台中心在图像中的坐标(center_x, center_y)。那么当前时刻的位置误差就是:error_x = center_x - ball_xerror_y = center_y - ball_y(注意:坐标轴方向需与平台运动方向对应)

  2. 微分项计算:微分项反映误差的变化率,即球体的速度。可以通过当前误差与上一次误差的差值除以时间间隔来近似求得:derivative_x = (error_x - previous_error_x) / delta_tderivative_y = (error_y - previous_error_y) / delta_t其中delta_t是控制循环的周期时间(例如0.01秒)。

  3. 控制量输出:PD控制器的输出是比例项和微分项的加权和:output_x = Kp * error_x + Kd * derivative_xoutput_y = Kp * error_y + Kd * derivative_y这里的output_xoutput_y就是平台需要在X轴和Y轴方向(对应Roll和Pitch)上倾斜的角度指令(通常需要乘以一个缩放系数,将像素误差转换为弧度)。

参数整定技巧

  • Kp(比例系数):决定了系统对位置误差的反应强度。Kp太大会导致平台反应过激,引起球体在中心附近振荡;Kp太小则反应迟钝,球体容易滑出平台。
  • Kd(微分系数):决定了系统对速度的阻尼效果。增大Kd可以抑制振荡,让球体更平滑地趋于稳定,但Kd过大会使系统响应变慢,显得“粘滞”。
  • 整定方法:先将Kd设为0,逐渐增大Kp,直到球体开始出现明显的等幅振荡。然后,逐渐增大Kd,直到振荡被有效抑制,球体能快速且平稳地回到中心。这是一个手动试凑的过程,需要耐心。在代码中,我将Kp和Kd定义为可调节的变量,便于通过串口监视器实时调整并观察效果。

3.4 主控制循环与状态管理

主程序loop()函数构成了一个固定的控制周期,其伪代码如下:

void loop() { unsigned long currentTime = micros(); float deltaT = (currentTime - previousTime) / 1e6; // 计算时间差,单位秒 previousTime = currentTime; // 1. 获取视觉数据 pixy.ccc.getBlocks(); // 获取识别到的色块 if (pixy.ccc.numBlocks > 0) { // 假设签名1为球体 ballX = pixy.ccc.blocks[0].m_x; ballY = pixy.ccc.blocks[0].m_y; ballDetected = true; } else { ballDetected = false; } // 2. 状态判断与处理 if (ballDetected) { // 检查球体是否在平台有效区域内(通过距离中心点的距离判断) float distanceToCenter = sqrt(pow(ballX - centerX, 2) + pow(ballY - centerY, 2)); if (distanceToCenter < platformRadiusThreshold) { // 球在平台上,执行平衡控制 // 计算PD输出 float tiltX = calculatePD(ballX, centerX, deltaT, Kp, Kd); float tiltY = calculatePD(ballY, centerY, deltaT, Kp, Kd); // 通过逆运动学计算舵机角度 float servoAngles[6]; calculateServoAngles(tiltX, tiltY, 0, 0, 0, 0, servoAngles); // 这里只用了X,Y倾斜 // 将角度指令发送给舵机控制器 setServoPositions(servoAngles); } else { // 球虽被看到但不在平台区域,舵机归零位(平台水平) goHomePosition(); } } else { // 未检测到球,舵机归零位 goHomePosition(); } // 3. 固定频率延迟,维持控制周期稳定 delay(CONTROL_LOOP_DELAY_MS); }

这个循环确保了系统以固定的频率(如100Hz)运行,这是数字控制器稳定性的重要保障。

4. 系统集成、装配与调试实录

4.1 机械装配全流程与关键技巧

装配顺序直接影响效率和最终精度。我建议按以下步骤进行:

  1. 底座与舵机安装:首先将六个舵机用M3螺丝牢固安装在下平台(基板)上。注意舵机的朝向,确保所有舵盘旋转平面大致平行。接着安装Pixy2的下支架和原型板。技巧:在固定舵机前,先给每个舵机通电并运行归中程序,确保其初始位置一致,便于后续安装舵盘。
  2. 电路集成:将焊接好Teensy和电平转换器的原型板固定在基板上。连接Pololu Maestro,并按照原理图连接所有线缆。特别注意:六个舵机信号线连接到Maestro的通道顺序,必须与代码中定义的舵机索引顺序完全一致。建议做好标签。
  3. 支链组装:将舵盘与“连杆一”用螺丝和防松螺母固定。然后将推杆连接件与拉杆、球头关节组装好,再与“连杆一”的另一端连接。关键点:推杆连接件的长度先预调到设计值,但不要锁死,留待整体校准。
  4. 上平台组装:将透明平台用螺丝和垫柱固定在“平台上框架”上。垫柱的作用是提供一个间隙,防止平台与框架摩擦。
  5. 总装:将组装好的支链上端(球头关节)用螺丝固定到上平台的对应安装孔(已预埋螺纹嵌件)。此时平台由六根支链悬吊。
  6. 摄像头支架安装:将木棍裁剪到合适长度,安装Pixy2上下支架,最后将摄像头固定在上支架。

装配核心挑战:平行与对称。装配的终极目标是,当所有舵机处于“零位”时,六根支链应尽可能长度一致且垂直于下平台,上平台应处于水平状态。这需要反复微调:一是通过代码中的舵机偏移量进行软件校准;二是微调推杆连接件的长度进行硬件补偿。这是一个需要耐心和细心的过程。

4.2 系统校准:视觉与机械的标定

校准是连接软件世界和物理世界的关键步骤,分为两部分:

1. 视觉系统标定:

  • 目的:找到摄像头画面中平台中心的像素坐标(center_x, center_y),以及一个表征平台大小的参数r_platform(通常为平台外接圆半径的像素值)。
  • 方法:在平台四个角安装红色的中心标记物。运行专门的校准程序,程序会控制平台移动到水平位置,然后让Pixy2识别这四个红色标记。通过计算这四个标记点位置的平均值,即可得到平台中心坐标。同时计算这四个点到中心点的平均距离,作为r_platform。这个值用于后续判断球体是否在平台有效区域内。

2. 机械零位校准:

  • 目的:定义每个舵机的“零点”,使得当所有舵机处于零点时,平台是水平的。
  • 方法:上传一个让所有舵机移动到90度(或中位)的程序。观察上平台是否水平。如果不水平,则在代码中逐个调整每个舵机的offset值(在目标角度上增加或减少一个微小度数),重新上传程序,直到平台水平。记录下这六个offset值,它们需要被写入最终的平衡控制程序中。

4.3 调试与性能优化

系统首次上电运行,很可能无法稳定平衡球体。以下是系统的调试路径:

  1. 检查通信:首先确保所有硬件通信正常。通过串口监视器查看Teensy是否能正确收到Pixy2的数据(坐标值),以及是否能向Maestro发送指令(可通过让舵机缓慢来回运动测试)。
  2. 验证视觉:在PixyMon软件中确认摄像头能稳定、准确地识别红色球体,且不受环境光变化过大影响。可以调整Pixy2的识别阈值和签名范围。
  3. 测试单轴运动:将PD控制器的KpKd先设小,甚至暂时注释掉PD控制,手动给平台一个固定的倾斜指令(例如只倾斜X轴),观察球体是否按预期方向滚动。这可以验证逆运动学计算和舵机驱动是否正确。
  4. 引入PD控制:先调一个轴(如X轴)。将另一个轴的控制量设为零。手动拨动球体,观察平台反应。从很小的Kp开始,逐渐增加直到出现振荡,然后加入Kd抑制振荡。反复调整直到单轴响应快速且平稳。
  5. 双轴耦合调试:同时启用X和Y轴控制。此时两轴之间可能存在耦合干扰。可能需要微调两个轴的参数,使其响应特性接近。有时,由于机械不对称,两轴的最佳参数可能略有不同。
  6. 应对异常情况:在代码中完善状态机。例如,当摄像头丢失目标,或球体快速滚出平台区域时,应立即让所有舵机回到安全零位,防止平台过度倾斜导致机械损坏。

性能优化点

  • 控制频率:尽可能提高主循环频率。减少不必要的串口打印,优化计算代码。目标是将循环周期控制在10ms(100Hz)以内。
  • 滤波:对Pixy2读取的坐标数据进行简单的低通滤波(如一阶滞后滤波),可以平滑数据,减少摄像头噪声对控制的干扰。
  • 前馈补偿:如果发现球体在匀速滚动时,平台跟踪有稳态误差,可以考虑加入基于球体速度的前馈控制项。

5. 常见问题排查与进阶思考

5.1 典型故障与解决方案速查表

现象可能原因排查步骤与解决方案
上电后舵机乱转或不动1. 电源功率不足或接触不良。
2. Pololu Maestro未正确初始化或通信失败。
3. 舵机信号线接错或损坏。
1. 检查电池电量,用万用表测量Maestro电源输入端电压是否稳定在7.4V左右。
2. 使用Maestro控制中心软件单独测试每个舵机通道是否正常。
3. 检查Teensy与Maestro的串口连接、电平转换器是否工作。
Pixy2检测不到球体1. 光照条件变化,颜色识别失效。
2. 摄像头镜头未对焦。
3. 签名(Signature)未正确训练或丢失。
1. 确保环境光线均匀,避免强光直射或过暗。球体颜色饱和度高。
2. 调整Pixy2镜头上的对焦环,使图像清晰。
3. 重新运行Pixy2的物体训练程序,确保在最终使用的光照环境下训练。
平台运动卡顿或抖动1. 机械结构有干涉或过紧。
2. 舵机扭矩不足或响应速度慢。
3. 控制循环周期不稳定,计算延迟大。
4. PD参数不合适,引发振荡。
1. 检查所有关节转动是否顺畅,推杆长度是否合适,有无零件摩擦。
2. 确认舵机供电电压是否为7.4V,尝试更换性能更强的舵机。
3. 使用micros()函数测量loop()周期,优化代码,移除调试输出。
4. 适当减小Kp或增大Kd
球体总是向某个方向漂移1. 平台物理不水平(零位不准)。
2. 摄像头安装倾斜,导致视觉坐标系与物理坐标系不匹配。
3. 某个舵机存在死区或中位偏差。
1. 重新进行机械零位校准,精细调整舵机偏移量。
2. 使用水平仪调整摄像头安装,确保其光轴与平台垂直。
3. 单独测试每个舵机,检查其中立点是否准确,必要时更换舵机。
系统偶尔复位或失控1. 舵机动作瞬间电流过大,导致电压骤降,Teensy复位。
2. 电源开关或接线端子接触不良。
3. 代码中存在内存泄漏或异常。
1. 在Maestro电源输入端并联大容量(1000μF以上)电解电容。
2. 检查所有电源连接点,确保焊接牢固。
3. 检查代码中数组越界、除零等潜在错误。

5.2 项目延伸与进阶可能性

完成基础平衡功能后,这个平台还有巨大的探索空间:

  1. 算法升级:将PD控制器升级为完整的PID控制器,加入积分项以消除静态误差(虽然对于动态平衡,积分项需谨慎使用,易导致超调)。或者尝试更先进的控制算法,如模糊控制、模型预测控制(MPC)。
  2. 增加交互性:通过蓝牙或Wi-Fi模块(如ESP-01S)连接机器人,开发一个手机APP或电脑端界面,可以手动设置平台倾斜角度,甚至绘制路径让球体自动沿特定轨迹(如八字形、圆形)运动。
  3. 更换被控对象:平台不仅可以平衡球,还可以尝试平衡一个倒立摆、一个装满水的杯子,或者一个处于起飞临界状态的多旋翼无人机模型,挑战不同的控制难题。
  4. 状态估计融合:仅靠视觉存在延迟和遮挡问题。可以增加一个惯性测量单元(IMU,如MPU6050)安装在平台上,融合视觉的绝对位置信息和IMU的加速度、角速度信息,通过卡尔曼滤波等算法得到更精准、更快速的球体/平台状态估计,提升系统抗干扰能力。
  5. 仿真先行:在投入硬件制作前,使用MATLAB/Simulink、Python或ROS+Gazebo等工具对Stewart平台动力学和球体平衡控制进行仿真。这可以帮助你提前验证运动学模型、调试控制参数,节约大量时间和物料成本。

这个项目从设计到实现,贯穿了机电一体化系统的核心思想。每一个环节——机械的精度、硬件的可靠性、软件的效率与算法的智能——都深刻影响着最终性能。调试过程可能充满挑战,但当看到球体在平台上稳稳停住的那一刻,所有的努力都变得值得。它不仅仅是一个机器人,更是一个理解复杂系统如何工作的窗口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询