2014年10月3日 星期五

我的飛行器 -- 多軸飛行器的影片介紹集錦

收集一些與多軸有關的影片

Vijay Kumar: Robots that fly ... and cooperate
介紹四軸的基本運作原理,四個螺旋槳如何做到前進,後退,旋轉,傾斜,展示多台四軸合作,彈奏音樂

Raffaello D'Andrea: The astounding athletic power of quadcopters
利用四軸平衡桿子,接球,打球,透過手勢控制四軸,螺旋槳故障後的四軸該如何飛行。

自動參數調整 

直升機學習順序


2014年9月23日 星期二

我的飛行器 -- 建構四軸時所遇到的問題與解決方式

以下整理自己建構四軸飛行器時所遇到的問題與解決方式。持續更新中...

1. Mission Planner 無法解鎖。
問題在於 Devo10 搖桿方向的值剛好介於 1100~1900,但是Mission Planner要求解鎖時,方向按鈕值需大於1900。 
有二種方法可以解決
a. 透過搖桿的微調按鈕進行微調,
b. 透過搖桿的控制介面調整比例,將比例由 100 改為 101
    [模型選單]->[混控器]->[方向]

我的飛行器 -- 插頭焊接

在實作4軸飛行器的過程中,會需要自行焊接連接用的插頭,可能會用到以下三種插頭
  • 金插,
  • T型接頭,
  • XT-60,
對於從未拿過焊槍的我,實在不敢貿然下手,因此在網路上先透過各種銲接影片學習,今將參考到的影片整理如下。

2014年9月17日 星期三

我的飛行器 -- DEVO 10 遙控器的設定方式

APM 可以透過多種遙控器進行控制,此處我選的是華科爾 DEVO10 遙控器 + RX1002接收器,以下記錄對此遙控器的設定方式。

我的設備如下
  • 遙控器  Devo10 + RX1002
  • APM 2.6

2014年9月15日 星期一

我的飛行器 -- 編譯各類型 DEVO 遙控器的模擬器

本篇介紹如何編譯 Deviation source code,因為我並不需要自行修改遙控器的韌體,因此重點擺在如何自行編譯模擬器,以下將以編譯我的遙控器 DEVO 10為例,說明如何分別在(Ubuntu, Mac OSX) 這兩個作業系統編譯模擬器。

一、Ubuntu 14.04 TLS

1. 下載程式碼控管軟體 mercurial
$ sudo apt-get install mercurial
2. 下載程式碼
$ hg clone https://bitbucket.org/PhracturedBlue/deviation
3. 編譯程式
$ cd deviation/src
$ sudo apt-get install g++
$ sudo apt-get install libfltk1.3-dev
$ make TARGET=emu_devo10
4. 執行程式
$ ./emu_devo10.elf
模擬器畫面如下

5. 編譯其他版本遙控器模擬器
只要改變 TARGET 值重新編譯即可,例如需要編譯 DEVO 8 模擬器,便可輸入make TARGET=emu_devo8,其模擬器畫面如下

二、Mac OS X 10.9.4

1.  下載程式碼控管軟體 sourcetree (Mercurial client for Mac) 並進行安裝

2. 下載程式碼,輸入 https://bitbucket.org/PhracturedBlue/deviation,如下圖

3. 編譯執行檔
需先安裝 xcode command line tool
$ sudo port -v selfupdate
$ sudo xcode-select --install 
接著安裝 fltk
$ cd deviation/src
$ sudo port install fltk-devel
$ ../utils/buiild-osx.sh
註:FLTK(Fast Light Toolki,讀做「fulltick")是一個跨平台的C++GUI工具集,用在UNIX/Linux(X11)、微軟Windows和Mac OS X上。 
編譯執行檔
$ make TARGET=emu_devo10 LFLAGS="`fltk-config --ldflags`"

4. 錯誤處理
編譯時遇到了一些錯誤,主要原因是因為 gcc 與 clang compiler 所允許的語法不同所致,若能改用gcc compiler應該就沒問題了,針對 clang 的解決方式說明如下: 
a. builtin function conflict
a.1 錯誤訊息如下:
In file included from target/emu_devo8/channels.c:15:
./common.h:189:8: error: conflicting types for '__builtin___strlcpy_chk'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy'  __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
  ^
./common.h:189:8: note: '__builtin___strlcpy_chk' is a builtin with type
      'unsigned long (char *, const char *, unsigned long, unsigned long)'
/usr/include/secure/_string.h:105:3: note: expanded from macro 'strlcpy'  __builtin___strlcpy_chk (dest, src, len, __darwin_obsz (dest))
  ^
1 error generated.
a.2 修改方式
修改 src/Makefile,CFLAGS 加入 -fno-builtin 
修改 /Users/liaokuohsun/deviation/src/common.h
#ifdef strlcpy
#undef strlcpy // use our own strlcpy()
size_t strlcpy(char* dst, const char* src, size_t bufsize);
#endif 
b. Clang 不支援 nested function,需改寫 nested function
_putc(), _putchw(), assign_int()
c. 改寫下列巨集  
  • OFFSET(s,v)   
  • OFFSETS(s,v)  
  • OFFSET_SRC(s,v)   
  • OFFSET_BUT(s,v)
  • OFFSET_COL(s,v) 
  • OFFSET_FON(s,v) 
d. 需要定義 FLTK_ABI_VERSION 
修改 /opt/local/include/FL/Enumerations.H,將下列這行程式碼的註解拿掉
//#define FLTK_ABI_VERSION 10303
e. 更改過後的檔案放在此處,列表如下,有需要可以自行下載比較。
src/Makefile  
src/common.h
src/std.h
src/config/display.c
src/config/model.c
src/target/common/stm32/printf.c
src/target/common/emu/fltk.h

2014年9月12日 星期五

內存越界檢查 -- 使用 XCode 與 Instrument

最近用 C語言 改寫 webrtc 內的 pseudoTCP,在記憶體配置與釋放遇到一個問題,將本次的解法記錄如下。

問題現象:

pseudoTCP(1403,0x7fff7cc17310) malloc: *** error for object 0x100103c10:
incorrect checksum for freed object - object was probably modified after being freed.

問題可能原因:

一般記憶體出錯的可能原因如下
  • you are freeing an object twice,
  • you are freeing a pointer that was never allocated
  • you are writing through an invalid pointer which previously pointed to an object which was already freed

2014年9月11日 星期四

我的飛行器 -- DEVO 10 遙控器的模擬器

Deviation 設計了一個 DEVO 10 遙控器的模擬器,可以在電腦上先試試看如何操作此遙控器。以下介紹使用方式。

我的飛行器 -- 在 MacOS 上安裝 MissionPlanner

ArduCopter 提供了一個很棒的工具 MissionPlanner,可惜的是只能夠在 Windows 下使用,偏偏我只有 iMac,因此只好設法找出在 MacOS 上安裝 MissionPlanner 的方法,以下將此次測試做一記錄。

我的飛行器 -- 4軸購買清單


圖片來源 https://code.google.com/p/arducopter/

2014年9月10日 星期三

[轉] 英制螺絲 VS 公制螺絲


公制(mm) = 英制(inch) X 25.4

英制螺紋俗稱 " 惠式螺紋 " 標示以 W__*N__.

W就是惠式螺紋(英制). W後面那個數字就是我們俗稱幾分. 幾分就是 8 分之幾英吋, 所指為螺紋外徑大小.

N就是螺紋牙距( 螺紋牙與牙間隔 ). 以每一英吋有多少數量螺紋.

公制螺紋標示以  M__*P__.

M後面那個數字也是指螺紋外徑大小. 表示螺紋外徑 " mm "

P也是指螺紋牙距, 但所表示為每一牙距距離為多少" mm "

( 英制螺紋牙距表示每一英吋有多少數量螺紋
  公制螺紋牙距表示每一牙距距離為多少 )

英制螺紋與公制螺紋在市場上多有固定規格尺寸之螺絲

在標準規格中有分粗牙與細牙(牙距不同 ), 不論粗牙或細牙皆有各外徑所配對之牙距. 成為規格

在市場上大多使用為粗牙螺絲, 所以稱呼上會直稱幾分(英制)或幾mm(公制). 將牙距稱呼簡略. 要細牙也是一樣只說細牙幾分或細牙幾mm. 因為你要平常人們是記各外徑所配對之牙距, 很難.

因市場上成為規格, 所以所有螺絲配套東西皆固定規格.

如果你須要不同規格螺絲(牙紋), 必須另行加工(車床), 無法使用規格配套東西

英制螺紋與公制螺紋是不同牙系規格, 各成一套系統, 二者是沒有互換性, 所以也沒有你所說之 " 對照表 ".

不只英制螺紋與公制螺紋外徑與牙距不同, 連螺絲頭六角帽螺帽規格尺寸多有一點差異, 所以連六角扳手多有分英制與公制

公制就是公制,就是使用在公制螺絲上
英制就是英制,就是使用在英制螺絲上
兩者使用的六角板手是不能共用的
否則將會損傷螺絲或板手

六角板手的號碼就是他的尺寸大小
公制 #3 代表六角面兩個平行面之間的尺寸是 3 mm
英制 #1/2 代表六角面兩個平行面之間的尺寸是 1/2" = 12.7mm
鑽孔尺寸 = 螺絲外徑 - 螺距

例如:

公制
M3 X 0.5 (外徑 = 3mm ,牙距 = 0.5mm) 
鑽孔尺寸 = 3mm - 0.5 = 2.5mm 
M5 X 0.8 
鑽孔尺寸 = 5mm - 0.8 = 4.2mm

英制螺絲

1/8"-40T (外徑 = 1/8" = 3.175mm ,每英寸40牙) 
鑽孔尺寸 = 3.175mm - 0.635mm = 2.54mm 
螺絲攻上面的標示,就可算出應該鑽多大的孔徑 
3/8"-16UNC (外徑 = 3/8"  ,16UNC = 美國粗牙每英寸16牙) 
3/8" = 25.4 * 3 / 8 = 9.525mm 
16UNC牙距 = 25.4 / 16 = 1.5875mm 
鑽孔尺寸 = 9.525mm - 1.5875mm = 7.9375mm 
所以3分螺絲,鑽孔8mm就可以

2014年9月4日 星期四

WebRTC -- 網路資源

此篇收集網路上與 WebRTC 有關的各項文章。

摘要說明
XMPP與IMPP、PRIM、SIP(SIMPLE)合稱四大IM協議主流,在此4大協定中,XMPP是最靈活的。
Google Talk 使用開放的 XMPP 協議(原名Jabber),VoIP功能使用 XMPP 擴展的Jingle協議,若要開發一個 P2P 的服務,可以直接參考 Google 的 libjingle source code,其URL為 https://code.google.com/p/webrtc/。 

2014年9月2日 星期二

iOS -- 使用音頻資料產生波形圖(Waveform)

對於 iOS 上的 Audio 應用,本人已經學會了使用 AudioUnit 進行播放,錄音以及混音,也了解如何使用 AudioConverter 或是 FFmpeg 進行音頻格式的轉換,接著要練習的便是利用 Audio 畫出 Waveform。本篇將針對 Waveform 作一介紹。

2014年8月19日 星期二

How to print size_t variable portably?

Reference stackoverflow

1. GNU (ISO C99)
size_t x = ...;
printf("%zu\n", x);  // prints as unsigned decimal
printf("%zx\n", x);  // prints as hex
printf("%zd\n", x);  // prints as signed decimal

2. Microsoft Visual C++
size_t x = ...;
printf("%Iu\n", x);  // prints as unsigned decimal

3. Others
use %u or %lu

2014年7月6日 星期日

live555 -- 運作原理

M最近把 live555 程式碼重頭看了一遍,以下整理個人的閱讀心得。

2014年5月19日 星期一

iOS -- 使用 Crash Report 進行除錯

當 APP 發佈之後,若使用者發現此APP會當掉,該如何回報給開發商,而開發 APP的人又該如何處理這些問題呢?以下針對上述問題的解決方式作一整理。

1. APP Crash Report
當 APP 發生問題導致Crash,iOS 會將各個 APP 的 Crash Report 統一儲存,路徑為 /private/var/mobile/Library/Logs/CrashReporter/

2014年5月13日 星期二

phpMyAdmin 使用上的小技巧

將使用 phpMyAdmin 所遇到的一些小問題彙整於此。

1. 建立變數,在 SQL 查詢時使用變數
Step 1. 建立 SQL bookmark, 將準備當變數的欄位寫成 [VARIABLE],如下:  

 Step 2. 使用 SQL bookmark 進行查詢, 
以上述SQL為例   若變數值為 20140514,則 SQL 會變成
SELECT Count(token) FROM `DeviceToken` WHERE 1
若變數值為空,則 SQL 會變成 
SELECT Count(token) FROM `DeviceToken` WHERE 1 AND `AddDate` >= '20140514'

參考:http://54.199.200.164/phpmyadmin/Documentation.html#faqbookmark

2014年4月14日 星期一

iOS - Audio Unit 簡介

本篇乃針對 Audio Unit Hosting Guide for iOS,摘錄個人閱讀後的心得整理。

基本概念

Audio Unit 在 iOS Audio Frame Work 屬於底層的應用,其階層關係可參考下圖。

2014年3月11日 星期二

iOS -- 錄音功能實作

近日針對 iOS 設備的錄音功能做一研究,整理如下:

一、聲音來源

錄音時,其聲音來源可能有以下兩處,
  • 麥克風
  • 正在播放的音頻資料(可能來自本地端的檔案,或是遠端的音頻資料)
可以分別選擇不同來源進行錄音,也可以將兩種聲音進行 mix

live555 程式碼分析 -- testRTSPClient.cpp

testRTSPClient.cpp 提供了一個程式範例,介紹如何使用 live555 來建立一個 RTSP 連線。
以下整理個人對此程式碼的閱讀心得。程式碼備份於此

1. 定義 ourRTSPClient class
此 class 繼承 RTSPClient class,並且改寫 createNew(),以及新增一個用來記錄stream狀態的 StreamClientState scs,此處須注意的是 createNew() 修改了最後一個參數的值,固定此值 socketNumToServer=-1。

2014年2月25日 星期二

[NEWS] 針對 NVR 監視系統優化,WD Purple 將取代 AV GP 系列硬碟

要搞NVR的話,硬碟真的要好好選才行。

====
摘錄原文如下:

針對 NVR 監視系統優化,WD Purple 將取代 AV GP 系列硬碟

以色彩來分別產品線的 WD,這次又多了繽紛的新選擇。

黑標、藍標、綠標、紅標,不同取向的產品線有者不同色彩標籤,WD 決定推出新顏色。
針對數位監控系統、NVR 網路監控錄影機等需求,推出了全新的系列 Purple。過去 WD 針對類似的 DVR、機上盒等市場曾推出了 WD-AV GP 系列硬碟,是基於 Green 系列產品加上特別的軔體優化而成。但近來流行的 NVR 都是以 NAS 作為基礎平台,有些平台除了儲存視訊串流以外還有會搭載 NAS RAID 的功能,在這點 Green 系列並沒有辦法好好的支援,因此 WD Purple 是以 NAS 導向的 Red 系列為基礎進行修改,加上對 SATA 指令、韌體的優化而成。
wd purple carousel 678x452 665x553 針對 NVR 監視系統優化,WD Purple 將取代 AV GP 系列硬碟
在對軔體的優化方面,過去 AV-GP 使用的 WD SilkStream 優化,可以同時錄製 12 路的 HD 影片串流;在 Purple 系列中,此技術被更新為 AllFrame ,可以一口氣支援到同步錄製 32 路串流,不過 WD 建議檢閱過驗證可以完整支援 AllFrame 技術的清單以得到完整的功能解放。
機械性的部分,Purple 系列和 Red 系列為 5400 RPM 與 IntelliPower、TLER 技術,不過並沒有搭載 RAFF 旋轉伺服加速系統,因此某種程度上限制了可用的硬碟數量,理想的範圍約莫在 1~8 Bay 左右。官方標稱的負載週期約在 60 TB/yr ,以錄製四路 1080P30 的影片一年約在 200TB 左右,因此 PURPLE 系列 比較建議可以搭配 RAID 使用,如果需要更重載的錄製需求,則建議使用 Se/Re 系列硬碟。
wd purple se re 665x422 針對 NVR 監視系統優化,WD Purple 將取代 AV GP 系列硬碟
Purple 系列到時將會有 1~4 TB 容量可選擇,目前已知 WD 也已經與 Synology、QNAP 等廠商建立起夥伴關係。

原文出處為:

2014年2月10日 星期一

如何取得 iPhone 內建音效檔案

iPhone 手機內建了許多音效,當我們開發App時,要如何直接使用這些音效檔案呢?以下簡介使用與取得這些音效檔案的方法。

2014年1月27日 星期一

RFC4747 -- NAT 的行為要求(UDP)

RFC4747 : Network Address Translation (NAT) Behavioral Requirements for Unicast UDP

此篇 RFC 提供了一些方法,說明當應用程式遇到不同類型的 NAT 時,應該如何處理UDP封包,才比較容易在NAT環境下運作無誤(NAT打洞容易成功)。例如線上遊戲或是視訊會議等應用程式。
The goals of this document are to define a set of common terminology for describing the behavior of NATs and to produce a set of requirements on a specific set of behaviors for NATs.

2014年1月20日 星期一

ffmpeg -- 使用 ffmpeg 命令降低 H.264 檔案大小

參考 x264EncodingGuide,使用裡頭的一個例子進行轉檔,以減少檔案大小。如下:
ABR (Average Bit Rate)
ffmpeg -i input -c:v libx264 -b:v 256k output.mp4 
轉好後的檔案的確降低 bitrate,但轉換後的檔案卻多出了 B-frame,如此可能會造成某些串流播放器播放時的困難。

以下記錄此問題的解決過程:

2014年1月19日 星期日

iOS -- 背景撥放音樂

iOS -- 背景撥放音樂

背景控制播放音樂的基本原理如下:
1. 將 app 設定為 FirstResponder 
2. 實作 UIResponder class 定義的 remoteControlReceivedWithEvent: 方法
   接收對應的 event 並進行處理,以下列舉幾個 event 當作例子 
UIEventSubtypeRemoteControlPlay
UIEventSubtypeRemoteControlPause
UIEventSubtypeRemoteControlStop
UIEventSubtypeRemoteControlTogglePlayPause
IEventSubtypeRemoteControlNextTrack
UIEventSubtypeRemoteControlPreviousTrack 
3. 透過 MPNowPlayingInfoCenter defaultCenter 設定鎖屏時顯示的資訊
   例如:[[MPNowPlayingInfoCenter defaultCenter] setNowPlayingInfo:songInfo ];

網路上已經有很多程式範例了,茲將實作時參考到的程式碼紀錄如後

設定背景撥放音樂,並接收鎖屏時的 Play/Stop 按鍵以進行客製化的行為
修改鎖屏時所顯示的歌曲訊息文字與圖片

2014年1月17日 星期五

iOS -- 播放聲音的 API

在 iOS 設備上有許多播放聲音的方法,那麼應該選擇什麼樣的方式呢?
以下根據個人的經驗,分析不同情景下適用的處理方式。

iOS 可以使用數種方法播放聲音,根據用法的難易度,由簡單到困難列舉如下:
  • System Sound Service
  • AVAudioPlayer
  • AVPlayer
  • Audio Queue Service
  • OpenAL
  • Audio Unit
下圖為 Audio Framework,可由此得知不同方法之間的階層關係

使用 Darwin(QTSS) 架設串流伺服器

以下使用文字記錄使用 Darwin Streaming Server來當成串流伺服器的操作過程,此操作可以同時適用于Ubuntu 12.04 與 Mac OS 10.9.1。

使用 VLC 架設串流伺服器

以下使用文字記錄使用VLC來當成串流伺服器的操作過程。喜歡看圖的可以參考 William.L 所整理的SlideShare

1. 安裝 VLC 

sudo apt-get install ffmpeg
sudo apt-get install vlc

2014年1月13日 星期一

live555 -- 指定使用某張網路卡進行連線

當使用live555時,若系統內有多張網路卡,該如何指定使用哪張網路卡進行連線呢?
其實作法很簡單,說明如下:

2014年1月6日 星期一

Apple TV3 播放大陸影音網站

Apple TV 可以直接播放大陸影音網站所提供的影片,這功能真的很方便,而且速度也挺順的,以下將自己設定 Apple TV3的過程作一記錄。

2014年1月5日 星期日

iOS -- 如何處理撥放的聲音(音量大小、聲音路徑、特效)

當 iOS 設備可以正確的播放聲音之後,後續便可能需要對此聲音作些處理,例如:變更音量大小,設定音量從喇叭或是耳機輸出,或者對於此聲音做些特效。

2014年1月3日 星期五

iOS -- 程式中指定透過WIFI 或 3G 進行連線

在手機中使用3G上網往往需要較昂貴的費用,因此app開發者應該要讓使用者可以自由選擇透過3G或是WIFI上網。

要指定建立連線的網路介面,只要使用 bind 函數,指定對應的網路介面即可。在 iOS 中選擇 WIFI 或是 3G 也是同樣的道理,以iPhone為例,其網路介面名稱定義如下

  • WIFI 為 en0
  • 3G 為 pdp_ip0