【走过路过不要错过】一个产品经理在崴脚期间完成的AR应用开发,主角竟然是走步机?

张开发
2026/5/31 8:02:41 15 分钟阅读
【走过路过不要错过】一个产品经理在崴脚期间完成的AR应用开发,主角竟然是走步机?
标题有点长但我是真想把这过去几个月跟大伙儿聊聊。先自我介绍下我是Spatial Joy 2025 Rokid全球ARAI开发大赛AI赛道的一名参赛者。没错就是做那个很有名的C2 走步机的产品经理。初衷让走步机不再成为“低头族”咱们公司的 C2 走步机颜值那是相当能打颜色靓丽放在家里绝对是个点缀。但它天生为了轻薄没有扶手这就带来了一个小问题人走着想看个数据速度、时长、消耗就就得低头。要么低头看机器上那个可怜巴巴的屏幕要么就得时不时瞅一眼手机。这运动体验来说有点割裂。所以我们一直想找个全新的终端方案来解决这个“低头看数据”的痛点。正好Rokid Glasses 出现了那不就是天然的、悬浮在眼前的“仪表盘”吗意外转折当“产品经理”直接搞开发项目刚开始我们还是挺传统的产品提需求设计画图研发吭哧吭哧写代码测试再咔咔找bug。计划是10月中旬开动按部就班来。但计划赶不上变化。11月初我们那位核心研发同学手里任务突然爆炸多眼看项目就要卡壳。这时候我们团队的一个小伙伴kiro对就是那个AI助手进入了我们的视野。我们一合计要不……试试让它来写代码结果这一试直接把我们的开发模式给“重构”了。后面就变成了产品经理直接对着 kiro 描述需求描述完了代码就有了原来的研发老哥呢彻底“升职”成了技术顾问每天悠哉游哉除非跑不起来否则他都不带出现的。就这么着从11月初开始折腾到11月底你猜怎么着第一个完整能跑的版本居然做出来了那一刻我们都觉得这路子“野”但是真香啊乐极生悲不是带伤作战人太顺了老天爷可能就想给你加点戏。第一版做出来那天我太开心了下班路上蹦跶了两下结果……咔嚓双踝、双膝全崴了直接喜提一个月的“居家养伤豪华套餐”。那咋办项目还得继续啊于是我的工位就搬到了家里的床上。脚肿得跟个馒头似的翘得老高手里还在用电脑改着 bug。那时候我成了 “身残志坚の程序员”。我这边在家改细节我的同事美洁也没闲着。她在公司里拿着我们半成品各种场景测试各种角度找茬每天给我提bug。我俩就这么一个躺着一个站着远程协作硬是在12月中旬卡着截止日期把项目给交上去了瘸着腿领奖这体验没谁了故事的最后到了一月份我们参加了路演、评奖、领奖。我虽然能下地走了但走路还是一瘸一拐的。想象一下那个画面一个走路不利索的人一颠一颠地去领了个AR开发大赛的奖还是个运动场景的产品……这画面真的又心酸又好笑。回头看看整个过程真的觉得这次活动太好玩了。我们不但解决了运动场景“不用低头”的痛点——用 Rokid Glasses 把 C2 走步机的所有运动数据都投射到了眼前实现了真正的“边走边看目不斜视”。更重要的是我们误打误撞在 kiro 的帮助下实践了一种全新的开发模式产品直接驱动开发研发只做最后的技术兜底。这种开发节奏说实话又快又刺激虽然中间出了我这么个“工伤”小插曲但一点都不影响我们把这东西做出来的成就感。现在想想做产品就像这次经历你永远不知道下一个绊倒你的是业务逻辑还是……自己走过的马路牙子。但只要最后能站起来瘸着走到终点那就是胜利。欢迎对AR运动、或者对我们这种“AI辅助开发”模式感兴趣的朋友们在楼下留言交流整体的开发过程如下一、项目架构设计1.1 技术栈选型编程语言Kotlin 1.9.20目标平台Android 8.0 - 14 (API 26-34)构建工具Gradle 8.1.4UI架构MVVM简化版 ViewBinding1.2 模块化架构设计项目结构android_RG_JJ4/ ├── app/src/main/ │ ├── bluetooth/ # 蓝牙通信模块 │ │ ├── BluetoothManager.kt # BLE管理器 │ │ ├── ProtocolFactory.kt # 协议工厂 │ │ ├── TreadmillProtocolC2.kt # C2协议实现 │ │ └── TreadmillProtocolV3.kt # V3协议实现 │ ├── rokid/ # Rokid SDK集成 │ │ └── RokidCXRManager.kt │ ├── ui/ # 界面层 │ │ ├── MainActivity.kt # 设备扫描 │ │ ├── RunningActivity.kt # 运动控制 │ │ ├── display/ # 显示模式管理 │ │ └── text/ # 国际化文本管理 │ └── debug/ # 调试配置二、核心技术实现详解2.1 智能蓝牙通信协议栈多协议兼容架构ProtocolFactory.ktKotlin// 协议工厂模式实现多协议自动切换 object ProtocolFactory { fun isDeviceSupported(deviceName: String): Boolean { return deviceName.contains(ks-c2, ignoreCase true) || deviceName.contains(ks-bdc2, ignoreCase true) || deviceName.contains(ks-blc2, ignoreCase true) } fun selectProtocolForDevice(deviceName: String): TreadmillProtocolBase { return when { deviceName.contains(c2, ignoreCase true) - TreadmillProtocolC2 else - TreadmillProtocolV3 } } }C2协议通信帧格式TreadmillProtocolC2.ktKotlin// C2协议数据包结构基于14字节标准帧 object TreadmillProtocolC2 : TreadmillProtocolBase { // 帧格式Header(2) CmdType(2) Params(8) Checksum(2) 14字节 override val serviceUuid 0000fe00-0000-1000-8000-00805f9b34fb override val writeUuid 0000fe02-0000-1000-8000-00805f9b34fb override val readUuid 0000fe01-0000-1000-8000-00805f9b34fb // 命令类型定义 const val CMD_START: UShort 0x0001u const val CMD_PAUSE: UShort 0x0002u const val CMD_STOP: UShort 0x0003u const val CMD_SET_SPEED: UShort 0x0101u const val CMD_GET_STATUS: UShort 0x0201u override fun buildCommandPacket(cmdType: UShort, data: ByteArray): ByteArray { val totalSize 14 data.size val buffer ByteBuffer.allocate(totalSize).order(ByteOrder.LITTLE_ENDIAN) buffer.putShort(HEADER_CMD_PACKET.toShort()) buffer.putShort(cmdType.toShort()) // 参数处理逻辑... return buffer.array() } }2.2 自适应显示模式系统显示模式状态机设计DisplayModeManager.ktKotlinclass DisplayModeManager(private val activity: RunningActivity) { private var currentMode: DisplayMode DisplayMode.NORMAL private val runtimeTracker RuntimeTracker() // 模式切换阈值运行累计时间超过30秒自动切换到紧凑模式 companion object { private const val COMPACT_MODE_THRESHOLD_MS 30000L private const val TRANSITION_DURATION_MS 80L } /** * 根据跑步机状态自动切换显示模式 */ fun onTreadmillStateChanged(isRunning: Boolean) { if (isRunning) { runtimeTracker.startTracking() if (runtimeTracker.hasReachedThreshold() currentMode DisplayMode.NORMAL) { switchToCompactMode() } } else { runtimeTracker.pauseTracking() if (currentMode DisplayMode.COMPACT) { switchToNormalMode() } } } }三、创新技术亮点3.1 智能协议回退机制BluetoothManager.ktKotlin// BluetoothManager.kt 中的智能连接策略 private val gattCallback object : BluetoothGattCallback() { override fun onConnectionStateChange(gatt: BluetoothGatt, status: Int, newState: Int) { when (newState) { BluetoothProfile.STATE_DISCONNECTED - { // v2.1.2: 增强的协议回退机制特别针对C2设备 if (protocolFallbackEnabled connectionAttempts maxConnectionAttempts) { connectionAttempts // 智能协议切换策略 val fallbackProtocol selectFallbackProtocol() if (fallbackProtocol ! currentProtocol) { currentProtocol fallbackProtocol Timber.d(切换到协议: ${currentProtocol.protocolVersion}) // 延迟重试连接 mainHandler.postDelayed({ currentDevice?.let { device - retryConnection(device) } }, 1500) } } } } } }四、开发工作流与质量保证4.1 持续集成与自动化构建build_glasses.shBash#!/bin/bash echo Building Glasses APK ./gradlew clean ./gradlew assembleRelease -Ptargetglasses # 版本号自动提取 VERSION$(grep -o const val VERSION [^]* app/src/main/java/com/kingsmith/wpc2/ui/text/UITextManager.kt | cut -d -f2) echo Building version: $VERSION五、项目成果与技术挑战5.1 关键技术指标95%连接成功率500ms平均响应延迟150MB峰值内存占用3支持语言数5.2 主要技术挑战与解决方案挑战解决方案效果设备连接不稳定多协议自动回退 连接超时优化连接成功率提升35%显示模式切换卡顿80ms平滑过渡动画 状态机管理切换流畅度提升60%多语言实时切换动态文本加载 布局适配系统切换时间100ms眼镜端远程控制Rokid CXR-S SDK深度集成实现双端实时同步六、总结与展望6.1 技术总结本项目成功实现了基于Rokid AR眼镜的智能跑步机控制应用核心技术亮点包括多协议蓝牙通信栈支持C2/V3双协议自动切换自适应显示系统基于运动时间的智能模式切换Rokid SDK深度集成实现眼镜-手机双端实时同步国际化动态文本支持多语言实时切换手势控制优化充分利用AR眼镜触摸板特性6.2 未来技术规划AI运动分析集成机器学习算法提供运动建议多人运动模式支持多用户协同训练云端数据同步运动数据上传与分析VR沉浸体验结合VR技术提供虚拟运动场景最后加个广子希望大家有机会体验我们产品产品的超酷体验。本文应用基于Rokid灵珠智能体/CXR SDK开发开发指南https://forum.rokid.com/index

更多文章