项目背景与创意起源

在当今快节奏的都市生活中,视障人群在日常出行中面临诸多挑战,尤其是障碍物识别与导航问题。根据《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 性能优化策略

  1. 模型量化:使用INT8量化减少50%模型大小

  2. GPU加速:启用TFLite GPU委托提升推理速度

  1. 帧率控制:动态调整检测频率(10-30FPS)平衡精度与功耗

  2. 后台隔离:使用WorkManager处理离线分析

8 验证与测试结论

8.1 测试指标

指标 实测值
模型初始化耗时 <500ms
单帧推理延迟 35-45ms
检测准确率 87.2%
系统内存占用 142MB

8.2 用户测试反馈

“3米内障碍物识别准确,语音提示及时。但在强光环境下台阶识别率下降约15%”——视障测试者A(2025.10.12)


创新点总结

  1. 首创CXRM SDK+TFLite协同架构,实现眼镜端采集与手机端AI计算的分离式设计
  2. 基于动态帧率调整的功耗控制算法,延长设备续航至4.2小时
  3. 三维空间-语音双通道反馈机制,解决传统单通道感知局限

未来方向

  • 集成激光雷达提升测距精度

  • 开发室内语义地图构建功能

  • 优化复杂场景下的小目标检测

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐