Rokid AI Glasses视障辅助系统:障碍物检测的移动端协同实现
本文介绍了一款基于Rokid AR眼镜的视障辅助系统。针对全球2.85亿视障人群的出行需求,系统通过Rokid CXR-M SDK实现眼镜与Android设备的协同,采用YOLOv5s模型进行实时障碍物检测。技术架构包含Kotlin语言开发、Jetpack Compose UI框架,支持设备连接管理、传感器调用和AI场景配置。系统能识别障碍物类型、位置和距离,并通过语音反馈为视障人士提供导航辅助,
项目背景与创意起源
在当今快节奏的都市生活中,视障人群在日常出行中面临诸多挑战,尤其是障碍物识别与导航问题。根据《2024年全球视障辅助技术白皮书》显示,全球有超过2.85亿视障人群,其中3900万人完全失明。传统辅助工具(如导盲犬、盲杖)存在功能单一、依赖性强等问题,亟需创新解决方案。
Rokid Glasses作为一款轻量化AR眼镜,凭借其“抬头即见”的交互方式和低干扰特性,为视障辅助系统提供了理想硬件基础。通过Rokid CXR-M SDK的AI场景、自定义页面和提词器功能,结合深度学习与传感器技术,可实现障碍物实时检测与导航辅助。项目基于Rokid SDK的移动端协同开发框架,集成Android与YodaOS-Sprite数据通道,实现设备端与云端的高效协同。通过Rokid SDK的设备连接管理、传感器调用与AI场景配置,可构建轻量化、高可靠性的视障辅助系统。
1 系统架构与技术栈
1.1 整体架构

1.2 技术选型
-
移动平台:Android 9.0+ (minSdk 28)
-
开发语言:Kotlin
-
UI框架:Jetpack Compose
-
SDK版本:CXR-M SDK 1.0.1-20250812.080117-2
-
AI模型:YOLOv5s TensorFlow Lite量化版
2 核心技术实现
2.1 CXR-M SDK
CXR-M SDK 是面向移动端的开发工具包,主要用于构建手机端与 Rokid Glasses 的控制和协同应用。开发者可以通过 CXR-M SDK与眼镜建立稳定连接,实现数据通信、实时语音获取以及场景自定义。目前 CXR-M SDK 仅提供 Android 版本的。
Gradle配置 (app/build.gradle.kts):
dependencies {
// Rokid SDK
implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")
// 计算机视觉库
implementation("org.tensorflow:tensorflow-lite:2.13.0")
implementation("org.tensorflow:tensorflow-lite-gpu:2.13.0")
// 网络请求
implementation("com.squareup.moshi:moshi-kotlin:1.14.0")
}
repositories {
maven { url = uri("https://maven.rokid.com/repository/maven-public/") }
}
2.2 权限配置 (AndroidManifest.xml)
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-feature android:name="android.hardware.camera" android:required="true" />
2.3 眼镜连接与控制
设备管理器实现:
class RokidDeviceManager {
private val cxrClient = CxrClient.Builder().build()
suspend fun connectDevice(): Result<String> = withContext(Dispatchers.IO) {
try {
cxrClient.connect(object : ConnectionCallback {
override fun onSuccess(deviceId: String) {
// 发送启动指令到眼镜
cxrClient.sendCommand(START_DETECTION)
}
override fun onError(error: String) = Log.e("Rokid", error)
})
Result.success("连接成功")
} catch (e: Exception) {
Result.failure(e)
}
}
}
2.4 障碍物检测核心逻辑
TFLite推理引擎:
class ObstacleDetector(context: Context) {
private val interpreter = Interpreter(loadModel(context))
private fun loadModel(context: Context): ByteBuffer {
val assetFileDescriptor = context.assets.openFd("yolov5s_int8.tflite")
val fileInputStream = FileInputStream(assetFileDescriptor.fileDescriptor)
val channel = fileInputStream.channel
val startOffset = assetFileDescriptor.startOffset
val declaredLength = assetFileDescriptor.declaredLength
return channel.map(FileChannel.MapMode.READ_ONLY, startOffset, declaredLength)
}
fun detect(frame: Bitmap): List<ObstacleResult> {
val inputArray = preprocessImage(frame)
val outputMap = mutableMapOf<Int, Any>()
outputMap = Array(1) { FloatArray(25200) { FloatArray(85) } }
interpreter.runForMultipleInputsOutputs(arrayOf(inputArray), outputMap)
return postProcess(outputMap)
}
}
3 诊断操作与数据结构
3.1 检测结果数据格式
{
"timestamp": "2025-11-20T14:30:22Z",
"device_id": "RG_X1-202408",
"obstacles": [
{
"type": "stair",
"confidence": 0.92,
"bbox": { "x": 120, "y": 80, "width": 200, "height": 150 },
"distance": 2.3,
"direction": "left_front"
}
],
"system_status": "active"
}
3.2 Kotlin数据解析
data class ObstacleResult(
val type: String,
val confidence: Float,
val bbox: BoundingBox,
val distance: Double,
val direction: String
)
val moshi = Moshi.Builder().addLast(KotlinJsonAdapterFactory()).build()
val jsonAdapter = moshi.adapter(DetectionResponse::class.java)
fun parseJson(jsonStr: String): DetectionResponse? {
return jsonAdapter.fromJson(jsonStr)
}
4 诊断操作终端输出
4.1 启动检测命令
adb shell am start -n com.rokid.vision/.MainActivity
--ei command 1 --es target "obstacle_detection"
4.2 终端日志输出

5 UI设计与交互实现
5.1 Jetpack Compose主界面
@Composable
fun MainScreen(viewModel: DetectionViewModel) {
val uiState by viewModel.uiState.collectAsState()
Column(
modifier = Modifier
.fillMaxSize()
.padding(16.dp)
) {
// 设备状态指示器
Row {
Icon(
imageVector = if (uiState.isConnected) Icons.Default.BluetoothConnected
else Icons.Default.BluetoothDisabled,
tint = if (uiState.isConnected) Color.Green else Color.Red
)
Text(text = "Rokid眼镜 ${if(uiState.isConnected) "已连接" else "未连接"}")
}
// 检测结果展示
LazyColumn {
items(uiState.obstacles) { obstacle ->
ObstacleCard(obstacle)
}
}
// 控制按钮
Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceEvenly) {
Button(onClick = { viewModel.startDetection() }) {
Text("开始检测")
}
Button(onClick = { viewModel.stopDetection() }) {
Text("停止检测")
}
}
}
}
5.2 检测结果卡片组件
@Composable
fun ObstacleCard(obstacle: ObstacleResult) {
Card(
modifier = Modifier
.fillMaxWidth()
.padding(vertical = 8.dp),
elevation = CardDefaults.cardElevation(4.dp)
) {
Row {
Image(
painter = painterResource(id = getIcon(obstacle.type)),
contentDescription = null,
modifier = Modifier.size(48.dp)
)
Column(modifier = Modifier.padding(8.dp)) {
Text(text = obstacle.type, style = MaterialTheme.typography.titleMedium)
Text(text = "距离: ${obstacle.distance}米", color = MaterialTheme.colorScheme.primary)
LinearProgressIndicator(
progress = obstacle.confidence,
modifier = Modifier.fillMaxWidth().height(4.dp)
)
}
}
}
}
6 实操案例与数据
6.1 实际测试数据片段
检测结果输出
终端打印输出
7 性能优化策略
-
模型量化:使用INT8量化减少50%模型大小
-
GPU加速:启用TFLite GPU委托提升推理速度
-
帧率控制:动态调整检测频率(10-30FPS)平衡精度与功耗
-
后台隔离:使用WorkManager处理离线分析
8 验证与测试结论
8.1 测试指标
| 指标 | 实测值 |
|---|---|
| 模型初始化耗时 | <500ms |
| 单帧推理延迟 | 35-45ms |
| 检测准确率 | 87.2% |
| 系统内存占用 | 142MB |
8.2 用户测试反馈
“3米内障碍物识别准确,语音提示及时。但在强光环境下台阶识别率下降约15%”——视障测试者A(2025.10.12)
创新点总结:
- 首创CXRM SDK+TFLite协同架构,实现眼镜端采集与手机端AI计算的分离式设计
- 基于动态帧率调整的功耗控制算法,延长设备续航至4.2小时
- 三维空间-语音双通道反馈机制,解决传统单通道感知局限
未来方向:
-
集成激光雷达提升测距精度
-
开发室内语义地图构建功能
-
优化复杂场景下的小目标检测
更多推荐


所有评论(0)