droneプログラミング覚書staff.gku.ac.jp/~ido/doc/sem/drone_programming.pdf「droneプログラミング覚書」岐阜経済大学井戸伸彦...

36
「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 1 はじめに (1)動作環境 (2)飛行プラン (3)ファイルからの飛行プランの読み 取り (4)飛行プランの引数渡しとGrabber (5)機能追加 droneプログラミング覚書 岐阜経済大学 経営学部 経営情報学科 井戸 伸彦 来歴: 0.0版 2018年5月10日 順次追加 スライドの構成

Transcript of droneプログラミング覚書staff.gku.ac.jp/~ido/doc/sem/drone_programming.pdf「droneプログラミング覚書」岐阜経済大学井戸伸彦...

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 1

はじめに

(1)動作環境

(2)飛行プラン

(3)ファイルからの飛行プランの読み取り

(4)飛行プランの引数渡しとGrabber

(5)機能追加

droneプログラミング覚書

岐阜経済大学 経営学部 経営情報学科 井戸 伸彦来歴:

0.0版 2018年5月10日 順次追加

スライドの構成

はじめに本スライドは、JavaScriptを用いて、ドローンParrot Mamboを操作するプログラムの作成に関わる覚書です。単独で教科書となることは意図していません。

JavaScriptプログラムはブラウザ上で動作させることがほとんどですが、本スライドではnode.jsを用いてコンソール上から起動します。

本スライドでは、JavaScriptについて次のスライドで学んでいることを前提とします。本スライド中では、このスライドを、“JS覚書”と記して参照します。「JavaScript覚書」

(http://staff.gifu-keizai.ac.jp/~ido/doc/web_text/javascript_text.pdf)

JavaScriptについてきちんと勉強したい方は、プログラミング等の講義を受講して頂くことをお願いします。

説明は直感的な分かりやすさを重視し、厳密には不正確な言い方もしています。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 2

(1.1)動作環境

本スライドでは、node.jsを用いてJavaScriptの動作環境を構築することを前提としています。

次のサイトを参考に環境構築を行いました。(1)全体像:「 Parrot Mambo Missionを動かす(github)」

(以下のスライドでは、このサイトからのファイル等を“元ネタ”と記します。)

(https://github.com/hiko2msp/play_with_parrot_mambo)

(2)node.js/npmのインストール:「Node.js / npmをインストールする」

(https://qiita.com/taiponrock/items/9001ae194571feb63a5e)

(3)gitのインストール:

「初心者でもWindowsやMacでできる、Gitのインストールと基本的な使い方」

(http://www.atmarkit.co.jp/ait/articles/1603/31/news026.html)

(4)proxy関係(大学内の環境下では必要):

「Proxy環境下でのGit for Windows設定」

(https://qiita.com/yujimny/items/08f02d9dfb670f0e9ddf)

「[Node.js] npm の proxy と registry 設定」

(https://qiita.com/LightSpeedC/items/b273735e909bd381bcf1)

(5)Bluetoothドライバの書き換え(Zadig):

「ミニドローン Parrot MAMBO を Node.js で飛ばす(Windows 編)」中の“Bluetoothアダプタの設定”(https://qiita.com/mkoku/items/7458239f5bcca88eed49)「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 3

(1.2)動作確認

大学で用いるタブレットPCでは、ユーザ名“drone”でサインインしてください。ユーザ名“岐阜経済大学”となっていた場合はサインアウトして、 “drone”に切り替えてください。

次のディレクトリ(フォルダ)にてプログラムを実行します。

~/drone/play_with_parrot_mambo/

(”~”は、ユーザのホームディレクトリ)

前記(1)のwebページ(「 Parrot Mambo Missionを動かす(

github)」)に記載のプログラムを、次のように起動出来る状態にします(ドローンの名前の設定はページの記述に従ってください。 )。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 4

>node testFlight.js

(1.3)作業フォルダ

今後、作成したプログラムは、タブレットPC上の次のフォルダ(ディレクトリ)に置くことにします。 [コンピュータ]-[ユーザー]-[drone]-[drone]-

[play_with_parrot_mambo]-[drone_programming] (~/drone/play_with_parrot_mambo/drone_programming/)

情報実習室パソコンからのコピーは、次のフォルダ経由で行います(赤字の部分は、年度とゼミに合わせます)。 [public]-[ido]-[student]-[2018se2]-[グループ名]

最初に、[ドキュメント]配下の“ファイルサーバ認証”を起動して、ネットワークドライブを割り当てておいてください。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 5

(1.4)コマンド入力(Git Bash)

コマンドは、次のように起動したGit Bash上で行います。 [スタート]-[git]-[Git Bash]

起動後、“cd”コマンドを次のように入力して、作業ディレクトリに移動します(linuxコマンドについては別途説明)。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 6

(2.1)飛行プランのプログラミング

元ネタにあるプログラム“testFlight.js”を書き換

えた次のプログラムを参考にして、自分で考えた飛行プランによりドローンを飛ばしてください。ファイルは、ネットワークドライブにあります。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 7

dronejs.connect(DRONE_NAME)

.then(() => dronejs.flatTrim()) // 飛ぶ前に一度平坦な状態を覚える

.then(() => dronejs.takeOff()) // 離陸

.then(() => {console.log(DRONE_NAME+' take off.');})

.then(() => dronejs.flatTrim())

.then(() => dronejs.turnRight(50, 20))

.then(() => {console.log(DRONE_NAME+' turnRight.');})

.then(() => dronejs.flatTrim())

.then(() => dronejs.land()) // 着陸する

.then(() => {console.log(DRONE_NAME+' land.');})

.then(() => dronejs.disconnect()) // 接続解除

.then(() => {

// 正常終了した場合、プログラムを終了する

<ch21_test_flight.js(86行目あたり)>

(2.2)プログラミングに関して

ch21_test_drive.jsのプログラムの内容は、スライド「JS覚書」中の次の点に注意して理解してください。(12)関数

(8)分岐、if文 (3)変数

以降でも、このスライドの参照が必要ですが、そのたびに上記のように参照することはしません。

ch21_test_drive.jsのプログラムの次の内容については、当面、“そのように書くもの”と理解しておいてください。別の機会に説明します。アロー関数(“()=>”)

thenメソッド

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 8

(2.3)課題

ch21_test_drive.jsのプログラムを書き換えて、

自分が考えた飛行プランでドローンを飛ばしてください。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 9

(3.1)ファイルからの読み取り

ブラウザ上で動作するJavaScriptでは、そのPCのファイルを読むことは出来ません。次のプログラムは、node.jsでのみ動作します。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 10

var fs = require('fs’); // ファイル操作モジュール

fs.readFile('ch31_test.txt’, // 読み出すファイルのパス名'utf8’, // ファイルの文字コードfunction(err,data){ // 読出後に実行される処理(コールバック関数)

// ファイルの内容の出力console.log(data);

} // 関数の終わり);

abcd

efg

hijklmn

<ch31_test.txt>C:¥> node ch31_read_file.js

abcd

efg

hijklmn

<実行結果>

<ch31_read_file.js>①起動

②読取

③出力

(3.2)1行ごとの処理

本スライドでは大きなファイルは扱いませんので、ファイルごと読み込んだ文字列を1行ごとの配列に格納して処理します。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 11

function (err, data) { // 読み出して実行される処理(関数)// ファイル内容の文字列を改行コードで配列に分割var lines=data.split(/¥r¥n|¥r|¥n/);

for(var i=0;i<lines.length;i++){// 配列の要素(=各行)ごとに繰り返しconsole.log((i+1)+':'+lines[i]); // 行番号を付加して行を出力

}

} // 関数の終わり

C:¥> node ch32_each_line.js

1:abcd

2:efg

3:hijklmn

<実行結果>

<ch32_each_line.js((3.1)のコールバック関数部分のみ)>

“abcd

efg

hijklmn” “abcd¥r¥nefg¥r¥nhijklmn”

[“abcd”,

“efg”,

“hijklmn”]

すなわち、

(3.3)練習問題次のようなブラウザ上で動作するJavaScriptプログラムを作成してください。

下の図の右のようなファイルから読み込んだつもりで、左のような文字列を宣言します。

ブラウザ上に下のようなグラフを出力します。項目の数は3つ(A、B、C)の固定としてOKです。形式が間違っているファイルに対する考慮も無用です。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 12

A12B28C20

var str=“A¥n¥r12¥n¥rB¥n¥r28¥n¥rC¥n¥r20”;

(3.4.1)ファイルを用いた飛行プランー1ー

次の2つのファイルを参考にして、ファイルに記述した飛行プランによりドローンを飛ばしてください。ファイルは、ネットワークドライブにあります。 ch34_planed_flight.js

ch34_flight_plan.txt

ひとつめのファイルがプログラムであり、次スライド以降に示します。次スライドに示すプログラムは、ch21_test_drive.jsの74行目あたりまで同じで、その後の部分を示しています。

ふたつめのファイルが飛行プランを記したファイルです。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 13

(3.4.2)ファイルを用いた飛行プランー2ー

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 14

var flight_plan=new Array();

function loadFlightPlan(fileName){

var fs = require('fs'); //ファイル操作モジュールfs.readFile(fileName, 'utf8’,

function (err, data) { // 読み出して実行される処理(関数)var lines=data.split(/¥r¥n|¥r|¥n/); //文字列を改行コードで配列に分割for(var i=0;i<lines.length;i++){ //配列の要素(各行)ごとに繰り返し

var line=lines[i].replace(/¥s+/g,‘’); //空白除去してlineに代入if(line==‘’||line.charAt(0)==‘#’)continue; //空行等は読み飛ばしvar action;

if(line.indexOf(':')>0){

var items=line.split(':'); // 1行を”:”(カンマ)で区切る。// オブジェクト(連想配列)を作成。action={method:items[0],params:items[1].split(',')};

}else{

action={method:line};

}

flight_plan.push(action);

}

} // 関数の終わり);

}

<次のスライドに続く>

<ch34_planed_flight.js(74行目以降)>

(3.4.3)ファイルを用いた飛行プランー3ー

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 15

<前のスライドからの続き>function schedule(){

var action=flight_plan.shift();

if(action==null){

console.log("#P#schedule.disconnect");

dronejs.disconnect()

.then(() => {process.stdin.pause();console.log("end");process.exit();})

.catch((e) => {console.log('e=' + e);process.stdin.pause();process.exit();});

return;

}

console.log("#P#schedule.action.method="+action.method);

if(action.method=='flatTrim'){

dronejs.flatTrim().then(()=>schedule())

.catch((e) => {console.log('e=' + e);process.stdin.pause();process.exit();});

}else if(action.method=='takeOff'){

dronejs.takeOff().then(()=>schedule())

.catch((e) => {console.log('e=' + e);process.stdin.pause();process.exit();});

}else if(action.method=='land'){

dronejs.land().then(()=>schedule())

.catch((e) => {console.log('e=' + e);process.stdin.pause();process.exit();});

}else if(action.method=='turnRight'){

dronejs.turnRight(action.params[0],action.params[1]).then(()=>schedule())

.catch((e) => {console.log('e=' + e);process.stdin.pause();process.exit();});

}else{

console.log("#E#schedule. illegal method. action.method="+action.method);

}

}

<次のスライドに続く>

(3.4.4)ファイルを用いた飛行プランー4ー

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 16

function main() {

// 飛行プランの読み取りloadFlightPlan('ch34_flight_plan.txt’);

console.log('start’)

const navDataStream = dronejs.getNavDataStream();

navDataStream.subscribe((data) => {

console.log(data);

},

e => debug(e),

() => debug('complete')

);

dronejs.connect(DRONE_NAME)

.then(()=>schedule())

.catch((e) => {

// 以上終了した場合、エラーの内容をコンソールに表示し、終了するconsole.log('エラー: ' + e);

process.stdin.pause();

process.exit();

});

}

main(); // 関数を実行します

(3.4.5)ファイルを用いた飛行プランー5ー

次のような飛行プランのテキストファイルを読み込みますが、次の点に注意してください。行の先頭に“#”(シャープ)を書くと、その行はコメント行になります。行の途中から“#”(シャープ)を書くと、それ以降がコメントと見なされます。

空白行は読み飛ばします。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 17

flatTrim

takeoff

flatTrim

turnRight:50, 20

flatTrim

land

<ch34_flight_plan.txt>

(3.5)課題

“ch34_planed_flight.js”のプログラムを書き

換えて、すべてのコマンドが飛行プランで実行できるようにしてください。

ファイル名は、“ch35_planed_flight.js”としま

す。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 18

(4.1)コマンドライン引数

スライド(3.1)のプログラムを書き換えて、読み出すファイル名を指定出来るようにします。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 19

var fs = require('fs’); // ファイル操作モジュールvar file_name = process.argv[2];

fs.readFile(file_name, // 読み出すファイルのパス名'utf8’, // ファイルの文字コードfunction(err,data){ // 読出後に実行される処理(コールバック関数)

// ファイルの内容の出力console.log(data);

} // 関数の終わり);

<ch41_read_file.js>

opqr

stuvwxyz

<ch41_test.txt>C:¥> node ch31_read_file.js ch41_test.txt

opqr

stuvwxyz

C:¥> node ch31_read_file ch31_test.txt

abcd

efg

hijklmn

<実行結果>

abcd

efg

hijklmn

<ch31_test.txt>

①コマンドライン引数

②ファイル名

③出力

(4.2)process.argv

process.argvの配列には、インデックス“2”から指定したコマンドライン引数が入ることに注意してください。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 20

C:¥> node ch42_arg_test.js aaa bbb ccc ddd

<ch42_arg_test.js>

index 0 : C:¥...¥node.exe

index 1 : C:¥ ch42_arg_test.js

index 2 : aaa

index 3 : bbb

index 4 : ccc

index 5 : ddd

console.log('index 0 : ‘+

process.argv[0]);

console.log('index 1 : ‘+

process.argv[1]);

console.log('index 2 : ‘+

process.argv[2]);

console.log('index 3 : ‘+

process.argv[3]);

console.log('index 4 : ‘+

process.argv[4]);

console.log('index 5 : ‘+

process.argv[5]);

node.jsの実行ファイル

実行されたプログラムファイル

コマンドライン引数

(4.3)飛行プランの引数での指定

スライド(3.5) の“ch35_planed_flight.js”を変

更して、飛行プランのファイルをコマンドラインの引数として指定出来るようにします。ファイル名は“ch43_planed_flight.js”とし、次のように実行出来るようにします。

変更は次の2か所で行います。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 21

C:¥> node ch43_planed_flight.js ch34_flight_plan.txt

(旧) main(); // 関数を実行します

(新) main(process.argv[2]); // 関数を実行します

(新)function main(file_name) {

// 飛行プランの読み取りloadFlightPlan(file_name);

(旧)function main() {

// 飛行プランの読み取りloadFlightPlan('ch34_flight_plan.txt');

(4.4)Grabber

元ネタにあるプログラム“testGrab.js”では、次の

ようにGrabberの操作を記述しています。

スライド(4.3) の“ch43_planed_flight.js”にて、

次の飛行プランを指定すると、同じことが出来ます。

(disconnectは、 “ch43_planed_flight.js”にて、プランの終了後に必ず実行するようにしています。)

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 22

dronejs.connect(DRONE_NAME)

.then(() => dronejs.grabClose()) // 腕を閉じる

.then(() => dronejs.grabOpen()) // 腕を開く

.then(() => dronejs.disconnect()) // 接続解除

.then(() => {

<testGrab.js>

grabClose # 腕を閉じるgrabOpen # 腕を開く

<ch44_plan_grab.txt>

(4.5)タイミング

利用させて頂いているネタ元の環境では、ドローンの着陸後にすぐ離陸することは難しいようです。

少しタイミングを取るためのプランの記述と、これを実行するプログラムの機能とを追加します。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 23

}else if(action.method=='checkAllStates'){

dronejs.checkAllStates().then(()=>schedule())

.catch((e) => {console.log('e=‘ +……

}else if(action.method=='timing'){

setTimeout(schedule,action.params[0]);

}else{

console.log("#E#schedule. illegal method.……

<ch45_operation.js(181行あたり)>

flatTrim

takeOff

flatTrim

forward:10,10

land

timing:2000

flatTrim

takeOff

flatTrim

backward:10,10

land

<ch45_plan_timing.txt>

追加

2000msだけタイミングを取る

(4.6)課題

“ch45_operation.js”を用いて次のような動作を

行う飛行プランを作成してください。物(丸めた紙)をつかむ。

離陸する。

少し前進する。

着陸する。

物を離す。

(ここでタイミングを取る)

離陸、後進、着陸して、元の場所に戻る。

ファイル名は、“ch46_carry_obj.txt”とします。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 24

(5)機能追加

次の機能追加を行います。ドローン名をファイルから読み込むことにする。

プランの実行前にプランの記述に誤りが無いかをチェックし、誤りが見つかった場合は実行を行わない。

移動における強さの上限を設定し、プランにおいてそれを超える値が設定されていても、制限内の強さで移動を行う。

(室内での飛行を想定しているので、安全対策として行う。)

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 25

(5.1.1)ドローン名のファイルへの記述

次のように飛行プランファイル内にドローン名を記述することにします。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 26

:droneName:Mambo_742xxx

:plan:

flatTrim

takeOff # 離陸する。flatTrim

forward:10,10 # 少し前進する。land # 着陸する。:

<ch50_plan_timing.txt>

ドローン名

この記述の後が飛行プラン

(5.1.2)プログラムでのドローン名の読み取り

飛行プランを読み取っている場合を表す変数を導入します。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 27

var on_reading_plan=false; // 飛行プランの読み取り中の時にtrue

for(var i=0;i<lines.length;i++){ // 配列の要素(=各行)ごとに繰り返し(中略)

if(on_reading_plan){ // 飛行プランを読取中の場合// 従来とおりの飛行プランの読み取り(中略)

}else{

// 飛行プラン以外(ドローン名など)を読取(中略)

if(line.indexOf(‘:droneName:’)==0){ // ドローン名の行// ドローン名の取得DRONE_NAME=line.substring(‘:dronName:’.length+1);

(中略)}else if(line.indexOf(':plan:')==0){

on_reading_plan=true; // 飛行プラン読取中に移行(中略)

}

}

<ch50_operation.js>

(5.2.1)パラメータチェック用のテーブル

次のようなテーブルでパラメータをチェックします。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 28

const PARAMS_C={

'takeOff' :[],'flatTrim':[],'land':[],

'forward' :[{min:0,max:20},{min:0,max:50}],

'backward' :[{min:0,max:20},{min:0,max:50}],

'right' :[{min:0,max:20},{min:0,max:50}],

'left' :[{min:0,max:20},{min:0,max:50}],

'up' :[{min:0,max:20},{min:0,max:50}],

'down' :[{min:0,max:20},{min:0,max:50}],

'turnRight':[{min:0,max:20},{min:0,max:50}],

'turnLeft' :[{min:0,max:20},{min:0,max:50}],

'grabClose':[],grabOpen:[],

'frontFlip':[],'backFlip':[],'rightFlip':[],'leftFlip':[],

'takePicture':[],'listAllPictures':[],'downloadPicture':[],

'deletePicture':[],

'enableLogging':[],'checkAllStates':[],

'timing':[{min:0,max:10000000}]};

<ch50_operation.js>これらのコマンドには、パラメータ

が無い

これらのコマンドには、パラメータが2つあり、

値には下限と上限がある

(5.2.2)パラメータチェックのプログラム

ch50_operation.js(抜粋)

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 29

if(PARAMS_C[action.method]==null){

// メソッドが飛行プランチェック用テーブルに無い場合return; // 処理を中止する -> 飛行プランの読み取りは中断。

}

if(items.length>1){ //パラメータがある場合var params=items[1].split(‘,‘); // カンマで区切ってパラメータ毎に分けるif(params.length>0 || PARAMS_C[action.method].length>0){

if(params.length!=PARAMS_C[action.method].length){

// パラメータの数が一致しない場合return; // 処理を中止する -> 飛行プランの読み取りは中断。

}

for(var i_para=0;i_para<params.length;i_para++){ // 各パラメータif(params[i_para]>PARAMS_C[action.method][i_para].max){

// 上限より大きい場合、上限の値に設定params[i_para]=PARAMS_C[action.method][i_para].max

}else if(params[i_para]<PARAMS_C[action.method][i_para].min){

// 下限より小さい場合、下限の値に設定params[i_para]=PARAMS_C[action.method][i_para].min;

}

}

}

(6)カメラ

現状、ドローン(Parrot社Mambo)からPCへの画像取得がうまく行かないため、カメラに利用は当面見送ります(2018.09.25)。

(参考URL:写真取得不可が未解決な現状を示す)https://forum.tynker.com/t/parrot-mambo-fetching-pictures/361/8

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 30

(7)webサーバ

カメラの利用を当面見送ることから、代替の題材としてwebサーバを利用したdroneの操作を実施します。

ドローンを制御するプログラムをwebサーバと連携させ、webページからドローンを操作します。この枠組みの中で、ゲームを行うプログラムの開発を行います。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 31

<ノートPC><ドローン>(Mambo)

webサーバ

ドローン制御連携

操作

対戦ゲーム

<端末>

(7.1)webサーバの環境設定等

次のサイトを参考にしています。

(1)webサーバ関連:「node.js 超入門①~④」

(https://qiita.com/ritukiii/items/7f28554369d63eb373c3)

・同じ内容の次の動画を見て勉強します。

(https://dotinstall.com/lessons/basic_nodejs)

webサーバとは直接関係しませんが、次のサイトも参考にします。

(2)node.js関連:「Node.js 実践講座 〜基礎編〜」(https://qiita.com/loremipsumjp/items/3d32a44fe80c9a2febbe)(3)Visual Studio Code関連:「Visual Studio CodeによるNode.jsのデバッグ」(https://dev.classmethod.jp/server-side/vscode-nodejs-1/)

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 32

(7.2)端末での操作画面

ログイン画面次のURLにアクセスしてログインします。http://172.17.xxx.xxx:3000/entry

ドローン操作画面ログインすると操作画面が現れます。

コマンドを入力して、[登録]をクリックします。実行できるコマンドは次のとおりです。

t(takeOff)、l(land)、tl(trunLeft)、tr(turnRight)、f(forward)、e(終了)

操作画面や実行出来るコマンドを、学生の皆さんが改良していきます。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 33

(7.3)操作のルール

ドローンを操作するユーザは、何人でもログイン出来ます。

ユーザはコマンドを続けて登録出来ますが、一つのコマンドが終了するまで次のコマンドは実行されません。コマンドを登録した後の削除は出来ません(出来るように改良することは可能です)。

複数ユーザがコマンドを登録したとき:優先権のあるユーザのコマンドが実行され、実行された後、優先件は次のユーザに移ります。

優先権のあるユーザのコマンド登録が無かった場合:他のユーザからのにコマンド登録があればそれが実行され、優先権はスキップされて他のユーザに渡ります。

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 34

(7.4)ファイル構成

作成したプログラムは、ノートPC上の次のフォルダ(ディレクトリ)に置くことにします。 [コンピュータ]-[ユーザー]-[drone]-[drone]-

[play_with_parrot_mambo]-[drone2018] (~/drone/play_with_parrot_mambo/drone2018/)

ファイル一覧 JavaScriptプログラム

main.js、jr_server.js、drone_operation.js設定ファイル

jr_config.js、command2actionLine.txtwebページ(のひな形)

dr_entry.ejs、dr_cont.ejs

起動の仕方

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 35

C:¥> node main.js

(7.5)ファイルの役割

「droneプログラミング覚書」 岐阜経済大学 井戸伸彦 36

main.js・起動

・サーバとドローン制御の連携

dr_config.js・パラメータ保持

drone_operation.js・ドローンの制御

command2actionLine.txt・コマンドからアクションへの変換表

dr_server.js・webサーバ・ユーザの管理

dr_entry.ejs・ログイン画面

dr_cont.ejs・操作画面

起動

起動起動

コマンド取得アクション取得