RDK X5 机械臂照护台灯:作业陪伴与睡眠守护

本项目用地平线 RDK X5(10 TOPS)替代 Jetson 作为六轴机械臂主控,打造一款具身智能桌面助手。台灯模式:照度传感器闭环调节灯头角度与亮度,实时检测孩子坐姿并提醒,雷达检测入座自动开关灯;夜灯模式:零摄像头、纯 60GHz 呼吸雷达监测睡眠状态,机械臂自动调整雷达朝向实现全睡姿覆盖,并模拟日出渐亮唤醒。配套家长端看板,可查看每日作业时长、坐姿达标率与睡眠结构。

RDK X5 机械臂照护台灯:作业陪伴与睡眠守护封面
waterkr3022026-11-10 16:15:10GPL-3.0
11
Star

PCBA

设计文件

KiCad图标PCB_Project.zip11.40MB(5次下载)

EDA查看器

复制嵌入代码

详细介绍

桌面助手 —— 六轴机械臂智能台灯/夜灯开发文档

0. 最终效果预览

白天 · 台灯模式(照度闭环 + 坐姿/专注监测)

效果图:黑色六轴机械臂台灯照射作业本,臂身中段集成 60GHz 呼吸雷达模块(AI 渲染,非实物)

夜间 · 夜灯模式(零摄像头睡眠监测 + 雷达朝向闭环)

效果图:夜灯模式下机械臂收回至床头守望位,灯头以最低亮度暖光渐亮,臂身 60GHz 雷达指向孩子胸口监测呼吸,底座蓝色指示灯表示雷达锁定(AI 渲染,非实物)

深夜 · 关灯特写(60GHz 呼吸雷达 + 机械臂自由调角,全功能覆盖)

效果图:深夜灯光全关,特写机械臂腕关节将 60GHz 毫米波雷达模块调整到正对孩子身体的角度,青蓝色指示灯与雷达波纹示意呼吸监测中;全程无摄像头、无灯光干扰睡眠(AI 渲染,非实物)

0.1 家长端数据看板(可交互原型)

👉 同目录文件:桌面助手_成长看板.html(双击用浏览器打开,无需联网)

包含 14 天模拟数据,可点击日期切换,展示:写作业时长与坐姿达标率趋势、睡眠结构(深睡/浅睡/夜醒)、坐姿提醒构成、每小时学习强度、睡眠时间轴、学习时段照度曲线与机械臂调整时刻。


1. 项目简介与场景定位

1.1 一句话定位

把 6 轴机械臂变成"会自己找角度的灯臂":灯头装在机械臂末端,雷达和视觉装在底座/臂身,RDK X5 做具身智能主控,让台灯自己调整照射角度、亮度、色温,让夜灯自己把雷达"送"到能覆盖用户的位置。

1.2 市场痛点(与"皮皮灯"类产品的差异化)

市面同类智能灯是"固定灯臂 + 传感器",存在三个用户焦虑场景没有解决:

焦虑场景

固定灯产品的问题

本项目的解法

孩子写作业,光照不到"正在写的那一行"

灯臂固定,孩子挪一下身体桌面就出现阴影/照度不足

机械臂实时调整照射角度 + 光强,闭环对准书面

家长不在家,孩子坐姿/专注度没人管

摄像头方案引发隐私焦虑

坐姿用桌面端本地视觉推理(数据不出板),状态/专注用雷达(无摄像头)

睡眠监测

多数用摄像头或穿戴设备,隐私与舒适度差

60GHz 呼吸雷达零摄像头监测呼吸/体动,机械臂自动调雷达朝向实现全床位覆盖

1.3 功能清单

台灯模式(学习场景)

  1. 照度闭环:环境光传感器实时检测书面照度(目标 300~500 lx,国标 GB/T 9473 读写要求 AA 级),机械臂调角度 + PWM 调光,把光"打"到正确位置。

  1. 入座检测:20GHz 毫米波雷达(存在感知)检测人员入座,自动开灯并预热到默认学习光照;离座超时自动关灯。

  1. 专注/状态监测:60GHz 呼吸雷达检测呼吸率与体动幅度,判断"伏案写作业 / 频繁走神 / 趴桌休息"等状态,超时提醒。

  1. 坐姿检测与提醒:视觉模型(本地推理)检测头-肩-眼距离、低头角度、驼背、趴桌,语音+灯效提醒;夜间/不装摄像头模式自动降级为纯雷达模式。

夜灯模式(睡眠场景)

  1. 零摄像头睡眠监测:60GHz 雷达检测呼吸率、体动、离床,输出入睡/浅睡/深睡/清醒状态估计。

  1. 全床位覆盖:不论用户怎么睡、床型怎么摆,机械臂调整雷达模块的俯仰/朝向,保证呼吸波形信号质量(雷达 SNR 闭环:信号差 → 机械臂微调角度直到波形质量达标)。

  1. 晨起唤醒:设定唤醒时间前 15~30 分钟,机械臂把灯头转向用户并渐亮(色温 2200K→4000K 模拟日出),配合呼吸雷达确认用户清醒后停止。


2. 系统总体架构

2.1 硬件组成(BOM)

#

部件

选型

说明

1

AI 主控

RDK X5(Sunrise® 5,BPU ~10 TOPS)

Ubuntu 22.04 + TROS;USB Type C 5V/5A 独立供电;默认网口 IP 192.168.127.10

2

六轴机械臂

Hiwonder JetArm 本体(入门版成品)

全金属,HTS-21H/HTD-35H/HX-12H 智能总线舵机 ×6,STM32F407 控制板(FreeRTOS),USB 串口控制,12V 5A DC5.5×2.5 独立供电

3

灯头模组

LED 灯板 + 双色温 LED(2700K~6500K)+ 恒流驱动

PWM 两路调亮度和色温;RDK X5 40PIN PWM 输出(3.3V 电平,经 MOS 驱动板放大)

4

存在雷达

20GHz 毫米波模块(如 LD012 / 类似静态存在+微动模块)

UART 输出,检测入座/离座

5

呼吸雷达

60GHz 毫米波模块(如海凌科 LD2410B / 24GHz-60GHz 呼吸心率模组)

UART 输出呼吸波形/能量值,睡眠监测

6

照度传感器

BH1750 / TSL2591(I2C)

贴于书面方向/灯头,测书面照度 lx

7

相机(可选)

USB 相机或 MIPI IMX219

仅坐姿检测用,本地推理、不上传;夜灯模式断电不用

8

语音提醒

板载耳机口接小喇叭 / USB 音箱

提醒播报

9

结构件

灯头快装支架(末端法兰)、雷达万向座(底座或臂身)

3D 打印

电源纪律:机械臂 12V/5A、RDK X5 5V/5A、灯头驱动独立供电,共地;雷达与灯头 PWM 线远离机械臂舵机动力线,避免电磁干扰。

2.2 软件架构

RDK X5(Ubuntu 22.04 + TROS / ROS2 Humble)
├── driver_layer          驱动层
│   ├── arm_serial_node      JetArm STM32 串口驱动(/dev/ttyUSB0,舵机角度读写)
│   ├── radar20_node         20GHz 存在雷达解析(入座/离座事件)
│   ├── radar60_node         60GHz 呼吸雷达解析(呼吸波形、能量、距离)
│   ├── lux_node             BH1750 照度采集(I2C)
│   └── light_pwm_node       灯光 PWM 控制(亮度/色温)
├── perception_layer      感知层
│   ├── posture_node         坐姿检测(BPU 跑 YOLOv8n-pose 类模型,本地推理)
│   ├── sleep_state_node     睡眠状态机(呼吸率+体动 → 清醒/浅睡/深睡/离床)
│   └── signal_quality_node  雷达波形质量评分(驱动"雷达朝向闭环")
├── decision_layer        决策层(具身智能核心)
│   ├── lamp_control_node    台灯闭环:照度 PID + 机械臂 IK 对准书面
│   ├── radar_aim_node       夜灯雷达朝向闭环:SNR 反馈 → 臂微调
│   ├── wake_node            晨起唤醒流程(渐亮曲线 + 清醒确认)
│   └── coach_node           坐姿/专注提醒策略(防打扰节流、语音播报)
└── app_layer             交互层
    ├── web_ui               局域网 Web 面板(家长配置目标照度/提醒阈值/看报告)
    └── data_report          本地 SQLite 记录学习时长/睡眠报告

ROS2 话题示例:

  • /radar60/breath_wave(呼吸波形)→ /sleep/state

  • /radar20/presence(bool)→ /lamp/power

  • /lux/book_lx + /light/current → /lamp/control(角度+亮度+色温)

  • /camera/posture(坐姿标签+置信度)→ /coach/reminder

  • /arm/joint_states、/arm/cmd_pose(IK 目标)

2.3 全局业务流程图

模式自动切换主流程:

台灯照度闭环(具身智能核心一):

夜灯雷达朝向闭环(具身智能核心二):

晨起唤醒时序:

睡眠状态机:


3. 开发过程(分八个阶段)

阶段 0:备料与结构改造(第 1 周)

  • 采购清单见 2.1;JetArm 确认为"机械臂本体"版(无 Jetson),STM32 控制板 USB 口引出

  • 灯头末端快装支架设计打印:与 JetArm 末端法兰孔位对齐,灯板可换向

  • 60GHz 雷达装于臂身中段万向座(夜灯模式用臂调朝向);20GHz 雷达装底座正面(存在检测不需要调向)

  • 布线:所有信号线沿臂内侧走线并留活动余量,扎带固定;确认舵机全行程时线不被拉扯

  • 验收:机械臂全行程运动 100 次,无掉线、无刮擦

阶段 1:RDK X5 基础环境(第 1 周)

# 1. 官网下载 RDK X5 Ubuntu 22.04 镜像,烧录 TF 卡(≥32GB),插卡上电
#    必须用 5V/5A Type C 电源(电脑 USB 供电会反复重启)
# 2. 调试串口登录(Micro USB,115200-8-N-1,PC 装 CH340 驱动),配 Wi-Fi
ssh sunrise@192.168.127.10
# 3. 安装 TROS / ROS2 Humble、Python 依赖
sudo apt update && sudo apt install python3-pip
# 4. 验证 BPU
hrut_somstatus        # 应能看到 BPU 状态
# 5. 确认 JetArm 控制板串口节点
ls /dev/ttyUSB* /dev/ttyACM* ; dmesg | grep tty

验收:SSH 稳定、BPU 可用、/dev/ttyUSB0 出现。

阶段 2:机械臂控制打通(第 2 周)

目标:Python 直接驱动 6 个总线舵机 + 夹爪(夹爪改造为"灯头角度微调"可选)。

  1. 参考 JetArm 官方 STM32 串口协议(或幻尔 SDK):帧头 + ID + 指令 + 数据 + 校验,实现 set_joint(id, angle, time_ms)、read_joint(id)。

  1. 建立关节限位表(灯头版:底座 ±150°、大臂/小臂行程按结构实测收窄,防止灯头扫桌面)。

  1. 用 Hiwonder 提供的 DH 参数/模型做逆运动学(IK):输入"桌面上目标照射点 (x,y,z) + 灯头俯仰角",输出 6 关节角。X5 上可直接用 ikpy/roboticstoolbox-python 或移植 JetArm ROS 包的 IK。

  1. ROS2 节点 arm_serial_node:发布 /arm/joint_states,订阅 /arm/cmd_pose。

# 串口控制骨架(协议字段按幻尔官方文档替换)
import serial, struct

class ArmClient:
    def __init__(self, port='/dev/ttyUSB0', baud=115200):
        self.ser = serial.Serial(port, baud, timeout=0.1)

    def _frame(self, cmd, payload):
        body = bytes([cmd]) + payload
        return bytes([0x55, 0x55]) + bytes([len(body)+1]) + body  # 示例帧格式

    def set_joint(self, sid, angle, t_ms=500):
        # angle: -150~150 → 0~1000 装载值(按幻尔协议)
        val = int((angle + 150) / 300 * 1000)
        self.ser.write(self._frame(0x03, bytes([sid]) + struct.pack('<HH', val, t_ms)))

    def pose_all(self, angles, t_ms=800):
        for sid, a in enumerate(angles, start=1):
            self.set_joint(sid, a, t_ms)

验收:IK 给定桌面坐标点,末端灯头指向误差 < 3cm;重复定位误差 < 0.5°;全程平滑无抖动(总线舵机自带加减速)。

阶段 3:灯光模组驱动(第 2 周)

  • 40PIN PWM(硬件 PWM 引脚)→ MOS 驱动板 → 冷/暖两组 LED;实现色温合成(冷暖占空比映射 2700K~6500K)

  • BH1750 挂 40PIN I2C(i2cdetect -y 1 确认地址 0x23),采样率 5Hz,滤波(滑动中值)

  • ROS2 节点 light_pwm_node + lux_node

验收:亮度 0~100% 线性可调无频闪感;色温切换平滑;照度读数与商用照度计误差 < ±10%。

阶段 4:雷达集成(第 3 周)

20GHz 存在雷达(UART 9600/115200)

  • 解析存在/微动输出 → /radar20/presence

  • 策略:入座 > 5s 判"在座";静止 > 10min 判"离座待机"(防误关:呼吸雷达仍在探测到人则不关灯)

60GHz 呼吸雷达(UART)

  • 解析呼吸波形/能量值/目标距离 → /radar60/breath_wave

  • 波形质量指标:呼吸峰谷幅度、信号 SNR、丢波率 → /radar60/quality(后续雷达朝向闭环的反馈量)

# 睡眠状态机骨架(sleep_state_node)
# 输入: 呼吸率 bpm、体动指数、目标距离;输出: AWAKE/LIGHT/DEEP/OUT_OF_BED
def classify(bpm, motion, dist, hist):
    if dist > BED_DIST_MAX:      return "OUT_OF_BED"
    if motion > MOTION_HIGH:     return "AWAKE"
    if bpm and 12 <= bpm <= 20:  return "LIGHT"   # 浅睡典型呼吸带
    if bpm and bpm < 12:         return "DEEP"
    return hist[-1] if hist else "AWAKE"

验收:真人躺卧测试 30 分钟,呼吸率与人工计数误差 ≤ 2 bpm;离床/翻身事件漏报 < 5%。

阶段 5:坐姿视觉检测(第 4 周,可选摄像头)

  • 数据:自采桌面学习姿态图(端正/低头过深/趴桌/侧身歪头/离席),标注关键点;或先跑预训练 yolov8n-pose 再微调

  • 用地平线 PTQ 工具链将 ONNX 量化编译为 BPU 模型(.bin),板端推理 FPS 目标 ≥ 15

  • 规则层(coach_node):

    • 低头角度(眼-肩连线与水平夹角)> 35° 持续 20s → 提醒"抬头"

    • 眼-书面距离 < 30cm 持续 10s → 提醒

    • 驼背/趴桌置信度 > 0.7 持续 15s → 提醒

    • 防打扰节流:同类提醒 ≥ 3 分钟内不重复;语音+灯效(黄闪两下)

  • 隐私设计:图像只在板上推理,不存盘不上传;家长端只看事件统计("今天提醒抬头 12 次"),不看画面

验收:五类姿态 F1 ≥ 0.85;误报率 < 1 次/半小时;推理延迟 < 80ms。

阶段 6:台灯照度闭环(第 4~5 周)——具身智能核心之一

闭环逻辑:

每 200ms:
  lx = lux_node.read()                     # 书面照度
  err = target_lx - lx
  brightness += PID(err)                   # 先调亮度(快变量)
  if brightness 到达上限且 err > 50lx:
      ik_target = 当前照射点 + 光斑偏移修正  # 再调角度(慢变量)
      arm.cmd_pose(ik_target)              # 机械臂把光斑挪回书面中心
  if 检测到阴影(照度突降>30%且亮度已满):
      机械臂绕开遮挡方向重新找角度(小步螺旋搜索)
  • 目标照度可配:作业 450lx / 阅读 350lx / 休息 200lx

  • 角度调整限速(末端线速度 < 5cm/s),避免灯光晃动引起孩子分心

验收:孩子任意挪动坐姿/书本,书面照度回归目标 ±10% 的时间 < 3s;机械臂动作幅度小且安静。

阶段 7:夜灯模式与晨起唤醒(第 5~6 周)

雷达朝向全功能覆盖闭环(差异化功能)

夜灯模式启动:
  1. 臂回收至"雷达守望位",60GHz 雷达指向床面
  2. 采集 10s 呼吸波形 → quality < 阈值?
  3. 质量差 → 机械臂按预置搜索序列(俯仰±10°、方位±15°小步进)
     每步评估波形质量,取最优位姿锁定
  4. 运行中持续监测:连续 60s 质量下降(用户翻身换位)→ 触发重新搜索

晨起唤醒流程

T-30min: 灯头转向床头,色温 2200K 亮度 5%,每 5min +10% 亮度、+300K
T-0:     达到 60% 亮度 / 4000K;呼吸雷达判断用户清醒(体动+呼吸率上升)
         → 用户坐起(雷达判定) → 播报晨间信息,臂转回待机位
         → 未清醒 → 保持渐亮曲线,最长 +20min 后进入常规闹钟逻辑

验收:模拟 3 种睡姿(仰/侧/俯)+ 换位,雷达重新锁定成功率 ≥ 95%,单次搜索 ≤ 15s 且动作安静(限速)。