桌面助手 —— 六轴机械臂智能台灯/夜灯开发文档
0. 最终效果预览
白天 · 台灯模式(照度闭环 + 坐姿/专注监测)
效果图:黑色六轴机械臂台灯照射作业本,臂身中段集成 60GHz 呼吸雷达模块(AI 渲染,非实物)
夜间 · 夜灯模式(零摄像头睡眠监测 + 雷达朝向闭环)
效果图:夜灯模式下机械臂收回至床头守望位,灯头以最低亮度暖光渐亮,臂身 60GHz 雷达指向孩子胸口监测呼吸,底座蓝色指示灯表示雷达锁定(AI 渲染,非实物)
深夜 · 关灯特写(60GHz 呼吸雷达 + 机械臂自由调角,全功能覆盖)
效果图:深夜灯光全关,特写机械臂腕关节将 60GHz 毫米波雷达模块调整到正对孩子身体的角度,青蓝色指示灯与雷达波纹示意呼吸监测中;全程无摄像头、无灯光干扰睡眠(AI 渲染,非实物)
0.1 家长端数据看板(可交互原型)
👉 同目录文件:桌面助手_成长看板.html(双击用浏览器打开,无需联网)
包含 14 天模拟数据,可点击日期切换,展示:写作业时长与坐姿达标率趋势、睡眠结构(深睡/浅睡/夜醒)、坐姿提醒构成、每小时学习强度、睡眠时间轴、学习时段照度曲线与机械臂调整时刻。
1. 项目简介与场景定位
1.1 一句话定位
把 6 轴机械臂变成"会自己找角度的灯臂":灯头装在机械臂末端,雷达和视觉装在底座/臂身,RDK X5 做具身智能主控,让台灯自己调整照射角度、亮度、色温,让夜灯自己把雷达"送"到能覆盖用户的位置。
1.2 市场痛点(与"皮皮灯"类产品的差异化)
市面同类智能灯是"固定灯臂 + 传感器",存在三个用户焦虑场景没有解决:
焦虑场景 | 固定灯产品的问题 | 本项目的解法 |
孩子写作业,光照不到"正在写的那一行" | 灯臂固定,孩子挪一下身体桌面就出现阴影/照度不足 | 机械臂实时调整照射角度 + 光强,闭环对准书面 |
家长不在家,孩子坐姿/专注度没人管 | 摄像头方案引发隐私焦虑 | 坐姿用桌面端本地视觉推理(数据不出板),状态/专注用雷达(无摄像头) |
睡眠监测 | 多数用摄像头或穿戴设备,隐私与舒适度差 | 60GHz 呼吸雷达零摄像头监测呼吸/体动,机械臂自动调雷达朝向实现全床位覆盖 |
1.3 功能清单
台灯模式(学习场景)
照度闭环:环境光传感器实时检测书面照度(目标 300~500 lx,国标 GB/T 9473 读写要求 AA 级),机械臂调角度 + PWM 调光,把光"打"到正确位置。
入座检测:20GHz 毫米波雷达(存在感知)检测人员入座,自动开灯并预热到默认学习光照;离座超时自动关灯。
专注/状态监测:60GHz 呼吸雷达检测呼吸率与体动幅度,判断"伏案写作业 / 频繁走神 / 趴桌休息"等状态,超时提醒。
坐姿检测与提醒:视觉模型(本地推理)检测头-肩-眼距离、低头角度、驼背、趴桌,语音+灯效提醒;夜间/不装摄像头模式自动降级为纯雷达模式。
夜灯模式(睡眠场景)
零摄像头睡眠监测:60GHz 雷达检测呼吸率、体动、离床,输出入睡/浅睡/深睡/清醒状态估计。
全床位覆盖:不论用户怎么睡、床型怎么摆,机械臂调整雷达模块的俯仰/朝向,保证呼吸波形信号质量(雷达 SNR 闭环:信号差 → 机械臂微调角度直到波形质量达标)。
晨起唤醒:设定唤醒时间前 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 个总线舵机 + 夹爪(夹爪改造为"灯头角度微调"可选)。
参考 JetArm 官方 STM32 串口协议(或幻尔 SDK):帧头 + ID + 指令 + 数据 + 校验,实现
set_joint(id, angle, time_ms)、read_joint(id)。
建立关节限位表(灯头版:底座 ±150°、大臂/小臂行程按结构实测收窄,防止灯头扫桌面)。
用 Hiwonder 提供的 DH 参数/模型做逆运动学(IK):输入"桌面上目标照射点 (x,y,z) + 灯头俯仰角",输出 6 关节角。X5 上可直接用
ikpy/roboticstoolbox-python或移植 JetArm ROS 包的 IK。
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 且动作安静(限速)。
