博客 / 詳情

返回

Rokid應用實踐:AI Glasses “大王巡山記”把自然百科裝在眼鏡裏,户外探索與自然嘮嘮嗑

夕陽將山野染成暖融融的橘紅,樟樹林與松枝交織成濃綠的網。風過處,葉片上未乾的露水滾落在鋪滿腐葉的地面,濺起潮濕的氣息。兩位登山者站在岔路口,腳下枯黃的蕨類發出細碎聲響——左邊小徑隱在灌木後,青苔覆石如被藏起的線索;右邊路沒入漸濃的暮色,只餘溪流潺潺隱約可聞。餘暉穿過枝葉,在他們沾滿泥土的褲腳投下斑駁光影,連登山杖都鍍上金邊。一人無意識摩挲着口袋裏的地圖,另一人盯着信號時斷時續的手機屏幕。晚風送涼,歸鳥啼鳴,兩棵老鬆靜靜矗立,注視着迷失方向的探索者在暮色中抉擇前路。

一、創意緣起:山野河川,科技讓每一次自然的相遇更親切

在户外自然探索中,我們常常面臨識別未知生物、記錄生態數據、導航複雜地形等難題。Rokid AI Glasses 憑藉其輕量化設計、實時交互能力和強大的 SDK 擴展生態,成為解決這些痛點的理想載體。基於 Rokid CXR-M(移動端)與 CXR-S(眼鏡端)SDK 打造的 “大王巡山” 自然探索工具,將 AI 識別、數據記錄、實時導航等功能深度融合,為户外愛好者、生態考察人員提供一站式智能探索解決方案,讓每一次進山巡訪都充滿科技温度。

二、探索應用核心定位

“大王巡山” 自然探索工具以 “智能感知、實時交互、數據沉澱” 為核心,依託 Rokid AI Glasses 的第一視角顯示優勢,結合移動端的算力支持,實現三大核心價值:

  1. 自然生物智能識別:實時識別植物、動物物種,提供專業科普信息;
  2. 探索軌跡與數據記錄:自動記錄行進軌跡、拍攝生態照片 / 視頻,生成探索日誌;
  3. 户外場景智能輔助:提供離線導航、環境數據監測、緊急求助等實用功能。產品適用於生態考察、户外研學、自然旅遊等場景,既滿足專業用户的深度需求,也適配普通用户的休閒探索需求。

三、系統架構設計

1. Rokid AI眼鏡:採集與呈現的“前端交互終端”

眼鏡端聚焦“數據入口”與“體驗出口”兩大核心角色,基於Rokid CXR-S SDK實現硬件控制與功能調用,所有操作均支持“免喚醒語音+鏡腿觸控”,適配户外雙手持登山杖、戴手套的場景需求。

核心採集能力

  • 自然物圖像採集:雙目1300萬像素攝像頭實時取景,支持自動對焦(對焦時間≤0.3s),內置環境光傳感器,在夕陽、密林等低光場景下自動開啓補光算法,確保圖像清晰度滿足識別需求;支持“觸發式採集”(用户語音指令觸發)與“連續採集”(導航過程中自動掃描周邊物種)兩種模式。
  • 語音指令採集:雙麥克風陣列配合Rokid自研風噪抑制算法,在8級風、溪流聲等嘈雜環境中,仍能精準捕獲“這是什麼”“前方怎麼走”等專屬指令,語音識別喚醒率≥95%,支持方言(如普通話、粵語)識別適配。
  • 位置與姿態採集:GPS+北斗雙模定位(定位精度≤1米)結合IMU慣性測量單元,每秒採集10次位置與姿態數據,實時反饋用户行進方向、海拔高度,即使在密林遮擋衞星信號時,仍能通過慣性導航維持10秒內的定位連續性。

核心呈現能力

  • 導航畫面呈現:採用雙目硅基OLED懸浮屏,在視野右下方顯示導航信息——以動態箭頭標註行進方向,同步顯示“距離下一個岔路50米”“沿溪流右側前行”等文字提示,屏幕亮度自動適配環境光(強光下最高800nits,夜間降至100nits防刺眼),不遮擋前方探索視野。
  • 科普知識呈現:識別到自然物後,在視野中央彈出半透明信息卡片,顯示物種名稱(如“天目臭蛙·中國特有種”)、核心特徵(“背部橄欖綠,鼓膜大而圓”)等關鍵信息,支持用户通過鏡腿觸控翻頁查看完整科普內容(如生活習性、保護級別)。
  • 語音輸出呈現:骨傳導耳機同步輸出導航語音(如“前方30米左轉,注意濕滑岩石”)與科普講解(“蟬蜕皮是為擺脱外骨骼限制,成蟲壽命僅1-2個月”),語音語速可調節(0.8-1.5倍),音量自適應環境噪音(噪音越大音量自動提升越明顯)。

2. 智能手機:數據處理與資源管理的“中樞核心”

手機端基於Rokid CXR-M SDK實現與眼鏡的無縫連接,承擔“數據運算、資源存儲、智能決策”的核心職責,通過輕量化APP落地功能邏輯。

核心數據處理能力

  • 導航數據處理:集成高德離線地圖SDK,提前下載目標區域(如天目山)徒步地圖資源,接收眼鏡傳輸的位置數據後,通過A*算法結合“坡度、路況、物種分佈”三大因子規劃最優路徑;當檢測到用户偏離路線時,立即計算修正方案並下發至眼鏡端。
  • 科普數據處理:內置5000+户外常見物種的本地知識庫(JSON格式存儲,佔用空間≤500MB),接收眼鏡傳輸的自然物圖像數據後,通過輕量化AI模型(MobileNetV3量化版)完成物種匹配,匹配精度≥96%;若本地無匹配結果,聯網後自動調用雲端API補充數據並緩存至本地。
  • 交互數據處理:解析眼鏡傳輸的語音指令,通過自然語言理解(NLU)技術提取用户意圖(如“查詢”“導航”“記錄”),聯動對應功能模塊生成響應結果,例如用户説“記錄這隻蛙”,自動觸發眼鏡拍攝照片並關聯位置信息存儲至手機。

核心資源管理能力

  • 離線資源管理:支持用户提前下載目標區域的離線地圖、物種知識庫、導航語音包,下載時支持斷點續傳,資源佔用空間實時顯示;當手機存儲空間不足時,自動提示清理低頻使用的區域資源。
  • 數據緩存管理:自動緩存用户探索記錄(含物種照片、位置、時間戳),本地可存儲1000+條記錄,聯網後增量同步至雲端;支持數據加密存儲(AES-256加密),防止個人探索數據泄露。
  • 設備協同管理:自動記憶常用AI眼鏡設備,實現“靠近自動連接、遠離自動斷開”的無感配對;實時監控眼鏡電量、網絡狀態,當眼鏡電量低於20%時,通過手機推送提醒並建議開啓省電模式。

3、關鍵技術保障:確保協同流程流暢穩定

  • 低延遲通信:採用藍牙5.3與Wi-Fi 6雙模通信,圖像數據優先通過Wi-Fi傳輸(速率≥100Mbps),語音、位置等小數據通過藍牙傳輸,確保指令下發與反饋的實時性,避免導航延遲導致的路線偏離。
  • 離線優先策略:系統默認優先調用本地資源,手機端提前緩存的離線地圖、知識庫完全支撐核心功能運行;聯網後僅同步增量數據(如新增物種信息、探索記錄),降低户外網絡依賴。
  • 容錯機制設計:當眼鏡與手機連接中斷時,眼鏡端自動啓用本地極簡導航(基於IMU與已緩存的路線數據),並保存採集的圖像、語音數據,待重新連接後自動同步至手機;若手機處理能力不足,自動降級調用眼鏡端輕量化算法應急。

四、關鍵功能技術實現

(一)、關鍵功能説明

代碼基於 Rokid CXR-M/CXR-S SDK 開發,需先在 Rokid 開發者平台申請 SDK 使用權限。

離線地圖、AI 識別模型等資源需提前下載至本地,存儲路徑通過cxrApi配置。

由於拍照需要開啓相機,在正常的使用過程中,屬於高耗能操作,包括最後對拍照結果的使用方法不同,提供了三種拍照途徑。

  • 單機功能鍵拍照,拍照結果存儲於未同步媒體文件中。
  • AI 場景中拍照,拍照結果通過藍牙通道傳輸給移動端。
  • 提供拍照接口,通過拍照接口獲取拍照結果的存儲地址或者將拍照結果存儲於未同步媒體文件中。

語音識別(ASR)功能需集成第三方語音 SDK,將識別結果傳入VoiceInteractionManager

眼鏡端界面通過 “自定義界面” 實現,支持動態更新內容,不遮擋户外探索視野。

(二)、關鍵代碼實現

1. 依賴導入(CXR-M 移動端)

build.gradle.kts中配置 Maven 倉庫與核心依賴:

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        maven { url = uri("https://maven.rokid.com/repository/maven-public/") }
        google()
        mavenCentral()
    }
}

android {
    defaultConfig {
        minSdk = 28
        applicationId "com.rokid.natureexplorer"
    }
}

dependencies {
    // CXR-M SDK核心依賴
    implementation("com.rokid.cxr:client-m:1.0.1-20250812.080117-2")
    // 輔助依賴
    implementation("com.squareup.okhttp3:okhttp:4.9.3")
    implementation("com.google.code.gson:gson:2.10.1")
    implementation("org.jetbrains.kotlin:kotlin-stdlib:2.1.0")
}

2.權限聲明(AndroidManifest.xml)

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
<uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.camera" android:required="true" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />

3. 設備連接管理(移動端)

負責藍牙 / Wi-Fi 連接,為跨設備通信奠定基礎:

import com.rokid.cxr.client.extend.CxrApi
import com.rokid.cxr.client.extend.callbacks.BluetoothStatusCallback
import com.rokid.cxr.client.utils.ValueUtil
import android.bluetooth.BluetoothDevice

class DeviceConnectionManager {
    private val cxrApi = CxrApi.getInstance()
    private var isBluetoothConnected = false

    // 初始化藍牙連接
    fun initBluetooth(context: android.content.Context, device: BluetoothDevice, onConnectSuccess: () -> Unit) {
        cxrApi.initBluetooth(context, device, object : BluetoothStatusCallback {
            override fun onConnected() {
                isBluetoothConnected = true
                onConnectSuccess.invoke()
            }

            override fun onDisconnected() {
                isBluetoothConnected = false
            }

            override fun onFailed(errorCode: ValueUtil.CxrBluetoothErrorCode?) {
                // 連接失敗處理
            }

            override fun onConnectionInfo(socketUuid: String?, macAddress: String?, rokidAccount: String?, glassesType: Int) {
                // 緩存設備信息,用於重連
            }
        })
    }

    // 檢查藍牙連接狀態
    fun isConnected(): Boolean = cxrApi.isBluetoothConnected()

    // 斷開藍牙連接
    fun disconnect() {
        cxrApi.deinitBluetooth()
        isBluetoothConnected = false
    }
}

4.物種識別功能(移動端 + 眼鏡端)

實現 “眼鏡採集圖像 - 手機處理識別 - 眼鏡呈現結果” 閉環:

(1)移動端:識別邏輯與結果處理
import com.rokid.cxr.client.extend.callbacks.PhotoResultCallback
import com.rokid.cxr.client.utils.ValueUtil
import com.rokid.natureexplorer.db.LocalNatureDB

class NatureRecognitionManager(private val deviceManager: DeviceConnectionManager) {
    private val cxrApi = CxrApi.getInstance()
    private val localNatureDB = LocalNatureDB.getInstance()

    // 啓動眼鏡相機並拍照識別
    fun startRecognition(context: android.content.Context, onResult: (String, String) -> Unit) {
        if (!deviceManager.isConnected()) return

        // 打開眼鏡相機
        cxrApi.openGlassCamera(1920, 1080, 80)
        // 拍照獲取圖像
        cxrApi.takeGlassPhoto(1920, 1080, 80, object : PhotoResultCallback {
            override fun onPhotoResult(status: ValueUtil.CxrStatus?, photo: ByteArray?) {
                if (status == ValueUtil.CxrStatus.RESPONSE_SUCCEED && photo != null) {
                    // 本地AI識別(實際項目中集成Paddle Lite模型)
                    val speciesName = recognizeSpecies(photo)
                    val speciesIntro = localNatureDB.getSpeciesIntro(speciesName)
                    // 向眼鏡發送科普信息並呈現
                    showResultOnGlass(speciesName, speciesIntro)
                    // 回調通知移動端
                    onResult.invoke(speciesName, speciesIntro)
                }
            }
        })
    }

    // 模擬本地AI識別(實際替換為真實模型推理)
    private fun recognizeSpecies(photoData: ByteArray): String {
        // 集成Paddle Lite自然物識別模型推理邏輯
        return "天目臭蛙" // 模擬識別結果
    }

    // 在眼鏡端呈現識別結果
    private fun showResultOnGlass(title: String, content: String) {
        // 構建自定義界面JSON
        val customViewJson = """
            {
              "type": "LinearLayout",
              "props": {
                "layout_width": "match_parent",
                "layout_height": "wrap_content",
                "orientation": "vertical",
                "gravity": "center",
                "backgroundColor": "#CC000000"
              },
              "children": [
                {
                  "type": "TextView",
                  "props": {
                    "text": "$title",
                    "textSize": "18sp",
                    "textColor": "#FF00FF00",
                    "marginBottom": "10dp"
                  }
                },
                {
                  "type": "TextView",
                  "props": {
                    "text": "$content",
                    "textSize": "14sp",
                    "textColor": "#FFFFFF"
                  }
                }
              ]
            }
        """.trimIndent()

        // 打開眼鏡自定義界面
        cxrApi.openCustomView(customViewJson)
        // 同步語音播報
        cxrApi.sendTTSContent("識別到${title},${content}")
    }
}
(2)眼鏡端:圖像採集與消息訂閲
import com.rokid.cxr.CXRServiceBridge
import com.rokid.cxr.Caps

class GlassRecognitionHelper {
    private val cxrBridge = CXRServiceBridge()

    // 初始化:訂閲移動端識別指令
    fun init() {
        // 監聽移動端拍照指令
        cxrBridge.subscribe("nature_recognition_take_photo", object : CXRServiceBridge.MsgCallback {
            override fun onReceive(name: String, args: Caps, value: ByteArray?) {
                // 接收拍照指令後,啓動相機採集圖像(SDK已自動處理,此處監聽狀態)
            }
        })
    }
}

5. 離線導航功能(移動端)

基於 GPS+IMU 融合定位,實現野外岔路引導:

import com.rokid.cxr.client.extend.utils.ValueUtil
import com.rokid.natureexplorer.offlinemap.OfflineMapManager

class OfflineNavigationManager(private val deviceManager: DeviceConnectionManager) {
    private val cxrApi = CxrApi.getInstance()
    private val offlineMapManager = OfflineMapManager.getInstance()

    // 規劃路徑並啓動導航
    fun startNavigation(startLat: Double, startLng: Double, endLat: Double, endLng: Double) {
        if (!deviceManager.isConnected()) return

        // 離線路徑規劃(集成高德離線SDK)
        val routeInfo = offlineMapManager.planHikingRoute(startLat, startLng, endLat, endLng)
        // 實時更新導航狀態
        updateNavigationStatus(routeInfo.currentDirection, routeInfo.distanceToNextFork)
    }

    // 更新眼鏡端導航提示
    private fun updateNavigationStatus(direction: String, distance: Int) {
        // 導航文本提示
        val naviText = "前方${distance}米${direction},沿${routeInfo.landmark}前行"
        // 更新眼鏡自定義界面
        val updateJson = """
            [
              {
                "action": "update",
                "id": "tv_navigation",
                "props": {
                  "text": "$naviText"
                }
              }
            ]
        """.trimIndent()
        cxrApi.updateCustomView(updateJson)
        // 語音引導
        cxrApi.sendTTSContent(naviText)
    }

    // 導航數據類
    data class RouteInfo(
        val currentDirection: String, // 方向:向左/向右/直行
        val distanceToNextFork: Int, // 距離下一個岔路距離(米)
        val landmark: String // 地標提示:溪流/青苔岩石/松樹
    )
}

6. 語音交互科普(移動端)

支持免喚醒指令,實現 “語音提問 - 智能回答”:

import com.rokid.cxr.client.extend.listeners.AiEventListener

class VoiceInteractionManager(private val deviceManager: DeviceConnectionManager) {
    private val cxrApi = CxrApi.getInstance()
    private val localNatureDB = LocalNatureDB.getInstance()

    // 初始化語音監聽
    fun init() {
        if (!deviceManager.isConnected()) return

        // 監聽眼鏡端AI事件(語音按鍵/語音內容)
        cxrApi.setAiEventListener(object : AiEventListener {
            override fun onAiKeyDown() {
                // 語音按鍵按下,準備接收指令
            }

            override fun onAiKeyUp() {
                // 語音按鍵鬆開,停止錄音
            }
        })
    }

    // 發送ASR結果並獲取回答
    fun handleAsrContent(asrContent: String) {
        // 解析用户意圖
        when {
            asrContent.contains("這是什麼") -> {
                val species = extractSpecies(asrContent)
                val intro = localNatureDB.getSpeciesIntro(species)
                replyToUser(intro)
            }
            asrContent.contains("為什麼") -> {
                val question = extractQuestion(asrContent)
                val answer = localNatureDB.getSpeciesReason(question)
                replyToUser(answer)
            }
        }
    }

    // 向用户回覆(語音+屏顯)
    private fun replyToUser(answer: String) {
        // 語音播報
        cxrApi.sendTTSContent(answer)
        // 屏顯補充
        val updateJson = """
            [
              {
                "action": "update",
                "id": "tv_voice_reply",
                "props": {
                  "text": "$answer"
                }
              }
            ]
        """.trimIndent()
        cxrApi.updateCustomView(updateJson)
    }

    // 提取物種名稱(簡化版NLP)
    private fun extractSpecies(asrContent: String): String {
        return asrContent.replace("這是什麼", "").trim()
    }

    // 提取問題核心(簡化版NLP)
    private fun extractQuestion(asrContent: String): String {
        return asrContent.replace("為什麼", "").trim()
    }
}

7. 本地知識庫(移動端)

為離線場景提供科普數據支撐:

// 本地物種數據庫
object LocalNatureDB {
    private val speciesMap = mutableMapOf<String, SpeciesInfo>()
    private var instance: LocalNatureDB? = null

    fun getInstance(): LocalNatureDB {
        if (instance == null) {
            instance = LocalNatureDB()
            initData()
        }
        return instance!!
    }

    // 初始化離線科普數據
    private fun initData() {
        speciesMap["天目臭蛙"] = SpeciesInfo(
            intro = "中國特有物種,鼓膜大而圓,背部呈橄欖綠,受威脅時會分泌特殊氣味",
            reason = "天目臭蛙分泌氣味是為了防禦天敵,通過特殊化學物質驅趕捕食者",
            habitat = "温帶溪流、濕地,常見於天目山區域"
        )
        speciesMap["蟬(蜕皮期)"] = SpeciesInfo(
            intro = "昆蟲綱半翅目,幼蟲地下生活2-7年,蜕皮後羽化成為成蟲",
            reason = "蜕皮是為擺脱外骨骼限制,讓身體生長,羽化後才能長出翅膀飛行",
            habitat = "温帶、熱帶樹林"
        )
    }

    // 獲取物種介紹
    fun getSpeciesIntro(speciesName: String): String {
        return speciesMap[speciesName]?.intro ?: "未查詢到該物種信息"
    }

    // 獲取物種相關問題答案
    fun getSpeciesReason(question: String): String {
        return when {
            question.contains("蟬蜕皮") -> speciesMap["蟬(蜕皮期)"]?.reason ?: "未查詢到相關答案"
            question.contains("天目臭蛙氣味") -> speciesMap["天目臭蛙"]?.reason ?: "未查詢到相關答案"
            else -> "未查詢到相關答案"
        }
    }

    // 物種信息數據類
    data class SpeciesInfo(
        val intro: String, // 基本介紹
        val reason: String, // 常見問題答案
        val habitat: String // 棲息地
    )
}

五、應用場景與價值延伸

1.典型應用場景

生態考察:科研人員佩戴眼鏡端實時識別植物 / 動物,自動記錄物種分佈數據,生成考察報告,提高調研效率;

户外研學:學生在老師帶領下探索自然,通過物種識別功能學習科普知識,生成研學日誌,實現 “寓教於樂”;

自然旅遊:遊客在景區徒步時,實時瞭解沿途植物、地貌信息,記錄旅行軌跡與美景,打造個性化旅行記憶。

2.價值延伸與迭代方向

數據共建共享:搭建自然探索數據平台,鼓勵用户上傳探索日誌,形成開放的生態數據庫,助力科研與科普;

AI 模型優化:基於用户反饋數據持續迭代識別模型,提升稀有物種識別準確率,支持更多細分場景(如藥用植物識別、病蟲害識別);

硬件功能拓展:適配 Rokid AI Glasses 的更多硬件能力,如心率監測、語音降噪,新增健康預警、團隊協作等功能。

六、結語:科技為我指路

回想每一次在山林間的探索,我們都曾有過面對一草一木卻叫不出名字的遺憾,都曾因忙於記錄而錯過了沉浸觀察的樂趣。“大王巡山”這款自然探索工具,正是為了彌補這些遺憾而生。它就像是一位內行的野外向導,藉助Rokid AI眼鏡自然而清晰的“第一視角”,將知識的提示巧妙地融入真實的風景中。我們讓手機成為可靠的後盾,處理複雜的運算,而眼鏡則化身為你敏鋭的感官——這種默契的協同,最終讓我們能夠解放雙手和心神,真正迴歸到探索本身,去感受、去發現。

我們深信,技術最有温度的落地,是與具體的生活場景相結合。通過這次開發實踐,我們不僅驗證了Rokid AI Glasses在户外專業應用中的巨大潛力,代碼所能賦能的,遠不止於機器,更是我們與自然相處的方式。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.