2018年11月3日 星期六

OpenQPano開源360度顯示器

最近幾年一直和好友Ahow在研究如何完成360度裸視立體顯示器,期間雖然有開發出不少類型原型機(https://sites.google.com/site/zoevortex/),小到可以放在手上,大到等身高,也曾參展推廣相關技術,但受限於研發經費難以繼續開發出商用版本,所以一直停在原型機狀況。今(2018)年初看到有人在Kickstarter上集資想推出一個360度攝影機加360度顯示器及360度收音對話的智能音箱「Septaer」 (https://septaer.com/),於是激發我想把之前曾做過的桌上型360度顯示器精簡後開源出來。

最早的版本是用一台快二萬台幣的高亮度DLP迷你投影機經過凹、凸鏡組、反射鏡及特製的圓錐面鏡才能背投影在柱狀螢幕上(Fig.1左圖)。但是這個版本複製成本太高,於是第二版花了六千多台幣買了一台只比五十圓硬幣大一些的超迷你DLP高亮度投影機來製作,採取直接投影在圓錐面鏡方式完成背投影工作(Fig.1中圖)。雖然省去了透鏡組,但是特製的圓錐面鏡和柱狀背投方式在量產上還是需要很大模具費用支出。這兩種設計顯示上都是採無接縫方式顯示,甚至透過一些小技巧就能讓人產生極佳的立體視覺感受。當看到「Septaer」推出的概念後,忽然想到可以把原先的設計改成有接縫的六角柱方式,直接用六片LCD組成就可以達到360度顯示(Fig. 1右圖),雖然失去立體顯示的效果,但這樣的作法可以讓成本降到很低,而且可加入播放系統成為一體成型機,不用再外接電腦,讓一般Maker也能有機會在家動手重製,於是有了這個開源專案,稱之為「OpenQPano」。

Fig. 1 360度顯示器 (點擊圖放大)



一般全景(360、720度)攝影機還滿容易買到,而且幾乎都有支援YOUTUBE 360全景影片格式,因此在這項開源專案中,除了會讓大家了解如何讓六片LCD同時顯示外,最重要的就是如何將YOUTUBE 360這種全景格式的影片直接轉成「OpenQPano」六角柱型360度顯示器能顯示的格式,那就算沒有全景攝影機也不怕沒有片源可播放。接下來就依硬體設計、全景影像轉換及360度播放程式做完整介紹。

1.    硬體設計

此次專案的主系統是選擇使用樹莓派Pi Zero W作為程式開發及執行使用,並利用其GPIO直接驅動六組LCD做為360度顯示用。系統主要電源系統是3.3V,但由LCD(背光)耗電超出樹莓派本身5.0V降至3.3V的供電能力,因此要額外搭配一組5.0V轉3.3V的電源模組板,負責供應六組LCD所需電力。除此外由於LCD是採八通道資料匯流排並聯方式驅動,所以樹莓派GPIO驅動能力不足,需額外增加緩衝器74HC244來提高驅動能力。

另外若想做一些互動應用,可考慮直接買具有觸控功能的LCD面板讓使用者可直覺進行點選等動作。或者可以加裝地磁感應器模組,用來偵測螢幕被轉到那個方向,即時改變顯示內容。如果想直接由鋰電池供電則需另加充放電模組板。額外提醒一點,當長時間執行播放工作時,單靠CPU散熱片可能不太夠,建議再加上一個小型風扇幫忙散熱,以免產生熱當。

本次專案電路雖不複雜,但連線非常多,目前並沒有洗電路板,光焊板子就得超過二天,所以如果焊板功力不佳的伙伴可能要考慮找朋友幫忙。若未來有完成電路板LAYOUT,一定會馬上開源,敬請期待。當然這裡更歡迎有人能幫忙LAYOUT並開源給社群使用,甚至可以幫忙製作電路板。

1.1 零件清單

本次專案所用到的零件清單如下:
a. 樹莓派Pi Zero W 一片 (自帶2x20 pin公排針)
b. CPU散熱片 一片
c. 16GByte SD卡 一片
d. 5V 2A 變壓器 一組
e. 2.2吋LCD 六片 (ILI9225驅動晶片, 8bit Bus)
f.  5V to 3.3V電源模組 一片
g. 74HC244 二顆
h. NPN (9013) 電晶體 一顆
i.  LED 一顆
j.  按鍵 一顆
k. 萬用洞洞板 二片
l. 2.54mm 1x16 pin母座 六組
m. 2.54mm 2x16 pin 母座 一組
n. 2.54mm 2x16 pin 排針 一組
o. 2.54mm 2x20 pin 母座 一組
p. 電源開關 1 組
q. 3D列印外殼 一套
r. 地磁感應模組(HMC5883L) 一組 (選配,偵測顯示旋轉方向用)
s. 充放電模組 一組 (選配)
t. 18650鋰電池 二顆 (選配)
u. OK線(鍍銀線) 若干

1.2 電路圖

本專案電路主要分成上、下部份,上半部為六組LCD驅動電路(Fig. 2a),下半部份則為系統控制部份(Fig. 2b)。六組LCD共用資料匯流排(DB0~DB7)及控制線(RS, WR, RTS, LCD),只有晶片選擇線各自獨立(CS1~CS6)。為使樹莓派的GPIO能同時順利推動六組LCD,所以加裝74HC244緩衝器來提高驅動能力。另外為方便利用邏輯分析儀除錯另增加一組母座連接器(Fig. 2a P2B)。

Fig. 2(a) OpenQPano上半部電路圖  (點擊圖放大)

下半部份主要為控制系統電路,由樹莓派做為主控制板。它有40pin GPIO,有些GPIO經過設定後可做為特定功能使用,如SPI, I2C, UART等。由於樹莓派本身並沒有Data Bus可直接驅動LCD,所以只能用連續的GPIO及記憶體直接存取的方式才能達到快速更新顯示資料,這裡特別安排GPIO20~27做為LCD的DB0~7。而在本專案中由於LCD並不需要讀取資料,所以RD信號部份就直接給高電位,以節省一個GPIO的使用。在電源方面,樹莓派板子雖然有5V轉3.3V供給主要晶片使用和少量GPIO使用,可是LCD的背光耗電遠遠超過其供電能力,因此要另外增加一組5V轉3.3V的模組板,搭配一個電晶體,就可當成控制大電流的背光開關。另外為方便操作和顯示系統狀態,所以搭配一個按鍵和LED做為操作及指示用。

Fig. 2 (b) OpenQPano下半部電路圖  (點擊圖放大)

更完整的電路板焊接半成品及成品照,請參考Fig. 3 ~ 5。

Fig. 3 OpenQPano上半部,(a)正視圖,(b)背視圖,(c)側視圖,(d)組立圖  (點擊圖放大)


Fig. 4 OpenQPano下半部,(a)正視圖,(b)背視圖,(c)樹莓派,(d)組立圖  (點擊圖放大)

Fig. 5 OpenQPano成品圖,(a)無外殼,(b)完整外觀 (點擊圖放大)

1.3 LCD模組顯示更新估算

本次使用的LCD模組和之前迷你電子看板「OpenQSignage」開源專案相同,是採用ILI9225驅動IC的2.2吋LCD,其解析度為176x220像素,並使用8bit資料匯流排傳送資料,每個像素採RGB565格式(65,536色)顯示,相關使用方式可參考OpenQSignage硬體設計說明 (https://omnixri.blogspot.com/2018/01/openqsignagearduino-lcd1.html)。

一般人眼有1/10秒的視覺暫留效應,所以只要將靜態影像快速播放就可讓人眼看起是連續動作。一般電影1秒播放24格(24 FPS),電視機或LCD顯示幕則是1秒播放30格(嚴格說是29.97FPS)的影像才能讓人眼看起來動作順暢,不會有閃爍感或延遲感,所以當有六片LCD時也要讓六片LCD更新一輪要控制在1/30秒內。換句話說,一片LCD共有176x220個像素,每個像素需要2 Byte (RGB565格式),一個完整畫面要77,440 Byte,更新六片要464,640 Byte,若顯示更新率為30FPS則一秒必須傳送完13,939,200 Byte。根據LCD規格書資料讀或寫1 Byte時間最少為70ns,所以每秒最快可以處理14.286 Mbyte,相當於一秒可更新184.5次,六片輪流顯示,則每片接近 30FPS,感覺上應該可以滿足。

但不幸的是樹莓派並沒有可以處理資料匯流排或DMA的機制,只能拿GPIO當成Data Bus用,所以即便將GPIO儘量排成連續位置,不使用現成GPIO控制函式庫,而是直接讀寫GPIO記憶體位置,也只能達到160~170ns讀寫1 Byte,大約只有理想速度的一半再少一些。更進一步來說,若六個畫面顯示相同的影片時,加上讀影片、轉格式(RGB888變RGB565)及LCD切換時控制命令的時間,一秒約能更新50~52次,而六個畫面播放不同內容(輪播)時則一秒只能更新8~9次,因此顯示上略有延遲感。未來或採用其它嵌入式控制板或許就不會這麼慢。更完整的控制說明請參照程式說明。

2.    全景影像轉換程式

由於虛擬實境(VR)眼鏡的興起,因此從真實世界實拍的需求也越來越大,所以全景(俗稱360或720度)攝影機也隨之普及。不論是雙攝影機到多攝影機的全景攝影機都會將同時拍到的多張影像(或影片)重新拼接成一個無接縫球形影像。為了相容於目前影像儲存格式(jpg, mp4…),所以會將球面影像轉成平面(如Fig. 6中上圖),而這樣的影像是變形的,越靠近上、下方就變形越嚴重,就像把地球儀變成一張平面地圖南北極變得很大一塊。當使用VR眼鏡時會依視角只取出其中一小塊對應的影像,看起來就不會有太大變形。當使用者移動視角時,只要不斷取出對應視角影像,如此便可觀賞到身歷其境的效果。YOUTUBE為了方便各家全景攝影機能交換這些影像,於是將此種球面、平面互轉的影像格式及播放方式進行統一,稱之為「YOUTUBE 360」。

Fig. 6 全景影像轉換六角柱顯示影像流程 (點擊圖放大)

本專案的六角柱顯示器,基本上可想成一圓柱形顯示器,所以相當於將原始全景影像捲成一個圓柱形。為了模仿人眼視角,所以取上下各60度影像再進行失真
矯正即可。

3.    360度影像播放程式





未完待續.........

延伸閱讀:

【課程簡報分享】Coscup2019_OpenQPano開源360度顯示器
http://omnixri.blogspot.com/2019/08/coscup2019openqpano360.html


沒有留言:

張貼留言

【頂置】簡報、源碼、系列文快速連結區

常有人反應用手機瀏覽本部落格時常要捲很多頁才能找到系列發文、開源專案、課程及活動簡報,為了方便大家快速查詢,特整理連結如下,敬請參考! Edge AI Taiwan 邊緣智能交流區 全像顯示與互動交流區 台科大(NTUST) 人工智慧與邊緣運算實務 開南大學...