動機:プログラムで思い通りに自動巡回をさせてみたい
結論:Parrot MamboでRolling Spiderを使っている場合は制約が多い
今回調べていて色々わかったのでその結果を共有します。
今回の検証環境
構成環境 | 詳細 |
---|---|
Mac Air | Mid 2014 |
機種 | Parrot Mambo |
Node.js Library | rolling-spider |
temporal |
基本的なこと
制御を失ったら
手持ちのiPhone / Androidに必ずFreeFightMiniをダウンロードして
接続できるようにしておいてください。
制御不能になったらすぐにスマホのBluetoothをOnにして
Mamboの制御権を取得して、スマホでコントロールできるようにします。
あとはスマホで着陸などお好きなように。
1. まっすぐ浮上しなくなったら
実は水平じゃないところで飛ばしている。
ちゃんと水平な場所に置きましょう。
水平なのに横に飛ぶ。
ぶつかって真っ直ぐ上に浮上しないときは、4つの羽のそれぞれの
回転数が違うため、後ろに飛んだり前に飛んだり斜めに飛んだりします。
解決方法
デコピンの要領で、羽を爪で弾いてくるくる回してみてください。
滑りが悪くて回転数が違う羽があると思います。
勢いよく弾くと滑りが元に戻ります。戻らないときは、羽の接続部を
軽く押し上げたり、押してみたりして、再度爪で弾いてみてください。
概ね回転数が揃えば、ある程度安定した浮上に戻せます。
2. 動作が完了しないと次の動作はキャンセルされる
DriveメソッドやTakeOffなどのメソッドを連続実行させるためには
前の動作が完了してからでないと、受け付けない。
なので、実行する動作が何秒後に完了しているかを把握して、
次の命令を発行する必要があります。
3. 簡単なメソッドの使い方
var RollingSpider = require("rolling-spider");
var d = new RollingSpider({uuid:"MamboのUUID"}); //各々書き換えましょう。
d.takeOff(); //浮上
var param = {tilt:0, forward:0, turn:0, up:0};
d.drive(param, 15); // 動作パターン, 実行時間(1-100) 1 = 56msecくらい
d.land(); // 着地
d.disconnect(); //切断
パラメータの意味と動作
パラメータ名 | 値 | 動作 |
---|---|---|
tilt | -100<= 0 <= 100 | 左右に傾く(傾くため、傾いた方向に進む) -方向 = 左下に傾く(左に水平移動) +方向 = 右下に傾く(右に水平移動) |
forward | 1 <= 100 | 前進するスピードを指定。大きいほど早い |
turn | -100 <= 0 <= 100 | 回転角度 -方向 = 左回転 +方向 = 右回転 |
up | -100 <= 0 <= 100 | 上下動のスピード -方向 = 下降 +方向 = 上昇 |
各種動作に必要な実行時間
動作 | 次の動作に必要な待機時間(msec) | パラメータ | Drive第二引数 | 移動距離(概算) |
---|---|---|---|---|
takeOff | 3500 | - | - | - |
drive (回転:90度) | 1000 | turn:90 or -90 | 18 | 0 |
drive (前進:50) | 2000 | forward: 50 or -50 | 20 | 30cmくらい |
drive (傾き:50) | 2000 | forward: 50 or -50 | 20 | 30cmくらい |
割り込みが許可される命令
turnのみの命令であれば、land命令を同時実行できる。
なので、回転しながら着地なんかの動作が可能です。
左回りで旋回して戻ってくるサンプルプログラム
var RollingSpider = require("rolling-spider");
var temporal = require("temporal");
var ACTIVE = true;
var STEPS = 5;
var d = new RollingSpider({uuid:"MamboのUUIDを記入してください"}); //各々書き換えましょう。
d.connect(function () {
d.setup(function () {
console.log('Configured for Mambo! ', d.name);
d.flatTrim();
d.startPing();
d.flatTrim();
setTimeout(function () {
console.log(d.name + ' => SESSION START');
ACTIVE = true;
temporal.queue(
[
{
delay: 500,
task: function() {
d.takeOff();
console.log("order take off.");
}
},
{
delay: 3500,
task: function() {
var param = {tilt:0, forward:50, turn:0, up:0};
d.drive(param, 20);
console.log("forward")
}
},
{
delay: 3500, // takeOff実行後3500msec経過してから実行
task: function() {
var param = {tilt:0, forward:0, turn:-90, up:0};
d.drive(param, 18);
console.log("left turn.")
}
},
{
delay: 3500, // trun -90度実行後 3500msec後に前進実行 (50cm程度進みます)
task: function() {
var param = {tilt:0, forward:50, turn:0, up:0};
// この20を小さくすると距離が短くなります。大きくすると長くなります。
// 大きくする場合は次のtaskのdelay(このtaskではない)を長く設定してください。
d.drive(param, 20);
console.log("forward")
}
},
{
delay: 3500,
task: function() {
var param = {tilt:0, forward:0, turn:-90, up:0};
d.drive(param, 18);
console.log("left turn")
}
},
{
delay: 3500,
task: function() {
var param = {tilt:0, forward:50, turn:0, up:0};
d.drive(param, 20);
console.log("forward")
}
},
{
delay: 3500,
task: function() {
var param = {tilt:0, forward:0, turn:-90, up:0};
d.drive(param, 18);
console.log("forward")
}
},
{
delay: 3500,
task: function() {
var param = {tilt:0, forward:50, turn:0, up:0};
d.drive(param, 20);
console.log("forward")
}
},
{
delay: 3000,
task: function() {
d.land();
console.log("order landing.");
}
},
{
delay: 500,
task: function() {
d.disconnect();
console.log('finish.');
temporal.clear();
process.exit(0);
console.log('exit.');
}
}
]
);
}, 1000);
});
});
ある程度は自由に飛ばせるようになると思います。
Mamboを楽しんでください。