Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

orb.roll の時間指定 or 距離指定 #13

Closed
shundroid opened this issue Mar 6, 2016 · 10 comments
Closed

orb.roll の時間指定 or 距離指定 #13

shundroid opened this issue Mar 6, 2016 · 10 comments

Comments

@shundroid
Copy link
Contributor

#2

タイトルのまま。orb.roll で、走る時間や距離を指定したい。

1秒後に止まるようなとき、
次のようなコードで良さそうに見えるが、

orb.roll(100, 0);
setTimeout(function() {
  orb.roll(0, 0);
}, 1000);

どうやら orb.roll は、非同期で実行されるらしい。
引数でコールバックとか、戻り値がPromiseとかだといいのだが・・。

@yammmt
Copy link
Owner

yammmt commented Mar 6, 2016

時間にしろ距離にしろ、止めるのであれば進行方向の逆方向に少し roll をかけてあげないとならないような気がします。
roll 自体が一定速度で走る、ではなくそれだけの加速度を与えるコマンドですね。。

@shundroid
Copy link
Contributor Author

徐々に、orb.roll を実行したときと、実際に加速度を与えるタイミングがずれていくような気がします。
説明しづらいので、動画を送ります。

@shundroid
Copy link
Contributor Author

https://goo.gl/photos/CNMsAtZThYuXGrNo8

コードは次のようになっています。
0.1秒毎に前進、ストップ、後退、ストップとしています。
最初はうまく行っているように思えますが、
だんだん遅くなって、最後は止まってしまいます。
なにかいい方法はありますでしょうか

var sphero = require("sphero");
var orb = sphero("COM7"); // 自分の Sphero の ID に置き換える

orb.connect(function() {
  function a() {
    orb.color("blue");
    orb.roll(100, 0);
    setTimeout(b, 100);
  }
  function b() {
    orb.color("red");
    orb.roll(0, 0);
    setTimeout(c, 100);
  }
  function c() {
    orb.color("green");
    orb.roll(100, 180);
    setTimeout(d, 100);
  }
  function d() {
    orb.color("yellow");
    orb.roll(0, 180);
    setTimeout(a, 100);
  }
  orb.color("black");
  setTimeout(a, 1000);
});

@yammmt
Copy link
Owner

yammmt commented Mar 7, 2016

お疲れ様ですーご確認ありがとうございます!
通信やモーターが動くまでの遅延が積み重なってしまったための現象じゃないかと思います。
秒単位だけでなく、 Sphero 本体が動作してるかを何らかのセンサーを使って確認してから実行するとどうでしょうかね??

@shundroid
Copy link
Contributor Author

返信遅れましてすみません。

たしかに!!です!
実際に、orb.rollをする前に、stream系のセンサーを動かしてみるということですね。

やってみますー!

@shundroid
Copy link
Contributor Author

https://gist.github.com/shundroid/d51c1ae93f047c585872

実行命令をするまえ、orb.ping をして、帰ってきてからにしたら、
いい感じになりました。ありがとうございます!

バグらないためにも、動かす前は、必ず ping しておいたほうがいいかもしれません。

@yammmt
Copy link
Owner

yammmt commented Mar 9, 2016

お疲れ様です!動いたようで良かったです。

結局本番は 30 分しかないので、 ping とばすとしてもラップして後ろで動かすしかなさそうですね。
gifter-labo ブランチに関しては、細かい時間単位の操作はされない、と仮定して進めていった方が良いかもしれません。
ただ、スタッフ間で共有すべき情報ですね。

@shundroid
Copy link
Contributor Author

説明不足ですみません。
上の「動かす前にping」というのは、「orb.rollの前にping」ということです。

ギフターラボのことですが、

1. ping などの処理をせず、シンプルにする。
2. backside.jsの方でラップして実装する。
  • orb.ping を使う方法。
  • main.js (参加者が弄る側)はシンプルのまま。
  • わかりにくいことはない(pingの方は完全にラップしてしまえば)
  • backside.jsの編集が必要
    • 間に合う?
  • 磁気センサーを使って、合わせられる。
    • ギフターラボではそこまで使うのか・・

どうしましょう。
土曜日集まった時にでも決めましょうか・・
となると、仰るとおり、スタッフ間でサイボウズ側で共有したほうが良さそうですね。

@yammmt
Copy link
Owner

yammmt commented Mar 10, 2016

お疲れ様です。
今回は制限時間のことを考えると 1 にした方が良いのかなぁ、とも思ってしまいます。
土曜日は…どうも次回は集まらなさそうですね。やることだけサイボウズでまとめた方が良さそうです。

どさくさにまぎれて実装する時間も実はそれほど残ってるわけでもないような…?

@shundroid
Copy link
Contributor Author

わかりました。では 1 でいきます!
土曜日は行きます。サイボウズでまとめておきますー!
今から習い事なので、少し時間が遅れるかもしれませんが、よろしくおねがいします。

issue は 解決できたので、閉じておきます。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants