一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

多方位玩轉(zhuǎn)“地平線(xiàn)新發(fā)布AIoT開(kāi)發(fā)板——旭日X3派(Sunrise X3 Pi)” 插電!開(kāi)機(jī)!輕松秒殺!

地瓜機(jī)器人 ? 2022-11-03 11:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一 整體結(jié)構(gòu)

下面給出了這個(gè)開(kāi)發(fā)板的整體的一個(gè)接口示意圖,固定孔位、尺寸和整體結(jié)構(gòu)的布局與樹(shù)莓派是極為相似的。個(gè)人感覺(jué),旭日3派最想拉過(guò)來(lái)樹(shù)莓派用戶(hù),希望吸引更多Jetson Nano用戶(hù)。

pYYBAGNjMDeANYitAAgeQ6Z5mks816.png

如何去理解這個(gè)開(kāi)發(fā)板,最直觀的比方,可以說(shuō)是:旭日3派≈樹(shù)莓派+神經(jīng)計(jì)算棒。它不像NVIDIA那樣有nvcc來(lái)開(kāi)發(fā)CUDA相關(guān)程序,沒(méi)有那么高的靈活度。但是它相比于樹(shù)莓派,多了5TOPS的深度學(xué)習(xí)計(jì)算能力。這對(duì)Jetson用戶(hù)來(lái)說(shuō)可能有點(diǎn)幼稚,但對(duì)樹(shù)莓派用戶(hù)來(lái)說(shuō)剛剛好(????)。

旭日X3派開(kāi)發(fā)板,為SoC系統(tǒng)級(jí)芯片,中心處理器采用的是ARM A53,其他ISP(圖像信號(hào)處理器)和BPU(人工智能處理器單元)均為自研,2GB的內(nèi)存,存儲(chǔ)使用TF卡,其他的一些參數(shù)去官網(wǎng)查看具體配置即可。

poYBAGNjMFCAJRYUAANo3JRkMEg601.png

前面已介紹,該開(kāi)發(fā)板三點(diǎn)大優(yōu)勢(shì)算力/功耗比高、重量輕、價(jià)格低。對(duì)于算力/功耗比,2.5W的基礎(chǔ)功耗提供了5TOPS的算力,下表給出一些同類(lèi)型的一些邊緣計(jì)算設(shè)備的一些配置。值得注意的是,神經(jīng)計(jì)算棒必須搭配其他開(kāi)發(fā)板使用。

pYYBAGNjMGuAdHjbAAbJSDz0_Lo068.png

這個(gè)表有幾點(diǎn)需要說(shuō)明下:

  • Jetson Nano查不到TOPS數(shù)據(jù),考慮到Nano的核心數(shù)是NX的1/3,因此根據(jù)NX的數(shù)據(jù)除以3作為Nano的TOPS數(shù)據(jù)。
  • 功耗一般為基礎(chǔ)功耗,非峰值功耗。
  • 價(jià)格為參考價(jià)。
  • 具體參數(shù)細(xì)節(jié)以個(gè)人使用為主哈,這里只是參考

在項(xiàng)目應(yīng)用中,如果其中檢測(cè)識(shí)別等相關(guān)處理算法,對(duì)實(shí)時(shí)要求不高,且對(duì)CPU要求不大的話(huà),非??梢栽囈幌滦袢臻_(kāi)發(fā)板。下面給出主要接口的說(shuō)明:

  • Type C電源:該開(kāi)發(fā)板可接入USB Type C線(xiàn)來(lái)供電,實(shí)際使用時(shí)可使用5V/2A的手機(jī)充電頭來(lái)用(充電頭功率高點(diǎn)能穩(wěn)定使用,低功率頭似乎無(wú)法提供穩(wěn)定的5V電壓)。
  • TF卡:開(kāi)發(fā)板系統(tǒng)需要從TF卡加載并運(yùn)行,用戶(hù)在使用開(kāi)發(fā)板前,需要先完成TF卡鏡像制作。推薦使用至少8GB容量的TF存儲(chǔ)卡,以便滿(mǎn)足Ubuntu操作系統(tǒng)及相關(guān)功能包的安裝要求。
  • HDMI接口:這個(gè)接口主要用于查看可視化結(jié)果,無(wú)鼠標(biāo),因?yàn)橄到y(tǒng)不具有桌面可視化能力,系統(tǒng)自己開(kāi)發(fā)了個(gè)功能,可以通過(guò)代碼將圖像數(shù)據(jù)輸出到HDMI方便查看。
  • 串口(用于登錄):接入串口線(xiàn),即可直接用遠(yuǎn)程的方式進(jìn)行登錄。
  • USB2.0/3.0:開(kāi)發(fā)板通過(guò)USB Hub、硬件開(kāi)關(guān)電路擴(kuò)展了多路USB接口,滿(mǎn)足用戶(hù)多路USB設(shè)備接入的需求。無(wú)法確定是否全部來(lái)自于一個(gè)USB,對(duì)于高吞吐量的設(shè)備比如Intel Realsense深度相機(jī),可能存在丟幀問(wèn)題,有待后續(xù)適配測(cè)試。
  • MIPI接口:開(kāi)發(fā)板提供1路MIPI CSI接口,可實(shí)現(xiàn)MIPI攝像頭的接入
  • 有線(xiàn)網(wǎng)口:千兆以太網(wǎng)接口,需要用命令行配置
  • 40PIN標(biāo)準(zhǔn)接口:開(kāi)發(fā)板提供40PIN標(biāo)準(zhǔn)接口,方便進(jìn)行外圍擴(kuò)展,其中數(shù)字IO采用3.3V電平設(shè)計(jì)。40PIN接口定義如下,有相關(guān)需求的可以測(cè)試一下。

poYBAGNjMHiAElr_AAJLMlj3b3M068.png

二 啟動(dòng)系統(tǒng)

下面,將完成系統(tǒng)的配置,完成系統(tǒng)的啟動(dòng)。

2.1 制作系統(tǒng)鏡像

開(kāi)發(fā)板目前支持Ubuntu 20.04 Server、Desktop兩個(gè)版本。注意,由于X3芯片不支持GPU硬件加速,因此使用Ubuntu Desktop版本時(shí),可能會(huì)因CPU渲染圖形桌面而造成系統(tǒng)負(fù)載過(guò)大,如對(duì)系統(tǒng)性能有較高要求,推薦使用不帶圖形桌面的Ubuntu Server版本,下面我就帶各位來(lái)使用Server版本的系統(tǒng)。

首先,準(zhǔn)備好一個(gè)TF卡(16G以上),和一個(gè)讀卡器,插到自己的筆記本上。我試用時(shí)候,提供了一個(gè)鏡像包x3pi_ubuntu_disk.tar.gz,解壓它得到一組文件,其中system_sdcard.img就是我們要刷的系統(tǒng)文件鏡像。

poYBAGNjMIKAaZieAAZr1p5Dudc022.png

鏡像刷錄我使用的是balenaEtcher工具,它是一款支持Windows/Mac/Linux等多平臺(tái)的啟動(dòng)盤(pán)制作工具,下載安裝好就可以進(jìn)行刷錄啦。

※第一步:選擇鏡像

pYYBAGNjMIyAb-9LAAHxp08-cUY408.png

※第二步:選擇TF卡。

poYBAGNjMJiAWcQIAADmcbx2KYI652.png

※第三步:刷機(jī)??!

pYYBAGNjMKGASxexAAEOnd2LJx0293.png

這幾步完成后,我們就完成了刷機(jī)工作,相當(dāng)簡(jiǎn)單吧φ(゜▽゜*)?。

2.2 進(jìn)入系統(tǒng)

刷完系統(tǒng)后,我們就可以把這張TF卡插回開(kāi)發(fā)板里面了。下面,我們要嘗試進(jìn)入系統(tǒng)。如果是刷機(jī)后第一次進(jìn)入系統(tǒng),一定要利用開(kāi)發(fā)板自帶的串口連接開(kāi)發(fā)板,配置好網(wǎng)絡(luò)后,后續(xù)可以不再利用串口登錄(如果網(wǎng)絡(luò)IP變了,那就重新用串口連接,查看下IP地址)。

※第零步:基礎(chǔ)準(zhǔn)備.

  • 將HDMI連接到一個(gè)1080P顯示器上(僅用于顯示圖像,無(wú)用戶(hù)操作)。我在實(shí)驗(yàn)中,使用了一個(gè)HDMI采集卡,可通過(guò)USB接到筆記本上,利用VLC來(lái)查看輸出圖像信息。
  • 將MIPI相機(jī)連接到開(kāi)發(fā)板上。
  • 將串口線(xiàn)的一段插在開(kāi)發(fā)板上。

pYYBAGNjMLOAF_YgAAg79Xl501k299.png

※第一步:串口連接系統(tǒng)

將串口線(xiàn)的另一端連接到筆記本上,看下設(shè)備管理器,若提示未知USB設(shè)備時(shí),說(shuō)明PC機(jī)未安裝串口驅(qū)動(dòng),驅(qū)動(dòng)程序可從地平線(xiàn)開(kāi)發(fā)者社區(qū)發(fā)布頁(yè)面https://developer.horizon.ai/resource獲取。驅(qū)動(dòng)安裝完成后,設(shè)備管理器可正常識(shí)別串口板端口

poYBAGNjMLyAM-pMAAGCdYgwgq4444.png

使用 MobaXterm 工具按照如下方式進(jìn)行配置,打開(kāi)后,由于設(shè)備沒(méi)插電,所以空白。

pYYBAGNjMMiAAKefAAHLoOmjhWs976.png

下面,將USB Type C電源線(xiàn),插入開(kāi)發(fā)板。這時(shí)候,控制臺(tái)就會(huì)輸出一堆文件,到最后,會(huì)需要輸入用戶(hù)名和密碼,默認(rèn)賬戶(hù)和密碼均為sunrise。如果開(kāi)發(fā)板HDMI正常顯示開(kāi)機(jī)畫(huà)面(Server系統(tǒng)顯示地平線(xiàn)logo、Desktop版本顯示系統(tǒng)桌面),說(shuō)明TF卡系統(tǒng)制作正確。

pYYBAGNjMNaAW3RPAAKugu-hDtw109.png

※第二步:BPU測(cè)試

開(kāi)發(fā)板已經(jīng)連接了一個(gè)MIPI相機(jī),下面使用官方示例來(lái)測(cè)試BPU模塊是否有效。先進(jìn)入示例程序文件夾cd /app/ai_inference/03_mipi_camera_sample/,然后輸入sudo python3 mipi_camera.py,注意一定要加sudo,調(diào)用BPU模塊需要管理員權(quán)限。

這時(shí)候,控制臺(tái)就會(huì)輸出一些檢測(cè)信息,對(duì)應(yīng)可視化效果由顯示器顯示。

poYBAGNjMOGAV9-aAAqqjE-xDaY968.png

※后話(huà):功耗分析

我分別對(duì)開(kāi)機(jī)時(shí),BPU檢測(cè)中,和檢測(cè)后的功耗進(jìn)行了分析。開(kāi)機(jī)后的功率在2.3W左右,利用BPU執(zhí)行了一個(gè)檢測(cè)示例,功耗升到3.6左右,結(jié)束后,功耗降為2.0W,這個(gè)原因比較詭異,可能是中止項(xiàng)目后,關(guān)閉了顯示輸出使得功耗下降。

poYBAGNjMP-AVDRUAAVKpC8raks409.png

至此,開(kāi)發(fā)板啟動(dòng)起來(lái)了,我們happy的進(jìn)行使用了。

poYBAGNjMQeADhM4AAB0gzwUe3A752.png

2.3 網(wǎng)絡(luò)配置

用串口來(lái)操作開(kāi)發(fā)板的話(huà),有幾個(gè)致命問(wèn)題:無(wú)法傳文件、命令過(guò)長(zhǎng)有bugVim使用不方便。因此,非常有必要把網(wǎng)絡(luò)配置好來(lái)進(jìn)行后續(xù)的調(diào)試開(kāi)發(fā)。

開(kāi)發(fā)板本身自帶無(wú)線(xiàn)模塊,同時(shí)也可以插網(wǎng)線(xiàn)以獲得更快的速度。下面給出這兩種模式的一個(gè)配置。

2.3.1 以太網(wǎng)配置

① 利用sudo nmcli dev查看網(wǎng)絡(luò)設(shè)備。輸入ifconfig發(fā)現(xiàn)IP地址是192.168.1.10,翻閱手冊(cè)發(fā)現(xiàn)開(kāi)發(fā)板以太網(wǎng)默認(rèn)采用靜態(tài)IP地址(192.168.1.10),以方便固定網(wǎng)絡(luò)環(huán)境下的使用,例如開(kāi)發(fā)板與PC機(jī)直連場(chǎng)景。但是,對(duì)于我來(lái)說(shuō),我需要?jiǎng)討B(tài)分配,因?yàn)樾@網(wǎng)整體就是局域網(wǎng),不需要網(wǎng)絡(luò)環(huán)境僅局限在電腦、開(kāi)發(fā)板之間

pYYBAGNjMRWAJ0n7AAB10a8TZS8671.png

以下的配置,是想讓開(kāi)發(fā)板的IP地址由學(xué)校路由器分配得到,不需要靜態(tài)IP

② 創(chuàng)建一個(gè)新的以太網(wǎng)鏈接

考慮到串口連接,輸入的命令不能過(guò)長(zhǎng),則先利用sudo -i切換為root(操作完后利用su sunrise切換回去),然后在命令行中輸入nmcli con add con-name "ethdhcp" type ethernet ifname eth0,這樣可以使用dhcp獲取網(wǎng)絡(luò),其中"ethdhcp"為網(wǎng)絡(luò)名,用戶(hù)可以自定義。這時(shí)候,我們發(fā)現(xiàn),CONNECTION部分已經(jīng)變了,且IP地址變?yōu)樽詣?dòng)分配的了。

pYYBAGNjMSWAXhD7AAGFKxHZGRo157.png

以太網(wǎng)有個(gè)大問(wèn)題,就是連接校園網(wǎng)時(shí)候,由于沒(méi)有用戶(hù)界面,因此賬號(hào)的登錄,可能需要利用Python腳本去完成,或者讓校園網(wǎng)插在路由器上完成中轉(zhuǎn),如果是個(gè)人路由器的話(huà),這種問(wèn)題一般不存在。

2.3.2 無(wú)線(xiàn)網(wǎng)配置

無(wú)線(xiàn)網(wǎng)絡(luò)的連接參考博客《Linux命令行連接WiFi(全網(wǎng)最簡(jiǎn)單的方法)》。

① 利用sudo nmcli radio wifi on開(kāi)啟wifi。

② 利用sudo nmcli dev wifi掃描wifi。其中,nova 9 Pro 為個(gè)人用手機(jī)開(kāi)的熱點(diǎn)

pYYBAGNjMTOAbf1YAACtQh4pRs8794.png

③ 利用sudo nmcli dev wifi connect "wifi名" password "密碼"連接WIFI。將wifi的賬號(hào)密碼套在這個(gè)命令里,即可成功連接上Wifi。

poYBAGNjMWmACH1nAADB6o3sRMI137.png

無(wú)線(xiàn)網(wǎng)最大的問(wèn)題就是它的速度真的太慢了,我手上的這個(gè)版本速度約為300KB/s,自己外加個(gè)天線(xiàn)能夠減低遠(yuǎn)程操作的延遲,這個(gè)問(wèn)題已反饋,據(jù)說(shuō)發(fā)布后的板子不存在這個(gè)問(wèn)題。

三 CPU項(xiàng)目測(cè)試

無(wú)論什么開(kāi)發(fā)板,基于CPU相關(guān)的程序的穩(wěn)定性至關(guān)重要。因此,非常有必要去測(cè)試USB、串口、Wifi等相關(guān)的有效性以及穩(wěn)定性。該部分的測(cè)試,一是測(cè)試項(xiàng)目的一些基本功能,其次是測(cè)試自己做項(xiàng)目中使用的一些算法,來(lái)分析整體系統(tǒng)的一個(gè)性能。

由于刷機(jī)時(shí)選擇的是Ubuntu Server,所以帶有界面相關(guān)的程序均無(wú)法使用。如果想在Server上部署界面端,40PIN接口上有SPI接口,可以購(gòu)置SPI液晶屏來(lái)開(kāi)發(fā)。

3.1 使用注意事項(xiàng)

  • 第一次使用記得要sudo apt-get update,默認(rèn)清華源速度還是可以的。
  • VSCode可以使用但不建議(占用600M左右的內(nèi)存,總共內(nèi)存在2G)。
  • 通過(guò)arch指令,可查得當(dāng)前系統(tǒng)的架構(gòu)為aarch64
  • 系統(tǒng)自帶了個(gè)輕量版OpenCV但不夠用,還是得通過(guò)指令sudo apt-get install libopencv-dev安裝個(gè)完整的OpenCV。
  • 通過(guò)指令sudo apt-get install mlocate安裝locate,方便用來(lái)查找某些文件的地址。
  • 系統(tǒng)默認(rèn)沒(méi)有g(shù)it,通過(guò)sudo apt-get install git來(lái)方便下載代碼
  • 利用htop可以查看CPU和內(nèi)存的利用情況

3.2 HDMI可視化圖像數(shù)據(jù)

由于系統(tǒng)里面并不包含圖形界面,因此如果動(dòng)態(tài)地看算法的檢測(cè)效果的話(huà),就需要將圖像數(shù)據(jù)輸出到HDMI來(lái)顯示,系統(tǒng)自帶的python包里面有個(gè)類(lèi)libsrcampy.Display就是來(lái)完成這樣的工作的。

為了方便各位后續(xù)可視化自己的算法,我將這個(gè)功能封裝為一個(gè)class

poYBAGNjMXOAVE9kAAM5tnsd8xQ601.png

class ImageShow(object):
    # 初始化,screen_w和screen_h表示HDMI輸出支持的顯示器分辨率
    def __init__(self, screen_w = 1920, screen_h = 1080):
        super().__init__()
        self.screen_w = screen_w
        self.screen_h = screen_h
        self.disp = srcampy.Display()
        self.disp.display(0, screen_w, screen_h)
     
    # 結(jié)束顯示
    def close(self):
        self.disp.close()
        
    # 顯示圖像,輸入image即可
    def show(self, image, wait_time=0):
        imgShow = self.putImage(image, self.screen_w, self.screen_h)
        imgShow_nv12 = self.bgr2nv12_opencv(imgShow)
        self.disp.set_img(imgShow_nv12.tobytes())
    
    # 私有函數(shù),將圖像數(shù)據(jù)轉(zhuǎn)換為用于HDMI輸出的數(shù)據(jù)
    @classmethod
    def bgr2nv12_opencv(cls, image):
        height, width = image.shape[0], image.shape[1]
        area = height * width
        yuv420p = cv2.cvtColor(image, cv2.COLOR_BGR2YUV_I420).reshape((area * 3 // 2,))
        y = yuv420p[:area]
        uv_planar = yuv420p[area:].reshape((2, area // 4))
        uv_packed = uv_planar.transpose((1, 0)).reshape((area // 2,))
        nv12 = np.zeros_like(yuv420p)
        nv12[:height * width] = y
        nv12[height * width:] = uv_packed
        return nv12
    
    # 圖像數(shù)據(jù)在顯示器最大化居中
    @classmethod
    def putImage(cls, img, screen_width, screen_height):
        if len(img.shape) == 2:
            imgT = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
        else:
            imgT = img
        irows, icols = imgT.shape[0:2]
        scale_w = screen_width * 1.0/ icols
        scale_h = screen_height * 1.0/ irows
        final_scale = min([scale_h, scale_w])
        final_rows = int(irows * final_scale)
        final_cols = int(icols * final_scale)
        print(final_rows, final_cols)
        imgT = cv2.resize(imgT, (final_cols, final_rows))
        diff_rows = screen_height - final_rows
        diff_cols = screen_width - final_cols
        img_show = np.zeros((screen_height, screen_width, 3), dtype=np.uint8)
        img_show[diff_rows//2:(diff_rows//2+final_rows), diff_cols//2:(diff_cols//2+final_cols), :] = imgT
        return img_show

下面給出視頻和圖像的測(cè)試方法,相機(jī)用的是MIPI相機(jī)

def test_show_image():
    img = cv2.imread('00000160.png') # 加載本地圖片
    im_show = ImageShow()  # 初始化顯示
    im_show.show(img)  # 顯示圖像
    time.sleep(1)
    im_show.close()
    
def test_mipi_camera():
    im_show = ImageShow()
    cam = srcampy.Camera() # 定義相機(jī)類(lèi)型
    cam.open_cam(0, 1, 30, 1920, 1080) # 設(shè)置相機(jī)采集所用的參數(shù)
    while True:
        origin_image = cam.get_img(2, 1920, 1080) # 獲取相機(jī)數(shù)據(jù)流
        origin_nv12 = np.frombuffer(origin_image, dtype=np.uint8).reshape(1620, 1920)
        # origin_bgr = cv2.cvtColor(origin_nv12, cv2.COLOR_YUV420SP2BGR)
        # 圖像雖然是RGB實(shí)際上是BGR,問(wèn)題已反饋
        origin_bgr = cv2.cvtColor(origin_nv12, cv2.COLOR_YUV420SP2RGB) 
        im_show.show(origin_bgr)
    
    im_show.close()

對(duì)這兩個(gè)函數(shù)分別測(cè)試,這時(shí)候顯示屏就會(huì)出現(xiàn)對(duì)應(yīng)可視化結(jié)果,這樣就完成數(shù)據(jù)可視化所需的一些工作(視頻流圖像顯示這部分,功耗占了1W,CPU占用30%左右,顯示這部分的代碼還是有點(diǎn)冗余)。

pYYBAGNjMYOAdlFqAAjTj-1TxEU671.png

3.3 QT項(xiàng)目測(cè)試——串口轉(zhuǎn)Wifi

之前有個(gè)項(xiàng)目,要求無(wú)人機(jī)與地面站直接的通信由之前的數(shù)傳改為wifi,搜了一圈,很多都屬于手工調(diào)試,而且包含復(fù)雜的界面。然而實(shí)際需求要求穩(wěn)定,自動(dòng)化。因此為了滿(mǎn)足這個(gè)需求只能是自己開(kāi)發(fā)一個(gè)小工具。該項(xiàng)目的細(xì)節(jié)部分參考博客串口轉(zhuǎn)wifi —— 兩個(gè)串口之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信

該工具可測(cè)試板子的串口模塊和Wifi模塊的穩(wěn)定性。

① 利用minicom測(cè)試串口。第一次使用可利用命令sudo apt-get install minicom安裝相關(guān)工具,將開(kāi)發(fā)板的4-5針頭,也就是串口的收發(fā)接頭短接。這樣接收到的信息又會(huì)發(fā)送出去。

poYBAGNjMY2AcI5KAAd233_m_AM533.png

② 編譯uart2net工具。按順序執(zhí)行以下相關(guān)代碼:

sudo apt-get install qt5-default
sudo apt-get install libqt5serialport5-dev
git clone https://github.com/Li-Zhaoxi/uart2net
cd uart2net
qmake uart2net.pro
make all -j4

③ 配置uart2net.ini文件。注意串口和IP地址的相關(guān)配置。

pYYBAGNjMZeAByVcAAH04zaZaaY121.png

④ 啟動(dòng)uart2net。

  • 服務(wù)端為個(gè)人筆記本,使用了串口調(diào)試助手+虛擬串口模擬串口數(shù)據(jù)的輸入。
  • 客戶(hù)端為旭日3派板子,由于/dev/ttyS3收發(fā)已短接,因此,接收到什么數(shù)據(jù)就會(huì)發(fā)送出去。

最后測(cè)試數(shù)據(jù)的輸出與博客串口轉(zhuǎn)wifi —— 兩個(gè)串口之間通過(guò)網(wǎng)絡(luò)進(jìn)行通信是一樣的這里就不再進(jìn)行敘述了。

測(cè)試時(shí)候發(fā)現(xiàn)個(gè)問(wèn)題,由于Wifi傳輸有一定的延遲,如果每10ms就發(fā)送幾十個(gè)字節(jié)的數(shù)據(jù)的話(huà),會(huì)造成大量數(shù)據(jù)的阻塞,后續(xù)在應(yīng)用時(shí)候注意數(shù)據(jù)傳輸不要過(guò)快,過(guò)多,否則會(huì)造成幾秒的延遲。

3.4 C++項(xiàng)目測(cè)試——圓形結(jié)構(gòu)檢測(cè)

部分項(xiàng)目應(yīng)用中需要檢測(cè)場(chǎng)景中的橢圓目標(biāo),因此將算法移植到這個(gè)板子上,以方便測(cè)試檢測(cè)效果與實(shí)時(shí)性,通過(guò)命令git clone https://github.com/Li-Zhaoxi/AAMED下載橢圓檢測(cè)代碼。

① 編譯python代碼模塊aamed.so。按照下面的方式配置好setup.py文件之后,cd python進(jìn)入python文件夾,執(zhí)行python3 setup.py build_ext --inplace編譯算法模塊。需要修改代碼的部分如下所示,直接替換即可。

opencv_include = "/usr/include/opencv4/"
opencv_lib_dirs = "/usr/lib/aarch64-linux-gnu/"
ext_modules = [
    Extension(
        "pyAAMED",
        ["../src/adaptApproximateContours.cpp",
         "../src/adaptApproxPolyDP.cpp",
         "../src/Contours.cpp",
         "../src/EllipseNonMaximumSuppression.cpp",
         "../src/FLED.cpp",
         "../src/FLED_drawAndWriteFunctions.cpp",
         "../src/FLED_Initialization.cpp",
         "../src/FLED_PrivateFunctions.cpp",
         "../src/Group.cpp",
         "../src/LinkMatrix.cpp",
         "../src/Node_FC.cpp",
         "../src/Segmentation.cpp",
         "../src/Validation.cpp",
         "aamed.pyx"],
        include_dirs = [numpy_include,'FLED', opencv_include],
        language='c++',
        libraries=['opencv_core', 'opencv_highgui', 'opencv_imgproc', 'opencv_imgcodecs', 'opencv_flann'],
        library_dirs=[opencv_lib_dirs]
        ),
    ]

② 調(diào)用MIPI攝像頭實(shí)現(xiàn)檢測(cè)。我在測(cè)試時(shí)候出現(xiàn)了一個(gè)錯(cuò)誤cannot allocate memory in static TLS block Python,把python頭文件的順序調(diào)整了下就OK了。下面給出我的測(cè)試代碼。

我在顯示屏上放上了待檢測(cè)的照片,讓mipi相機(jī)去拍顯示器完成檢測(cè)過(guò)程

from hobot_vio import libsrcampy as srcampy
import cv2
import numpy as np
import time
from pyAAMED import pyAAMED
# 這里把前面的HDMI可視化部分的代碼貼上
# 復(fù)制類(lèi)class ImageShow(object)

# 檢測(cè)主程序
def test_mipi_camera():
    im_show = ImageShow()
    cam = srcampy.Camera()
    cam.open_cam(0, 1, 30, 1920, 1080)
    aamed = pyAAMED(550, 970)
    aamed.setParameters(3.1415926/3, 3.4,0.77) # 閾值設(shè)置,如果假橢圓過(guò)多,可適當(dāng)調(diào)高0.77
    while True:
        origin_image = cam.get_img(2, 1920, 1080)
        origin_nv12 = np.frombuffer(origin_image, dtype=np.uint8).reshape(1620, 1920)
        origin_bgr = cv2.cvtColor(origin_nv12, cv2.COLOR_YUV420SP2RGB)
        imgG = cv2.resize(cv2.cvtColor(origin_bgr, cv2.COLOR_BGR2GRAY), (960, 540))
        imgGC = cv2.cvtColor(imgG, cv2.COLOR_GRAY2BGR)
        t1 = cv2.getTickCount()
        res = aamed.run_AAMED(imgG) # 檢測(cè)部分代碼
        t2 = cv2.getTickCount()
        print('time consumption(ms):', (t2 - t1) * 1000 / cv2.getTickFrequency())
        for each_elp in res:
            cv2.ellipse(imgGC, ((each_elp[1], each_elp[0]), (each_elp[3], each_elp[2]), -each_elp[4]), (0, 0, 255), 2)
        im_show.show(imgGC)
    im_show.close()

test_mipi_camera()

下面是檢測(cè)耗時(shí)和效果圖,檢測(cè)的圖像分辨率為960×540,這個(gè)時(shí)耗幾乎在37ms左右,也能滿(mǎn)足一些基本的算法需求。

time consumption(ms): 36.989471
time consumption(ms): 37.507962
time consumption(ms): 36.99551
time consumption(ms): 43.346158
time consumption(ms): 37.378966
time consumption(ms): 38.764665
time consumption(ms): 38.915905
time consumption(ms): 25.642136
time consumption(ms): 49.384246

pYYBAGNjMaeAcas8AAWFDJ26fvo316.png

3.5 小結(jié)

至此,開(kāi)發(fā)板CPU的部分相關(guān)所需功能均已測(cè)試完畢,總體來(lái)說(shuō),基本能滿(mǎn)足大部分輕量型算法的需求,除了Wifi部分延遲較高,其余我覺(jué)得均已經(jīng)足夠適應(yīng)大部分的任務(wù)了。我個(gè)人非常喜歡操作HDMI顯示圖像的方式,降低帶有桌面系統(tǒng)帶來(lái)的性能損耗,極大的給算法留出更多的計(jì)算量。

四 BPU項(xiàng)目測(cè)試

開(kāi)發(fā)板中的BPU部分為自研芯片,部分深度學(xué)習(xí)網(wǎng)絡(luò)層從硬件的角度進(jìn)行了加速。因此,這個(gè)開(kāi)發(fā)板核心在于部署。在前文進(jìn)入系統(tǒng)部分中,通過(guò)cd /app/ai_inference/03_mipi_camera_sample/和sudo python3 mipi_camera.py已經(jīng)展示了系統(tǒng)自帶的檢測(cè)效果。

4.1 基本操作

  • 查看BPU使用率。?使用sudo watch -n 1 hrut_somstatus命令可以查看當(dāng)前開(kāi)發(fā)板的bpu使用率,在運(yùn)行mipi_camera.py的時(shí)候,可執(zhí)行該命令獲得BPU利用情況。

pYYBAGNjMg6ASWbKAACjiYJoabE503.png

  • 查看CPU使用率。盡管hrut_somstatus已經(jīng)提供了CPU的利用率情況,但我還是覺(jué)得htop效果更直觀???。

poYBAGNjMhmAEu1AAAF0soZA8g0096.png


這些操作,主要是用來(lái)查看算法的資源占用率的,初級(jí)功能。后續(xù)非常期待官方出一個(gè)類(lèi)似jetson的jtop工具,jtop的參考鏈接為jetson_stats。

4.2 已有模型測(cè)試

由于開(kāi)發(fā)板的特殊性,利用pytorch訓(xùn)練好的模型,是無(wú)法直接用在這個(gè)板子上的,官方將一堆常見(jiàn)的模型參數(shù)進(jìn)行了轉(zhuǎn)換。在裝好的系統(tǒng)中,有兩個(gè)可直接使用的模型。fcos用于目標(biāo)檢測(cè),mobilenetv1用于目標(biāo)分類(lèi)。

poYBAGNjMiOAaLZMAABIjne48Uc310.png

在開(kāi)發(fā)板的/app/ai_inference/01_basic_sample/路徑下,提供了一個(gè)示例test_mobilenetv1.py,下面對(duì)其中的主函數(shù)部分進(jìn)行一個(gè)介紹,部分核心功能的解釋寫(xiě)在代碼注釋里面了。這部分通過(guò)opencv的cv2.getTickCount()和cv2.getTickFrequency()可測(cè)出,耗時(shí)約為9ms??!

# 主函數(shù)代碼前面還包含如下子函數(shù),用于數(shù)據(jù)轉(zhuǎn)換,參數(shù)輸出等。
# bgr2nv12_opencv、print_properties、get_hw
if __name__ == '__main__':
    # 1. 加載模型,用于BPU加速計(jì)算的模型為一個(gè)*.bin文件,里面包含了模型的所有信息
    models = dnn.load('../models/mobilenetv1_224x224_nv12.bin')
    # 2. 輸出模型的Input和output信息
    #   ========== inputs[0] properties ==========
    print("=" * 10, "inputs[0] properties", "=" * 10)
    # 輸出模型的輸入信息,輸出信息如下
    # tensor type: NV12_SEPARATE
    # data type: uint8 
    # layout: NCHW
    # shape: (1, 3, 224, 224)
    # inputs[0] name is: data
    print_properties(models[0].inputs[0].properties)
    print("inputs[0] name is:", models[0].inputs[0].name)
    # ========== outputs[0] properties ==========
    print("=" * 10, "outputs[0] properties", "=" * 10)
    # 這里輸出模型的輸出信息,輸出內(nèi)容如下:
    # tensor type: float32
    # data type: float32
    # layout: NCHW
    # shape: (1, 1000, 1, 1)
    # outputs[0] name is: prob
    print_properties(models[0].outputs[0].properties)
    print("outputs[0] name is:", models[0].outputs[0].name)

	# 3. 加載圖像數(shù)據(jù),前面已經(jīng)輸出了模型需要的輸入數(shù)據(jù)尺寸和數(shù)據(jù)類(lèi)型
	# 因此,先利用cv2.resize將圖像轉(zhuǎn)換為目標(biāo)大小尺寸
	# 再利用bgr2nv12_opencv將圖像數(shù)據(jù)轉(zhuǎn)為NV12形式(個(gè)人理解是壓縮了圖像數(shù)據(jù),減少了傳輸時(shí)間)。
    img_file = cv2.imread('./zebra_cls.jpg')
    h, w = get_hw(models[0].inputs[0].properties)
    des_dim = (w, h)
    resized_data = cv2.resize(img_file, des_dim, interpolation=cv2.INTER_AREA)
    nv12_data = bgr2nv12_opencv(resized_data)
	# 4. 將圖像的NV12數(shù)據(jù)傳入模型中,完成了整體的推理過(guò)程
    outputs = models[0].forward(nv12_data)
    # 下面將模型預(yù)測(cè)信息打印輸出
	# ========== Get output[0] numpy data ==========
	# output[0] buffer numpy info:
	# shape:  (1, 1000, 1, 1)
	# dtype:  float32
	# ========== Classification result ==========
	# cls id: 340 Confidence: 0.991851
    print("=" * 10, "Get output[0] numpy data", "=" * 10)
    print("output[0] buffer numpy info: ")
    print("shape: ", outputs[0].buffer.shape)
    print("dtype: ", outputs[0].buffer.dtype)
    # print("First 10 results:", outputs[0].buffer[0][:10])

    print("=" * 10, "Classification result", "=" * 10)
    assert np.argmax(outputs[0].buffer) == 340
    print("cls id: %d Confidence: %f" % (np.argmax(outputs[0].buffer), outputs[0].buffer[0][np.argmax(outputs[0].buffer)]))

其實(shí)要把模型裝板里,攏共分三步:

  • 加載模型。模型格式為*.bin文件,需要利用地平線(xiàn)的天工開(kāi)物平臺(tái)轉(zhuǎn)換得到。
  • 加載圖像數(shù)據(jù)。圖像的加載利用opencv即可完成。獲取數(shù)據(jù)之后,轉(zhuǎn)換為目標(biāo)尺寸、NV12數(shù)據(jù)即可直接輸入到加載好的模型中。
  • 直接推理。outputs = models[0].forward(nv12_data)即可完成推理,這部分很簡(jiǎn)單。

4.3 個(gè)人模型部署概述

上面介紹了如何將 大象 模型裝進(jìn)BPU里→_→, 其實(shí)對(duì)個(gè)人來(lái)說(shuō),最難的就是如何獲得*.bin文件。這里我其實(shí)無(wú)法一步步的引導(dǎo)各位如何部署自己的模型,因?yàn)檫@里的部署過(guò)程需要利用地平線(xiàn)開(kāi)發(fā)的天工開(kāi)物工具鏈,部署教程參考文檔:Horizon AI Toolchain User Guide。對(duì)我來(lái)說(shuō),這部分東西太多,學(xué)習(xí)成本太大了,裝進(jìn)這個(gè)博客里有點(diǎn)太多了(多寫(xiě)個(gè)博客可以白嫖更多瀏覽量 )。

深度學(xué)習(xí)用的比較多的還是pytorch,模型可以轉(zhuǎn)換為onnx模型文件,這個(gè)模型文件我覺(jué)得還是非常通用的,tensorRT和Intel的神經(jīng)計(jì)算棒都利用了這個(gè)文件。

模型轉(zhuǎn)換的目的就是檢查模型文件中的網(wǎng)絡(luò)層是否包含在BPU支持的層中(BPU本質(zhì)上是從硬件的角度加速模型的計(jì)算,是一個(gè)專(zhuān)用工具),如果某些層不存在,這些層就需要利用CPU完成推理。

實(shí)際上,為了保證模型遷移的可靠性,整個(gè)上有以下幾個(gè)關(guān)鍵過(guò)程:

① 模型準(zhǔn)備。這些模型一般都是基于公開(kāi)深度學(xué)習(xí)訓(xùn)練框架得到的, 需要將模型導(dǎo)出為開(kāi)發(fā)板支持的格式,目前轉(zhuǎn)換工具支持的深度學(xué)習(xí)框架如下。Caffe導(dǎo)出的caffemodel是直接支持的(Caffe是基于C++的,代碼相當(dāng)優(yōu)美,非常適合硬件轉(zhuǎn)換); PyTorch、TensorFlow和MXNet是通過(guò)轉(zhuǎn)到ONNX實(shí)現(xiàn)間接支持。

pYYBAGNjMkCAAxbfAABFdySKP3s807.png

② 模型驗(yàn)證。用來(lái)確保提出的算法模型是符合BPU要求的,開(kāi)發(fā)平臺(tái)提供了hb_mapper checker來(lái)完成模型的檢查。 不滿(mǎn)足遷移的層,就需要手動(dòng)調(diào)整,最簡(jiǎn)單的辦法就是這部分轉(zhuǎn)到CPU來(lái)跑(數(shù)據(jù)傳輸上存在大量時(shí)間浪費(fèi)),因此還是盡可能將這部分轉(zhuǎn)到BPU上( ,科研和落地還是有很大差距的)。

③ 模型轉(zhuǎn)換。這個(gè)階段會(huì)將浮點(diǎn)模型轉(zhuǎn)為可用BPU使用的模型,利用函數(shù)hb_mapper makertbin完成轉(zhuǎn)換,轉(zhuǎn)換成功后,得到的模型就可以運(yùn)行在開(kāi)發(fā)板上了。

模型轉(zhuǎn)換,不一定就能保證一定就能跑起來(lái),精度和性能都不敢說(shuō)保證與開(kāi)發(fā)中的結(jié)果是一樣的,因此需要進(jìn)行驗(yàn)證和調(diào)試。NVIDIA其實(shí)也有類(lèi)似的工作,就是tensorRT,加速必有一定程度的損失,這些不可避免,這些其實(shí)涉及到數(shù)值分析的內(nèi)容。這部分有需要的話(huà),可以參考模型性能分析與調(diào)優(yōu)模型精度分析與調(diào)優(yōu)。

原作者:小璽璽

原鏈接:原文詳見(jiàn)地平線(xiàn)開(kāi)發(fā)者社區(qū)

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 測(cè)試
    +關(guān)注

    關(guān)注

    8

    文章

    5705

    瀏覽量

    128856
  • 嵌入式
    +關(guān)注

    關(guān)注

    5152

    文章

    19673

    瀏覽量

    317536
  • 人工智能
    +關(guān)注

    關(guān)注

    1806

    文章

    49018

    瀏覽量

    249464
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    【Banana Pi BPI-RV2開(kāi)發(fā)板試用體驗(yàn)】開(kāi)箱上

    BPI-RV2 RISC-V開(kāi)源路由器之開(kāi)箱上 背景 現(xiàn)在剛好正在研究短距及網(wǎng)絡(luò)相關(guān)的東東。 最近剛好有幸得到了一塊香蕉 BPI-RV2 RISC-V 開(kāi)源路由器開(kāi)發(fā)板。感謝電子發(fā)燒友
    發(fā)表于 06-26 19:51

    韻樂(lè)Vinal X3/X5卡拉OK音頻處理器調(diào)音軟件簡(jiǎn)介

    韻樂(lè)Vinal X3/X5卡拉OK音頻處理器調(diào)音軟件軟件簡(jiǎn)介韻樂(lè)Vinal X3/X5調(diào)音軟件具有音箱處理器功能的卡拉ok效果器每個(gè)功能部分都獨(dú)立可調(diào)且有相應(yīng)的PC界面可直觀調(diào)節(jié)易于操
    發(fā)表于 05-16 15:33 ?1次下載

    RDK X3 帶飛的智能護(hù)理系統(tǒng):讓機(jī)器人秒變貼心小棉襖

    濟(jì)往開(kāi)來(lái)團(tuán)隊(duì)帶著超燃黑科技來(lái)了!基于 RDK X3 開(kāi)發(fā)的老年智能監(jiān)控系統(tǒng),跌倒秒報(bào)警、手勢(shì)一鍵呼叫、還能陪嘮嗑!最絕的是 開(kāi)源代碼直接甩鏈接 ,技術(shù)黨狂喜!
    的頭像 發(fā)表于 05-09 21:53 ?269次閱讀
    RDK <b class='flag-5'>X3</b> 帶飛的智能護(hù)理系統(tǒng):讓機(jī)器人秒變貼心小棉襖

    地平線(xiàn)城區(qū)輔助駕駛系統(tǒng)HSD解讀

    近日,在2025地平線(xiàn)年度產(chǎn)品發(fā)布會(huì)上,地平線(xiàn)城區(qū)輔助駕駛系統(tǒng)HSD正式發(fā)布。作為國(guó)內(nèi)首個(gè)軟硬結(jié)合全棧開(kāi)發(fā)的城區(qū)輔助駕駛系統(tǒng),
    的頭像 發(fā)表于 04-22 14:44 ?647次閱讀

    HMC-XTB110 無(wú)源x3倍頻器,24-30GHz輸入技術(shù)手冊(cè)

    HMC-XTB110是一款單芯片x3無(wú)源倍頻器,采用GaAs肖特基二極管技術(shù),具有低轉(zhuǎn)換損耗和高度Fo隔離。 這款寬帶x3倍頻器無(wú)需直流電源,適用于低頻率的3倍頻率比直接生成高頻率更加經(jīng)濟(jì)的大規(guī)模
    的頭像 發(fā)表于 04-16 16:15 ?330次閱讀
    HMC-XTB110 無(wú)源<b class='flag-5'>x3</b>倍頻器,24-30GHz輸入技術(shù)手冊(cè)

    九號(hào)公司Segway Navimow X3割草機(jī)器人獲TüV萊茵&quot;高效割草&quot;Quality-mark認(rèn)證

    巴黎當(dāng)?shù)貢r(shí)間4月1日,九號(hào)公司(Segway-Ninebot)旗下子公司未嵐大陸在巴黎舉辦產(chǎn)品發(fā)布會(huì),發(fā)布其最新款割草機(jī)器人Segway Navimow X3。該產(chǎn)品獲國(guó)際獨(dú)立第三方檢測(cè)、檢驗(yàn)和認(rèn)證
    的頭像 發(fā)表于 04-14 15:07 ?431次閱讀
    九號(hào)公司Segway Navimow <b class='flag-5'>X3</b>割草機(jī)器人獲TüV萊茵&quot;高效割草&quot;Quality-mark認(rèn)證

    地平線(xiàn)與上汽集團(tuán)深化戰(zhàn)略合作

    近日,上汽集團(tuán)舉辦“懂車(chē)更懂你·2025上汽之夜”活動(dòng),地平線(xiàn)創(chuàng)始人兼CEO余凱博士受邀發(fā)表主旨演講。作為地平線(xiàn)第一大機(jī)構(gòu)股東,上汽集團(tuán)在發(fā)布會(huì)上表示將繼續(xù)拓展與地平線(xiàn)等頭部企業(yè)的合作
    的頭像 發(fā)表于 04-12 09:07 ?540次閱讀

    “你的錢(qián)來(lái)了”:財(cái)神1號(hào),RDK X3驅(qū)動(dòng),自動(dòng)撿錢(qián)不手軟!

    采用 RDK X3 打造無(wú)情的撿錢(qián)機(jī)器,每天8億紙幣掉在路面上,財(cái)神1號(hào)幫你撿個(gè)夠!
    的頭像 發(fā)表于 02-18 11:15 ?594次閱讀
    “你的錢(qián)來(lái)了”:財(cái)神1號(hào),RDK <b class='flag-5'>X3</b>驅(qū)動(dòng),自動(dòng)撿錢(qián)不手軟!

    地平線(xiàn)SuperDrive相關(guān)問(wèn)答

    近日,地平線(xiàn)SuperDrive智駕百人團(tuán)體驗(yàn)活動(dòng)圓滿(mǎn)落幕,現(xiàn)場(chǎng)130余家媒體對(duì)地平線(xiàn)SuperDrive表現(xiàn)出濃厚的興趣并提出了諸多問(wèn)題。對(duì)此,地平線(xiàn)特意整理了大家提出的典型問(wèn)題并進(jìn)行解答,希望能幫助大家更全面地了解這套擬人的
    的頭像 發(fā)表于 01-21 10:15 ?483次閱讀

    Cadence推出Palladium Z3與Protium X3系統(tǒng)

    楷登電子(Cadence)公司近日宣布,正式推出新一代Cadence? Palladium? Z3 Emulation和Protium? X3 FPGA原型驗(yàn)證系統(tǒng)。這一組合標(biāo)志著數(shù)字孿生
    的頭像 發(fā)表于 01-07 13:48 ?1065次閱讀

    光庭信息獲地平線(xiàn)堅(jiān)實(shí)后盾獎(jiǎng)

    后盾獎(jiǎng)”,高度肯定了雙方過(guò)往在智駕領(lǐng)域的合作成效。 過(guò)去兩年內(nèi),光庭信息基于地平線(xiàn) J3、J5 及 J6 等多個(gè)平臺(tái),打造了“泊車(chē)與駕駛一體化解決方案”,提供高性能的自動(dòng)駕駛和泊車(chē)功能,可以輕松實(shí)現(xiàn)跨平臺(tái)遷移和新應(yīng)用
    的頭像 發(fā)表于 12-28 15:07 ?688次閱讀

    ETAS支持地平線(xiàn)征程6 AUTOSAR版本發(fā)布

    地平線(xiàn)于2024年北京車(chē)展期間推出了覆蓋自動(dòng)駕駛?cè)珗?chǎng)景的征程6產(chǎn)品。征程6是地平線(xiàn)新一代家族系列產(chǎn)品,能夠覆蓋從主動(dòng)安全ADAS到城區(qū)全場(chǎng)景NOA的智能駕駛需求。
    的頭像 發(fā)表于 10-15 17:34 ?1506次閱讀

    地平線(xiàn)Journey 3的電源設(shè)計(jì)

    電子發(fā)燒友網(wǎng)站提供《地平線(xiàn)Journey 3的電源設(shè)計(jì).pdf》資料免費(fèi)下載
    發(fā)表于 09-04 10:48 ?0次下載
    <b class='flag-5'>地平線(xiàn)</b>Journey <b class='flag-5'>3</b>的電源設(shè)計(jì)

    樹(shù)莓和arm開(kāi)發(fā)板的區(qū)別

    樹(shù)莓(Raspberry Pi)和ARM開(kāi)發(fā)板都是基于ARM架構(gòu)的微型計(jì)算機(jī),但它們之間存在一些關(guān)鍵區(qū)別。 一、歷史背景 樹(shù)莓(Raspberry
    的頭像 發(fā)表于 08-30 15:36 ?1950次閱讀

    linux開(kāi)發(fā)板與樹(shù)莓的區(qū)別

    定義和用途 Linux開(kāi)發(fā)板:Linux開(kāi)發(fā)板是一種基于Linux操作系統(tǒng)的嵌入式開(kāi)發(fā)板,通常用于工業(yè)自動(dòng)化、物聯(lián)網(wǎng)、智能家居等領(lǐng)域。 樹(shù)莓:樹(shù)莓
    的頭像 發(fā)表于 08-30 15:34 ?1972次閱讀