hagetak's blog

どうも、はげたかです。

今日の一言:カテゴリ分けをしっかりしたらPVあがるかな?

JavaScriptでSpheroプログラミングについてまとめる

はじめに

前回に引き続き、Spheroに関する記事を書く。

hagetak.hatenablog.com

今回は、Node.js(JavaScript)で"CylonJS"を用い、プログラミングをしてみる。

まずは、Node.js版の基本関数をまとめる。

github.com

Cylon.js - Sphero Driver

f:id:hagetak:20150412171525j:plain

リファレンス

関数 引数 説明
roll() speed, heading 方向に(heading)に速度(speed)で進む
set.color() color Spheroの色をcolorに変える(色リストを参考)
detectCollisions() collisionのイベントを使うとき、明示しておく。

今回は、あまり書くことがないなぁ。JSはイベントがメインなので、私が実際に書いたコードを例に、載せる。

例:

var Cylon = require("cylon"); // Cylonを使うためのおまじない

Cylon.robot({
  connections: {
    // port: "/dev/tty.Sphero-Your-NAME"
    sphero: { adaptor: "sphero", port: "/dev/tty.Sphero-ROG-AMP-SPP-17" }
  },
  devices: {
    sphero: { driver: "sphero" }
  },

  work: function(my) {
    my.sphero.collisionCount = 0;
    my.sphero.moveCount = 0;
    my.sphero.moveHeading = 0;

    after((1).seconds(), function() {
      console.log("Setting up Collision Detection...");
      my.sphero.detectCollisions(); //collisionを使うよ!
    });

    every((1).second(), function() {

      console.log("move:", ++my.sphero.moveCount);
      if(my.sphero.moveCount % 2 == 0) {
        my.sphero.moveHeading += 90;
      }
      if(my.sphero.moveHeading > 360) {
        my.sphero.moveHeading = 0;
      }
      my.sphero.roll(120, my.sphero.moveHeading);
      my.sphero.setRandomColor()
    });

    my.sphero.on("collision", function() {
      console.log("Collision:", ++my.sphero.collisionCount);
      my.sphero.setColor("black");
    });

  }
}).start();

このコードは、比較的わかりやすい物だと思う。(Spheroは単純な操作しかできないため)

一つ一つ、紐解いてみることにしよう。

var Cylon = require("cylon"); // Cylonを使うためのおまじない

Cylon.robot({
  connections: {
    // port: "/dev/tty.Sphero-Your-NAME"
    sphero: { adaptor: "sphero", port: "/dev/tty.Sphero-ROG-AMP-SPP-17" }
  },
  devices: {
    sphero: { driver: "sphero" }
  },
  work: function(my) {

  }
}).start();

これが基本形。port:"/dev/"は、以下の記事を参考にすること.

hagetak.hatenablog.com

他に説明することがないので、work以下を見ていくことにする。

    after((1).seconds(), function() {
      console.log("Setting up Collision Detection...");
      my.sphero.detectCollisions(); // 宣言しておく
    });

collisionイベントを使う場合は、宣言しておく。

 every((1).second(), function() {

 })

1秒毎に実行する。

      console.log("move:", ++my.sphero.moveCount);
      if(my.sphero.moveCount % 2 == 0) {
        my.sphero.moveHeading += 90;
      }
      if(my.sphero.moveHeading > 360) {
        my.sphero.moveHeading = 0;
      }
      my.sphero.roll(120, my.sphero.moveHeading);
      my.sphero.setRandomColor()

これは四角形に動くようにするコード.色もランダムに変えるように(my.sphero.setRandomColor())がある。

Ruby にあった、"keep_going"がCylonにないため、roll(speed, heading)のspeedを大きくすることを勧める。60だとあまり進まず、200だとよく進む。

    my.sphero.on("collision", function() {
      console.log("Collision:", ++my.sphero.collisionCount);
      my.sphero.setColor("black");
    });

on.("event", function(){

})

この構文は、見慣れているでしょう。イベントをbindするときに使うものだ。今回はcollisionをbindしている。 collisionは、「ぶつかったら」なので、このコードは、ぶつかったら黒く発光するという意味だ。

このcollisionはRubyにはなかったので、nodeのほうが楽しめるでしょう! ぶつかったら逃げるとか、面白いでしょ!

さいごに

【日本正規代理店品】 Orbotix Sphero 2.0 white S003AS(JP)

【日本正規代理店品】 Orbotix Sphero 2.0 white S003AS(JP)

今回の記事と、前回の記事を通して、人のコードにすごく触れる機会が多くなった。

隠れたイベントやメソッド(関数)があるのではないかと、libファイルを漁ったり、documentもかなり読んだ。APIにもついて触れたし、このSpheroを動かすために必要なパケットについても一瞬見た。

意外と一つ一つよく見てみると、理解できるし、変数名・関数名などで「その関数が何をするか」が分かり、すごいなと思った。自分のコードは一人よがりなモノなので、外に出せるようにそういった知識を深めたいと思う。

コードを読んで理解して、楽しくて、自分でもやってみて感動が生まれる。この繰り返しがすごく自分に良い影響を与えたと思う。

続けて、様々なコードを読み、実践していきたい。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

【日本正規代理店品】 Orbotix ollie for iOS & Android ホワイト1B01JAP

【日本正規代理店品】 Orbotix ollie for iOS & Android ホワイト1B01JAP