はじめに
enchantMOONで三輪オムニロボットを操作してみました。動画はこちら。
経緯など
以前、「Firefox OSとRaspberry Piで三輪オムニホイールロボットを操作してみた」というエントリで、JavaScriptの勉強のために、Firefox OSで三輪ロボットを操作するという実験を行いました。
三輪ロボット側のRaspberry Piでnode.jsを動かし、websocket.ioを用いてFirefox OSと通信を行う、というものでした。
Firefox OS+JavaScriptという組み合わせで操作できるなら、enchantMOON+JavaScriptでもいけるのでは?というのが今回の着想です。
しかし、それほど簡単ではなかったので、以下に注意点をまとめます。
注意点
- enchantMOONで動かすsocket.io.jsはesmasuiさんが手を加えたものを用います
公式の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を使ってみました。
タッチイベントを使いたかったので、parachesさんの『enchantMOONで「簡易版とことんぷよぷよ」を遊べるようにしてみた』を参考にenchant.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'); }
コントロール画面はこんな感じです。やっつけで書きました。絵心がある人だったら、面白いコントロール画面を描けると思います。
0 件のコメント:
コメントを投稿