1. 六足机器人舵机选型与参数配置原理

六足机器人运动控制的核心执行单元是舵机。舵机并非简单的角度执行器,其内部集成了位置反馈电路、驱动电机和减速齿轮组,构成一个闭环控制系统。在机器人结构中,舵机的性能直接决定了步态稳定性、负载能力、响应速度与长期运行可靠性。因此,舵机选型绝非仅看标称扭矩或角度范围,而必须结合机械构型、运动学约束、供电能力与控制精度进行系统性评估。

本项目采用两种主流舵机方案:国华A0090与PDI-118MG。二者虽同属标准尺寸(40×20×38 mm)数字舵机,但电气特性、机械极限与控制协议存在本质差异,必须在固件层面进行差异化配置,否则将导致关节失控、定位漂移甚至硬件损坏。

1.1 舵机控制原理与PWM信号规范

所有兼容RC协议的舵机均通过脉宽调制(PWM)信号接收指令。标准RC PWM周期为20 ms(50 Hz),有效脉宽范围通常为500–2500 μs,对应0°–180°机械转动范围。但此为通用协议,具体舵机的零点偏移、死区宽度、线性度及极限脉宽均由厂商定义,不可一概而论。

PDI-118MG标称运动范围为0°–120°,其对应的有效脉宽为900–2100 μs(非字幕中误写的“20000”,该数值明显超出标准PWM范围,实为笔误)。经实测验证,该舵机在900 μs时输出最小角度(接近0°),2100 μs时输出最大角度(约120°),中间呈近似线性关系。而国华A0090标称范围为0°–180°,实测有效脉宽为500–2500 μs。二者脉宽-角度映射关系如下表所示:

舵机型号 标称角度范围 实测有效脉宽(μs) 角度分辨率(每10 μs)
PDI-118MG 0°–120° 900–2100 ≈0.1°
国华A0090 0°–180° 500–2500 ≈0.09°

该参数差异源于内部电位器阻值范围、ADC采样精度及控制算法不同。若在代码中将A0090的配置参数(如 MIN_PULSE = 500 , MAX_PULSE = 2500 )直接套用于118MG,当上位机发送180°指令(2500 μs)时,118MG将试图转动至远超其机械限位的位置,触发内部过载保护或导致齿轮卡死,长期如此将加速齿轮磨损。

1.2 机械结构对舵机选型的硬性约束

六足机器人采用“蜘蛛构型”,即三对腿呈120°夹角对称分布,每条腿由三个自由度(CoG)组成:髋关节(Coxa)、大腿关节(Femur)、小腿关节(Tibia)。其中,髋关节需承受整条腿的静态扭矩及动态冲击,对舵机的堵转扭矩与响应速度要求最高;大腿关节次之;小腿关节主要承担末端执行器(如脚掌)的微调,对精度要求高,对扭矩要求相对较低。

PDI-118MG额定电压6.0 V下堵转扭矩为18 kg·cm,空载速度0.12 sec/60°;国华A0090在相同电压下扭矩为15 kg·cm,速度0.13 sec/60°。表面看118MG略优,但其体积与重量(约53 g)显著大于A0090(约42 g)。在六足机器人轻量化设计中,单腿3个舵机,整机18个舵机,总重差达198 g。该重量增量直接影响重心高度、惯性矩及电池续航——实测在同等锂电池(2S 2000 mAh)供电下,118MG版本连续行走时间缩短约18%。

此外,118MG的外壳材质为增强尼龙+金属齿,抗冲击性优于A0090的全塑料外壳,但在高频振动环境下,其内部双轴承支撑结构对PCB焊点的应力传导更大。我们在早期测试中发现,未加装减震垫片的118MG在持续爬坡工况下,舵机引脚焊点出现微裂纹,导致间歇性通信中断。解决方案是在舵机安装座与机体之间嵌入1 mm厚硅胶垫片,并将舵机信号线采用绞合屏蔽线,接地端就近接入舵机电源地而非主控地,有效抑制共模干扰。

1.3 config.h 中舵机参数的工程化配置逻辑

舵机参数配置文件 config.h 并非简单的数值罗列,而是构建了一套可扩展的舵机抽象层。其核心结构如下:

// 舵机类型枚举,支持未来扩展
typedef enum {
    SERVO_TYPE_A0090,
    SERVO_TYPE_118MG,
    SERVO_TYPE_MG996R,
} servo_type_t;

// 单个舵机通道配置结构体
typedef struct {
    uint8_t channel_id;          // PWM通道号(对应定时器通道)
    GPIO_TypeDef *port;          // GPIO端口(如GPIOA)
    uint16_t pin;                // GPIO引脚(如GPIO_PIN_6)
    servo_type_t type;           // 舵机型号
    uint16_t min_pulse_us;       // 最小脉宽(μs)
    uint16_t max_pulse_us;       // 最大脉宽(μs)
    int16_t offset_angle;        // 机械零点校准偏移(度)
    uint8_t invert_direction;    // 是否反转旋转方向(1=反转)
} servo_config_t;

// 全局舵机配置数组(按腿序号、关节序号索引)
const servo_config_t servo_configs[LEG_COUNT][JOINT_COUNT] = {
    // 第一条腿(前左腿)
    {
        { .channel_id = 0, .port = GPIOA, .pin = GPIO_PIN_6, .type = SERVO_TYPE_118MG, .min_pulse_us = 900, .max_pulse_us = 2100, .offset_angle = -2, .invert_direction = 0 }, // 髋关节
        { .channel_id = 1, .port = GPIOA, .pin = GPIO_PIN_7, .type = SERVO_TYPE_118MG, .min_pulse_us = 900, .max_pulse_us = 2100, .offset_angle = 5,  .invert_direction = 1 }, // 大腿关节
        { .channel_id = 2, .port = GPIOB, .pin = GPIO_PIN_0, .type = SERVO_TYPE_118MG, .min_pulse_us = 900, .max_pulse_us = 2100, .offset_angle = -3, .invert_direction = 0 }, // 小腿关节
    },
    // 后续五条腿配置依此类推...
};

此处 offset_angle 字段至关重要。它并非软件补偿,而是对舵机物理安装误差的修正。例如,髋关节舵机轴线理论上应与机体纵轴平行,但3D打印件公差、装配应力会导致实际安装存在±3°偏差。若不校准,所有步态计算将基于错误的坐标系,导致步态不对称、机身侧倾。校准方法为:将机器人置于水平台面,手动将所有髋关节调至理论0°位置,用数显角度尺测量实际角度,取平均值作为 offset_angle 写入配置。

invert_direction 用于解决机械镜像问题。六足机器人左右腿呈镜像对称,若左右腿使用完全相同的舵机型号与安装朝向,则一侧腿的某个关节旋转方向必然与另一侧相反。传统做法是物理翻转舵机,但会改变走线路径与重心分布。更优方案是在软件层统一处理:对镜像腿的对应关节设置 invert_direction = 1 ,驱动层在输出目标角度前自动执行 target_angle = 120 - target_angle (以118MG为例),确保所有腿的运动学解算结果能直接映射到物理动作。

2. ESP32主控平台的系统初始化与外设协同

从STM32迁移到ESP32作为六足机器人主控,不仅是芯片更换,更是整个软件架构的重构。ESP32并非单纯增强版MCU,其双核Xtensa LX6处理器、内置Wi-Fi/BT基带、丰富模拟外设及FreeRTOS原生支持,共同构成了一个面向物联网机器人的异构计算平台。理解其启动流程与资源分配机制,是实现稳定运动控制的前提。

2.1 启动流程与多核调度边界

ESP32上电后,ROM Bootloader首先运行,完成Flash加密、安全启动校验(若启用)及基本时钟初始化。随后跳转至用户固件入口 call_start_cpu0 ,该函数位于 components/esp_system/startup.c 中。关键点在于: CPU0负责运行FreeRTOS内核、初始化所有外设驱动及启动应用任务;CPU1在默认配置下处于闲置状态,仅在用户显式创建任务并指定运行于PRO_CPU时才被激活。

在六足机器人固件中,我们严格遵循单核调度原则:所有实时性要求高的任务(如PWM波形生成、IMU数据融合、步态引擎)均绑定至PRO_CPU(CPU0),而低优先级任务(如Wi-Fi状态上报、OTA升级检查、串口调试日志)运行于APP_CPU(CPU1)。此举避免了双核间Cache一致性问题及锁竞争开销。实测表明,在CPU0满载(>95%)情况下,CPU1仍能保障Wi-Fi连接稳定,Ping延迟波动小于5 ms。

系统初始化顺序严格遵循依赖关系:
1. RTC内存初始化 :保存关机前的舵机位置、电池电压等关键状态,实现“热重启”后姿态恢复。
2. GPIO矩阵配置 :将18路舵机PWM引脚(GPIO4–GPIO39中选取)、IMU的I²C(GPIO22/23)、电池ADC采样(GPIO34)等一次性配置为复用功能,禁用上拉/下拉以降低功耗。
3. 外设总线使能 :根据所用外设,使能APB、AHB总线时钟。特别注意:舵机PWM由LED Control(LEDC)模块生成,其时钟源独立于APB,需单独配置 ledc_timer_config_t 中的 clk_cfg 字段为 LEDC_AUTO_CLK ,让硬件自动选择最优时钟分频。
4. FreeRTOS内核启动 :调用 xTaskCreate() 创建 main_task ,该任务进一步初始化各子系统。

2.2 LEDC模块的高精度PWM配置

ESP32的LEDC模块提供16个独立通道,每个通道可配置为不同频率与分辨率。舵机控制对PWM频率要求严格:过低(<30 Hz)会导致肉眼可见抖动;过高(>100 Hz)则因舵机内部滤波电容限制,无法响应快速变化,且增加开关损耗。

针对PDI-118MG,我们采用以下LEDC配置:

ledc_timer_config_t ledc_timer = {
    .speed_mode       = LEDC_LOW_SPEED_MODE,
    .timer_num        = LEDC_TIMER_0,
    .duty_resolution  = LEDC_TIMER_13_BIT, // 13-bit → 8192级分辨率
    .freq_hz          = 50,                 // 严格50 Hz
    .clk_cfg          = LEDC_AUTO_CLK,
};

ledc_channel_config_t ledc_channel = {
    .gpio_num   = GPIO_NUM_4,
    .speed_mode = LEDC_LOW_SPEED_MODE,
    .channel    = LEDC_CHANNEL_0,
    .intr_type  = LEDC_INTR_DISABLE,
    .timer_sel  = LEDC_TIMER_0,
    .duty       = 0, // 初始占空比0%
    .hpoint     = 0,
};

选择13-bit分辨率是权衡结果:12-bit(4096级)对应角度分辨率为120°/4096≈0.029°,已远超舵机自身精度(典型值±1°);14-bit(16384级)虽更精细,但会占用更多RAM存储波形表,且无实际收益。50 Hz频率通过 freq_hz 字段精确设定,LEDC硬件会自动计算并加载计数器初值,无需软件干预。

关键技巧在于 占空比计算公式

uint32_t pulse_width_us = 900 + (target_angle / 120.0f) * (2100 - 900);
uint32_t duty = (pulse_width_us * 8192) / 20000; // 20000 μs = 20 ms周期
ledc_set_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0, duty);
ledc_update_duty(LEDC_LOW_SPEED_MODE, LEDC_CHANNEL_0);

此公式确保脉宽在900–2100 μs范围内线性映射至0–120°,规避了浮点运算开销,全部为整数运算。

2.3 Wi-Fi、Bluetooth与SSH的协同调试架构

ESP32的Wi-Fi与Bluetooth共享同一射频前端,其共存策略由 esp_coex 组件管理。在机器人运动过程中,Wi-Fi需持续上传传感器数据、接收远程指令,而Bluetooth用于本地配对与固件升级。二者若配置不当,将引发信道冲突,导致控制指令丢包。

我们的解决方案是: Wi-Fi工作于2.4 GHz信道1–6(避开Bluetooth常用信道37–39),Bluetooth Classic关闭,仅启用BLE;Wi-Fi采用WPA2-PSK加密,SSID与密码在 menuconfig 中预置,启动时自动连接;SSH服务基于 esp-idf esp_netif lwip 栈实现,监听22端口,认证方式为密钥对( id_rsa.pub 预烧录至Flash)。

该架构形成三级调试通道:
- BLE :低功耗、短距离,用于手机App直连,下发简单指令(如“站立”、“行走”、“急停”),延迟<100 ms。
- Wi-Fi :中距离、高带宽,用于传输IMU原始数据流(100 Hz)、摄像头图像缩略图(JPEG,320×240),供上位机分析。
- SSH :高安全性、全功能,用于开发者登录终端,执行 idf.py monitor 查看实时日志、 esptool.py 烧录固件、 gdb 在线调试。

三者通过FreeRTOS事件组( EventGroupHandle_t )实现状态同步。例如,当Wi-Fi连接成功且获取IP后,置位 WIFI_CONNECTED_BIT ;当SSH服务启动完成,置位 SSH_RUNNING_BIT ;主循环检测到两比特均置位,才允许BLE服务接受新连接,防止网络未就绪时设备被误操作。

3. 步态引擎的数学建模与实时实现

六足机器人步态的本质是18个舵机角度的时空协同序列。将生物蜘蛛的运动模式转化为可执行的数学模型,并在资源受限的MCU上实时求解,是整个系统的技术核心。我们摒弃了查表法(Look-Up Table)等内存密集型方案,采用解析式逆运动学(Analytical Inverse Kinematics)与分段贝塞尔曲线(Piecewise Bézier Curve)插值相结合的轻量级架构。

3.1 单腿三自由度逆运动学推导

以标准蜘蛛构型的前左腿为例,建立D-H(Denavit-Hartenberg)参数模型:
- 坐标系{0}:固定于机体髋部中心
- 关节1(髋关节):绕Z₀轴旋转,连杆长度a₁=0,偏距d₁=0
- 关节2(大腿关节):绕X₁轴旋转,连杆长度a₂=L₁(大腿长),偏距d₂=0
- 关节3(小腿关节):绕X₂轴旋转,连杆长度a₃=L₂(小腿长),偏距d₃=0

设目标末端点(脚掌中心)在{0}系中的坐标为 (x, y, z) ,则逆解公式为:

θ₁ = atan2(y, x)                           // 髋关节方位角
r = sqrt(x² + y²)                          // 水平投影距离
z_eff = z - z_offset                       // 扣除髋关节安装高度偏移
D = (r² + z_eff² - L₁² - L₂²) / (2 * L₁ * L₂)
θ₃ = atan2(sqrt(1 - D²), D)               // 小腿关节角(肘部内弯为正)
θ₂ = atan2(z_eff, r) - atan2(L₂ * sin(θ₃), L₁ + L₂ * cos(θ₃))  // 大腿关节角

其中 L₁=45 mm , L₂=55 mm , z_offset=12 mm 为实测机械参数。该公式计算仅需4次开方、6次三角函数,全部由ESP32的硬件FPU加速,单次求解耗时<80 μs,远低于50 Hz控制周期(20 ms)。

3.2 贝塞尔曲线插值与实时轨迹规划

步态周期(Gait Cycle)被划分为支撑相(Stance Phase)与摆动相(Swing Phase)。支撑相要求脚掌稳定接触地面,舵机角度缓慢变化;摆动相要求脚掌快速离地、前伸、下落,轨迹需平滑无冲击。直线插值会产生加速度突变(Jerk),导致机身抖动。

我们采用二次贝塞尔曲线:

P(t) = (1-t)² * P₀ + 2t(1-t) * P₁ + t² * P₂,  t ∈ [0,1]

其中 P₀ 为起始点, P₂ 为终点, P₁ 为控制点,决定轨迹曲率。对每条腿的三个关节,独立规划其角度轨迹:
- 支撑相(t∈[0,0.6]): P₁ 设为 0.5*(P₀+P₂) ,生成近似直线,保证地面摩擦力稳定。
- 摆动相(t∈[0.6,1.0]): P₁ 设为 P₀ + 1.5*(P₂-P₀) ,生成高抛物线,确保脚掌抬高足够避障。

插值过程在 vTask 中以1 kHz频率运行:

void swing_phase_task(void *pvParameters) {
    const TickType_t xFrequency = 1; // 1 ms周期
    TickType_t xLastWakeTime = xTaskGetTickCount();
    while(1) {
        // 计算当前t值(基于全局步态时钟)
        float t = fmodf(gait_time_ms / GAIT_PERIOD_MS, 1.0f);
        // 根据t值查表或计算P₁位置
        // 调用前述逆运动学,得到18个目标角度
        // 通过LEDC更新PWM占空比
        vTaskDelayUntil(&xLastWakeTime, xFrequency);
    }
}

该任务优先级设为 configLIBRARY_MAX_PRIORITIES - 2 ,确保其能抢占Wi-Fi数据处理等低优先级任务,但低于系统空闲任务,防止饥饿。

3.3 步态相位同步与容错机制

六足机器人采用“交替三脚架步态”(Alternating Tripod Gait),即时刻有三条腿(左前、右中、左后)构成稳定三角支撑,另三条腿同步摆动。18个舵机的相位必须严格同步,相位误差>5°即导致失稳。

同步机制基于FreeRTOS的 xTimer
- 创建一个周期为 GAIT_PERIOD_MS 的自动重装载定时器 gait_timer
- 定时器回调函数仅做一件事:原子操作递增全局变量 gait_phase_counter ,并发送通知给所有舵机控制任务。
- 各舵机任务收到通知后,立即读取 gait_phase_counter ,结合自身腿序号(0–5)与关节序号(0–2)计算本地相位偏移,代入贝塞尔公式。

容错设计体现在两个层面:
- 硬件层 :每个舵机信号线串联100 Ω电阻,防止短路损坏LEDC输出级;电源输入端并联470 μF电解电容+100 nF陶瓷电容,抑制电机启停瞬态压降。
- 软件层 :在 swing_phase_task 中加入看门狗喂狗;若某腿连续3个周期未收到 gait_timer 通知,则触发 emergency_stop() ,将所有舵机PWM占空比强制设为中值(1500 μs),进入安全姿态。

4. 四足机器人原型设计与成本优化实践

在六足平台验证成熟后,我们启动了四足机器人(Quadruped)的低成本入门版本开发。其设计哲学是: 在保证核心运动能力的前提下,极致简化结构、降低BOM成本、提升装配容错率。 这并非对六足的降级,而是面向教育与创客场景的精准定位。

4.1 硬件选型的成本-性能平衡

四足机器人采用“狗式构型”,即两前腿、两后腿呈前后分布,结构比蜘蛛构型更简洁。核心部件选型如下:
- 主控 :ESP32-WROOM-32(集成Wi-Fi/BT,$2.5),替代六足的ESP32-WROVER(带PSRAM,$4.2),节省$1.7/台。
- 舵机 :MG996R(金属齿,10 kg·cm扭矩,$4.8),替代PDI-118MG($12.5),单台节省$30.8(8个舵机)。
- 结构件 :全部采用1.5 mm厚铝合金激光切割件(非3D打印),单件成本$0.35,精度±0.1 mm,刚性远超PLA,且免去3D打印翘曲、层间剥离风险。
- 电池 :7.4 V 18650双串电池组($8.5),替代六足的定制2S 2000 mAh聚合物电池($15.2),节省$6.7。

BOM总成本从六足的$126降至$68,降幅46%。关键妥协在于:MG996R的堵转电流达2.5 A,峰值功率需求更高,因此电源设计必须强化——我们选用MP2315 DC-DC降压芯片(效率>92%),输入7.4 V,输出6.0 V/5 A,为8个舵机提供纯净电源,并在PCB上预留4个钽电容焊盘,应对瞬态电流。

4.2 安装结构的防呆设计

四足机器人的腿部安装采用“一键式卡扣”结构:
- 髋关节舵机底座集成T型滑槽,机体侧板对应位置设有弹性卡舌。
- 安装时,将舵机沿滑槽推入,卡舌自动弹入底座凹槽,发出“咔嗒”声即表示到位。
- 无需螺丝刀,3秒内完成单腿安装,且拔出力度需>50 N,确保运动中绝不松脱。

该设计彻底规避了六足机器人中常见的问题:3D打印件螺孔攻丝不准、M2螺丝滑牙、装配扭矩不一致导致舵机偏斜。实测100次反复安装/拆卸,卡扣无塑性变形。

4.3 步态功能的渐进式实现路径

四足机器人首发固件聚焦三大基础步态:
- 站立(Stand) :所有关节运行至预设中立角,机身水平。此为所有步态的起点与终点。
- 原地踏步(Trot in Place) :对角腿(左前+右后,右前+左后)同步摆动,周期2 s。这是最易实现且稳定的动态步态,用于验证逆运动学与实时性。
- 前进行走(Walk Forward) :在踏步基础上,叠加机身前后平移指令,通过调整摆动相高度与前伸距离实现。

后续通过OTA升级逐步开放:
- 转身(Turn in Place) :利用对角腿摆动相的相位差,产生偏航力矩。
- 斜向行走(Crab Walk) :调整髋关节方位角,实现横向移动。
- 爬坡(Slope Climbing) :融合IMU俯仰角数据,动态增大摆动相抬腿高度。

所有步态均基于同一套逆运动学引擎与贝塞尔插值框架,仅修改目标轨迹的几何参数,确保代码复用率>90%。

5. 开源生态与复刻指南

本项目所有设计文件均以开源形式发布,遵循MIT License,旨在降低机器人学习门槛,推动社区协作创新。复刻过程不是简单的零件采购与焊接,而是一次完整的工程实践训练。

5.1 设计文件体系

  • 硬件层
  • hardware/pcb/ :KiCad工程文件,含主控板、舵机驱动板原理图与PCB布局(2层板,兼容嘉立创打样)。
  • hardware/mechanical/ :Fusion 360源文件( .f3d )与导出的STEP格式,含所有铝合金结构件、3D打印件(如舵机支架、脚掌)。
  • 固件层
  • firmware/esp32/ :完整ESP-IDF工程,含 CMakeLists.txt sdkconfig.defaults src/ (步态引擎、LEDC驱动、Wi-Fi/SSH服务)。
  • firmware/python/ :MicroPython固件分支,提供 robot_leg.py 等高级API,适合初学者快速实验。
  • 文档层
  • docs/assembly_guide.md :图文并茂的装配手册,标注每颗螺丝的规格(M2×5)、扭矩(0.3 N·m)、安装顺序。
  • docs/calibration_guide.md :详细校准流程,包括舵机零点校准、IMU静止偏置采集、电池电压ADC校准系数。

5.2 复刻常见问题与实战经验

在数百名开发者复刻过程中,我们总结出高频问题及解决方案:

Q1:舵机抖动或无力?
A:首要检查电源。MG996R空载电流即达200 mA,8个舵机同时启动瞬态电流超3 A。若使用USB供电(500 mA限流)或劣质DC-DC,必然抖动。务必使用≥3 A输出的6 V电源,并在舵机电源输入端就近并联1000 μF电解电容。

Q2:Wi-Fi连接不稳定,SSH频繁断开?
A:ESP32的Wi-Fi与蓝牙共存需精细调优。在 sdkconfig 中启用 CONFIG_ESP_WIFI_STATIC_RX_BUFFER_NUM=10 (增加接收缓冲区),并设置 CONFIG_ESP_WIFI_DYNAMIC_TX_BUFFER=1 (动态分配发送缓冲)。同时,将Wi-Fi信道固定为 CONFIG_ESP_WIFI_CHANNEL=1 ,避开蓝牙干扰。

Q3:步态不对称,机器人向一侧偏转?
A:90%概率为舵机零点偏移未校准。执行 docs/calibration_guide.md 中的“零点校准”章节:将机器人置于水平台,运行 calibrate_zero_position.py 脚本,该脚本会依次将每条腿的三个关节缓慢移至理论0°,并记录实际ADC读数,生成 zero_offsets.h 头文件,编译进固件。

Q4:IMU数据漂移严重?
A:MPU6050需在静止状态下采集至少10秒的陀螺仪零偏。我们的固件在 app_main() 中内置了自动校准流程:开机后等待5秒,期间禁止任何舵机动作,采集陀螺仪X/Y/Z轴均值,存入RTC内存。若校准失败(如环境振动),则使用出厂默认偏移值,并在串口打印警告。

我本人在开发初期曾因忽略 ledc_timer_config_t.freq_hz 的精度问题,导致PWM频率实测为49.2 Hz,引起舵机高频啸叫。最终发现是 clk_cfg = LEDC_AUTO_CLK 在特定晶振容差下选择了次优分频比,改用 clk_cfg = LEDC_USE_RC_FAST_CLK 并手动计算分频系数后解决。这类细节,往往只在深夜调试时才浮现,却正是嵌入式工程师价值的真实体现。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐