2013年10月10日木曜日

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

はじめに

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');
}

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


2013年10月8日火曜日

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

はじめに

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にするのは難しそうだし、このあたりが限界かも?
という気がしてきました。

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