Quantcast
Channel: neuralassemblyのメモ
Viewing all 50 articles
Browse latest View live

docomo Galaxy S II (SC-02C) 用 Cyanogenmod 9 のビルド方法

$
0
0

docomo Galaxy S II (SC-02C)用に Cyanogenmod9 をビルドしてみました。

海外版 Galaxy S II 用の Cyanogenmod 9 はこちらからダウンロードできます。
META-INF/com/google/android/updater-script
の先頭付近にて SC-02C に対する許可を与えればインストールができ、
ほとんどの機能を使うことができます。

しかし、docomo の端末に最適化されたものではないため、

  • 電池のもちが悪い
  • センサが正しくない値を返す
などの問題があります。

そこで、docomo の端末で快適に使えるようビルドしてみました。
ここではそのビルド方法をまとめます。

変更したのは主に下記の通りです

  • docomo端末用の変更を kernel に追加する(こちらで入手できる2.6系のカーネルを参考に)
  • センサのライブラリを日本の端末のものを利用するよう変更
  • その他(APN設定、フォント、エリアメール対応など)


なお、この方法では端末内のバイナリを利用するため、
ビルド済みのものを配布することはしません。

端末には、最新の公式android 4.0.3 (IML74K.OMLPG) をあらかじめ入れておきます。
また、64bit の Ubuntu を、androidをビルドできるよう設定しておきます(本ページでは省略)。
adb コマンドが使える必要もあります。
さらに、Ubuntu からadbコマンドで端末の中身を取り出せるよう、

/etc/udev/rules.d/51-android.rules に
SUBSYSTEM=="usb", ATTRS{idVendor}=="04e8:685e", SYMLINK+="android_adb", MODE="0666" GROUP="plugdev"

と記述しておきます。

以上の準備のもと、以下の様に作業を進めます。
mkdir ~/cm9work
cd ~/cm9work
repo init -u git://github.com/CyanogenMod/android.git -b ics
ここで
gedit .repo/local_manifest.xml
を起動し、下記の内容を記述して保存します。

<?xml version="1.0" encoding="UTF-8"?>
<manifest>
  <remote  name="bitbucket" fetch="https://bitbucket.org/" />
  <project name="CyanogenMod/android_packages_apps_SamsungServiceMode" path="packages/apps/SamsungServiceMode" remote="github" />
  <project name="teamhacksung/buildscripts" path="buildscripts" remote="github" />
  <project name="neuralassembly/cm9_device_samsung_sc02c" path="device/samsung/sc02c" remote="bitbucket" revision="master" />
  <project name="neuralassembly/cm9_kernel_samsung_smdk4210jp" path="kernel/samsung/smdk4210jp" remote="bitbucket" revision="master" />
</manifest>

そして、下記の様にダウンロードを開始します。

repo sync -j16

ダウンロードが終了したら、下記の様にproprietaryなバイナリの準備を行います。
海外端末のバイナリは NIGHTLY ビルドから、  SC-02C のバイナリは adb により端末から吸い出します。
あらかじめ Ubuntu に IML74K.OMLPG な端末を接続し、adb で認識できるようにしてから
作業を進めます。

mkdir device/samsung/sc02c/cm9
cd device/samsung/sc02c/cm9
wget http://download.cyanogenmod.com/get/jenkins/4513/cm-9-20120717-NIGHTLY-galaxys2.zip
(その時点で入手できる最新のものを利用するのが良いと思います)
unzip cm-9-20120717-NIGHTLY-galaxys2.zip
cd ..
./extract-files.sh

しばらく待つとバイナリの準備は完了します。

そこで、下記の様にビルドを開始します。

cd ~/cm9work
./buildscripts/samsung/build.sh  sc02c

ビルド完了したときにできるファイルは
out/target/product/sc02c/cm-9-xxxxxxxx-UNOFFICIAL-sc02c.zip
です。これを clockworkmod リカバリで焼くことになるので、
あらかじめ内部SDカード領域にコピーしておきます。
また、gapps-ics-20120429-signed.zip もどこかで見つけて
内部SDカード領域にコピーしておきます。

ここから先は実際に焼く作業になります。失敗した場合の
戻し方を予め調べてから実行してください。

まず、 Up2_SU_CWM_KJ4-2.tar をどこかで見つけ、
Odin v.3.04 でPDAにセットして焼きます。
(ここでは clockworkmod リカバリを起動したいだけなので、
色々なやり方があると思います)

この時点で clockworkmod リカバリ しか起動しなくなるので、
Volume Up + HOME + 電源長押しで clockworkmod リカバリ を起動します。
このリカバリの決定ボタンはホームボタンであることに注意します。

wipe data/factory reset
install zip from sdcard→chooze zip from internal sdcard

の順で実行し、cm-9-xxxxxxxx-UNOFFICIAL-sc02c.zip を
インストールすると、リカバリも含めて新しくなります。
ここで下記のように一旦リカバリを終了します。

Go Back→power off

そして再びVolume Up + HOME + 電源長押しで最新の clockworkmod リカバリを起動します。
この最新のリカバリで下記の順で選択し、もう一度同じファイルを焼きます。
今度は決定は電源ボタンなので注意。

install zip from sdcard→chooze zip from internal sdcard

終わったら gapps-ics-20120429-signed.zip も焼きます。

終わったら
Go Back→reboot system now
で再起動、でおしまいです。

まあ本当は JCROM が使える docomo 端末を増やしたかった
だけなんですけどね。


[備考]
海外モデルの場合、
https://github.com/CyanogenMod/android_kernel_samsung_smdk4210
を kernel/samsung/smdk4210 に、
https://github.com/CyanogenMod/android_device_samsung_galaxys2
を device/samsung/galaxys2
にセットし、ターゲットは galaxys2 を指定します。




JCROMのタブレットモードで使えるテーマ画像を増やした

$
0
0
JCROMのタブレットモードで使えるテーマ画像を増やしてみました。

例えば以下の様なテーマ設定が可能です。


 ロックスクリーンは例えばこんな感じにできます
 デスクトップ
ランチャー


設定できる画像は以下の通りです。テーマが設定できるとタブレットを使うのも楽しくなるかもしれないですね。

変更箇所フォルダファイルサイズ(ICS)サイズ(JB)補足
時計表示パネルnotificationnotification_panel_tablet_normal.png
notification_panel_tablet_pressed.png
*これだけ新規
430x158446x130
通知notificationnotification_item_background_00_normal.png
notification_item_background_00_pressed.png
数字は00から99まで可
430x64446x64
設定パネルnotificationnotification_tracking_bg.png430x390446x390
システムバーnavibarnavibar_background_port.png
navibar_background_land.png
1280x48
800x48
ICSと同じlandとportの意味が逆になってしまいました
壁紙wallpaperhome_wallpaper.png1892x1389ICSと同じ(参考)
こちら
ロックスクリーンlockscreenlockscreen_wallpaper.png
lockscreen_wallpaper_land.png
1280x752
-
1280x752
800x1232
ランチャーlauncherlauncher_wallpaper.png
launcher_wallpaper_land.png
1280x752
800x1232
ICSと同じportとlandの意味が逆
最近使ったアプリframemy_frame.png208x130ICSと同じ
simejisimejijcrom_port.png
jcrom_land.png
800x360
1280x340
ICSと同じ

AndroidでWifiカメラからのMJPEGストリームを表示する

$
0
0
最近ひとりぶろぐさんのエントリ
でも紹介されていましたが、Ai-BallのようにMJPEGストリームを送信できるカメラが楽しいです。

ここではその映像をandroidで受信する方法について紹介します。利用形態は左図のようなイメージです。

サンプルコードはstack overflowの「Android ICS and MJPEG using AsyncTask」で既に紹介されています。しかし、このコードを用いると
  • メモリ使用量が多くGarbage Collectionが一秒間に多数回実行される
  • 端末によっては映像の遅れが1秒以上起こる
となり、少し性能が物足りないです。

MJPEGを表示するアプリケーションでGoogle Playでダウンロードできるものとしては「MJpeg Viewer」がありますが、これも同様の問題を抱えています。

この問題を解決するため、その高速版として「SimpleMjpegView」を作成して公開しました。
(ソースだけではなく、ビルド済みアプリもGoogle Playからダウンロードできるようにしました。2013.4.29)


メモリ使用量を削減し、jpegのデコードにJNI経由でlibjpegを利用しているのが主な変更点です。上記の問題に対しては下記のように解決されています。
  • Garbage Collection は1秒に1回以下(端末依存、後述)
  • 映像の遅れは1秒より大幅に短い(<< 1秒)
このコードをベースに作成したのが下記の、WifiカメラAi-Ballを搭載したプラレールです。


このプラレールを2012年10月20日(土)に仙台にて行われたICT ERA + ABC 2012 東北や2012年12月1日(土)、2日(日)に日本未来科学館で行われたMaker Faire Tokyo 2012にて展示させて頂きました。

ここでは、そこでの体験なども含め、MJPEGストリームをAndroidで表示する方法についてまとめてみたいと思います。

利用形態

(1)Wifiカメラ+スマホ

Trek Ai-Ballが用いている方式で、カメラ自体がアクセスポイントになります。メリットはとにかく小型であることです。

Planexからも多数のネットワークカメラが発売されていますが、それらで動作するかは試していません。

URLはデフォルトでは
http://192.168.2.1:80/?action=stream
となります。


(2)スマホ+Wifiルーター+スマホ

カメラデータ送信用スマートフォンにIP WebcamというフリーソフトをインストールしてWifiカメラ化し、そこからの映像をWifiルーター経由で受信するという方式です。(1)よりも無線が安定するのではないかと導入してみました。

URLはデフォルトでは
http://192.168.x.y:8080/videofeed
となります。

(3)スマホ(テザリング)+スマホ

(2)と同じですが、Wifiルーターの代わりにスマートフォンのテザリング機能を用いるものです。

部品点数が減るのがメリットですが、送信側のスマートフォンの電池持ちが悪くなるのがデメリットです。


(4)PC+Wifiルーター+スマホ

LinuxなどのUnix系PCにmjpeg streamerというソフトウェアを導入して、UVC対応のUSBカメラの映像をルーター経由で送信します。

様々なカメラを用いることができるのがメリットですが、PCとカメラを有線接続する必要があるため、規模が大きくなるのがデメリットです。

こちらの方法を(ノートPCなどでなく)Raspberry Piで使っている方々がいらっしゃいます。



性能

stack overflowで公開されているサンプルと、性能改善したSimpleMjpegViewとで性能を比較したのが下記の表です。カメラは「利用形態」の(1)で紹介したTrek Ai-Ballを用いました。解像度640x480、30fpsの映像が送られてきます。

なお、たまたま手元にあった端末が全てカスタムOSが載ったものだったのですが、結果は公式OSでも変わりません。また、OSのバージョンにもあまり依存しないようです。

まず、オリジナルのサンプルから。

stack overflow のサンプル
端末フレーム数 (fps)1秒あたりのGC回数時間遅れ (s)
Nexus 7
OS: 4.2.1, JCROM
1525<< 1
Galaxy S3 (docomo)
OS: 4.1.2, cm10-based JCROM
174<< 1
Galaxy Nexus
OS: 4.2.1, JCROM
1626> 1
Xperia Arc
OS: 4.1.2, CM10-based JCROM
1718<< 1
Nexus S
OS: 4.2.1, JCROM
1130> 1

ここで見るべきポイントは以下の通りです。
  • どの端末も、1秒間に多数回のGarbage Collection (GC)が実行される
  • フレーム数はそれほど悪くないが、1秒以上の映像の時間遅れがある端末がある
  • 新しい端末の方が性能が良いとは限らない。最新機種のGalaxy S3の性能が良い一方で、古い端末であるXperia Arcの性能も良い
一方、性能改善したアプリでは下記のようになります。

性能改善したSimpleMjpegView
端末フレーム数 (fps)1秒あたりのGC回数時間遅れ (s)
Nexus 7
OS: 4.2.1, JCROM
171<< 1
Galaxy S3 (docomo)
OS: 4.1.2, cm10-based JCROM
17およそ1/10<< 1
Galaxy Nexus
OS: 4.2.1, JCROM
171<< 1
Xperia Arc
OS: 4.1.2, CM10-based JCROM
171/4<< 1
Nexus S
OS: 4.2.1, JCROM
171<< 1

見るべきポイントは下記の通りです。
  • どの端末もGCの回数は秒間1回以下に改善(性能が良いのはやはりGalaxy S3とXperia Arc)
  • 時間遅れはどの端末でも1秒以下に改善された

端末による性能差

上の表で見た通り、映像表示の性能には端末による差があり、なおかつ新しい端末の方が性能が良いとは限らない、という現象が見られます。

性能改善したSimpleMjpegViewを用いる場合、映像表示するだけならそれほど差は見られませんが、上のプラレールの動画のように、画像処理に基づいて制御を行う場合、微妙な性能差が結果に影響を及ぼすことがあるので注意が必要です。

下記の端末で特に性能が悪かったのが印象的です。
  • Galaxy Nexus
  • Nexus S
上記のプラレールの動画でXperia Arcを用いているのは、古い端末で安価に入手できるにも関わらず映像表示の性能が良いためです。今後、Galaxy S3の価格が下がって入手しやすくなればそちらに乗り換えるかもしれません。

なお、この端末による性能差の原因はわかっていませんが、ハードウェアの違いやkernelのドライバに起因する問題ではないかと現在のところは考えています。

Wifiの干渉についての体験記

このようなWifiカメラの利用法の一つとして、自作のロボットなどに搭載して遊ぶ、というものが考えられます。個人で遊ぶぶんには何の問題もないのですが、大勢の人が集まる展示会でデモしようとすると、Wifiの干渉により映像が遅れるなどして、期待の動作をしないということがあります。

この現象は個人で再現することがなかなか難しく、有効な対策ができない場合が多いのですが、ここでは私が展示会で体験した経験をいくつか紹介したいと思います。

結論から先に述べると、「利用形態」の(3)で紹介した「スマホ(テザリング)+スマホ」が、Wifiの干渉に最も強い組み合わせでした。

2012年10月20日(土)ICT ERA + ABC 2012 東北(Trek Ai-Ball + Xperia Arc, 802.11g)

動画で紹介したプラレールを展示した初めての展示会でしたが、「利用形態」(1)で紹介したWifiカメラ(Trek Ai-Ball)で送信した映像をXperia Arcで受信しました。

この場合、映像が3~5秒くらい遅れて届いたため、画像処理に基づく制御はあきらめ、Bluetooth経由での手動制御を中心に紹介しました。なお、Trek Ai-BallはWifiのチャンネルを手動で変更する機能がついているのですが、それを行っても焼け石に水という感じでした。

2012年12月1日(土)Maker Faire Tokyo 2012 (Xperia Ray + Router + Xperia Arc, 802.11n)

ABC2012東北の約1か月後に行われたMaker Faire Tokyo 2012の初日です。Trek Ai-Ballでの展示はあきらめ、「利用形態」(2)で紹介した「スマホ+ルーター+スマホ」の組み合わせで行いました。

カメラはXperia RayにIP Webcamを入れてWifiカメラ化し、プラレールに搭載します(左図)。ルーターはNECのAtermWR8370N、受信はいつも通りXperia Arcです。

結果はボチボチ、といったところでした。カメラの映像は基本的にはスムーズに届き、画像処理に基づく制御もうまく機能しました。ただしやや不安定で、1~2分おきに映像が届かなくなる現象が起こりました。そんなときはルーターとスマホの位置関係を変えると突然映像が復帰することが多かったので、そのまま展示を続けることができました。

不安定ではありましたが、少なくとも昼から17時までの展示はなんとか乗り切ることができました。

2012年12月2日(日)Maker Faire Tokyo 2012 (Xperia Ray + Xperia Arc, 802.11g)

Maker Faire Tokyo 2012の2日目です。前日と同様に「スマホ+ルーター+スマホ」の組み合わせで行こうとしたのですが、前日と異なり映像が頻繁に途切れてうまく流れません。

想像ですが、恐らく会場では私と同様に2.4GHz帯の無線を使って何かデモをしようとした方が大勢いらっしゃったと思います。初日に無線の干渉の問題でデモに失敗した方が、2日目にリベンジとして別の無線機器を持ち込んだ、ということがあったかもしれません。

いずれにせよ前日の組み合わせではうまくいかなかったので、「利用形態」の(3)で紹介した「スマホ(テザリング)+スマホ」の組み合わせを試してみたところ、(何故か)非常に安定して映像が送受信でき、終日それで乗り切りました。1日目のルーターを噛ませる場合に比べて安定性はかなり上でした。

テザリングを行ったスマホはXperia Rayで、この上でIP Webcamも動作させました。テザリングはdocomoの公式OSでもカスタムOSでも問題なくできます(SIMは刺さずにデモしました)。ただし、当然電池の持ちは悪いので予備バッテリーは必須です。10:00~17:00の展示で、Rayの電池は2回交換したと思います。

Wifi干渉についてのまとめ

以上、展示会3日分の体験を紹介しました。少なくともこの3日間の体験から判断するなら、安定性は「スマホ(テザリング)+スマホ」で決まり、なのですが、もう少し検証をしたい気もします。展示会ほど無線が飛び交う状況をなかなか作れないので、新たに展示会に出展することでしか検証は難しいのですが。

あと、この3日間で用いた無線の規格は802.11gか11nのどちらかです。802.11aを用いたらどうなるだろう、という興味もありますが、この場合、映像の送信側も受信側も802.11aに対応している必要があります。個人的にはXperia SXが小型で11aに対応しているので送信側に適してそうな気がしています。

おしまい

以上、私自身の体験も交えてWifiカメラからのMJPEGストリームをandroidで表示する方法についてまとめてみました。

気が向いたら、画像処理の方法(ピクセルを直接いじる方法、OpenCVを用いる方法)や複数個のカメラからの映像を一つの端末で受信する方法などについても書いてみたいと思います。

こちらもどうぞ

AndroidでWifiカメラから受け取った動画を画像処理する(1)ピクセルを直接操作する方法

$
0
0
前回はWifiカメラからのMJPEGストリームをandroidで受け取って表示する方法を紹介しましたが、今回は受け取った画像を画像処理してみます。取り扱うのは簡単なフィルタリングですが、この手法を発展させると、画像から対象物を見つけるというような処理も可能になります。

今回はandroidが持っているBitmap画像のピクセル値を直接処理する手法を取扱います。NDKを用いてCygwin上でC言語のモジュールをビルドする必要がありますので注意してください。

画像処理ライブラリであるOpenCVを用いる方法は次回紹介します。

準備として、前回紹介したSimpleMjpegViewをダウンロードし、eclipseからandroidにインストールできるようにしておいてください。ダウンロード法はいろいろありますが、「Downloads→Branches→masterのzip」と辿るのが簡単です。展開して得られたフォルダをお好みの場所(例えばeclipseのworkspace)に移動します。そのままではフォルダ名が長いので、短い名前に変更した方がNDKによるビルド時に楽です。

そのフォルダをeclipseに取り込むには「ファイル→インポート→一般→既存プロジェクトをワークスペースへ」とたどり、ルートディレクトリを設定して完了します。私はeclipseをpleiadesによって日本語化しているのでこのような表記になりますが、英語版を使っている方は適宜読みかえてください。




このアプリケーションをandroidにインストールして動作を確認しておきます。Wifiカメラは前回紹介した方法のどれでも構いません。Ai-Ballの場合は変更なしでそのまま動作します。スマホ+IP WebCamの場合、メニューからIP Webcamを動かすスマートフォンのURLをあらかじめ指定しておきます。どのようなURLを指定すべきかは、Wifiカメラ側のスクリーンに表示されていますので参照してください(URLの末尾には「videofeed」をつけます)。

もちろん、映像を見るandroidとWifiカメラは同一のネットワークに属している必要がありますので注意してください。

横画面で表示した結果は図の通りです。画質を落としたjpegが送られてきますので、静止画でみるとかなり粗いですね。

MjpegView.javaの編集

動作を確認したら、ここから画像処理に入っていきます。ここではグレースケール化を試してみます。src以下のMjpegView.javaの130行目に下記のような記述があるのを見つけます。
if(bmp==null){
bmp = Bitmap.createBitmap(IMG_WIDTH, IMG_HEIGHT, Bitmap.Config.ARGB_8888);
}
int ret = mIn.readMjpegFrame(bmp);

if(ret == -1)
{
return;
}
ここではBitmapクラスのインスタンスbmpのメモリを必要に応じて確保し、readMjpegFrameという関数によってWifiカメラからの映像をbmpに格納しています。なお、readMjpegFrameはC言語で書かれた関数であり、JNI経由で呼び出しています。

この処理が終わった時点でbmpにはWifiカメラから得た画像が格納されており、これがそのまま画面に表示されますので、これを加工すればそれがそのまま画面に現れます。やってみましょう。

ここでは、引数にBitmapをとるimageprocessingを関数を作ることを考えましょう。つまり、先ほどのreadMjpegFrameの後に下記の内容を追加します。
if(bmp==null){
bmp = Bitmap.createBitmap(IMG_WIDTH, IMG_HEIGHT, Bitmap.Config.ARGB_8888);
}
int ret = mIn.readMjpegFrame(bmp);

if(ret == -1)
{
return;
}
// 下記のJNIによる画像処理を追加
imageprocessing(bmp);
次にこのimageprocessingをどのように実装するかですが、画像処理は非常に計算量が多く時間がかかる処理であるため、Javaでは書かずにJNIを利用してC言語で記述することにします。

そのために、同じくMjpegView.javaでIMG_WIDTHとIMG_HEIGHTを設定している部分を見つけ、その後ろに下記の4行を追加します。
public int IMG_WIDTH=640;
public int IMG_HEIGHT=480;

// 下記の4行を追加
static {
System.loadLibrary("ImageProc");
}
public native void imageprocessing(Bitmap bmp); 
これは、libImageProc.soという自作ライブラリを呼び出す設定と、その中の(これから作成する)imageprocessing関数の宣言を記述しています。

ImageProc.hとImageProc.cの編集

次に、imageprocessing関数をC言語のモジュールとして記述していきます。このアプリケーションでは、jpegのデコードで既にJNIによるC言語モジュールを利用していますので、そこに追記していく形式をとります。まず、jni/ImageProcフォルダにあるヘッダファイルImageProc.hを開き、末尾に下記の2行を追加します。
void Java_com_camera_simplemjpeg_MjpegView_imageprocessing(JNIEnv* env,jobject thiz, jobject bmp);
int getIndex(int i, int j);
一つ目がこれから作成するimageprocessing関数ですが、Javaにおけるパッケージ名とクラス名をアンダーバーでつないだ形になっていることに注意してください。これはJNIの規約です。また、2行目は画像の座標を配列のインデックスに変換する関数です。これはC言語の内部からしか用いないので、パッケージ名やクラス名は入っていません。

次にjni/ImageProcフォルダにあるImageProc.cを開き、末尾に下記の内容を追加します。
void Java_com_camera_simplemjpeg_MjpegView_imageprocessing(JNIEnv* env,jobject thiz, jobject bmp){

AndroidBitmapInfo info;
int* pixels;
int ret;
int i,j;

if(bmp==NULL) return;

if ((ret = AndroidBitmap_getInfo(env, bmp, &info)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

if (info.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Bitmap format is not RGBA_8888 !");
return;
}

// Java側にあるBitmap画像のピクセルの配列をpixelとして利用
if ((ret = AndroidBitmap_lockPixels(env, bmp, (void *)&pixels)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
return;
}

//グレースケール化
for(j=0 ; j<IMG_HEIGHT ; j++){
for(i=0 ; i<IMG_WIDTH ; i++){
int blue =(0xff0000 & pixels[getIndex(i, j)])>>16;
int green =(0xff00 & pixels[getIndex(i, j)])>>8;
int red =0xff & pixels[getIndex(i, j)];

// 浮動小数演算を行うとパフォーマンスが悪いので整数演算で
//int Y = (int)(0.299f*red + 0.587f*green + 0.114f*blue);
int Y = (299*red + 587*green + 114*blue)/1000;
blue = green = red = Y;

pixels[getIndex(i, j)] = 0xff000000 | blue<<16 | green<<8 | red ;
}
}

// ※ (この位置、後で使います)

// 配列pixelのロックを解除して終了
AndroidBitmap_unlockPixels(env, bmp);
}

// 座標を配列のインデックスに変換
// インライン関数にしないとパフォーマンスが悪い
inline int getIndex(int i, int j){
return i + j*IMG_WIDTH;
}
imageprocessing関数の方は、「Javaから渡されたbitmapオブジェクトからピクセルの配列を取得→画像処理→ピクセルの解放」という流れで処理が進んでいます。この手法はandroid 2.2およびNDKバージョン4bにて導入された手法を用いていますので、それ以前のandroidでは動作しません。

得られたピクセルは、上位ビットから順に8ビットずつ不透明度、blue、green、redの順で並んでいます。これはJava側でBitmapを構築する際にBitmap.Config.ARGB_8888を指定したためです。不透明度はここでは使わずに0xffで固定しています。

グレースケールの輝度値(Y)を得るための演算は実数演算として定義されますが、floatで浮動小数点演算を行うとパフォーマンスが落ちますので、ここでは整数演算として実行します。浮動小数点演算でどれくらいパフォーマンスが落ちるかは後で試してみても良いでしょう。

また、画像の座標を配列に変換する関数getIndexはインライン関数として実装します。C言語のマクロ機能を用いても良いのですが、(後で)ビルドに用いるコンパイラのgccはC言語でもinline関数をサポートしていますので利用してみました。「inline」を削除して通常の関数とするとパフォーマンスが落ちますので、後で試してみても良いでしょう。

このように、androidでは通常のWindowsなどでのプログラミングの感覚で記述するとパフォーマンスが落ちることがあります。

以上を記述して保存したら、ビルドしてみます。

ビルド

上記のコードはC言語のコードを含んでいますので、ビルドにはAndroid NDK(Android Native Development Kit)を用いる必要があります。

NDKのセットアップはネットでは
などが詳しいです。また、書籍では出村成和著「Android NDKネイティブプログラミング」などがあります。

NDKのセットアップが済んだらビルドをCygwin上でコマンドラインで行います。eclipseのプラグインであるADTを最新にするとeclipse上でビルドできるはずなのですが、今回それを試したところ「ビルドは通るがエディタでエラーが消えない」状態になったので、面倒でもコマンドラインで実行してください。

ビルドの流れは
  1. Cygwinを起動し、「cd  (プロジェクトがある場所)」でプロジェクトのフォルダに移動
  2. 「ndk-build」を実行し、ビルドを行う
となります。

1.のフォルダの移動ですが、WindowsのCドライブのトップは「/cygdrive/c/」となることに注意してください。Cygwin解説サイトなどでフォルダの移動に慣れてからの方が良いかもしれません。

2.のビルドではwarningがいくつかでますが、最後に以下が表示されていればビルドに成功しています。

SharedLibrary  : libImageProc.so
Install : libImageProc.so => libs/x86/libImageProc.so
ndk-buildによるC言語のモジュールのビルドが終わったら、androidにアプリをインストールします。ndk-buildを実行したのにandroidアプリに変更が反映されなかった場合、eclipseで「プロジェクト→クリーン」を実行して、apkを作り直せばよいでしょう。

実行すると、図のようなグレースケール画像が得られます。

エッジ画像風にしてみる

最後にもう一つ、画像処理らしさを出すために、エッジ画像風の画面表示にしてみます。ここでは数学的な厳密さよりも、記述のシンプルさと見た目のわかりやすさを重視して、「水平方向微分と垂直方向微分の絶対値和」を画像として表示してみます。

上で記述したグレースケールのコード中に「※」を記した位置があるのですが、そこに下記のコードを挿入してください。
  // ※部に下記を挿入

// |水平微分| + |垂直微分| の整数倍を配列pixelsに格納
for(j=0 ; j<IMG_HEIGHT-1 ; j++){
for(i=0 ; i<IMG_WIDTH-1 ; i++){

int Y1 =0xff & pixels[getIndex(i, j)];
int Y2 =0xff & pixels[getIndex(i+1, j)];
int Y3 =0xff & pixels[getIndex(i, j+1)];
int Y4 =0xff & pixels[getIndex(i+1, j+1)];

int x_diff = (Y1-Y2+Y3-Y4)/2; // 水平方向微分
int y_diff = (Y1+Y2-Y3-Y4)/2; // 垂直方向微分

//それぞれ絶対値をとる
if(x_diff<0){
x_diff = -x_diff;
}
if(y_diff<0){
y_diff = -y_diff;
}

int diff = x_diff + y_diff;

diff *= 5; // 画面表示用に明るくするため、任意数倍

if(diff > 255){
diff = 255; // 255以下に丸める
}

//緑色のエッジ風に表示
pixels[getIndex(i, j)] = 0xff000000 | diff<<8 ;
}
}
//右端を黒に
for(j=0 ; j<IMG_HEIGHT ; j++){
pixels[getIndex(IMG_WIDTH-1, j)] = 0xff000000;
}
//下端を黒に
for(i=0 ; i<IMG_WIDTH ; i++){
pixels[getIndex(i, IMG_HEIGHT-1)] = 0xff000000;
}
これをndk-buildによりビルドしてインストールすると下記のような画像が得られます。

なかなかいい感じです。


おしまい

以上、Wifiカメラから得られた画像をピクセルを直接操作することで画像処理してみました。

前回の紹介で「古い端末でも映像の取得が高速な場合がある」という趣旨の記述をしました。それはWifi経由での画像取得の速度についての記述だったのですが、今回の画像処理は、純粋に計算能力で速度が決まりますので、ほとんどの場合、新しい端末の方が高速に動作します。

ちなみに、最後に行った「エッジ画像風表示」をAi-Ballで行った場合、Galaxy S3では1秒以内に処理が完了しますが、Xperia Arcでは数秒の計算遅延が起こります。

実際の応用では無理に全画面を処理の対象とせず、画像の一部だけにするなど、何らかの工夫が必要になる場合もあります。そういう場合でもこのピクセルを直接いじる方法は柔軟に対応できます。

こちらもどうぞ

AndroidでWifiカメラから受け取った動画を画像処理する(2)OpenCVを用いる方法

$
0
0
前回、Wifiカメラから受け取った映像をピクセル操作によって画像処理してみました。しかし、簡単な処理でも記述量が多くなるという問題がありました。

そこで、今回はOpenCVと呼ばれるライブラリを用いてお手軽に画像処理をしてみます(といっても、OpenCVを用いるのは私も今回が初めてなのですが)。

準備として、前回の前半に書いてあるように、SimpleMjpegViewがandroid上で動作するようにしておいてください。前回の続きでも良いですし、新規に始めても構いません。新規の場合は図のように映像が表示されます。

OpenCVのインストール

まずはeclipseがインストールされたマシンにandroid用のOpenCVをインストールします。こちらからopencv-android→(最新の数字)とたどり、OpenCV-x.x.x-android-sdk.zipをダウンロードします。私が試したときの最新版はOpenCV-2.4.3.2-android-sdk.zipでした。解凍して現れるファイルを、例えばeclipseのワークスペースにコピーします。

次に、OpenCVのフォルダに含まれるsdk/javaフォルダをeclipseにインポートします。通常通り、「ファイル→インポート→既存プロジェクトをワークスペースへ」で行います。

次に、SimpleMjpegViewからOpenCVを参照する設定を行います。eclipse上のプロジェクトエクスプローラー上でSimpleMjpegViewを右クリック→プロパティーとたどり、項目の中のandroidをクリックすると、下半分にライブラリーという項目があるので、追加ボタンをクリックして、OpenCVライブラリを追加します。

最後に、アプリをインストールするandroid端末に、Google PlayからOpenCV Managerをインストールしておきます。

以上の準備が済んだら、ファイルの編集を行います。

ファイルの編集

まず、初期化処理のためにSimpleMjpegViewのsrcフォルダ以下にあるMjpegActivity.javaを編集します。冒頭のimport文に、下記の 3項目を追加します。
import org.opencv.android.OpenCVLoader;
import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
次に、MjpegViewのインスタンスmvの宣言の直後に下記の初期化処理を記述します(※ソース更新に合わせて、若干の変更 2013.1.30/2013.4.29)。
private MjpegView mv = null;
String URL;

// mv と URL の宣言の直後に下記を記述

private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
setContentView(R.layout.main);
mv = (MjpegView) findViewById(R.id.mv);
if(mv != null){
mv.setResolution(width, height);
}
new DoRead().execute(URL);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
そして、同じファイル内で、MjpegViewをnewしている部分をみつけ、下記のようにコメントアウトした上で初期化処理の追記を行います(※ソース更新に合わせて、若干の変更 2013.1.30/2013.4.29)。
// 下記の6行を見つけてコメントアウトし、代わりに下記を追記

// setContentView(R.layout.main);
// mv = (MjpegView) findViewById(R.id.mv);
// if(mv != null){
// mv.setResolution(width, height);
// }
// new DoRead().execute(URL);

if (!OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_3, this, mOpenCVCallBack))
{
Log.e(TAG, "Cannot connect to OpenCV Manager");
}
次に、画像処理の本体を記述します。SimpleMjpegViewのsrcフォルダ以下にあるMjpegView.javaを編集します。まず冒頭のimport文の中に、下記の四項目を追加します。
import org.opencv.android.Utils;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.imgproc.Imgproc;
次に、同じくMjpegView.java内で下記のように readMjpegViewを呼び出している部分を見つけます。前回の続きとして実行する場合は、imageprocessing関数が記述されていると思いますが、その場合はその行をコメントアウトしてください。

そしてその後ろに5行のOpenCV命令を記述します。これは画像のグレースケール化を行う処理なのですが、詳細は末尾に記すTechBoosterさんのサイトを参考にしてください。
if(bmp==null){
bmp = Bitmap.createBitmap(IMG_WIDTH, IMG_HEIGHT, Bitmap.Config.ARGB_8888);
}
int ret = mIn.readMjpegFrame(bmp);

if(ret == -1)
{
return;
}
// 前回の続きとして実行している場合は下記1行をコメントアウトしておく
//imageprocessing(bmp);

//OpenCVによる画像処理
Mat bmp_mat = new Mat(IMG_HEIGHT, IMG_WIDTH, CvType.CV_8UC4);
Utils.bitmapToMat(bmp, bmp_mat);
Imgproc.cvtColor(bmp_mat, bmp_mat, Imgproc.COLOR_RGB2GRAY);
Imgproc.cvtColor(bmp_mat, bmp_mat, Imgproc.COLOR_GRAY2RGBA, 4);
Utils.matToBitmap(bmp_mat, bmp);
以上の記述ができたらandroidにアプリをインストールします。
成功すると、図のようにグレースケール画像が得られます。

このように、OpenCVを用いると少ない記述量で様々な処理を行うことができます。OpenCVが流行っている理由がわかる気がします。

計算時間の比較

前回の「(JNIによる)ピクセル直接編集」と今回のOpenCVの計算にかかる時間はどの程度か調べてみます。対象は今回取り扱ったグレースケール処理の部分のみで、かかった計算時間を100回以上平均をとって計測しました。結果は以下の通りです。

端末ピクセル直接編集OpenCV
Galaxy S3
cm10-based JCROM
7.7ms14.8ms (*)
Xperia Arc
cm10-based JCROM
13ms23ms

みてわかるように、2つの端末の両方でピクセル直接編集の方が高速であることがわかりました。といっても、私はOpenCVを今回初めて使ったので、もっとOpenCVを効率的に用いる方法があるのかもしれませんが。なお、参考までに、表中で (*) のついた 14.8ms について、OpenCVで用いた5行の画像処理命令の内訳を記すと下記のようになります。

Mat bmp_mat = new Mat(IMG_HEIGHT, IMG_WIDTH, CvType.CV_8UC4); 0.2ms
Utils.bitmapToMat(bmp, bmp_mat); 3.1ms
Imgproc.cvtColor(bmp_mat, bmp_mat, Imgproc.COLOR_RGB2GRAY); 6.5ms
Imgproc.cvtColor(bmp_mat, bmp_mat, Imgproc.COLOR_GRAY2RGBA, 4); 4.4ms
Utils.matToBitmap(bmp_mat, bmp); 0.6ms

RGB2GRAYがグレースケール化の実体だと思いますが、その前後のbitmapToMatとGRAY2RGBAに地味に時間がかかるのが痛いように思います。

おしまい

今回私も初めてのOpenCV体験でしたので、下記の薄い本とサイトを参考にさせて頂きました。ありがとうございました。

こちらもどうぞ

スマートウォッチi'm Watchでプラレールを操作してみた

$
0
0
android 1.6ベースのスマートウォッチi'm Watchでプラレールを操作してみました。早速ですが動画はこちら。



操作の流れは下図のようになります。

i'm Watchは母艦であるGalaxy S3とBluetoothテザリングによりネットワークを共有しているので、i'm WatchからGalaxy S3へソケット接続し、命令を送信します。Galaxy S3は受け取った命令をもとに、プラレール上のPIC24FマイコンへBluetooth命令を送信し、モーターを動かしています。なお、今回母艦であるGalaxy S3にはカスタムロム(CM10-based JCROM)をインストールしています。

i'm WatchとPICは直接通信できないの?

当初はi'm WatchとPICを直接通信できないかと思っていました。i'm Watchはandroid 1.6ベースなので、自作アプリからBluetoothを利用するときは(例えば)backport-android-bluetoothなどを使わねばならないのですが、実際にやってみると

のようにbackport-android-bluetoothが必要とするandroid.bluetooth.IBluetoothDeviceがないと言われたので今回は断念しました。

ソースとか

通信のサンプルソースは以下の通りです。
このサンプルの利用イメージは下図のようになります。

母艦からPICへの送信アプリは、hrdakinoriさんのDroidControlにサーバーソケット機能を追加して作成しています。hrdakinoriさんに感謝します。

なお、i'm Watch用アプリであるDroidControlImWatchでは、母艦のIPアドレスを指定する必要があります。設定用のGUIを用意しましたので、そちらで設定を行ってください(追記2013.4.30)。なお、androidでBluetoothテザリングを行うと母艦側は192.168.44.1になるようなので、その値を初期値としてあります。ポートは両方のアプリで指定する必要がありますが、今回は8081にしています(特に根拠はないです)。

参考にしたサイト

スマートウォッチi'm WatchでMJPEGストリームを表示してみた

$
0
0
前回のエントリでi'm Watchを用いてプラレールを操作する方法を紹介しました。今回は、MJPEGをストリーミングするタイプのWifiカメラの映像をi'm Watchで受け取って表示してみます。

いつものプラレールですが、使用例の動画が下記になります。


今回のポイントは、プラレール上のXperia Rayからの映像がMJPEGストリームとして送信され、i'm Watchがそれをデコードして表示している点です。以下で解説するように、動画はBluetoothテザリングで送られてきますので高速にはできず、毎秒5フレーム程度です。

なお、同時にプラレールの操作もi'm Watchで行っていますが、これは前回のエントリに基づいています。

仕組みとサンプルソース

システムの大まかな流れは下の図のようになります。

動画を送信するXperia Rayでは、Google PlayからインストールできるIP Webcamというソフトウェアを導入して実行しています。IPWebcamはサービスとしてバックグラウンドで実行できますので、他のアプリ(ここではBluetoothでPICマイコンに命令を送信するもの)を同時に実行できます。IP Webcamの設定の注意点は以下の通りです。上図で分かるようにデータはBluetoothで送られますので、データ量を減らすことが重要です。
  • Resolution: 320x240に。データ量削減のため
  • Quality: 30~50程度。低いほど画質が下がるが、データ量は減るので有効
  • Orientation: Landscape
  • FPS limit: 5以下に。一秒間に送られる画像の枚数
i'm Watch用の受信アプリですが、MJPEGのデコードに特化したサンプルのソースを
に置きました。このアプリをi'm Watchにインストールして利用します。注意点は以下の通りです。
  • i'm Watchを母艦(上の図ではXperia Ray)と接続し、Xperia Ray側でBluetoothテザリングを有効にします。なお、今回はXperia Rayにはカスタムロムをインストールしています(CM10-based JCROM)。
  • i'm Watch側のアプリから母艦のIPアドレスを指定する必要があります。GUIによる設定画面を用意しましたので、そちらで設定を行います(追記2013.4.30)。なお、androidでBluetoothテザリングを行うと母艦側は192.168.44.1になるようなので、その値を初期値としてあります。
このサンプルを使用しているイメージは下図のようになります。いい感じです。この図では母艦はCM10-based JCROMをインストールしたGalaxy S3です。


おわりに

届いた当初は何に使ったらよいのか途方に暮れたi'm Watchでしたが、adbが入ったファームウェアが公開され、自作アプリを試せるようになると俄然愛着がわきますね。時計としてはまあちょっと残念ですが(毎日充電しなきゃいけないし)。

expansysには色によって在庫があるようなので、気になる人は試してみては?

こちらもどうぞ


スマートウォッチi'm WatchでタミヤのRCモデルを操作してみた

$
0
0
スマートウォッチI'm WatchでタミヤのRCモデルを操作してみました。
動画はこちら


経緯


卒業生がTAMIYAのRCモデル「初音ミク Studie GLAD BMW Z4」を遺産として残してくれました。塗装もデカール貼りも気合いが入っています。


androidからbluetooth経由で操作できるよう改造されているのですが、スマートフォンでのラジコン操作は2010年の時点で既にいわたんさんによるすごい動画があるのでどう使おうか迷いどころでした。

しかしこのまま眠らせるのも惜しいと思い、手持ちのスマートウォッチi'm Watchで操作してみることにしました。ものを動かすためにi'm watchを利用するのは下記のプラレール操作に引き続き2つ目ということになります。
i'm Watchは血迷って2つ購入してしまったので、無理にでも積極的に活用しないと損をした気になってしまうのです。



i'm Watchと回路を連携するためには、母艦となるスマートフォンに中継してもらう方法を用いており、これは上記のプラレールと本質的には変わりません。

ただし、そのままではつまづくポイントがあったので、以下ではそれらをメモします。

技術的なこと


実現したいことは以下の通りです。

  • i'm WatchでRCモデルを操作できること
  • RCモデルにカメラを搭載し、i'm Watchから閲覧できること
プラレールの時に用いた方法を用いるなら、こんな感じになるでしょう。



なお、Xperia RayでBluetoothテザリングを行うには、カスタムロムをインストールする必要があります(ここではCM10-basedなJCROM)。が、実際に試してみると、i'm Watchのbluetoothは2、3m程度しか飛ばないことがわかり、RCモデルの操作には適していないことがわかります(プラレールの場合はi'm Watchを常にプラレールの近くに置いて操作していたので問題なかったのですが)。

そこで、実際に採用したのは以下の第2案です。


…なんというか、必要以上に複雑なシステムになってしまいました。実用性よりも「i'm Watchを無理にでも使うこと」が目的になってしまっている感がありますが、とにかくこうなっています(という自分用のメモ)。なお、Xperia ArcでBluetoothテザリングを行ってi'm watchの母艦とするために、カスタムロムをインストールして用いています(ここではCM10-basedなJCROM)。このXperia Arcは動画ではシャツの胸ポケットに入っています。

なお、RCモデル上のカメラを省略すれば、Xperia Rayは不要になって若干シンプルになります。

図では省略していますが、RCモデルの操作はオリジナルの操作系をそのまま活用するため、プロポの基板+ESCをそのまま車体内に搭載し、プロポ基板に対してPIC24F+DA変換チップ(MAX525)からアナログ電圧を与えることで操作しています。

Xperia ArcとPIC24FとのBluetooth通信には、いつも通りhrdakinoriさんのBT_DROIDを活用させて頂いております。

おしまい


i'm WatchでRCモデルを操作してみましたが、スマートウォッチとしての本来の目的(メール、スケジュール管理、SNS連携など)はどうかというと、何をやるにしてもスマホの使い勝手には敵わないというのが現実です。そのあたりの事情はWiredの「Smartwatchは本当に革新的なのだろうか?」という記事が参考になります。

そうはいっても、腕時計で通信をしたりものを動かしたりというのは「古き良き未来」を感じさせてワクワクさせるものがあります。個人的にはウルトラセブンのモロボシダンがキリシマ隊長とビデオシーバーを使ってテレビ電話をしていたのを良く覚えています。また、この作業をしているときにたまたま読んでいた「ファイブスター物語リブート1」でザ・ナイト・オブ・ゴールドの外部からの操作にやはりこの手のスマートウォッチ風のデバイスを用いていたのもイイ感じでした(1986年頃の作品です)。

今後数年でスマートウォッチがより進化して、我々の生活に浸透してくると面白いですね。


簡単MJPEGビューア(SimpleMjpegView)をGoogle Playに公開してみた

$
0
0
Trek Ai-BallIP Webcam (Google Play)のようにMJPEGストリーミングを行うネットワークカメラをandroidで表示するためのサンプルアプリのソースを以前から公開していました(詳細)。

何人かの方が使ってくださっているようなのですが、カメラのIPアドレスがソースに直書きされているので使いにくいという意見がありました。

サンプルだからシンプルな方が良いだろう、と思ってIPアドレス変更用のインターフェイスをつけていなかったのですが、せっかくなので必要な機能を追加した上でGoogle Playに公開してみました。ソースもこれまで通り公開しています。

以下、リンクなど

<実行ファイル>
簡単MJPEGビューア(Google Play)

<ソース>
SimpleMjpegView (bitbucket)

<解説>
AndroidでWifiカメラからのMJPEGストリームを表示する

<画像処理の方法>
AndroidでWifiカメラから受け取った動画を画像処理する(1)ピクセルを直接操作する方法
AndroidでWifiカメラから受け取った動画を画像処理する(2)OpenCVを用いる方法

以前との違いは下記の通りです。

  • カメラのIPアドレスを設定するインターフェイスをつけた(デフォルトは http://192.168.2.1:80/?action=stream になっており、Trek Ai-Ballにつながる)
  • 解像度を可変にした(デフォルトは640x480だが、任意の解像度を指定可能)
ロボットなどに搭載して遊ぶのに良いと思います。

注意点としては、映像を受信する端末によって映像の滑らかさに差が出ることが挙げられます。これは以前の解説ページに書いた通りですが、Nexus 4 は特に遅い印象がありました。快適なのは以前も書いた通りXperia Arcなどです。




スマートウォッチi'm watchのマーケットi'marketでアプリを公開してみた

$
0
0
スマートウォッチi'm watchを使ってこれまで
してきましたが、せっかくなのでマーケットであるi'marketにアプリを出してみることにしました。

モノはこの前GooglePlayに出しSimpleMjpegViewのi'm watch版で名前をMjpegViewとしました(名前の長さに制限があります)。

i'm watchはスマートフォンと連携して使うのですが、そのスマートフォンからネットワーク的にアクセスできるネットワークカメラからのMJPEGストリームを表示するアプリです。

スクリーンショットはこんな感じ。
ネットワークの設定画面はこんな感じです。
そして使用イメージはこんな感じ。
なお、i'm watchはbluetoothで母艦のスマートフォンと接続するため、データ量を極力小さくする必要があります。そのため、解像度やフレームレートなどを細かく設定可能なIP Webcamというアプリをandroid上で動かしてネットワークカメラとするのが現実的です。

IP Webcamの設定は以下の程度とするのが良いと思います。
  • Resolution: 320x240
  • Quality: 20-30
  • Orientation: Landscape
  • FPS Limit: 5
スマートウォッチi'm WatchでMJPEGストリームを表示してみた」や「スマートウォッチi'm WatchでタミヤのRCモデルを操作してみた」でやったように、ものを動かすコントローラーとしてi'm watchを使う場合、一緒にカメラ映像も表示してあげると、程よい未来感が出てカッコいいかなあ、なんて思います。

ソースはGitHubで公開してます。

docomo Galaxy S2 (SC-02C) 向けにFirefox OSをビルドしてみた

$
0
0

はじめに

solaさんによる「Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
から始まるFirefox OSについての連続投稿を見て、自分でも何かビルドしてみようと思い立ちました。

Firefox OSはandroid 4.0 (ICS)ベースであり、ICSが動く端末ならばFirefox OSを載せることは
技術的には可能、ということなので、手持ちのGalaxy S2とGalaxy S3に載せることを目標にします。
どちらの端末にもCyanogenMod 9 (ICSベースのカスタムロム) をビルドして
載せたことがあるので、多分なんとかなるだろう、との予測からです。

なお、「Firefox OS ビルドの必要条件」にあるように、Galaxy S2は優先度は低いとはいえ
公式にサポートされている端末なので、これでビルドの手順を把握してから
Galaxy S3に進むという手順を取ります。

Galaxy S2は去年9月にもビルドしたことがあって、その時はまだ完成度が低かったものが
どれくらい変化したか見たい、というのもあります。

目標

ビルドするにあたって、目標にしたのは下記の2点です。
  • kernelは自分でビルドしたものを用いる
  • ビルド用PCと端末に焼くPCとを別にしたい
一つ目のkernelについてですが、海外版と日本版のGalaxy S2ではバードウェア構成が
若干異なるので、日本版に対応したkernelをビルドして載せないと、
電池持ちが悪くなるなどの問題が起こるだろう、との判断からです。

また、二つ目ですが、Galaxy S2はFirefox OSのgaiaのインストールにadb接続を用います。
そのため、ビルド用PCだけではなく、端末に焼くPCにも
gaiaのソース一式が必要なので、取扱いがちょっと面倒でした。
この部分にはsolaさんによるodapackageの対応などを活用させて頂き、
CWM recoveryで焼けるzipファイルを作成するようにしています。
(odapackageとCWM recoveryによるインストールはGalaxy S3では必須になります)

手順は以下の通りです。
なお、ビルドのための環境構築はsolaさんによる
Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
を参考にしてみてください。

なお、通常のFirefox OSと、solaさんによるカスタムロムのBoot to JCROM
両方のビルド法をともに記します。

ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`
$ git clone https://github.com/neuralassembly/B2JC.git B2G
$ cd B2G

Firefox OSをダウンロードする場合は以下のコマンドを、
$ ./config.sh sc02c

Boot to JCROMをダウンロードする場合は以下のコマンドを実行します。
$ ./config.sh sc02c-b2jc

ダウンロードが終わったら、Galaxy S2 (SC-02C)の /system ディレクトリのダンプを
ソースツリーに配置します。

$ mkdir -p $B2G_WORK/B2G/backup-sc02c/system
$ cd $B2G_WORK/B2G/backup-sc02c/system
(端末がつながっていれば)
$ adb pull /system/. .

もし端末がビルド用のPCにつながっていない場合、あらかじめsystemを
ダンプしておき、何らかの方法でビルド用のマシンの
$B2G_WORK/B2G/backup-sc02c/system
に配置してください。できたら、以下のように/systemから抜き出したファイルをソースツリー上に配置します。

$ cd $B2G_WORK/B2G/device/samsung/sc02c/
$ ./extract-files.sh

この操作により、下記のディレクトリにプロプライエタリファイルなどが配置されます。
$B2G_WORK/B2G/vendor/samsung/sc02c/
$B2G_WORK/B2G/vendor/samsung/sc02c-common/

高解像度対応、日本語対応など

この章で行う操作はsolaさんによるものを流用させて頂いております。

また、この章の内容は、通常のFirefox OSをビルドするときのみ行ってください。
Boot to JCROMをビルドする場合は次の「いくつかの修正」へ進んでください。

下記のように日本語辞書を用意します。

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

いくつかの修正

6/10の時点では、起動時のロゴやFirefoxブラウザのアイコンが
取り込まれないというバグがありますので、それを以下で修正します。
このコミットが関連していると思われる)

$ cd $B2G_WORK/B2G/gaia/build
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-webapp-zip.patch
$ patch < b2g-webapp-zip.patch

また、画面ON時にHOMEボタン裏のLEDが光りっぱなしになるのが気になるので以下で修正します。

$ cd $B2G_WORK/B2G/gecko/hal/gonk/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-GonkHal.patch
$ patch < b2g-GonkHal.patch

環境変数の設定

環境変数を設定します。

$ export LOCALE_BASEDIR=$B2G_WORK/B2G/multilocale/gaia-l10n
$ export LOCALES_FILE=$B2G_WORK/B2G/multilocale/languages-japan.json
$ export PATH="$PATH:$B2G_WORK/B2G/multilocale/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/multilocale/compare-locales/lib"
$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2

kernel のビルド

ここは自分でkernelをビルドしたい人のみ行って下さい。
既に日本版のkernelを配置済みなので飛ばしても問題ないです。

http://opensource.samsung.com/ からMobile→Mobile Phoneと辿り、
SC-02C_ICS_Opensource_Update1.zipを $B2G_WORKにダウンロードしておきます。

$ cd $B2G_WORK
$ unzip SC-02C_ICS_Opensource_Update1.zip
$ mkdir kernel
$ cd kernel
$ tar zxf ../Kernel.tar.gz

$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g_jpn_ntt_defconfig -O arch/arm/configs/b2g_jpn_ntt_defconfig
$ git clone https://github.com/neuralassembly/initramfs-sc02c-b2g.git
$ rm -rf initramfs-sc02c-b2g/.git
$ rm -f initramfs-sc02c-b2g/README.md
 (initramfs-sc02c-b2gディレクトリがそのままrootfsになるので、
 不要なファイルを削除します。残しておいても影響ないので、
 気になる方は削除しないでもよいです)

$ export ARCH=arm
$ export CROSS_COMPILE=$B2G_WORK/B2G/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

$ make b2g_jpn_ntt_defconfig
$ make -j16

$ cp `find drivers -name "*.ko"` initramfs-sc02c-b2g/lib/modules/

$ make -j16

$ cp `find drivers -name "*.ko"` $B2G_WORK/B2G/device/samsung/sc02c/
$ cp arch/arm/boot/zImage $B2G_WORK/B2G/device/samsung/sc02c/kernel

ビルドと書き込み

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh otapackage

ビルドが終わると、
 out/target/product/sc02c/full_sc02c-ota-eng.username.zip
ができていますので、これをCWM recoveryで書き込んでください。

heimdallで焼きたい方は
 out/target/product/sc02c/ にある kernel と system.img を
heimdall flash --kernel kernel --factoryfs system.img
で焼いてもOKです。ただし、この場合heimdallのバージョンは1.3.1を用いてください。
1.3.2を用いると、system.img を焼く際に失敗します。

できることとできないこと

下記のような感じです。3GとWifiが使えるので、それなりに遊べます。アップデートの通知が来ますが、アップデートしないでください。

通話×-
3G通信docomo SIMでmopera.netに接続
Wifi-
SDカード内蔵メモリが使われる
カメラ×カメラアプリを起動して放っておくと数分間隔で絵は撮れてるので、努力次第でなんとかなるかも?
音楽再生-
動画再生R, G, B の各成分の画像が縦にずれて表示される


技術的なこと

少し細かな話ですが、「目標」で述べた2点について少し補足します。

kernelですが、Galaxy S2ではkernel (zImage) をそのままboot.imgにコピーして用います。
その際、rootfs は initramfs に配置します。
また、kernelをビルドするためのコンパイラはarm-eabi-4.4.3のものにしましたが、
これを用いないと、起動しないkernelができたり、insmodで読み込めない
カーネルモジュールができたりしました(よくあることのようです)。

また、otapackageの作成ですが、関連するコミットやリポジトリへのリンクを貼っておきます。
<solaさんによるもの>
sola-dolphin1 / B2JC / Supports build otapackage.
sola-dolphin1 / platform_build / Supports build otapackage.
sola-dolphin1 / platform_external_genext2fs
sola-dolphin1 / platform_external_e2fsprogs

<私による追加>
neuralassembly / platform_build / add support for BOARD_CUSTOM_BOOTIMG_MK
  例えば「kernelをそのままコピーしてboot.imgとする」というような指定を
 deviceディレクトリの端末毎のmkファイルで行えるようにした (CyanogenMod 9 由来)
neuralassembly / platform_build / skip common.CheckSize when creating otapackage
 こちらはエラー回避のため

ということで、公式にサポート端末である Galaxy S2 によって
ビルド法をある程度理解できたので、次回の Galaxy S3 へと続きます。

こちらもどうぞ


docomo Galaxy S3 (SC-06D) 向けにFirefox OSをビルドしてみた

$
0
0

はじめに

前回、docomo Galaxy S2 (SC-02C) にFirefox OSをビルドし、感覚をつかみました。
これに基づいて Galaxy S3 (SC-06D) にFirefox OSをビルドしてみます。

Galaxy S2は(海外版とは言え)公式にサポートされている端末でしたが、
Galaxy S3はそうではありません。そこで問題となるのが、ハードウェア絡みのドライバを
どう用意するかです。

mozilla-b2g / b2g-manifestのリポジトリを見ると、公式ではlinaroやcodeauroraなどのコードを利用していますが、
それと同じことをし、さらにdevice以下のmkファイルを自分で用意するのは私の手に負えないと考え、
既に動作が確認されている CyanogenMod9 からハードウェア依存のコードを全て持ってくるようにしました。
CyanogenMod9は依存関係が深いので、framework/base や system/core まで
CyanogenMod9のものを持ってくる羽目になりましたが、結果的に動いたのでよしとします。
(詳細はneuralassembly / b2g-manifest / sc06d.xml を見て下さい)

動画はこちら



というわけで、ビルド法は以下の通りです。Galaxy S2のときと同様、
solaさんによる「Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
によるビルド法を踏襲したものになっています。
また、ビルド環境の構築にも上記のsolaさんのページを参考にしてみてください。

なお、通常のFirefox OSと、solaさんによるカスタムロムであるBoot to JCROM
両方のビルド法を以下で解説します。




ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`
$ git clone https://github.com/neuralassembly/B2JC.git B2G
$ cd B2G

通常のFirefox OSのビルドの際は以下のコマンドを、
$ ./config.sh sc06d

solaさんによるBoot to JCROMのビルドの際は以下のコマンドを実行します。
$ ./config.sh sc06d-b2jc

ダウンロードが終わったら、Galaxy S3 の /system ディレクトリのダンプを
ソースツリーに配置するのですが、ここではHomuHomu さんらが開発されている一撃ツールと
ビルド済みCyanogenMod9のファイルを用いることにします。

$ mkdir $B2G_WORK/B2G/backup-sc06d
$ cd $B2G_WORK/B2G/backup-sc06d
$ wget http://dl.dropbox.com/u/14219187/make_JP_CompleteROM_SC06D.zip
$ unzip make_JP_CompleteROM_SC06D.zip
(http://goo.im/devs/cm/d2att/nightly/ から cm-9-20120916-NIGHTLY-d2att.zip
をダウンロードしてここに配置)
$ unzip cm-9-20120916-NIGHTLY-d2att.zip
$ cd $B2G_WORK/B2G/device/samsung/sc06d/
$ ./extract-files.sh

以上の操作により、以下が作成されます。
$B2G_WORK/B2G/vendor/samsung/sc06d/

高解像度対応、日本語対応など

この章で行う操作はsolaさんによるものを流用させて頂いております。

また、この章の内容は、通常のFirefox OSをビルドするときのみ行ってください。
Boot to JCROMをビルドする場合は次の「いくつかの修正」へ進んでください。

下記のように日本語辞書を用意します。

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

いくつかの修正

なお、6/10の時点では、起動時のロゴやFirefoxブラウザのアイコンが
取り込まれないというバグがありますので、それを以下で修正します。
このコミットが関連していると思われる)

$ cd $B2G_WORK/B2G/gaia/build
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-webapp-zip.patch
$ patch < b2g-webapp-zip.patch

画面ON時にHOMEボタン裏のLEDが光りっぱなしになるのが気になるので以下で修正します。

$ cd $B2G_WORK/B2G/gecko/hal/gonk/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-GonkHal.patch
$ patch < b2g-GonkHal.patch

環境変数設定

次に、環境変数設定を行います。

$ export LOCALE_BASEDIR=$B2G_WORK/B2G/multilocale/gaia-l10n
$ export LOCALES_FILE=$B2G_WORK/B2G/multilocale/languages-japan.json
$ export PATH="$PATH:$B2G_WORK/B2G/multilocale/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/multilocale/compare-locales/lib"
$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2

kernel のビルド

ここは自分でkernelをビルドしたい人のみ行って下さい。
既に日本版のkernelを配置済みなので飛ばしても問題ないです。

kernelはsakuramilkさんの公開されているSC-06D用kernelを使わせていただきます。

$ cd $B2G_WORK
$ git clone https://github.com/sakuramilk/sc06d_kernel_ics.git -b android-linux-3.0-master
$ cd sc06d_kernel_ics
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/sc06d_kernel_makefile.patch
$ patch < sc06d_kernel_makefile.patch

$ export ARCH=arm
$ export CROSS_COMPILE=$B2G_WORK/B2G/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

$ make sc06d_aosp_defconfig
$ make -j16
$ cp `find drivers -name "*.ko" ` $B2G_WORK/B2G/device/samsung/sc06d/
$ cp arch/arm/boot/zImage $B2G_WORK/B2G/device/samsung/sc06d/kernel

ビルドと書き込み

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh otapackage

ビルドが終わると、
  out/target/product/sc06d/full_sc06d-ota-eng.username.zip
ができていますので、これをCWM recoveryで書き込んでください。
heimdallでの書き込みには私は成功していません。
 (heimdall detect での検出には成功するが、書き込みできない)

できることとできないこと

下記のような感じです。Wifiが使えるので、それなりに遊べます。アップデートの通知が来ますが、アップデートしないでください。

通話×-
3G通信×-
Wifi-
SDカード内蔵メモリではなく、外付けのSDカードを使用
カメラ×アプリ起動しないです
音楽再生-
動画再生-
ブラウザ初回起動時、縦画面ではタッチに全く反応しないので、横画面で使ってみてください。一度トップサイトにサイトが登録されれば縦画面でも使えます

そういえば、端末をつないでからadbで接続できるようになるまで、1~2分待たされます。なぜ?

技術的なこと&ハマったこと

Galaxy S2でotapackageを作るために必要な変更は前頁にて紹介しましたが、
ここではさらに以下を追加しました。


 ramdisk のアドレスをdeviceディレクトリの各端末のmkファイルで指定できるようにしています。
 (CyanogenMod 9由来)

Galaxy S3 でFirefox OSを動かすにあたり、まず必要なことはkernelを正常に動作させることです。
kernelが起動して起動スクリプトが実行されれば、次のステップであるgaiaが起動しなくても、
adb shellで端末の中身を見ることができるので、問題を発見しやすくなります。
(ただしこの際、画面は真っ黒なまま)

次に、gaiaの起動ですが、Galaxy S2の起動法に従えば、以下の手順で起動プロセスが進みます。

(1) init.b2g.rc のインポート
(2) /system/b2g/b2g などに実行パーミッションを与える
(3) check-sysimage.shを実行し、OSがandroidかFirefox OSかを判定する
(4) 判定結果に基づき、 servicemanager-g というサービスを起動する
(5) /system/bin/b2g.sh が起動される
(6) /system/b2g/b2g が実行される

(2)の /system/b2g/b2g に実行パーミッションを与えるのが曲者で、
この時点で/system パーティションが読み書きできる状態でなければ
実行権限が与えられず、(6)の起動に失敗します。これに気づくまで数日かかりました。

また、実行パーミッションをうまく与えても、数回に一回しか起動しない、という
状態になりました。これは起動プロセスのタイミングの問題だろうと考え、
上の、やや回りくどい起動プロセスを下記のように簡略化しました。
(init.b2g.rcやcheck-sysimage.shは残してありますが、実行されていない)
これにより、確実に起動するようになりました。

(1) /system/b2g/b2g などに実行パーミッションを与える
(2)  servicemanager-g というサービスを起動する
(3) /system/bin/b2g.sh が起動される
(4) /system/b2g/b2g が実行される

使ってみた感想など

Galaxy S2とGalaxy S3とでは、その性能差からS3の方が快適だろうと予想していたのですが、
必ずしもそうではありませんでした。S3の解像度(720x1280)はS2の解像度(480×800)より
高いのですが、そのためにブラウザなどの文字表示が小さくなり、またタッチに反応する
エリアが狭くなってしまっていることが何度もありました(反応するまで何度もタッチする)。
また、画面が大きいせいもあるのか、もっさり感を感じる場面も多くありました。

また、Firefox OSとandroidとを比較した場合(比較してはいけないのでしょうが)、
androidでは快適に見られていた動画がFirefox OSではカクカクになるなど、
ネイティブまで触れるandroidと、HTML5メインのFirefox OSの差を感じさせられました。

もちろん、これらは自分でビルドした端末での評価なので、
公式のKEONやPEAKでは異なるのかもしれません。

「ネイティブ vs HTML5」という図式を見ると、Java1.1~Java2の頃の「C++ vs Java」
のどちらが速いかという論争を思い出してしまいます。
当時は「(ベンチマークの内容によっては)JavaはC++よりも高速」なんてよく言われてましたね。

結局Javaは「クライアントサイドでは遅い」というイメージを今でも払拭できていないと私は思いますが、
HTML5はどうなるか、気になるところです。

おしまい

日本語化や高解像度の設定、odapackageの作成などにはsolaさんいよる変更を、
プロプライエタリファイル周りではHomuHomuさんの一撃ツールを、
kernelはsakuramilkさんのものを
使わせて頂きました。

Xperia arcとXperia ray向けにFirefox OSをビルドしてみた

$
0
0

はじめに

docomo Galaxy S2 (SC-02C) docomo Galaxy S3 (SC-06D) に引き続き、
Xperia arcとXperia rayに対してFirefox OSをビルドしてみました。

動画はこちら


写真はこちら
Xperia arc


Xperia ray


ビルドの前に

日本版のXperia arcとXperia rayに対して、Firefox OSを含む非公式のロムをインストールするためには
bootloader unlockをする必要があります。私はOmniusというツールを使って行いました。
arc向けの解説はこちら、ray向けの解説はこちらが参考になります。
無料のunlockツールとしてはs1toolというものがあるようなので、そちらでも良いかもしれません。

なお、経験上ですが、Xperia rayを公式の最新OSにアップデートするとbootloader unlockできなくなるように見えました。
古い公式OSに焼きなおしても状況は変わらないので、穴がふさがれる?
なお、新品のrayの白ロムを買えば問題なくbootloader unlockできました。
Xperia arcの場合どうなのかはちょっとわかりません。

このあたりは自己責任でお願いします。

というわけで、ビルド法は以下の通りです。これまでと同様、
solaさんによる「Keon と Peak が届かないので、Nexus S を Firefox OS 端末にしてみた
によるビルド法を踏襲したものになっています。
また、ビルド環境の構築にも上記のsolaさんのページを参考にしてみてください。

なお、以下では通常のFirefox OSとsolaさんによるBoot to JCROMのビルド法の
両方を解説します。

ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`

(arc用にビルドするときは)
$ export DEVICE=anzu

(ray用にビルドするときは)
$ export DEVICE=urushi

$ git clone https://github.com/neuralassembly/B2JC.git B2G
$ cd B2G

通常のFirefox OSをビルドする場合は下記を、
$ ./config.sh $DEVICE

Boot to JCROMをビルドする場合は下記を実行します。
$ ./config.sh $DEVICE-b2jc

ダウンロードが終わったら、Xperia arcまたはrayの /system ディレクトリのダンプを
ソースツリーに配置するのですが、ここではビルド済みCyanogenMod9のファイルを用いることにします。

$ mkdir $B2G_WORK/B2G/backup-$DEVICE
$ cd $B2G_WORK/B2G/backup-$DEVICE

(arcの場合、http://download.cyanogenmod.com/?device=anzu から
cm-9.1.0-anzu.zip をダウンロードしてここに配置、
 rayの場合、http://download.cyanogenmod.com/?device=urushi から
cm-9.1.0-urushi.zip をダウンロードしてここに配置)

$ unzip cm-9.1.0-$DEVICE.zip
$ cd $B2G_WORK/B2G/device/semc/$DEVICE/
$ ./extract-files.sh

以上の操作により、以下が作成されます。
$B2G_WORK/B2G/vendor/semc/anzu/  (arcの場合)
$B2G_WORK/B2G/vendor/semc/urushi/  (rayの場合)

さらに、Xperia rayでは傾きセンサの向きが逆になる(海外版と日本版の違い?)ので、 以下のパッチ当てを行います(rayのみ)。

$ cd $B2G_WORK/B2G/vendor/semc/urushi/proprietary/etc/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-urushi-sensors-conf.patch
$ patch < b2g-urushi-sensors-conf.patch

高解像度対応、日本語対応など

この章で行う操作はsolaさんによるものを流用させて頂いております。

また、この章の内容は、通常のFirefox OSをビルドするときのみ行ってください。
Boot to JCROMをビルドする場合は次の「いくつかの修正」へ進んでください。

下記のように日本語辞書を用意します。

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

いくつかの「修正

6/10の時点では、起動時のロゴやFirefoxブラウザのアイコンが
取り込まれないというバグがありますので、それを以下で修正します。
このコミットが関連していると思われる)

$ cd $B2G_WORK/B2G/gaia/build
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-webapp-zip.patch
$ patch < b2g-webapp-zip.patch

Xperia arcとrayに固有な問題の修正を行います。

電池残量や充電状況の取得に失敗する点、
画面ON時にHOMEボタン裏のLEDが光りっぱなしになる点を以下で修正します。

$ cd $B2G_WORK/B2G/gecko/hal/gonk/
$ wget https://dl.dropboxusercontent.com/u/69652790/patch/b2g-GonkHal.patch
$ patch < b2g-GonkHal.patch

環境変数設定

環境変数設定を行います。

$ export LOCALE_BASEDIR=$B2G_WORK/B2G/multilocale/gaia-l10n
$ export LOCALES_FILE=$B2G_WORK/B2G/multilocale/languages-japan.json
$ export PATH="$PATH:$B2G_WORK/B2G/multilocale/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/multilocale/compare-locales/lib"
$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2

kernel のビルド

ここは自分でkernelをビルドしたい人のみ行って下さい。
既に日本版のkernelを配置済みなので飛ばしても問題ないです。

kernelはCyanogenMod9のkernelを用います。

$ cd $B2G_WORK
$ git clone https://github.com/CyanogenMod/semc-kernel-msm7x30 -b ics
$ cd semc-kernel-msm7x30

$ export ARCH=arm
$ export CROSS_COMPILE=$B2G_WORK/B2G/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-

$ make cyanogen_$DEVICE_defconfig
$ make -j16
$ cp `find drivers net -name "*.ko"` $B2G_WORK/B2G/device/semc/$DEVICE/
$ cp arch/arm/boot/zImage $B2G_WORK/B2G/device/semc/$DEVICE/kernel

ビルドと書き込み

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh otapackage

ビルドが終わると、
arcの場合  out/target/product/anzu/full_anzu-ota-eng.username.zip
rayの場合  out/target/product/urushi/full_urushi-ota-eng.username.zip
ができていますので、これを焼きます。

あらかじめ、端末にfastbootとadbで接続できるよう、ドライバをインストールしておいてください。
まず、ビルドしてできたzipファイルをSDカードに配置しておきます。
また、あらかじめzipファイルからboot.imgを取り出しておき、PC上に置いておきます。 

次に、端末の電源を切り、arcの場合はメニューを押しながら、
rayの場合はボリュームアップキーを押しながらPCのUSBポートに接続します。
fastbootモードに入り、arcはUSBポートの横のLEDが、rayはホームボタンの周囲が
青く光るはずです。 そこで

$ fastboot flash boot boot.img

を実行し、boot.imgを焼きます。次に、以下のコマンドで再起動します。

$ fastboot reboot

Free Xperia Projectのロゴが見えている状態で、arcはメニューボタンを連打、
rayはボリュームダウンキーを連打します。 どちらも、成功するとホームキー周囲のLEDが点灯し、
CWM recoveryに入ります。

 CWM recoveryにて、wipe data/factory reset を実行後、
install zip from sdcardから、作成したzipファイルを焼いてください。

できることとできないこと

下記のような感じです。ほぼグローバル端末と変わらないからでしょうか、通話と3Gが使えます。
アップデートの通知が来ますが、アップデートしないでください。

arcもrayも解像度は480×854なのですが、これくらいの画面サイズが
Firefox OSには適しているようで、結構快適です。

あとはカメラをなんとかしたいですね。

通話-
3G通信-
Wifi-
SDカード-
カメラ×アプリ起動しないです
音楽再生-
動画再生-


おしまい

日本語化や高解像度の設定、odapackageの作成などにはsolaさんによる変更を
使わせて頂きました。感謝です。

Xperia arcとXperia rayでドッキング


こちらもどうぞ


Boot to JCROMをGalaxy S2/S3、Xperia arc/ray向けにビルドしてみた

$
0
0
androidsolaさんが開発されているFirefox OSベースのカスタムロム
Boot to JCROMをGalaxy S2、Galaxy S3、Xperia arc、Xperia ray向けにビルドしてみました。

ビルド法はFirefox OSのビルド法に近いので下記のページに追記する形でまとめました。


動作している様子は下記の写真のようになります。

SDカード領域にテーマ画像を配置することで、
ロック画面、壁紙、通知画面、ステータスバーに画像が貼れていることがわかります。

テーマのサンプルはBoot to JCROM公式ページのこちらから入手できます。

左からGalaxy S2、Galaxy S3、Xperia ray、Xperia arc


開発者向け端末が出たばかりという時期でカスタムロム開発を始める
androidsolaさんのスピード感が素晴らしいと思います。

Firefox OSとRaspberry Piで三輪オムニホイールロボットを操作してみた

$
0
0
Firefox OSを載せたXperia arcと、node.jsが動作するRaspberry Piで三輪オムニホイールロボットを操作してみました。動画はこちら。



以下、動画について解説していきます。

はじめに

最近、Google Glass、Firefox OS、Windows ストアアプリ、enchantMOONのようにJavaScriptを用いて開発する環境が増えています。

私のWeb関係の知識ははHTML3.2時代で止まっていて、このままではとてもこれらの流れについていけそうにないので、少し知識をアップデートすることにしました。

また、別ジャンルで名刺サイズの小型PCであるRaspberry Piが去年から流行っていますが、この流行にも乗り遅れた感があるので、合わせて触ってみようと思い立ちました。

というわけで、これらを満たす目標として
  • Firefox OSでnode.jsが動作するRaspberry PiとWebSocket通信し、ロボットを動かす
ことを目指してみます。

動かすロボットは、
で用いた三輪オムニホイールロボットとします。こちらはandroidアプリでbluetooth通信してロボットを動かしていましたが、こちらと同じ動作を目指します。

なお、androidでは画像処理による対象物追跡を行いましたが、さすがにJavaScriptで画像処理はキツイ気がするので今回は割愛しました。

システム

こんな感じのシステムとしました。Firefox OSを載せた端末としては、「Xperia arcとXperia ray向けにFirefox OSをビルドしてみた」で紹介したXperia arcを用います。

基本的に、Android上のChromeやFirefoxでも動作するように作成しているので、自前ビルド端末を使ったことによる影響は多分ないと思います。


node.jsを動かしてモーターを動かすなら、こちらでやられているようにmbedを用いた方がスマートな気がしますが、mbedは未体験ということもあり今回は見送りました。

方針が決まれば、あとは様々な方の成果を活用させて頂くだけ、ということで、以下でそれらへのポインタを示したいと思います。


Raspberry Pi上のnode.js

Raspberry Piにnode.jsをインストールし、Firefox OS(というよりブラウザ)からの指令を受け取れるようにする方法はInterface誌2013年9月号の記事「ARMコンピュータRaspberryPi×HTML5でスマートI/O」に書いてあります。

この例では、指令に基づいてRaspberry Piのピンに接続したLEDを点灯させていましたが、その部分をシリアル通信でのaruduinoへの指令に変更します。

Raspberry Piからのシリアル通信は、こちらのページのC言語のプログラムを用いました。リンク先の例ではRaspberry Pi上のピンでシリアル通信しているので/dev/ttyAMA0を用いていますが、今回私はUSBシリアルアダプタを用いたので/dev/ttyUSB0を指定します。(3.3V←→5Vのレベル変換が面倒だったので)

また、送る文字列ですが、コマンドラインの引数で与えた文字列をそのままaruduinoに送りたかったので、以下のようにしました。

main関数の引数部
int main(int argc, char *argv[]){

送信文字列の定義部
  p_tx_buffer = &tx_buffer[0];
char *num_buffer = argv[1];

while(*num_buffer != '\0')
{
*p_tx_buffer++ = *num_buffer++;
}
*p_tx_buffer++ = '\0';


なお、このシリアル通信プログラムを起動する部分のJavaScriptは以下のような感じです。「[value]」の部分がブラウザから送られる文字列で、serialtestという名前をつけた上のシリアル通信用プログラムの引数となります。

server.on('connection', function(socket) {
socket.on('message', function(data){
console.log('Receive: ' + data);
send_to_arduino(data);
});
});

var send_to_arduino = function (value){
var spawn = require('child_process').spawn;
var sendexec = spawn('./serialtest', [value]);
sendexec.stdout.on('data', function(data){});
}

なお、「Raspberry PiとNode.jsで作る独立稼働モバイルサーバ (Think IT)」によると、node-serialportを用いるとnode.jsを通してRaspberry Pi/arduino間でJavaScriptで通信できるそうなので、そちらでもよさそうですね。

Firefox OSアプリ

Firefox OSアプリは実質Webアプリなので、HTML/CSS/JavaScriptで記述します。
  • Raspberry PiにSSHでログインしてエディタでJavaScriptを編集
  • Android上のChromeとFirefoxで動作確認
という手順で開発しました。ブラウザのリロードでアプリのアップデートが完了するのは、当たり前といえ新鮮な体験です。

AndroidのFirefoxで動作確認するとFirefox OSでもほぼ同じ動作をするので、あまりFirefox OSの出番はなく開発を進められました(Firefox OSの存在意義は…)。

今回は小さなアプリなのでそれほど苦労する部分はありませんでしたが、端末の画面の回転の検出にChromeとFirefoxで違いがあったので注意が必要でした。

  var mqOrientation = window.matchMedia("(orientation: portrait)");

mqOrientation.addListener(function() {
// 画面回転検出時の処理
});
によってChromeとFirefox両方で画面回転を検出できます。

また、IP Webcamからの画像取得ですが、今回は簡易的に済まそうということで、IP Webcamのスナップショット画像を得る機能をひたすら呼び出してcanvasに描画し続けるという方法を取っています。


Firefox OSアプリのpackaged app化

Firefox OSでは、通常ブラウザ上で動作するWeb アプリを、zipで固めたpackaged appとして端末にインストールすることができます。

packaged appを作成するためのテンプレートとして今回はkassy-kzさんのFirefoxOS_Templateを用いました。

packaged appをインストールする方法としては
  1. マーケットからインストール
  2. Firefox OSシミュレーターからインストール
  3. ローカルネットワーク上のサーバーからのインストール
などがあります。私は公式端末であるKeonやPeakを購入しておらず、Nexus SやGalaxy S2などといった端末に自分でビルドしたFirefox OSをインストールするという方法でFirefox OSを試しています。

この自前ビルドの端末ですが、上記の2の方法でのインストールがうまくいきませんでした。Remote Debuggingを有効にしてはいるのですが。

仕方ないので、3の方法でインストールしました。リンク先の解説の通りですが、package.manifest は、アプリのmanifest.webappをコピーして、package_pathの行を追加するだけで良さそうでした。インストール後、「XXXX downloading...」という通知が、端末を再起動するまで消えないのですが、気にしないことにします。



感想など

Androidアプリで行っていたbluetoothでのロボット操作を、Firefox OSでも実現できました。ただし、いくつか気になる点もありました。

まず、モーターへ指令が到達するまでのステップ数がかなり増えているので若干遅延が発生することがあります。Wifiを利用しているので、Wifiの干渉が大きい場所ではこの遅延がより大きくなることが予想されます。

また、タッチイベントを全て送ると処理が追いつかなくなり、やはり遅延が大きくなるので、指令を送信する回数を減らすなどの工夫が必要な場面がありました。

一方、良い面ですが、Firefox OS用に作成したアプリはWebアプリなので、androidでもiOSデバイスでも動作する(はず)というのはなかなか魅力的に思えました。

ただ、どうしても機能が最大公約数的になりますし、結局各端末でデバッグしなければいけないということも起こりがちなので良し悪しかなあと思います。なんだかこの辺はJavaが出てきたときに言われたことの繰り返しですね。

あと個人的には、ビルドだけして放っておいたFirefox OS端末の使いみちができてよかったな、と。

そんな感じで今回は以上です。

こちらもどうぞ



ガンダムAGE風に改造したドロイド君の写真をまとめてみた

$
0
0

はじめに


twitterやGoogle+のアイコンを自分独自のドロイド君にしたい、ということで作り始めたガンダムAGE風ドロイド君。チョコチョコ作っているうちに数が増えてきて、写真もtwitterに貼ったりGoogle+に貼ったりしてたらどこに何があるのかわからなくなってきたので、一か所にまとめてみることにしました。

技術ネタ以外を書くのは初ですが、まあたまにはいいよね、ということで。

集合写真


初めて作ったタイタスドロイド。左はfigmaバッファローベルHG ガンダムAGE1タイタスの手足をつけたもの。無改造でこの違和感のなさ。
ドロイドタイタスが気に入ったので、一気にたくさん作ったもの。一時期この写真をGoogle+のトップ画像にしていた。
Android Bazaar and Conference 2013 Spring(東京立川・明星大学)の展示にて。i'm watchというスマートウォッチでプラレールを動かしているのですが、色々持ち込んで何の展示だかわからなくしてしまうのがいつもの癖。
ガンダムAGE1フルグランサと共に、フルグランサドロイド君。これとダークハウンド、FXバーストは2つ以上のプラモデルをミックスして作っている。
最近作ったFXバーストドロイド君。周りを取り巻いているのはHG ガンダムAGE-FXバーストの付属パーツのCファンネルだけど、これが思いのほかカッコいい。今これをGoogle+のトップ画像にしてる

個別写真とその構成


AGE1ドロイド

android mini collectibles series 02 ICEBERG
BB戦士 ガンダムAGE1
タイタスドロイド

android mini collectibles series 01 Android
BB戦士 ガンダムAGE1
タイタスドロイド(赤)

android mini collectibles series 03 Red
BB戦士 ガンダムAGE1
スパロードロイド

android mini collectibles series 02 Bluebot
BB戦士 ガンダムAGE1
フォートレスドロイド

android mini collectibles series 01 Android
BB戦士 ガンダムAGE3
FXドロイド

android mini collectibles series 02 Greeneon
BB戦士 ガンダムAGE-FX
レギルスドロイド

android mini collectibles series 01 Android
BB戦士 ガンダムレギルス
ダークハウンドドロイド

android mini collectibles series 03 Nexus
BB戦士 ガンダムAGE2
HG ガンダムAGE2ダークハウンド

このあたりからBB戦士のキットにないものを作り始めた
フルグランサドロイド

android mini collectibles series 02 Greeneon
BB戦士 ガンダムAGE1
HG ガンダムAGE1フルグランサ
HG ガンダムAGE1(短いビームサーベルのみ)

今のところ背負いものを持っているのはこれだけ
FXバーストドロイド

android mini collectibles series 02 ICEBERG
BB戦士 ガンダムAGE-FX
HG ガンダムAGE-FX バースト
アクションベース2グレー


作り方

作り方は簡単。ドロイド君の腕を切り取り、デザインナイフなどで5mm角くらいの穴を開けます。そこにBB戦士のポリキャップCを加工してはめ込み、瞬間接着剤で固めます。

頭は取り外しが容易になるよう、出っぱりをデザインナイフで削っておくと、作業が効率的に行えます。クリアタイプのドロイド君は頭が簡単に外せるのですけどね。

なお、android mini collectiblesはebayで買ってます。




おしまい


並べてみるとわかるのですが、これ結構カネかかってるよね…、ということでおしまい。

Xperia arc/rayとGalaxy S2/S3向けFirefox OS 1.1のビルド法を更新し、ビルド済みファイルを公開した話

$
0
0

はじめに

10/20(日)に東京電機大学で開催されるAndroid Bazaar and Coneference 2013 Autumnで展示するために、
安定して動作するFirefox OS端末が必要になったので、これまでビルド法を公開してきたGalaxy S2/S3、Xperia arc/ray へのビルドを試してみました。
ビルド法を公開した当時とは色々と状況が変わっているので、変更点などをメモ。
ついでにビルド済みファイルを公開。

これまでの経緯

2013年の6月に、下記の通りGalaxys S2/S3、Xperia arc/ray へのFirefox OSのビルド法を公開しました。

このビルド法は、下記の構成でソースを取得してビルドするようになっていました。
  • gaia:masterブランチの最新
  • gecko:gecko-18ブランチの最新
  • gonk:android 4.0 または cyanogenmod 9

しかし、7月以降、高解像度端末では上のままでは正しい解像度でのビルドができなくなっていました。


正しい解像度(6月頃)正しくない解像度(7月以降)


このあたりのコミットとかこのあたりのコメントを追っていくと情報が得られますが、
gaiaでの簡易的な高解像度端末への対応を削除して、
gecko(masterとv1.1.0hdブランチ)の高解像度端末への対応度を高めていくということのようです。

Xperia arcとGalaxy S2への対応

ということで、まず、Xperia arcとGalaxy S2はビルド法を下記の構成に変更しました。
  • gaia:v1.1.0hdブランチの最新
  • gecko:v1.1.0hdブランチの最新(gecko 18.1)
  • gonk:android 4.0 または cyanogenmod 9

この2つは素直な端末なのか、トラブルは少ないです。Firefox OSのバージョンでいうと1.1ですね。

gaiaをmasterにしなかったのは、変更が頻繁すぎるため、
geckoをmasterにしなかったのは、gonkをcyanogenmod 9のままにしておきたかったからです。
(cyanogenmod 9のままgeckoをmasterにすると、WifiやSIMが使えなくなったりと、残念な感じになります)

Boot 2 JCROMの方は下記のようにしています。
  • gaia:master-jcブランチの最新
  • gecko:v1.1.0hdブランチの最新
  • gonk:android 4.0 または cyanogenmod 9

基本的には上記の方法でビルドするのですが、下記のように、端末ごとにいくつか例外があります。

Xperia rayへの対応

まず、Xperia rayではgecko v1.1.0hdでの解像度の取り扱いがうまくいっていないようなので、
geckoをgecko-18、gaiaを6月末の時点のものに固定していくつか修正を加えます。
  • gaia:masterブランチの6月末+いくつかの修正(ココ
  • gecko:gecko-18ブランチの最新
  • gonk:android 4.0 または cyanogenmod 9

Boot 2 JCROMは下記の通りです。
  • gaia:master-jcブランチの6月末+いくつかの修正(ココ
  • gecko:gecko-18ブランチの最新
  • gonk:android 4.0 または cyanogenmod 9

Galaxy S3への対応

この中では一番解像度が高い端末なのですが、Xperia ray同様、
gecko  v1.1.0hdでの解像度の取扱いがうまくいっておらず、さらに
gecko-18でも8月以降、起動が途中で止まってしまうコードが入っているようで、
gecko-18の7月末頃のコードを利用します。
  • gaia:masterブランチの6月末+いくつかの修正(ココ
  • gecko:gecko-18ブランチの7月末頃
  • gonk:android 4.0 または cyanogenmod 9

Boot 2 JCROMも同様です。
  • gaia:master-jcブランチの6月末+いくつかの修正(ココ
  • gecko:gecko-18ブランチの7月末頃
  • gonk:android 4.0 または cyanogenmod 9

ビルド済みパッケージ公開について

せっかくなので今日の時点でのビルド済みファイルをダウンロード可能にしました。
下記の各端末のページでダウンロード可能です。

なお、アップデートは無効にしてあるので、OTAアップデートは飛んできません。

これは、海外から「OTAアップデートしたらカメラが使えた!」というコメントが多くて困ったためです。
OTAアップデートすると解像度が狂ったり、こちらで修正した問題点が復活したりするのでOTAアップデートすべきではないです。
そもそも非公式端末にOTAアップデートが降ってきて適用できること自体問題だと思います。

おわりに

非公式端末へのインストールなので仕方ないのですが、特にXperia rayとGalaxy S3で
ビルド時のトラブルが多いです。

Galaxy S3の場合はgaiaとgeckoを両方masterにしてFirefox OS 1.2ベースにすると
状況は改善するようなのですが、gonkをJelly Beanベースにしなければいけないので、
作業に手を付けるのはいつになるか、わかりません。

Xperia rayについては、Firefox OS 1.2にするのは難しそうだし、このあたりが限界かも?
という気がしてきました。

というわけで、おしまい。

enchantMOONで三輪オムニロボットを操作してみた

$
0
0

はじめに

enchantMOONで三輪オムニロボットを操作してみました。
動画はこちら。




経緯など

以前、「Firefox OSとRaspberry Piで三輪オムニホイールロボットを操作してみた」というエントリで、JavaScriptの勉強のために、Firefox OSで三輪ロボットを操作するという実験を行いました。

三輪ロボット側のRaspberry Piでnode.jsを動かし、websocket.ioを用いてFirefox OSと通信を行う、というものでした。

Firefox OS+JavaScriptという組み合わせで操作できるなら、enchantMOON+JavaScriptでもいけるのでは?というのが今回の着想です。

しかし、それほど簡単ではなかったので、以下に注意点をまとめます。

注意点

公式のsocket.io.jsでは通信ができませんでした。また、サーバーであるロボット側は前回はwebsocket.ioを用いましたが、enchantMOONに合わせてサーバー側もsocket.io.jsを用いるように変更しました(こちらは公式のものでOK)。
  • enchantMOONのバージョンはver.2.6.0 (r1880)以上を用いる
これより前のバージョンでは、つながったりつながらなかったりと、通信が不安定でしたが、ver.2.6.0では安定しています。その理由は「enchantMOONのXHRでresponseTextの末尾にゴミデータがつく」問題が、version 2.6.0で改善されたからだそうです。esmasuiさん、ありがとうございます。

ソースの構成など

enchantMOON側のソースの構成は下記のようにしました。

hack.js
main.js
lib/MOON.js
lib/socket.io.js  : esmasuiさんのもの
lib/enchant.js

タッチイベントを使いたかったので、parachesさんの『enchantMOONで「簡易版とことんぷよぷよ」を遊べるようにしてみた』を参考にenchant.jsを使ってみました。

hack.jsの内容
importJS(['lib/MOON.js', 'lib/enchant.js', "lib/socket.io.js"], function() {

var sticker = Sticker.create();
sticker.ontap = function() {
var script=document.createElement('script');
script.src="main.js";
script.type='text/javascript';
script.language='javascript';
document.body.appendChild(script);
};
sticker.register();
});

main.jsの内容の一部
enchant();

var URL = 'http://192.168.1.5:8888'; // サーバーのアドレス
var width = 240
var height = 320
var socket;
var game = new Game(width,height);

game.onload = function () {
socket = io.connect(URL, {'transports': ["xhr-polling"]});

var touchPanel = new Sprite(width,height);
touchPanel.x = 0;
touchPanel.y = 0;
touchPanel.addEventListener('touchstart', function(e) {
moonTouched(e.x, e.y);
});
touchPanel.addEventListener('touchmove', function(e) {
moonTouched(e.x, e.y);
});
touchPanel.addEventListener('touchend', function(e) {
stopMotors();
});

game.rootScene.addChild(touchPanel);
}
game.start();

function moonTouched(keyx, keyy) {
//ここにタッチエリアに応じた処理を書く。
//上の動画では、4つのモーターにデータを送りたいので、
//コンマ区切りの数値を送っている。

//例えば以下のように
//socket.send('90,0,0,0');
}
function stopMotors() {
//例えば以下のようにモーターを停止させている
//socket.send('90,0,0,0');
}

コントロール画面はこんな感じです。やっつけで書きました。絵心がある人だったら、面白いコントロール画面を描けると思います。


Raspberry Pi用赤外線カメラPi NoIRの映像をandroidで表示してみた

$
0
0

はじめに

Raspberry Pi用の赤外線カメラPi NoIRが発売されました。
赤外線カメラは使ったことがないので興味があり、早速注文してみました。

既存のカメラと同じくraspistillコマンドなどで使えるのですが、
今回、その映像をmjpg-streamerで配信し、androidで見てみることにします。


Raspbian側の準備

まず、あらかじめraspi-config でカメラを有効にしておいてください。

次に、OSを最新にします。

sudo apt-get update
sudo apt-get upgrade

さらに、ファームウェアを最新にします。 これを実行しておかないと後でmjpg-streamerを起動するときに「ERROR opening V4L interface: Interrupted system call」というエラーがでます。

sudo rpi-update

なお、アップデートを実行すると、Raspberry Piの起動時の「Mounting local filesystems」の際にmmcblk0に関するエラーが出て起動しなくなる場合があります。その場合、こちらに関連情報がありますが、SDカードを変更すれば状況が改善する場合があります。

私の場合、Transcend SDHC 8GB(class 10)で起動しなくなったので、古いTranscend SDHC 8GB(class 2)に変更したところ、問題が解決しました。

Video4Linuxの有効化

次に、Rapsberry PiのカメラをVideo4Linuxで用いるために、こちらを参考にVideo4Linuxを有効にします。まず、以下を実行。

wget http://www.linux-projects.org/listing/uv4l_repo/lrkey.asc && sudo apt-key add ./lrkey.asc

次に、/etc/apt/sources.listの末尾に下記の行を加えます。

deb http://www.linux-projects.org/listing/uv4l_repo/raspbian/ wheezy main

そして、以下を実行します。

sudo apt-get update
sudo apt-get install uv4l uv4l-raspicam

mjpg-streamerのインストール

こちらを参考に、mjpg-streamerをインストールします。

まず、インストールに必要なライブラリやヘッダなどをインストールします。

sudo apt-get install libjpeg8-dev libv4l-dev
sudo apt-get install imagemagick

ヘッダにリンクを貼ります。

sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h

次に、mjpg-streamerの最新のソースをダウンロードするため、subversionをインストールします。

sudo apt-get install subversion

そしてmjpg-streamerのソースをダウンロードします。

svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer

そして、以下のようにmakeします。

cd mjpg-streamer
make

エラーが出ずにビルドが完了すれば次に進みます。

mjpg-streamerの起動

mjpg-streamerをビルドしたディレクトリで作業します。

まず、Video4Linuxを有効にします(このコマンドはどのディレクトリでもOK)。なお、無効にするには pkill uv4lを実行します。この例は解像度320x240、フレームレート10fpsです。

uv4l --driver raspicam --auto-video_nr --width 320 --height 240 --framerate 10

そして、mjpg-streamerを起動します。やはり解像度320x240、フレームレート10fpsを指定しています。

export LD_LIBRARY_PATH="$(pwd)"
LD_PRELOAD=/usr/lib/uv4l/uv4lext/armv6l/libuv4lext.so ./mjpg_streamer -i "input_uvc.so -d /dev/video0 -r 320x240 -f 10 -no_dynctrl" -o "output_http.so -w ./www"

色々試してみたところ、フレームレートを大きくすると不安定になるようで、mjpg-streamerが落ちます。私の環境では解像度320x240、フレームレート10fpsでは安定して動きますので、どこまでいけるか色々試してみてください。

android側アプリで閲覧

PCのブラウザで、Raspberry Piが動いているIPアドレスの8080ポートを見ると(http://xx.xx.xx.xx.:8080/)、
映像が配信されていることがわかります。

この映像をandroidで受け取るには、手前味噌ですが簡単MJPEGビューアを使うと簡単です。
このアプリのソースはこちらにあります。

アプリを起動したら、メニューから「設定」を選択し、下図のように、解像度を320x240に、ポート番号を8080に設定します。

設定を保存すると下記のように、Raspberry Piのカメラから配信された映像がandroid上に表示されます。
なお、この映像は暗い部屋で人形にテレビのリモコンの赤外線を当てて撮影しました。お疲れ様でした。






Nexus 4 用に日本語対応の Firefox OS をビルドした話

$
0
0
今までGalaxy S3やXperia arc/rayに android 4.0 (Ice Cream Sandwich) ベースの
Firefox OS1.1をビルドしてきましたが、android 4.3 (Jelly Bean) ベースのものは
試したことがなかったので、練習として Nexus 4 に最新の Firefox OS をビルドしてみました。

使ってみたところ、日本語IMEが実用レベルに近づいており、
twitter/Facebook/Google+などのSNSの読み書きができたのでメモします。



ビルド済みファイル

下記のファイルをダウンロードします。

(md5sum: bd173d4d1b6cedd080256c1e14a4e2fc)
このファイルの利用は自己責任でお願いします。

書き込み

ダウンロードしたファイルを解凍して、boot.img、system.img、userdata.imgを
あらかじめ取り出しておきます。

これらを書き込む前に、radioがandroid 4.3のときのものでないとWifiが使えませんので、
あらかじめfastbootで書き込んでおきます。
Factory Images for Nexus Devicesよりoccam-jwr66y-factory-74b1deab.tgzをダウンロードしておき、
中に含まれる radio-mako-m9615a-cefwmazm-2.0.1700.84.img を下記のように書き込みます。

$ fastboot flash radio radio-mako-m9615a-cefwmazm-2.0.1700.84.img

あとは、 boot.img、system.img、userdata.img を以下のようにfastbootで書き込み、再起動します。
SDカード領域は初期化されますので、バックアップはPCなどに退避しておきます。
なお、初回の起動は黒い画面のまま15秒くらい待たされます。

$ fastboot flash boot boot.img
$ fastboot flash system system.img
$ fastboot flash userdata userdata.img
$ fastboot reboot

日本語キーボードの有効化など

設定アプリから
キーボード→使用中のキーボード→他のキーボードを追加
と辿り、Japanese - Kanjiにチェックを入れると、日本語キーボードが使えます。
テキストエリアをタップすると自動でキーボードが現れます。

初回の変換時にIMEが固まるので、一度ホームボタンでホームに回避してから、
もう一度変換を試みると、以後普通に使えるようになります。

その他

なお、docomoのXi SIMを差してmopera.netを指定したのですが、
アンテナは立つものの、回線をつかんでくれません。
ただし、Wifiが使えるのでそれなりに使えます。

また、adb が使えるので、adb push hoge.mp3 /sdcard/
などとしてファイルを送り込めば音楽や動画を再生できます。

「ブラウザ」というのがFirefoxかなーと思うのですが、
これ、ブックマークとかないのかな?Firefox OSはご無沙汰なのでよくわかりません。

ソースは2014年2月3日の時点のものを利用しました。
gaia は 1.4.0.0prerelease
gecko は 29.0a1です。

ビルドに関して

以下のサイトを参考に、ビルド法を以下に記します。
なお、上での述べたように、ビルド済みファイルは2014年2月3日のソースを用いましたが、
2014年2月5日頃のソースでは、gecko が 30.0a1になったことが影響しているのか、
下記のように色々おかしなところが出てきています。
  • ホームボタンのサイズが合っておらず、Firefoxアイコンが欠けている
  • セットアップ時の地域の変更が画面に反映されない(内部的には処理されている)
  • テキストエリアをタップしてもキーボードが現れない(Wifiのパスフレーズが入力できず困る)
このように、Firefox OSのmasterは頻繁に更新されており、
常に期待の動作をするとは限りませんので、うまくいかない場合は
何日かおいてからまた試してみるのがよいかもしれません。

以下、ビルド法です。

ソースの準備

ソースを下記のようにダウンロードします(環境によりますが30分~1時間くらいかかります)。

$ mkdir ~/b2g_work
$ cd ~/b2g_work
$ export B2G_WORK=`pwd`
$ git clone git://github.com/mozilla-b2g/B2G.git
$ cd B2G
$ ./config.sh nexus-4

日本語対応など

日本語ロケールの追加、日本語辞書の追加などを行います。

まずはgaiaのロケールの追加。

$ mkdir $B2G_WORK/B2G/locales
$ cd $B2G_WORK/B2G/locales
$ hg clone http://hg.mozilla.org/gaia-l10n/ja
$ wget http://sola-dolphin-1.net/data/B2G/source/languages-japan.json

次にgeckoのロケールの追加。

$ mkdir $B2G_WORK/B2G/gecko-l10n
$ cd $B2G_WORK/B2G/gecko-l10n
$ hg clone http://hg.mozilla.org/l10n-central/ja
$ hg clone http://hg.mozilla.org/build/compare-locales

次に日本語辞書の追加

$ cd $B2G_WORK
(naist-jdic-0.4.3.tar.gzを http://sourceforge.jp/projects/naist-jdic/releases/ からダウンロードして配置)
$ tar zxvf naist-jdic-0.4.3.tar.gz
$ cd $B2G_WORK/B2G/gaia/apps/keyboard/js/imes/jskanji/dict
$ mkdir ipadic
$ cp $B2G_WORK/naist-jdic-0.4.3/naist-jdic.dic ipadic/
$ make json (この命令は環境変数LANGの値によっては失敗します。ja_JP.utf8 にセットすればよいです)

環境変数設定

次に、環境変数設定を行います。

$ export MOZILLA_OFFICIAL=1
$ export GAIA_DEV_PIXELS_PER_PX=2
$ export LOCALE_BASEDIR=$B2G_WORK/B2G/locales
$ export LOCALES_FILE=$B2G_WORK/B2G/locales/languages-japan.json
$ export L10NBASEDIR=$B2G_WORK/B2G/gecko-l10n
$ export MOZ_CHROME_MULTILOCALE="ja"
$ export PATH="$PATH:$B2G_WORK/B2G/gecko-l10n/compare-locales/scripts"
$ export PYTHONPATH="$B2G_WORK/B2G/gecko-l10n/compare-locales/lib"
$ export GAIA_KEYBOARD_LAYOUTS=en,jp-kanji

ビルド

以下のようにビルドを行います。

$ cd $B2G_WORK/B2G
$ ./build.sh

ビルドが終わると、
  out/target/product/mako/
に boot.img、system.img、userdata.img ができていますので、これをfastbootで書き込みます。



備考

私が2014年2月3日にビルドした時のコミット情報は

  • gaiaのコミット e9222d3b3e6047f05b929948b631e4bd6b5b0180
  • geckoのコミット 1fded49c645d068599f4f6f17ae17505cf05d2b3
で、この時のソースで日本語辞書を追加するときは


の方法で行う必要がありました。参考までに。

Viewing all 50 articles
Browse latest View live