Practical

How to sound like a native English speaker?

To sound like a native English speaker, I start echoing. However, I need video/audios that suits me, along with the script.

Echo method: http://homepage.ntu.edu.tw/~karchung/pubs/CET6970.pdf

Best resource for me: https://tw.voicetube.com/search?query=crash+course&time=medium

Advertisements
Practical

超讚的學科大地圖

今天 Youtube 突然推薦我一個看起來超讚的影片 – The Map of Mathematics:

裡面把各種數學的定位都給出來了,要是以前學數學就有這個大地圖該有多好,就可以在學習微積分、線性代數、微分方程、機率與統計、複變等這些科目時就有完整的概念,也更有機會把學習過的東西都串起來並真正應用在實際的問題上。

順便附上 Computer Science 的大地圖:

祝看到的各位都能運用數學來解決實際上遇到的問題,不斷體會到數學的美好!

Practical

數位濾波器的學習筆記

因為濾波器的應用實在太廣了,趁著有空之餘,來學習一些基礎知識,順便將自己的筆記分享出來。

首先談一下濾波器的基本觀念。如果大家仔細觀察,就會發現,在我們的世界裡,訊號是無所不在的,你現在看到的這段文章就是透過光的訊號傳遞、你說的話是聲音訊號、你上網是透過網路訊號,這些訊號是濾波器想要處理的對象,所以你可以想像濾波器是一個黑盒子,吃進訊號、輸出訊號。而濾波器這個黑盒子一定有做一些事情,讓輸出的訊號比輸入的訊號”好”,不然就不需要這個濾波器了,所以接下來要談談到底會怎麼個變好法。

數位濾波器分成兩種類型 – IIR (Infinite Impulse Response) 跟 FIR (Finite Impulse Response)。

首先來看一下相對簡單的FIR,推薦一個youtube上的影片,裡面有一張圖片滿清晰地說明了FIR的基本觀念:

fir

左上方的訊號就是原始的訊號,右邊是我們希望可以取出的訊號,如果說左邊訊號中所顯示的一些凹陷是由雜訊造成的,那右邊的訊號相對起來就是比較好的,因為不受雜訊干擾。從理論上比較簡單的想法是先做傅立葉轉換得到頻率域的成分,接著套一個low-pass filter就可以把主要的sine成分取出來,最後再做反轉換得到右邊的訊號。而FIR在做的事就可以達到跟以上過程一樣的效果。

FIR的作法在上圖的左下角呈現,在這個例子中,一次處理訊號中的4個點,每個都乘上一個係數f,最後再加總起來,得到一個新的訊號點輸出。所以可以想像成我吃進4的原始訊號的點,只對應到右邊輸出訊號的一個點而已。

看到這邊,你應該就可以發現FIR設計的兩個重點:

  1. 我要使用幾個輸入訊號點來產生一個輸出訊號點?
  2. 我的係數f要怎麼設計?

這個部分就看你的應用中想要用濾波器來做什麼事情,可以自行調整這兩個變數來測試濾出來的訊號是否符合你的要求。

以上是layman’s term的講法,幫助理解最簡單的概念,如果你想繼續深入,可以來看看理論的說明(來自陽明大學盧家鋒老師的教學影片,講得很清楚)。

接下來看一下IIR,推薦這部影片,裡面畫了一張圖清晰地把IIR的概念呈現出來:

cmpr.jpg

看了上圖應該可以比較 清楚的比較出,FIR用來產出輸出訊號的”原料”只有輸入訊號;而IIR用來產生輸出訊號的原料除了輸入訊號之外、還包含了更早之前的輸出訊號。

最後附上幾張用比較數學的方式來呈現FIR跟IIR概念的圖結束這回合: (來自盧家鋒老師的投影片)

io

上面這張表示我們只需要設計a和b這兩組係數,就可以設計出一個濾波器,而這個濾波器在時間域對訊號的作用方式由第二個式子表示。

firr

FIR就只用到b這組係數,由時間域的式子可以看出,產生一個訊號的輸出點,只會用到K個輸入訊號點,所以這也是為什麼被稱作”有限”的原因。

iir

IIR會用到a的係數,所以輸出的訊號點y(n)還會包含到前面的輸出訊號點y(n-l),會持續用到整段訊號,這種不斷使用到前面訊號的特性,有一種不斷輪迴的感覺,所以被稱作”無限”脈衝濾波器。相對來說,FIR就只固定看某一個範圍內的輸入訊號,所以就被稱為”有限”脈衝濾波器。

Practical, Robotics

邊緣偵測

UCB有一個網站比較了目前最state-of-the-art的演算法,好的邊緣偵測對於物體辨識很有幫助。

https://www.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/bench/html/algorithms.html

先記下來好用的學習資源:

投影片:

http://www.cs.cmu.edu/~efros/courses/LBMV09/presentations/GlobalPb.pdf

詳細實作:

http://www.multimedia-computing.de/mediawiki/images/d/dc/MA2012_ChristianEggert.pdf

https://github.com/vrabaud/gPb

Practical

HackNTU – Raspberry Pi相機工作坊

基於一個想多學一點東西的心情,報名了這次的工作坊。不過事實上這個工作坊跟我目前的研究有很大的相關性,我在做的是機器人視覺的相關研究,自然需要接收資訊來源的sensor,也需要處理資料的平台,之前我習慣使用的是Kinect或是camera+機器人;經過這次工作坊則是多了一個選項,Raspberry Pi Camera+Raspberry Pi這個火紅的嵌入式板。

不意外的是,Raspberri Pi跟ROS之間也已經可以整合:

還有一篇好文章可以參考:http://www.intorobotics.com/ros-tutorials-start-working-arduino-raspberry-pi/

附上這個工作坊的內容

  • Raspber 無線網路設定
  • Raspberry Pi Camera簡介,標準 Camera 和 NoIR Camera 介紹、應用介紹、改裝套件介紹、安裝設定
  • 基礎 Camera 使用:使用指令操作 Camera、縮時攝影、使用手機控制、網路串流
  • 進階 Camera 使用:寫程式控制(使用 picamera)、週邊硬體與 Camera 的互動、串接網路服務。文字辨識、人臉辨識

我覺得講師的投影片做得很好,有興趣的人可以自己看,體驗的部份有滿多眉眉角角一時也難以說清XD

http://sosorry.s3.amazonaws.com/raspberrypi/doc/slide/20150502-introduction-to-raspberrypi-camera.pdf

今天的工具除了板子跟相機之外,還有簡易的電子電路工具組(好懷念電子電路實驗啊):

1

IMG_2912

雖然今天來不及全部做完,但還是有做出一些小成果

1. 縮時攝影

2. 按鈕觸發(影片中可以看出按下按鈕會跑出一堆輸出,是因為彈跳問題)

    要處理彈跳問題可以從軟體著手,只要在程式裡面寫清楚超過延遲時間以上的輸入才接受就好。經過處理之後會發現按下按鈕只會跳出一次訊息了!

3. 影像tagging(利用imagga API)

    我寫了一個簡單的shell script,在執行之後會先用目前的相機拍一張照,拍完照之後會上傳到imagga讓server端來辨識,辨識的結果會再輸出到螢幕上,然後我最後再把拍到的照片印出來(不知道為什麼不能把顯示的指令寫到shell script裡面,會失敗)。最後辨識的結果有點好笑,第一次是黑色、第二次是示波器XD 不過還是挺好玩的~

經過一天的工作坊真的讓我對Raspberry Pi的概念有了基本的掌握,而且也跟我之前玩嵌入式或是一些機器人硬體的經驗串連起來,讓我進入開源硬體的門檻大大地下降了,光這一點就讓我覺得收穫頗豐。真的要感謝HackNTU跟熱情推廣的台灣樹莓派啊。

BTW, 後來imagga的成員還寄信問我使用狀況,因為我在註冊的時候填是應用在Raspberry Pi上,所以他們對我的使用情境跟感想很有興趣。簡單回覆我是在工作坊上用到跟覺得速度有點慢之後,他們的CEO/CTO又很快地回信跟我講一些使用上的技巧(短邊300px的影像會最快),我覺得感覺超好的啊~跟世界上另一群很有熱情的人互動總是令人振奮,如果大家對於一些物體辨識等等的電腦視覺技巧有興趣但又想直接用工具的話,可以考慮使用他們的API XD

Practical

git入門

查了一些資源,但有些看了反而混淆視聽,把我學習過程中有幫助記下來。

0.高級字典 – Pro Git繁中版

http://iissnan.com/progit/index.zh-tw.html

1.快速抓到git概念跟使用git的方法

http://tech.marsw.tw/blog/2013/08/16/git-notes-github

2.Fork別人的東西

幽默的入門資源:http://site.douban.com/196781/widget/notes/12161495/note/269163206/

分散式工作流程基礎:http://iissnan.com/progit/html/zh-tw/ch5_0.html

3. 互動式的git學習工具

http://pcottle.github.io/learnGitBranching/

現在會用到的指令

1.要把東西push到repository

git add <files>
git commit -m "comment about this version"
git push

2. 送出Pull Request

Github getting started Tutorial: How to Fork Github Repository, Create “Pull Request” and Merge?

3. 遇到fork下來的origin/master跟origin/new-branch都比原本的repo還要後面,但卻想送PR

事情是這樣,當初fork了一份透明物體辨識的code,然後因為我自己要加上新功能,所以就在自己的master一直commit。後來想寫一份演算法的教學並送出PR,但問題是,我的master中有一堆我不想要推回原本repo的code,所以就很尷尬,因為就算我在電腦的lcoal端用rebase改回去,要push的時候也會被抱怨說跟網站上的不同步。研究了一陣子,發現一個解法。

先到電腦的local端,讓電腦端跟origin/master跟origin/new-branch同步,所以電腦端會有master跟new-branch。接下來可以做

git checkout master      //切換到master這個branch上
git branch -v            //確認自己的branch有哪些跟自己在哪個branch
git rebase -i            //修改commit歷史,把本地端的master復原成原本的repo
git branch tutorial      //開一個新的branch,這個branch的進度跟原本的repo是一樣的
git push origin tutorial //把這個新branch推到github網站上,那之後在這個branch的修改就可以發送PR了
....                     //一連串的修改跟新增檔案等等
git push origin tutorial //只把這個branch的修改推到網站上,這樣就不會造成master那邊的衝突

雖然問題是解決了,但感覺還是不太合理,因為沒道理不能把master復原成幾個commit之前,只是我目前的作法都是在本地端改完才push上去,然後就會被抱怨說會遺失掉網站上的版本歷史,我想一定還有什麼是我不知道的,有機會學到再補上來吧。

4.送出PR之後,作者又修改了某些東西,怎麼直接修改PR (謝謝林承澤大大熱心指導QQ)

這次的case也是因為幫ORK的透明物體辨識寫演算法的教學,所以我就送了一個PR。接下來作者跟我說,他要把原本的repo修改一下,方便未來寫教學可以很容易擴充。所以情況變成我的origin/tutorial做了a、也發了PR,而作者又做了b。那我該怎麼直接修改tutorial這個branch來讓PR自動更新呢?

git checkout tutorial
git fetch ork (先把他做的b給抓下來)
git rebase ork/master 
git rebase -i HEAD~2
在vi中把做了a的那個commit直接整行刪掉 & :wq
some editing
git commit
git push origin tutorial -f (-f表示強制推上去,把origin/master修改成跟本地端一樣)

這麼做之後,PR就會神奇地自動更新了。這是因為我發的這個PR本質上就是比較origin:tutorial 跟 ork:master 的差別,所以只要我硬是把origin/tutorial更新完畢,PR就會自己更新。

附上PR的連結:

https://github.com/wg-perception/transparent_objects/pull/4

Practical, Robotics

各種控制,一個overview

我覺得對於控制和系統有完整的概觀很重要,剛好這週上到連豊力老師的課,他講的例子非常好懂,所以我整理起來,幫助大家入門。

適應控制(Adaptive Control)
假設我騎一台腳踏車,但不知道後座載的人是誰,我只知道他的體重不變,所以我可以慢慢調整我踩踏板的力道、轉彎控制龍頭的幅度等等(這些就對應到控制系統的各種增益),讓我在載這個人的途中不斷讓騎車變得更順。

強健控制(Robust Control)
假設我騎一台腳踏車,後座載的人重量已知,但是這個人會隨著我騎的過程不斷晃動。我只知道他的體重不變,但他一晃動就會導致我的重心改變,假設我也知道他晃動的幅度,那我的技術就需要夠robust以確保在他的晃動範圍內不管他怎麼晃動,我都不會跌倒。

最佳控制(Optimal Control)
將我騎腳踏車這個系統完全用微分方程式來表示,只要我能夠把model建立起來,最佳控制就能幫我找到我踏板該踩多大力、轉彎時怎麼控制龍頭跟踏板等等。
最簡單的建模方法就是假設我踩踏板的力道是F,假設把腳踏車當作一質量為m的質點,那F=ma,那我就得到一個二次微分的方程式(因為加速度是位置的二次微分)。

隨機控制(Stochastic Control)
我騎一台腳踏車,可能因為有颱風或是萬里無雲導致我的空氣阻力是一個隨機變化的變數,但是空氣阻力大小會影響我的控制,因為阻力大我就得更用力地踩踏板以維持不會跌倒的速度,而隨機控制就提供一些方法讓我們可以合理地將空氣阻力model成一個隨機變數,用一個機率密度函數來表示,再併入控制器的設計。