1. 项目概述:当K210遇见Mixly,让舵机云台“看”着人转
如果你手头有一块K210开发板,又对Mixly这种图形化编程感兴趣,还想做个能自动跟着人脸转动的酷炫小装置,那咱们今天聊的这个“人脸追踪舵机云台”项目,绝对对胃口。这项目说白了,就是让K210这块带AI加速的芯片充当“眼睛”,识别出画面里的人脸,然后计算出人脸在画面里的位置,再把这个位置信息转换成指令,驱动两个舵机(一个控制左右,一个控制上下)组成的云台转动,最终让摄像头始终对准人脸。整个过程,我们打算用Mixly来完成编程,这对很多觉得写代码头疼、或者想快速验证创意的朋友来说,是个福音。
K210本身性能很强,跑个人脸检测模型轻轻松松。但直接用它官方的MaixPy IDE写代码,对新手还是有门槛。Mixly的出现,相当于在强大的K210和用户之间搭了一座桥,把复杂的图像处理、坐标计算、串口通信、PWM控制这些操作,都封装成了一个个积木块。你只需要像搭乐高一样,把逻辑拖拽出来,项目就能跑起来。这大大降低了开发智能视觉项目的门槛,让更多人可以专注于创意实现,而不是纠结于语法错误。
这个项目适合谁呢?首先是教育领域的师生,用于AI和物联网的入门教学,直观又有趣。其次是硬件爱好者、创客,想快速做个智能监控雏形、互动展示装置或者就是个好玩的玩具。最后,哪怕你是个有一定经验的开发者,用Mixly做前期原型验证和逻辑梳理,效率也非常高。整个系统的核心,就在于“感知-决策-控制”这个闭环:K210负责感知(人脸检测),Mixly程序负责决策(坐标到舵机角度的换算),舵机云台负责执行(转动)。接下来,我们就一步步拆解,看看怎么用Mixly把这些环节串起来,玩转K210的人脸追踪。
2. 核心思路与硬件选型解析
2.1 为什么选择K210+Mixly+舵机云台这个组合?
做视觉追踪,核心是“眼睛”和“大脑”。K210双核64位、带KPU(神经网络处理器)的配置,让它处理像人脸检测这样的经典计算机视觉任务时游刃有余,功耗和成本相比一些方案更有优势。它原生支持MaixPy,生态成熟。而Mixly for K210是这个生态里的一个图形化分支,它把MaixPy的常用功能,特别是Maix、image、sensor、lcd这些模块的API,转化成了可视化的积木。这意味着你不用去记img.find_faces()这样的函数,而是直接找到“寻找人脸”的积木来用,极大减少了初学者的记忆负担和调试时间。
舵机云台是经典的执行机构。选择它而不是步进电机,是因为在这个项目里,我们不需要连续旋转,而是需要精确的角度定位。舵机接收PWM信号,控制简单,开箱即用。一个二维云台通常由两个舵机正交叠放组成,一个控制Yaw(偏航,左右),一个控制Pitch(俯仰,上下)。我们通过调节输出给舵机的PWM信号占空比,来精确控制其旋转角度。SG90这类微型舵机就足够应付小负载的摄像头模块,成本也低。
所以,这个组合的优势很明显:K210提供强大的视觉感知能力,Mixly提供极低的编程门槛,舵机提供可靠的动作执行。三者结合,能让你在几个小时内就从零搭建出一个可运行的人脸追踪原型,快速获得正反馈,这对于学习和创新来说至关重要。
2.2 硬件清单与连接要点
你需要准备以下硬件:
- K210开发板:如Sipeed Maix Dock、Maix Bit等。注意板载摄像头和LCD屏幕的型号,确保与Mixly中选择的硬件型号匹配。
- 二维舵机云台:可以购买成品,也可以用两个舵机加一个云台支架自己组装。推荐SG90或MG90S这类9g舵机,扭矩适中。
- 舵机驱动板:虽然K210的IO口可以直接输出PWM,但为了稳定和方便,建议使用一个简单的PCA9685这类I2C舵机驱动板。它可以通过I2C总线控制多达16路舵机,解放了K210的IO,也提供了更稳定的电源。当然,直接连接也可以,但要注意电源问题。
- 电源:这是关键!舵机,特别是两个同时动作时,瞬间电流可能很大(可达1A以上)。绝对不要仅靠K210开发板上的USB口给舵机供电,这极易导致开发板复位或损坏。务必为舵机云台准备独立的外部电源(如3节AA电池盒或一个5V/2A的电源适配器),并与K210开发板共地。
- 连接线:杜邦线(母对母、公对母),用于连接各模块。
连接示意图与注意事项:
- K210与摄像头/LCD:如果使用的是像Maix Dock这样的板子,摄像头和LCD通常是板载或通过排线连接好的,无需额外接线。
- K210与舵机驱动板(以PCA9685为例):
- I2C连接:将PCA9685的SCL接K210的IO口(如IO_9),SDA接IO口(如IO_10)。具体引脚需查阅你的K210开发板原理图。
- 电源连接:将外部电源的正极(V+)接PCA9685的VCC,负极(GND)接PCA9685的GND。同时,务必将这个GND与K210开发板的GND用一根杜邦线连接起来,确保“共地”,这是信号正常通信的基础。
- 舵机连接:将控制Yaw轴的舵机信号线接到PCA9685的某个通道(如Channel 0),控制Pitch轴的舵机信号线接到另一个通道(如Channel 1)。舵机的VCC和GND也接到PCA9685对应的V+和GND排针上。
注意:如果选择不使用舵机驱动板,直接将舵机信号线接到K210的GPIO(需支持PWM),那么更要注意电源隔离。建议使用一个逻辑电平转换模块,并为舵机单独供电,避免电机噪声干扰核心板。
3. Mixly for K210环境搭建与基础配置
3.1 Mixly的安装与K210固件烧录
首先,你需要去Mixly的官方仓库或社区下载支持K210的专用版本。安装过程很简单,和普通软件一样。安装完成后,打开Mixly,在左上角的“主板”类型中选择你的K210开发板型号,例如“Sipeed Maix Dock”。
接下来是关键一步:给K210烧录MaixPy固件。Mixly图形化程序最终是转换成MaixPy的代码在K210上运行的,所以板子里必须有MaixPy的运行时。你需要:
- 从MaixPy的GitHub仓库下载最新的固件文件(.bin文件)。
- 使用K-Flash工具(或者MaixPy IDE自带的烧录功能)将固件烧录到K210开发板。烧录时,注意选择正确的开发板型号和串口,并将烧录地址设置为
0x00000。 - 烧录成功后,通过USB线将K210连接至电脑。在Mixly的“端口”选项中,应该能看到对应的串口出现,选择它。
3.2 Mixly界面与关键积木块介绍
Mixly的界面分为左侧的积木区、中间的编程区和右侧的代码预览区。对于本项目,我们需要重点关注以下几类积木:
- “K210/摄像头”相关:在“传感器”或“K210”分类下,你会找到初始化摄像头、设置摄像头分辨率、拍摄照片等积木。例如,“初始化摄像头”积木是必须的第一步。
- “K210/图像处理”相关:在“图像”或“K210”分类下,核心积木是“寻找人脸”。这个积木块会返回一个列表,包含了检测到的每个人脸的信息,如人脸框的坐标(x, y, w, h)。
- “变量与数学运算”:我们需要创建变量来存储人脸坐标、计算出的舵机目标角度等。数学运算积木用于做坐标映射。
- “串口通信”:如果我们使用舵机驱动板(如PCA9685),并且驱动板通过串口(或模拟I2C)通信,那么就需要用到串口初始化、发送数据的积木。更常见的是使用“I2C”相关积木来控制PCA9685。
- “控制”与“逻辑”:循环积木(如“重复执行”)、条件判断积木(“如果...那么...”)是构建程序逻辑的骨架。
一个重要的技巧:在开始拖拽人脸追踪逻辑之前,先拖出一个“初始化摄像头”和一个“LCD显示图像”的积木,并让摄像头图像显示在LCD上。这能帮你快速验证摄像头和LCD是否工作正常。在Mixly中,这通常可以通过“设置摄像头为...分辨率”和“在LCD上显示图像”两个积木的组合来实现。
4. 人脸检测与坐标获取逻辑实现
4.1 配置摄像头与加载AI模型
在Mixly中,我们通常不需要显式地“加载”模型文件。因为Mixly for K210在编译时,可能已经将一些常用模型(如人脸检测模型)内置或自动关联了。我们首要的任务是正确初始化摄像头传感器。
你需要找到类似“初始化摄像头”的积木,并设置合适的分辨率。对于人脸检测,分辨率不宜过高,否则会增加K210的计算负担,降低帧率。常用的分辨率是QVGA (320x240)或VGA (640x480)。在Mixly中,它可能被表述为“设置摄像头尺寸为320x240”。将这个积木放在“程序开始”的下面。
接下来,为了看到效果,我们可以用一个循环,不断地从摄像头获取图像,并显示到LCD上。这能确保我们的硬件链路是通的。
4.2 使用“寻找人脸”积木并理解返回值
核心中的核心,就是“寻找人脸”这个积木块。你可以在积木区的“图像识别”或“K210人工智能”分类下找到它。把它拖到程序中,它需要一个“图像”作为输入。这个“图像”就是从上一步“从摄像头获取图像”积木得到的。
这个积木的执行结果(返回值)是一个“列表”。列表里的每一个元素,代表一个被检测到的人脸对象。每个人脸对象本身又包含了一些属性,通常以列表或字典的形式存在,关键信息包括:
- x: 人脸框左上角的横坐标。
- y: 人脸框左上角的纵坐标。
- w: 人脸框的宽度。
- h: 人脸框的高度。
- confidence(可能): 检测置信度。
在Mixly中处理这个列表需要一点技巧。你需要使用“获取列表长度”积木来判断是否检测到人脸(长度>0)。如果检测到了,再用“获取列表中第...项”的积木,取出第一个人脸(通常我们追踪最显著的一个,即索引0)。然后,通过“获取对象属性”或类似积木(有时需要结合“字典”操作积木),从这个人脸对象里取出x,y,w,h的值,并存入我们事先定义好的变量中,比如face_x,face_y,face_w,face_h。
实操心得:在Mixly里,处理这种嵌套的数据结构(列表里套字典/对象)可能是最绕的一步。一个有效的方法是,先使用“打印”积木,将“寻找人脸”返回的整个列表输出到串口监视器看看。观察它的结构到底是什么样的,是
[[x, y, w, h], ...]还是[{'x':val, 'y':val...}, ...]。看清了结构,才能用对的积木去提取数据。
5. 从像素坐标到舵机角度的映射算法
5.1 计算人脸框中心点
拿到人脸框的坐标(x, y, w, h)后,我们首先要找到人脸的“中心点”在图像中的像素坐标。这很简单:
中心点X坐标 = face_x + (face_w / 2) 中心点Y坐标 = face_y + (face_h / 2)在Mixly中,你需要使用数学运算积木来实现这个计算,并将结果存入新变量,如center_x,center_y。
5.2 建立映射关系:PID控制思想的简化应用
我们的目标是让摄像头中心对准人脸中心。也就是说,当center_x等于图像宽度一半(如320/2=160),center_y等于图像高度一半(如240/2=120)时,舵机不应该转动。当center_x偏离160时,控制Yaw轴舵机转动;当center_y偏离120时,控制Pitch轴舵机转动。
这里最直接的方法是使用比例(P)控制,它是PID控制中最简单也最常用的一部分。思路是:舵机需要转动的角度,与人脸中心偏离图像中心的距离成正比。
我们可以这样计算:
误差_X = 图像中心X - 人脸中心X # 即 160 - center_x 误差_Y = 图像中心Y - 人脸中心Y # 即 120 - center_y # 将像素误差转换为舵机角度增量。这里需要一个比例系数Kp 角度增量_X = 误差_X * Kp_X 角度增量_Y = 误差_Y * Kp_Y # 更新舵机目标角度 目标角度_X = 当前角度_X + 角度增量_X 目标角度_Y = 当前角度_Y + 角度增量_Y为什么是“图像中心 - 人脸中心”?假设人脸在画面偏右(center_x > 160),误差为负,计算出的角度增量也为负,意味着舵机需要向左转(假设我们定义向左转为角度减小),从而让摄像头向左移动去对准人脸。这是一个负反馈过程。
比例系数Kp的选择:这是调参的关键。Kp太大,舵机反应会非常剧烈,在目标点附近来回振荡;Kp太小,舵机移动缓慢,追踪迟钝。需要根据实际测试来调整。一个经验值是:先设定一个较小的Kp(如0.1),观察云台运动,如果太慢就慢慢加大,如果开始振荡了就减小。也可以对X和Y轴设置不同的Kp,因为水平转动和垂直转动的机械惯性和视角变化可能不同。
5.3 加入死区与角度限幅
直接使用上述公式,只要人脸有微小移动,舵机就会不停微抖,既耗电又磨损机械结构。因此需要引入“死区”(Dead Zone)。即只有当误差的绝对值大于某个阈值(比如5个像素)时,才计算角度增量并转动舵机。小于这个阈值就忽略,认为已经对准了。
同时,必须对计算出的目标角度_X/Y进行限幅,确保它在舵机的物理运动范围之内(例如SG90是0-180度)。避免发出超出范围的角度指令导致舵机卡死或损坏。
如果 目标角度_X < 0, 那么 目标角度_X = 0 如果 目标角度_X > 180, 那么 目标角度_X = 180Y轴同理。
在Mixly中,你需要大量使用“数学运算”、“比较判断”和“逻辑与或非”积木来搭建这套逻辑。虽然看起来积木很多,但逻辑是清晰的:计算误差 -> 判断是否在死区外 -> 计算角度增量 -> 更新目标角度 -> 限幅。
6. 舵机控制与PWM信号生成
6.1 舵机控制原理与PWM参数
舵机接收的是周期为20ms(频率50Hz)的PWM信号。控制角度靠的是高电平的脉冲宽度(占空比)。对于180度舵机,典型对应关系是:
- 0度: 脉冲宽度约0.5ms (占空比 2.5%)
- 90度: 脉冲宽度约1.5ms (占空比 7.5%)
- 180度:脉冲宽度约2.5ms (占空比 12.5%)
在Mixly中,如果我们直接使用K210的GPIO控制舵机,需要找到“设置PWM”或“模拟输出”相关的积木,并设置正确的频率(50Hz)和占空比。但更推荐使用I2C舵机驱动板(如PCA9685),因为它更稳定,且不占用K210的CPU资源进行精确计时。
6.2 通过Mixly控制PCA9685舵机驱动板
PCA9685驱动板有现成的Mixly用户库或积木块。你需要先导入相关的库。通常,会有一个“初始化PCA9685”的积木,需要填入I2C地址(默认0x40)和频率(50Hz)。
控制特定通道舵机转到指定角度的积木,通常类似“设置PCA9685通道 [0] 角度为 [90] 度”。你只需要将之前计算好的、经过限幅的目标角度_X和目标角度_Y变量,填入对应通道的积木中即可。
一个关键细节:PCA9685积木块内部已经完成了从角度到脉冲宽度的换算。但不同品牌的舵机,其中位(90度)对应的脉冲宽度可能有微小差异。如果发现云台的中位不是你想要的中心位置,可能需要在程序里加一个“偏移量”进行校准。例如,实际发送角度 = 目标角度 + 校准偏移量。
6.3 控制频率与平滑移动
不要在每个循环中都急速更新舵机角度。这会导致云台动作生硬、抖动。应该设置一个控制周期,比如每100毫秒(10Hz)更新一次舵机角度。在Mixly中,可以用“延时(毫秒)”积木放在主循环末尾来实现。
更进一步,可以加入平滑滤波。例如,不是直接将计算出的目标角度发给舵机,而是让舵机每次只向目标角度移动一小步(比如每次最多变化5度)。这会让云台的运动看起来更柔和、更拟人化。实现起来就是在更新当前角度时,判断与目标角度的差值,如果差值大于步进值,就只增加或减少一个步进值。
7. 系统集成与主循环逻辑搭建
7.1 程序初始化模块
在“程序开始”积木下,我们需要按顺序初始化所有模块:
- 初始化串口(用于调试打印,可选但强烈推荐)。
- 初始化I2C(如果使用PCA9685)。
- 初始化PCA9685,设置频率为50Hz。
- 初始化摄像头,设置分辨率。
- 初始化LCD(如果使用)。
- 初始化变量:如
current_pan_angle,current_tilt_angle(设为云台初始中间位置,如90),kp_x,kp_y,dead_zone等。 - 将云台归中:发送90度指令给两个舵机通道,让云台回到初始位置。
7.2 主循环逻辑设计
主循环里是整个程序的灵魂,它需要高效、稳定地执行“采集-处理-控制”流程。一个健壮的主循环结构如下:
- 图像采集:使用“从摄像头获取图像”积木,将图像数据存入一个变量(如
img)。 - 图像显示(可选但建议):将
img显示在LCD上,可以实时观察检测效果。 - 人脸检测:对
img使用“寻找人脸”积木,结果存入face_list。 - 判断是否检测到人脸:
- 如果检测到(
face_list长度 > 0):- 提取第一个人脸的坐标,计算中心点
center_x,center_y。 - 分别计算X轴和Y轴的误差。
- 判断误差是否超出死区。如果超出,则根据比例系数计算角度增量,更新目标角度,并进行限幅。
- 将新的目标角度发送给PCA9685对应的舵机通道。
- 提取第一个人脸的坐标,计算中心点
- 如果未检测到:
- 可以执行一个“搜索”模式,例如让云台缓慢地左右扫描,直到再次检测到人脸。或者简单地停止不动。
- 如果检测到(
- 调试信息输出:将关键数据(如
center_x,center_y, 误差, 目标角度)通过串口打印出来,这在调试阶段无比重要。 - 循环延时:在循环末尾添加一个适当的延时,如50-100毫秒,以控制循环频率,避免程序跑飞。
在Mixly中搭建这个逻辑,会用到大量的“如果...那么...否则”、“循环”、“变量操作”积木。看起来会有点复杂,但只要你按功能模块一点点搭建和测试,是完全可以实现的。
8. 调试技巧、常见问题与优化方案
8.1 调试:从串口信息开始
一定要用串口调试!在Mixly中,初始化串口后,使用“串口打印”积木,把你关心的变量值打印出来。这是你了解程序内部状态的唯一窗口。你可以打印:
- 是否检测到人脸
- 人脸中心坐标
- 计算出的误差
- 计算出的目标舵机角度
- 实际发送给舵机的指令
通过观察这些数据,你可以判断是人脸检测出了问题(坐标异常),还是坐标映射计算有误,或是舵机指令没发对。
8.2 常见问题排查表
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| LCD黑屏或花屏 | 1. 摄像头初始化失败或型号不匹配。 2. LCD初始化失败或接线错误。 3. 程序跑飞。 | 1. 检查Mixly中摄像头型号设置是否正确。 2. 单独编写一个仅显示摄像头画面的简单程序测试。 3. 检查电源是否稳定。 |
| 检测不到人脸 | 1. 光线太暗或过曝。 2. 人脸距离太远或不在画面内。 3. 模型未加载或初始化问题。 | 1. 改善光照环境,避免背光。 2. 确保人脸清晰出现在画面中。 3. 通过串口打印“寻找人脸”返回的列表长度,确认是否为空。检查初始化流程。 |
| 舵机不转动 | 1. 电源问题(供电不足或未共地)。 2. 信号线连接错误。 3. PWM信号参数(频率、占空比)不对。 4. 舵机损坏。 | 1.首要检查:用独立电源给舵机供电,并确保与K210共地。 2. 检查信号线是否接在了正确的通道上。 3. 使用一个简单的测试程序,固定发送90度指令,看舵机是否归中。 4. 更换舵机测试。 |
| 舵机抖动或转动不顺畅 | 1. 电源功率不足,导致多个舵机同时动作时电压被拉低。 2. 控制频率太高,指令发送太频繁。 3. 机械结构卡涩或负载过重。 | 1. 使用更大电流的电源(如2A以上)。 2. 增加主循环中的延时,降低控制频率。 3. 检查云台组装是否顺畅,润滑转动关节。 |
| 追踪延迟大,不灵敏 | 1. 摄像头分辨率设置过高,处理帧率低。 2. 比例系数Kp设置过小。 3. 主循环中有耗时操作。 | 1. 尝试降低摄像头分辨率(如降到320x240)。 2. 逐步增大Kp值,观察反应。 3. 优化程序,移除不必要的打印或计算。 |
| 追踪过程振荡(来回晃) | 1. 比例系数Kp设置过大。 2. 没有加入死区控制。 3. 云台机械惯性大。 | 1.首要调整:减小Kp值。 2. 加入死区,忽略微小误差。 3. 加入平滑滤波(每次角度变化限幅)。 |
8.3 性能与效果优化方案
- 优化图像处理:在
img.find_faces()之前,可以尝试将图像转换为灰度图(如果Mixly有该积木),或者对图像进行缩放,都能减少计算量,提高帧率。 - 多级PID与预测:在比例(P)控制的基础上,可以尝试加入积分(I)控制来消除静态误差,加入微分(D)控制来抑制超调。更高级的,可以根据人脸移动的速度和方向,预测其下一帧的位置,实现提前量控制,让追踪更丝滑。
- 加入状态机:让程序拥有不同的状态,如“搜索状态”、“锁定跟踪状态”、“丢失状态”。在人脸丢失时,进入搜索状态缓慢扫描;锁定后,进入高精度的跟踪状态。这会使系统行为更智能。
- 使用总线舵机:如果项目对速度和精度要求高,可以考虑使用总线舵机(如DYNAMIXEL或一些国产总线舵机)。它们通过串口总线通信,可以设置速度、扭矩、位置等多种参数,并读取当前位置和负载,实现更精准的控制。在Mixly中可能需要寻找或自己编写对应的用户库。
这个项目虽然用Mixly实现了图形化编程,但其背后涵盖的知识点非常丰富:从计算机视觉、传感器数据采集、控制算法到硬件驱动。通过动手完成它,你不仅能得到一个好玩的人脸追踪装置,更能深入理解一个典型嵌入式AI应用的系统级设计思路。当看到云台稳稳地跟着你的脸转动时,那种成就感就是学习技术最大的乐趣所在。