摘要:本文的三位作者正陽(yáng)海洋阿力,是來(lái)自不同公司的工程師,將與智能小車結(jié)合,開發(fā)了一款可實(shí)時(shí)視頻遠(yuǎn)程看房的創(chuàng)新性項(xiàng)目。用戶可以通過(guò)上位機(jī)或網(wǎng)頁(yè)前端控制小車前后左右移動(dòng)或控制云臺(tái)調(diào)整攝像頭方向。
本文的三位作者正陽(yáng)、海洋、阿力,是來(lái)自不同公司的工程師,將 Agora SDK 與智能小車結(jié)合,開發(fā)了一款可實(shí)時(shí)視頻遠(yuǎn)程看房的創(chuàng)新性項(xiàng)目。本文將從方案設(shè)計(jì)到具體實(shí)現(xiàn),詳實(shí)分享他們的開發(fā)經(jīng)驗(yàn)。三人也憑借該項(xiàng)目,在6月30日的Agora RTC Hack 上海站編程馬拉松獲得大獎(jiǎng)。創(chuàng)意構(gòu)思
此前聽到多很多次“黑客馬拉松”這樣的活動(dòng),一群來(lái)自不同地方的人聚在一起,組隊(duì)、構(gòu)思、開發(fā),在48小時(shí)內(nèi)做出產(chǎn)品雛形。我們?nèi)吮еヂ犅爠e人的創(chuàng)意,重在參與的想法參加了這次比賽。對(duì)于想要做的東西,在比賽前也只是有一個(gè)大概的方向:
構(gòu)思的方向依據(jù)我們擅長(zhǎng)的部分來(lái)組合拼接,這就得說(shuō)到我的兩位給力隊(duì)友海洋、阿力;海洋是嵌入式軟件工程師,汽車電子方向,寫個(gè)驅(qū)動(dòng)做個(gè)小車手到擒來(lái)。阿力是后端工程師,具備處理服務(wù)器端和前端頁(yè)面的能力。
于是隊(duì)伍有了嵌入式和云端兩部分的能力,技術(shù)構(gòu)思的方向是云端為嵌入式賦能。希望有一個(gè)小車,小車可以傳遞回視頻圖像,視頻圖像可以實(shí)時(shí)傳給多個(gè)用戶,用戶在得到授權(quán)之后,實(shí)現(xiàn)遠(yuǎn)程對(duì)小車的操控。
方案設(shè)計(jì)與分工出于這樣的構(gòu)思,實(shí)現(xiàn)架構(gòu)如上圖所示?,F(xiàn)在有了一個(gè)基本架構(gòu),也清楚了我們要實(shí)現(xiàn)的功能,接下來(lái)就是分工了。考慮到我們各有所長(zhǎng),分工如下:
分工 | 人物 | 實(shí)現(xiàn)目標(biāo)1 | 實(shí)現(xiàn)目標(biāo)2 |
---|---|---|---|
小車驅(qū)動(dòng)與攝像頭端 | 海洋 | 使用 Android系統(tǒng),完成攝像頭驅(qū)動(dòng) | 在 Android系統(tǒng)中加入驅(qū)動(dòng),解析運(yùn)動(dòng)控制信號(hào),實(shí)現(xiàn)小車運(yùn)動(dòng) |
車載APP與用戶APP | 正陽(yáng) | 將攝像頭采集的視頻傳遞出去,解析服務(wù)器信令,給小車發(fā)送運(yùn)動(dòng)信號(hào) | 用戶可以通過(guò)手機(jī)查看小車視頻,并控制小車 |
服務(wù)器端與web前端 | 阿力 | 將視頻傳輸服務(wù)器掛到公網(wǎng)上,用戶可以用輸入網(wǎng)址的方式查看小車視頻 | 提供web前端,用戶可以通過(guò)網(wǎng)頁(yè)控制小車 |
小車采用了是4輪伺服電機(jī)驅(qū)動(dòng),搭配有視頻采集模塊、伺服電機(jī)驅(qū)動(dòng)模塊、STM32控制模塊和攝像頭云臺(tái)模塊,安裝后整體效果圖如下:
用戶在遠(yuǎn)程操控小車各種動(dòng)作之前,需要小車通過(guò)wifi連接到互聯(lián)網(wǎng)。用戶可以通過(guò)上位機(jī)(Android APP 或網(wǎng)頁(yè)前端)控制小車前后左右移動(dòng)或控制云臺(tái)調(diào)整攝像頭方向。
視頻采集模塊包含有wifi模塊,可以連接到wifi熱點(diǎn)為視頻傳輸提供網(wǎng)絡(luò)基礎(chǔ)。也提供HDMI接口與顯示器連接,方便用戶調(diào)試。攝像頭通過(guò)USB的方式與視頻采集模塊連接,我們采用免驅(qū)動(dòng)的天敏6602型號(hào)攝像頭,分辨率可以達(dá)到640*480,并能夠自動(dòng)調(diào)焦。
STM32控制模塊采用 Arduino 接口與伺服電機(jī)驅(qū)動(dòng)模塊連接,STM32模塊負(fù)責(zé)控制電機(jī)、云臺(tái)信號(hào)的產(chǎn)生,并由伺服電機(jī)驅(qū)動(dòng)模塊直接驅(qū)動(dòng)電機(jī)工作。伺服電機(jī)輸入電壓為6~12V,直流驅(qū)動(dòng)。
工作原理小車上的視頻采集模塊采用了定制的 Android 系統(tǒng),提供網(wǎng)絡(luò)連接、指令轉(zhuǎn)發(fā)和視頻流采集、傳輸功能。當(dāng)上位機(jī)通過(guò)遠(yuǎn)程服務(wù)連接到小車后,上位機(jī)可以請(qǐng)求到當(dāng)前小車攝像頭上的視頻信息;同時(shí),視頻采集模塊也將上位機(jī)上傳來(lái)的控制信號(hào)解析為指定格式和功能的協(xié)議數(shù)據(jù),并通過(guò)串口發(fā)送到 STM32控制模塊。
小車上的STM32控制模塊在接收到相關(guān)控制信號(hào)后,調(diào)整輸出脈沖信號(hào)的占空比,由驅(qū)動(dòng)板轉(zhuǎn)換輸出電平后直接控制伺服電機(jī)或云臺(tái)模塊做出相應(yīng)的動(dòng)作,從而完成上位機(jī)用戶想要的操控功能。
控制信號(hào)協(xié)議對(duì)于只需要實(shí)現(xiàn)簡(jiǎn)單的小車控制的話,我們只需要實(shí)現(xiàn)通過(guò)串口向 STM32控制模塊發(fā)送控制信號(hào)即可,簡(jiǎn)單的控制信號(hào)協(xié)議如下:
命令類型 | 包頭 | 類型 | 命令 | 數(shù)據(jù) | 包尾 |
---|---|---|---|---|---|
停止 | FF | 00 | 00 | 00 | FF |
前進(jìn) | FF | 00 | 01 | 00 | FF |
后退 | FF | 00 | 02 | 00 | FF |
左轉(zhuǎn) | FF | 00 | 03 | 00 | FF |
右轉(zhuǎn) | FF | 00 | 04 | 00 | FF |
云臺(tái)上下 | FF | 01 | 01 | 角度值 | FF |
云臺(tái)左右 | FF | 01 | 02 | 角度值 | FF |
為了實(shí)現(xiàn)我們想要的實(shí)時(shí)視頻與小車的遠(yuǎn)程控制功能,我們需要采用聲網(wǎng)的視頻SDK,并運(yùn)行在 Android 開發(fā)板上。開發(fā)板,我們選用了Firefly的RK3128平臺(tái),采用Cortex-A7架構(gòu)四核1.3GHz處理器、Mali-400MP2 GPU,板載千兆以太網(wǎng)口、2.4GHz Wi-Fi和藍(lán)牙4.0,支持Android與Ubuntu雙系統(tǒng)。
為了實(shí)現(xiàn)RK3128對(duì)小車的控制,我們需要實(shí)現(xiàn) RK3128通過(guò) USB 轉(zhuǎn)串口模塊與STM32控制模塊通信。因此我們首先要重新配置RK3128內(nèi)核,使得RK3128支持 USB轉(zhuǎn)串口驅(qū)動(dòng)程序。
首先下載完RK3128 Android SDK并先驗(yàn)證文件MD5值:
md5sum /path/to/fireprime_android5.1_git_20180510.tar.gz fce0e6d65549939167923260142b2c1e fireprime_android5.1_git_20180510.tar.gz
確認(rèn)無(wú)誤后解壓:
mkdir -p ~/proj/fireprime cd ~/proj/fireprime tar xvf /path/to/fireprime_android5.1_git_20180510.tar.gz git reset --hard git remote add bitbucket https://bitbucket.org/T-Firefly/firenow-lollipop.git git pull bitbucket fireprime:fireprime
配置并編譯內(nèi)核:
cd ~/proj/fireprime/kernel make rk3128-fireprime_defconfig make menuconfig make -j8 rk3128-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 等常用串口工具設(shè)備。
編譯Android系統(tǒng):
cd ~/proj/fireprime . build.sh make -j8 ./mkimage.sh
最后編譯完成后燒錄分區(qū)鏡像,并插入U(xiǎn)SB轉(zhuǎn)串口工具查看系統(tǒng)dmesg是否出現(xiàn)以下log信息:
[ 2213.003173] usb 1-1.3: new full-speed USB device number 6 using rockchip_ehct [ 2213.113759] usb 1-1.3: New USB device found, idVendor=10c4, idProduct=ea60 [ 2213.113839] usb 1-1.3: New USB device strings: Mfr=1, Product=2, SerialNumbe3 [ 2213.113883] usb 1-1.3: Product: CP2102 USB to UART Bridge Controller [ 2213.113921] usb 1-1.3: Manufacturer: Silicon Labs [ 2213.113956] usb 1-1.3: SerialNumber: 0001 [ 2213.120813] cp210x 1-1.3:1.0: cp210x converter detected [ 2213.209852] usb 1-1.3: reset full-speed USB device number 6 using rockchip_et [ 2213.320161] usb 1-1.3: cp210x converter now attached to ttyUSB0
出現(xiàn)串口設(shè)備附著到 ttyUSBx,即說(shuō)明定制串口驅(qū)動(dòng)成功。
以上為全編譯Android SDK的方法,需要編譯 Android 系統(tǒng),相較于僅編譯內(nèi)核而言比較費(fèi)時(shí)。我們可以在上述make menuconfig時(shí)將需要的串口驅(qū)動(dòng)程序勾選為M,通過(guò)make modules的方法,將驅(qū)動(dòng)編譯成.ko文件,然后在 Android系統(tǒng)開機(jī)時(shí)自動(dòng)加載驅(qū)動(dòng)程序:
首先將.ko驅(qū)動(dòng)程序文件復(fù)制到 Android 文件系統(tǒng)內(nèi)
adb shell su mount -o remount ,rw / mkdir /modules chmod 777 /modules chown -R nobody:nobody /modules exit exit adb push ./xxxx.ko /modules
編寫啟動(dòng)運(yùn)行腳本/data/serial.sh
#!/system/bin/sh insmod /modules/xxxx.ko mknod /dev/ttyUSB c 240 0
修改init.rc并添加運(yùn)行自己的腳本
service serial /system/bin/sh /data/serial.sh user root oneshot在 App 端實(shí)現(xiàn)視頻傳輸
視頻傳輸和信令傳輸?shù)牟糠?,我們通過(guò)聲網(wǎng) Agora SDK 來(lái)實(shí)現(xiàn)。由于涉及到與嵌入式開發(fā)板的結(jié)合,我們主要參考的是聲網(wǎng)在 Github 提供的各種案例中的抓娃娃機(jī) demo。示例代碼中的結(jié)構(gòu)圖如下:
示例代碼有視頻傳輸?shù)牟糠郑刂菩帕钚枰约和瓿伞?/p>
兩個(gè)APP | 視頻 | 控制信號(hào) |
---|---|---|
小車端的 Android App | 發(fā)送視頻信號(hào) | 接受控制信號(hào) |
用戶手機(jī)端 Android App | 接受視頻信號(hào) | 發(fā)送控制信號(hào) |
首先申請(qǐng) AppID
AndroidAPP中在res/values/strings_config.xml加入如下內(nèi)容,將agora_app_id進(jìn)行配置
1a486ee31a30xxxxxxxxxx
將.jar文件拷貝到libs/中
因?yàn)橛玫叫帕詈鸵曨l傳輸兩部分,需要兩個(gè).jar 文件分別為agora-rtc-sdk.jar和agora-sig-sdk.jar
在src/main/jniLibs加入armeabi-v7a與其中的.so文件
并在build.gradle中確定擁有如下描述:
dependencies { compile fileTree(dir: "libs", include: ["*.jar"]) testCompile "junit:junit:4.12" compile "com.android.support:appcompat-v7:23.4.0" }
就此,使用示例代碼可以順利開啟視頻傳輸功能。
用信令讓 App 控制小車信令的具體使用方法見Agora 的參考,這里不進(jìn)行詳盡描述。主要使用的函數(shù)如下:
// 初始化信令 SDK m_agoraAPI = AgoraAPIOnlySignal.getInstance(context, appID); // 登錄 Agora 信令系統(tǒng) m_agoraAPI.login2(appId, account, token, uid, deviceID, retry_time_in_s, retry_count) //////////////點(diǎn)對(duì)點(diǎn)測(cè)試///////////// // 發(fā)送點(diǎn)對(duì)點(diǎn)消息 m_agoraAPI.messageInstantSend(account, uid, msg, msgID) // 設(shè)置對(duì)端收到消息回調(diào)( m_agoraAPI.onMessageInstantReceive(account, uid, msg){ //code there } /////////////頻道測(cè)試/////////////// // 加入頻道 m_agoraAPI.channelJoin(channelName) // 發(fā)送頻道消息 m_agoraAPI.messageChannelSend(channelName, msg, msgID) // 設(shè)置對(duì)端接收到頻道消息回調(diào) m_agoraAPI.onMessageChannelReceive(channelID, account, uid, msg) { // code there } ////////////////////////////////// // 退出 Agora 信令系統(tǒng) m_agoraAPI.logout()Android App 操作串口
對(duì)于小車端的 Android App 得到信令之后需要串口發(fā)送數(shù)據(jù)。因此如何實(shí)現(xiàn) Android App 操作串口。這里簡(jiǎn)述兩種方案:
采用 Android 系統(tǒng)給出的架構(gòu)進(jìn)行處理, Android 帶有串口demo代碼,名稱為 SerialPort。這里注意兩點(diǎn),此處的代碼依賴于 JNI 工具和 NDK,如果沒有完整安裝在使用項(xiàng)目代碼的時(shí)候會(huì)出現(xiàn)問(wèn)題。另外,串口操作不方便使用 Android 模擬器進(jìn)行測(cè)試,對(duì)于沒有串口的設(shè)備,在開啟串口的動(dòng)作時(shí),會(huì)報(bào)錯(cuò)并可能導(dǎo)致程序退出崩潰。
選擇使用 Android 代碼發(fā)送 shell 命令的方式,直接模擬linux的shell控制代碼,示例 echo ‘a(chǎn)a’ > /dev/ttyUSB0 將aa發(fā)送到串口ttyUSB0,這樣做的好處時(shí)代碼本身簡(jiǎn)單,串口直接調(diào)用底層。
對(duì)于短時(shí)間實(shí)現(xiàn)功能來(lái)說(shuō),方案2是更容易實(shí)現(xiàn)的方法,這里需要非常注意的一點(diǎn),需要重新編譯android的framework層給app賦予root權(quán)限
當(dāng)信令解析完成,串口調(diào)試通過(guò),就可以實(shí)現(xiàn)遠(yuǎn)程控制小車的行進(jìn)了。
為了實(shí)現(xiàn)用戶可以方便通過(guò)手機(jī)或者電腦在線實(shí)時(shí)看房,我們需要通過(guò)web端連接小車的Android App端,獲取實(shí)時(shí)傳輸過(guò)來(lái)的視頻內(nèi)容。在我們的設(shè)想中,用戶可以通過(guò)遠(yuǎn)程控制小車,這樣可以方便用戶了解房屋各個(gè)方面的情況。綜上所述,我們需要實(shí)現(xiàn)如下兩個(gè)功能:
具有視頻連接功能
具有遠(yuǎn)程遙控功能
幸運(yùn)的是,通過(guò)聲網(wǎng)提供的服務(wù),我們可以很便捷的搭建這兩個(gè)服務(wù)。
在本項(xiàng)目中,我們使用聲網(wǎng)的視頻SDK實(shí)現(xiàn)網(wǎng)頁(yè)端和小車APP端的視頻連接,通過(guò)信令SDK發(fā)送消息,去控制小車的前后左右行走和攝像頭上下左右擺動(dòng)。
羅列一下我們使用到的工具:
視頻通話的Web端SDK及文檔,用來(lái)實(shí)現(xiàn)遠(yuǎn)程的視頻交互功能;
信令的SDK及文檔,用來(lái)實(shí)現(xiàn)遠(yuǎn)程遙控智能小車;
服務(wù)器,用于部署靜態(tài)頁(yè)面;
實(shí)現(xiàn)視頻連接和發(fā)送消息先在頁(yè)面上引入視頻和信令的 SDK。然后我們先來(lái)實(shí)現(xiàn)視頻連接。
// 創(chuàng)建 AgoraRTC 實(shí)例并加入頻道 const client = AgoraRTC.CreateClient({mode:"interop"}) client.init(appId, function () { console.log("AgoraRTC client initialized"); client.join(channel_key, CHANNEL_NAME, null, function (uid) { console.log("User " + uid + " join channel successfully") console.log(new Date().toLocaleTimeString()) // do something } }
訂閱遠(yuǎn)端的視頻流并播放。
let stream = AgoraRTC.creatStream(merge(defaultConfig.config)) localStream.init(() =>{ client.on("stream-added", function (evt) { var stream = evt.stream; console.log("New stream added: " + stream.getId()); console.log("Subscribe ", stream); client.subscribe(stream, function (err) { console.log("Subscribe stream failed", err); }); }); client.on("stream-subscribed", function (evt) { var stream = evt.stream; console.log("Subscribe remote stream successfully: " + stream.getId()); if ($("div#video #agora_remote" + stream.getId()).length === 0) { $("div#video").append(""); } stream.play("agora_remote" + stream.getId()); }); })
實(shí)現(xiàn)發(fā)送信息。
// 創(chuàng)建信令的對(duì)象 const signal = Signal(appId) // 在實(shí)驗(yàn)條件下,不設(shè)置token const token = "_no_need_token" // 登錄 const session = signal.login(account, token) session.onLoginSuccess = (uid) => { //發(fā)送消息給指定的賬號(hào) signal.sendMessage(reciveAcount, message) }
完成上述的步驟之后,與小車端設(shè)置相同的appId和token(如有必要),設(shè)定好對(duì)應(yīng)的參數(shù),我們就可以遠(yuǎn)程控制小車并獲取視頻了。
Hacker 們用實(shí)際行動(dòng),說(shuō)明了 RTC 技術(shù)不僅僅可應(yīng)用于娛樂(lè)、社交、教育等領(lǐng)域,還可以迸發(fā)出更多新的創(chuàng)意。就在近期,Agora RTC Hack 還在全球其它城市火熱進(jìn)行中。有個(gè)人,也有來(lái)自創(chuàng)業(yè)公司的團(tuán)隊(duì)參賽并獲獎(jiǎng)。我們將邀請(qǐng)其中幾支來(lái)自世界各地的獲獎(jiǎng)團(tuán)隊(duì)參加到9月7日 - 8日舉行的 RTC 2018 實(shí)時(shí)互聯(lián)網(wǎng)大會(huì)。現(xiàn)場(chǎng)不僅有 Google WebRTC 產(chǎn)品經(jīng)理、華為多媒體實(shí)驗(yàn)室首席科學(xué)家、西北工業(yè)大學(xué)智能聲學(xué)與臨境通信中心首席科學(xué)家、Twitch 首席研發(fā)工程師、AVS 標(biāo)準(zhǔn)工作組組長(zhǎng)等技術(shù)大咖們帶來(lái)的干貨,還將有這些飽含創(chuàng)意與開發(fā)熱情的小項(xiàng)目。想與他們聊一聊,交個(gè)朋友么?點(diǎn)擊這里報(bào)名,現(xiàn)場(chǎng)約起來(lái)吧!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/76498.html
摘要:本文的三位作者正陽(yáng)海洋阿力,是來(lái)自不同公司的工程師,將與智能小車結(jié)合,開發(fā)了一款可實(shí)時(shí)視頻遠(yuǎn)程看房的創(chuàng)新性項(xiàng)目。用戶可以通過(guò)上位機(jī)或網(wǎng)頁(yè)前端控制小車前后左右移動(dòng)或控制云臺(tái)調(diào)整攝像頭方向。 本文的三位作者正陽(yáng)、海洋、阿力,是來(lái)自不同公司的工程師,將 Agora SDK 與智能小車結(jié)合,開發(fā)了一款可實(shí)時(shí)視頻遠(yuǎn)程看房的創(chuàng)新性項(xiàng)目。本文將從方案設(shè)計(jì)到具體實(shí)現(xiàn),詳實(shí)分享他們的開發(fā)經(jīng)驗(yàn)。三人也憑借...
閱讀 2122·2021-10-12 10:12
閱讀 831·2021-09-24 09:47
閱讀 1245·2021-08-19 11:12
閱讀 3538·2019-08-29 13:06
閱讀 747·2019-08-26 11:43
閱讀 2640·2019-08-23 17:20
閱讀 1198·2019-08-23 16:52
閱讀 2662·2019-08-23 14:27