本文的三位作者正陽、海洋、阿力,是來自不同公司的工程師,將 Agora SDK 與智能小車結合,開發了一款通過智能小車來實時視頻遠程看房的創新項目。本文將從方案設計到具體實現,詳實分享他們的開發經驗。三人也憑借該項目,在7月1日結束的 Agora RTC Hack 上海站編程馬拉松獲得大獎。
創意與構思
此前聽到多很多次“黑客馬拉松”這樣的活動,一群來自不同地方的人聚在一起,組隊、構思、開發,在48小時內做出產品雛形。我們三人抱著去聽聽別人的創意,重在參與的想法參加了這次比賽。對于想要做的東西,在比賽前也只是有一個大概的方向:
構思的方向依據我們擅長的部分來組合拼接,這就得說到我的兩位給力隊友海洋、阿力;海洋是嵌入式軟件工程師,汽車電子方向,寫個驅動做個小車手到擒來。阿力是后端工程師,具備處理服務器端和前端頁面的能力。
于是隊伍有了嵌入式和云端兩部分的能力,技術構思的方向是云端為嵌入式賦能。希望有一個小車,小車可以傳遞回視頻圖像,視頻圖像可以實時傳給多個用戶,用戶在得到授權之后,實現遠程對小車的操控。
方案設計與分工
出于這樣的構思,實現架構如上圖所示。現在有了一個基本架構,也清楚了我們要實現的功能,接下來就是分工了。考慮到我們各有所長,分工如下:
從硬件開發開始
小車采用了是4輪伺服電機驅動,搭配有視頻采集模塊、伺服電機驅動模塊、STM32控制模塊和攝像頭云臺模塊,安裝后整體效果圖如下:
圖:效果圖
用戶在遠程操控小車各種動作之前,需要小車通過wifi連接到互聯網。用戶可以通過上位機(Android App 或網頁前端)控制小車前后左右移動或控制云臺調整攝像頭方向。
視頻采集模塊包含有 Wi-Fi 模塊,可以連接到wifi熱點為視頻傳輸提供網絡基礎。也提供 HDMI 接口與顯示器連接,方便用戶調試。攝像頭通過 USB 的方式與視頻采集模塊連接,我們采用免驅動的天敏6602型號攝像頭,分辨率可以達到640*480,并能夠自動調焦。
STM32控制模塊采用 Arduino 接口與伺服電機驅動模塊連接,STM32模塊負責控制電機、云臺信號的產生,并由伺服電機驅動模塊直接驅動電機工作。伺服電機輸入電壓為6~12V,直流驅動。
小車上的視頻采集模塊采用了定制的 Android 系統,提供網絡連接、指令轉發和視頻流采集、傳輸功能。當上位機通過遠程服務連接到小車后,上位機可以請求到當前小車攝像頭上的視頻信息;同時,視頻采集模塊也將上位機上傳來的控制信號解析為指定格式和功能的協議數據,并通過串口發送到 STM32控制模塊。
小車上的 STM32控制模塊在接收到相關控制信號后,調整輸出脈沖信號的占空比,由驅動板轉換輸出電平后直接控制伺服電機或云臺模塊做出相應的動作,從而完成上位機用戶想要的操控功能。
控制信號協議
對于只需要實現簡單的小車控制的話,我們只需要實現通過串口向 STM32控制模塊發送控制信號即可,簡單的控制信號協議如下:
Android SDK 的定制
開發工具
為了實現我們想要的實時視頻與小車的遠程控制功能,我們需要采用聲網的視頻通話SDK,并運行在 Android 開發板上。開發板,我們選用了 Firefly的 RK3128平臺,采用 Cortex-A7 架構四核1.3GHz 處理器、Mali-400MP2 GPU,板載千兆以太網口、2.4GHz Wi-Fi 和藍牙4.0,支持 Android 與 Ubuntu 雙系統。
定制串口驅動
為了實現 RK3128 對小車的控制,我們需要實現 RK3128 通過 USB 轉串口模塊與 STM32控制模塊通信。因此我們首先要重新配置 RK3128 內核,使得RK3128支持 USB 轉串口驅動程序。
首先下載完 RK3128 Android SDK 并先驗證文件 MD5值:
md5sum/path/to/fireprime_android5.1_git_20180510.tar.gzfce0e6d65549939167923260142b2c1efireprime_android5.1_git_20180510.tar.gz
確認無誤后解壓:
mkdir-p~/proj/fireprimecd~/proj/fireprimetarxvf/path/to/fireprime_android5.1_git_20180510.tar.gzgitreset--hardgitremoteaddbitbuckethttps://bitbucket.org/T-Firefly/firenow-lollipop.gitgitpullbitbucketfireprime:fireprime
配置并編譯內核:
cd~/proj/fireprime/kernelmakerk3128-fireprime_defconfigmakemenuconfigmake-j8rk3128-fireprime.img
其中make menuconfig這一步需要勾選上Device Drivers —> USB support —> USB Serial Converyer support —> USB Serial Console device support / USB Generic Serial Driver,并勾選上 CP210x / CH341 / FTDI / PL2303 等常用串口工具設備。
編譯 Android 系統:
cd~/proj/fireprime.build.shmake-j8./mkimage.sh
最后編譯完成后燒錄分區鏡像,并插入USB轉串口工具查看系統dmesg是否出現以下log信息:
[2213.003173]usb1-1.3:newfull-speedUSBdevicenumber6usingrockchip_ehct[2213.113759]usb1-1.3:NewUSBdevicefound,idVendor=10c4,idProduct=ea60[2213.113839]usb1-1.3:NewUSBdevicestrings:Mfr=1,Product=2,SerialNumbe3[2213.113883]usb1-1.3:Product:CP2102USBtoUARTBridgeController[2213.113921]usb1-1.3:Manufacturer:SiliconLabs[2213.113956]usb1-1.3:SerialNumber:0001[2213.120813]cp210x1-1.3:1.0:cp210xconverterdetected[2213.209852]usb1-1.3:resetfull-speedUSBdevicenumber6usingrockchip_et[2213.320161]usb1-1.3:cp210xconverternowattachedtottyUSB0
出現串口設備附著到 ttyUSBx,即說明定制串口驅動成功。
以上為全編譯Android SDK的方法,需要編譯 Android 系統,相較于僅編譯內核而言比較費時。我們可以在上述make menuconfig時將需要的串口驅動程序勾選為 M,通過make modules的方法,將驅動編譯成.ko文件,然后在 Android系統開機時自動加載驅動程序:
首先將.ko驅動程序文件復制到 Android 文件系統內
adbshellsumount-oremount,rw/mkdir/moduleschmod777/moduleschown-Rnobody:nobody/modulesexitexitadbpush./xxxx.ko/modules
編寫啟動運行腳本/data/serial.sh
#!/system/bin/shinsmod/modules/xxxx.komknod/dev/ttyUSBc2400
修改init.rc并添加運行自己的腳本
serviceserial/system/bin/sh/data/serial.shuserrootoneshot
在 App 端實現視頻傳輸
視頻傳輸和信令傳輸的部分,我們通過聲網 Agora SDK 來實現。由于涉及到與嵌入式開發板的結合,我們主要參考的是聲網在 Github 提供的各種案例中的抓娃娃機 demo。示例代碼中的結構圖如下:
示例代碼有視頻傳輸的部分,控制信令需要參考聲網信令文檔自己完成。
聲網 SDK 的集成
1. 首先申請AppID
Android APP 中在 res/values/strings_config.xml加入如下內容,將agora_app_id進行配置
1a486ee31a30xxxxxxxxxx
2. 將.jar文件拷貝到libs/中
因為用到信令和視頻傳輸兩部分,需要兩個.jar 文件分別為 agora-rtc-sdk.jar和 agora-sig-sdk.jar
3. 在 src/main/jniLibs 加入 armeabi-v7a 與其中的.so文件
并在 build.gradle 中確定擁有如下描述:
dependencies{compilefileTree(dir:'libs',include:['*.jar'])testCompile'junit:junit:4.12'compile'com.android.support:appcompat-v7:23.4.0'}
就此,使用示例代碼可以順利開啟視頻傳輸功能。
用信令讓 App 控制小車
信令的實現
信令的具體使用方法見聲網官網文檔中心的參考,這里就不進行詳盡描述了。主要使用的函數如下:
//初始化信令SDKm_agoraAPI=AgoraAPIOnlySignal.getInstance(context,appID);//登錄Agora信令系統m_agoraAPI.login2(appId,account,token,uid,deviceID,retry_time_in_s,retry_count)//////////////點對點測試///////////////發送點對點消息m_agoraAPI.messageInstantSend(account,uid,msg,msgID)//設置對端收到消息回調(m_agoraAPI.onMessageInstantReceive(account,uid,msg){//codethere}/////////////頻道測試/////////////////加入頻道m_agoraAPI.channelJoin(channelName)//發送頻道消息m_agoraAPI.messageChannelSend(channelName,msg,msgID)//設置對端接收到頻道消息回調m_agoraAPI.onMessageChannelReceive(channelID,account,uid,msg){//codethere}////////////////////////////////////退出Agora信令系統m_agoraAPI.logout()
Android App 操作串口
對于小車端的 Android App 得到信令之后需要串口發送數據。因此如何實現 Android App 操作串口。這里簡述兩種方案:
采用 Android 系統給出的架構進行處理, Android 帶有串口demo代碼,名稱為 SerialPort。這里注意兩點,此處的代碼依賴于 JNI 工具和 NDK,如果沒有完整安裝在使用項目代碼的時候會出現問題。另外,串口操作不方便使用 Android 模擬器進行測試,對于沒有串口的設備,在開啟串口的動作時,會報錯并可能導致程序退出崩潰。
選擇使用 Android 代碼發送 shell 命令的方式,直接模擬 Linux 的 shell 控制代碼,示例 echo ‘aa’ > /dev/ttyUSB0 將aa發送到串口ttyUSB0,這樣做的好處時代碼本身簡單,串口直接調用底層。
對于短時間實現功能來說,方案2是更容易實現的方法,這里需要非常注意的一點,需要重新編譯 Android 的 framework 層給 App 賦予 root 權限
當信令解析完成,串口調試通過,就可以實現遠程控制小車的行進了。
最后:服務器端的部署
為了實現用戶可以方便通過手機或者電腦在線實時看房,我們需要通過 Web 端連接小車的 Android App 端,獲取實時傳輸過來的視頻內容。在我們的設想中,用戶可以通過遠程控制小車,這樣可以方便用戶了解房屋各個方面的情況。綜上所述,我們需要實現如下兩個功能:
具有視頻連接功能
具有遠程遙控功能
幸運的是,通過聲網提供的服務,我們可以很便捷的搭建這兩個服務。在本項目中,我們使用聲網的視頻 SDK 實現網頁端和小車 App 端的視頻連接,通過信令 SDK 發送消息,去控制小車的前后左右行走和攝像頭上下左右擺動。
羅列一下我們使用到的工具:
聲網視頻通話Web SDK 及文檔,用來實現遠程的視頻交互功能;
聲網信令 SDK 及文檔,用來實現遠程遙控智能小車;
服務器,用于部署靜態頁面;
實現視頻連接和發送消息
先在頁面上引入視頻和信令的 SDK。然后我們先來實現視頻連接。
//創建AgoraRTC實例并加入頻道constclient=AgoraRTC.CreateClient({mode:"interop"})client.init(appId,function(){console.log("AgoraRTCclientinitialized");client.join(channel_key,CHANNEL_NAME,null,function(uid){console.log("User"+uid+"joinchannelsuccessfully")console.log(newDate().toLocaleTimeString())//dosomething}}
訂閱遠端的視頻流并播放。
letstream=AgoraRTC.creatStream(merge(defaultConfig.config))localStream.init(()=>{client.on('stream-added',function(evt){varstream=evt.stream;console.log("Newstreamadded:"+stream.getId());console.log("Subscribe",stream);client.subscribe(stream,function(err){console.log("Subscribestreamfailed",err);});});client.on('stream-subscribed',function(evt){varstream=evt.stream;console.log("Subscriberemotestreamsuccessfully:"+stream.getId());if($('div#video#agora_remote'+stream.getId()).length===0){$('div#video').append('');}stream.play('agora_remote'+stream.getId());});})
通過下述方法來實現發送信息。
//創建信令的對象constsignal=Signal(appId)//在實驗條件下,不設置tokenconsttoken='_no_need_token'//登錄constsession=signal.login(account,token)session.onLoginSuccess=(uid)=>{//發送消息給指定的賬號signal.sendMessage(reciveAcount,message)}
完成上述的步驟之后,與小車端設置相同的appId和token(如有必要),設定好對應的參數,我們就可以遠程控制小車并獲取視頻了
圖:現場演示
圖:48小時改裝的小車
-
視頻
+關注
關注
6文章
1942瀏覽量
72887 -
智能小車
+關注
關注
87文章
549瀏覽量
81724
原文標題:一起跳出思維定勢吧,RTC 技術還可以這樣玩
文章出處:【微信號:shengwang-agora,微信公眾號:聲網Agora】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論