|
Top > 空飛ぶドリトル 飛行船をドリトルから制御するプログラムです。
// 基本設定 //
COM・基地局=『COM6』。
地上センサ有効=はい。
リモコンモード=いいえ。
// ポイントリスト //
配列:ポイント追加=「|x y h 点|点=配列!作る。
点:x=x。点:y=y。点:h=h。
!(点)入れる」。
ポイント=配列!作る
6363 5454 4000 ポイント追加
7878 4545 2000 ポイント追加
8636 3182 0 ポイント追加。
初期座標x=3333mm。//909
初期座標y=2727mm。//3636
角度補正値=0度。// 飛行船離陸時のドリトル角度(例えばグラフ上で右向きなら0度,下向きなら270度)
//当日に角度を測る別紙参照
制限時間=60秒。 // 緊急着陸タイマ
ホバリング係数=25。// ホバリングするために必要な垂直モータ出力 //55
//{連番(0〜F)}:{固有番号(16進四桁)}={座標xxxx[mm]},{座標yyyy[mm]}
//※注意:整形が崩れると正しく読めません。
センサアレイ=『
0:FDFF=3333,1818
1:FEFF=3333,3636
2:FFF7=4848,2929
3:FFFB=4848,4545
4:FFFD=4848,6363
5:FBFF=6363,1818
6:FFEF=6363,3636
7:7FFF=6363,4545
8:FFFE=6363,7272
9:F7FF=7878,0909
A:FFDF=7878,2727
B:FFBF=7878,4545
C:FF7F=7878,6363
D:EFFF=9393,1818
E:DFFF=9393,3636
F:BFFF=9393,5454
』。
// デバッグ用 //
ダンプリスト=リスト!作る 消える -300 90 位置 200 160 大きさ。
p=「|m|ダンプリスト!現れる (m)書く。m」。
「COM・基地局==『』」!なら「
シリアルポート=配列!作る。シリアルポート:時計=タイマー!作る。
//シリアルポート:開く=「|sp|!(sp+『を開きました。』)p。ポート=sp。自分」。
シリアルポート:開く=「|sp|ポート=sp。自分」。
//シリアルポート:閉じる=「!(『ポートを閉じました。』)p。ポート=『』。自分」。
シリアルポート:閉じる=「ポート=『』。自分」。
//シリアルポート:出力=「|v|!(v)p。自分」。
シリアルポート:出力=「自分」。
シリアルポート:値?=「|x 値|値=『』。「値=値!(乱数(9))連結」!(x)繰り返す。値」。
シリアルポート:待つ=「|s|時計!1 回数 (s)間隔 「」実行 待つ。自分」」実行。
// グラフ・バー・ログ //
タートル:グラフ化=「|処理 x y w h Mx My 画像 軸色|
更新=処理。原点x=x。原点y=y。グラフ幅=w。グラフ高さ=h。最大x=Mx。最大y=My。
ピクセルx=グラフ幅/最大x。ピクセルy=グラフ高さ/最大y。
ラベル!作る 20 25 大きさ (原点x−20)(原点y−10)位置 『0』書く
;作る 200 25 大きさ (原点x+グラフ幅−40)(原点y−10)位置 (最大x)書く
;作る 200 25 大きさ (原点x−30)(原点y+グラフ高さ+30)位置 (最大y)書く。
!消える ペンなし (原点x+グラフ幅)(原点y)位置 ペンあり (原点x)(原点y)位置
(原点x)(原点y+グラフ高さ)位置 (原点x)(原点y)位置 (軸色)線の色 図形にする;
(黒)線の色 1 線の太さ (画像)変身する 現れる」。
スライダー:バー化=「|出力処理 x y w h|
出力=出力処理。動作=「!(floor((!値?)*1.98)−99)出力」。
入力=「|v|!(ceil(v/2)+50)値」。
!(x)(y)位置 (w)(h)大きさ 縦向き」。
リスト:ファイル読む=「
|ファイル キー s i|
s=ファイル!(キー)読む。
s=s!((s!『 』indexof)+1)substring。// 先頭はタイトルなので読み飛ばす。
「i=s!『 』indexof。i!=0」!の間「
!(s!1(i)substring)書く。
s=s!(i+1)substring」実行。
!(s)書く。
自分」。
飛行制御=タイマー!作る。
飛行制御:初期化=「
制御頻度=0.50秒。//【要調整】0.75
指定秒数=99秒。// 次のポイントに到達するまでの時間
目標方向=0度。
目標距離=0mm。
目標高度=(ポイント!1 見る):h。
推力=0。
比=0.08。// 角度差とそれを補正するための出力の比。【要調整】0.12
待機時間=1秒。// 空中待機する時間。
センサ文字列=『』。
センサ更新あり=いいえ。
センサ数=0。
センサ=配列!作る (配列!作る)入れる (配列!作る)入れる (配列!作る)入れる。
ポイント番号=0。
ポイント更新=「|点|
ポイント番号=ポイント番号+1。
点=ポイント!(ポイント番号)見る。
目標座標x=点:x。目標座標y=点:y。目標高度=点:h。自分」。
角度算出=「|x y a|a=atan(y/x)。
「x<0」!なら「a=a+180」そうでなければ
「y<0」 なら「a=a+360」実行。round(a)」。
高度=0mm。方向=角度補正値。速度=0mm毎秒。
座標算出=「
//速度=(飛行船:動力・左+飛行船:動力・右)*5。
//座標x=round(座標x+速度*制御頻度*cos(a))。
//座標y=round(座標y+速度*制御頻度*sin(a))。
「センサ更新あり!(センサ数>0)全部本当」!なら「
座標x=0。座標y=0。
「|s|s=(センサ!(s)見る)。
座標x=座標x+s:x。座標y=座標y+s:y」!(センサ数)繰り返す。
座標x=座標x/センサ数。座標y=座標y/センサ数。
!針路補正」実行。
自分」。
針路補正=「|x y|x=目標座標x−座標x。y=目標座標y−座標y。
目標方向=!(x)(y)角度算出。
「目標方向<0」!なら「目標方向=目標方向+360」実行。
目標距離=round(sqrt(x*x+y*y))。
推力=20+目標距離/100。//←↓【要調整】
指定秒数=10+round(推力/10)。自分」。
高度確保=「飛行船!((目標高度−高度)/20)上昇下降。自分」。//【要調整】(?)
// 制御モード //
針路維持=「|回 d|
!座標算出 高度確保。
d=目標方向−方向。
「d<0 」!なら「d=d+360」実行。
「d>180」!なら「d=d−360」実行。
//↓【要調整】
「abs(d)<30」!なら「飛行船!(推力)直進」そうでなければ「飛行船!(d*比)転身」実行。
指定秒数=指定秒数−1。
//↓【要調整】
「((目標距離<666)!(指定秒数<1)どれか本当)!(abs(目標高度−高度)<500)全部本当」!なら「
「目標高度<1」!なら「!(終了)モード変更」
そうでなければ「!(空中待機)モード変更」実行」実行」。
空中待機=「|回|
!座標算出 高度確保。
「回*制御頻度>待機時間」!なら「!ポイント更新 針路補正 (針路維持)モード変更」実行」。
緊急着陸=「
飛行船!0 -99 0 動力設定。
タイマー!作る 1 回数 5秒 間隔 「」実行 待つ。!終了」。
実行回数=0。
制御モード=針路維持。
モード変更=「|m|制御モード=m。!1 m。実行回数=1。自分」。
経過時間=0秒。
制御=「|回|
経過時間=回*制御頻度。
高度=飛行船:高度*17。
方向=飛行船:方向+角度補正値。
「方向>360」!なら「方向=方向−360」実行。
「センサ文字列==飛行船:センサ文字列」!なら「センサ更新あり=いいえ」
そうでなければ「
センサ更新あり=はい。センサ文字列=飛行船:センサ文字列。センサ数=0。
「|i s b|s=センサ!(i)見る。i=i*4−3。
b=センサアレイ!((センサ文字列!(i)(i+4)substring)+『=』)indexof。
「b==0」!なら「s:x=未定義。s:y=未定義」そうでなければ「
センサ数=センサ数+1。
s:x=(センサアレイ!(b+5)(b+9)substring)*1。
s:y=(センサアレイ!(b+10)(b+14)substring)*1」実行。
」!3 繰り返す
」実行。
実行回数=実行回数+1。
!(実行回数)制御モード 」。
開始=「
座標x=初期座標x。座標y=初期座標y。
!ポイント更新。
!(制御頻度)間隔 (制限時間)時間 (制御)実行
1 回数 「!(緊急着陸)モード変更」実行」。
終了=「!中断。飛行船!停止」。
」。飛行制御!初期化。
画面表示=タイマー!作る。
画面表示:初期化=「
更新頻度=1.5秒。//【要調整】
高度グラフ=タートル!作る
「|時間 高度|!(時間*ピクセルx+原点x)(高度*ピクセルy+原点y)位置」
-350 -145 280 220 (制限時間+『秒』)『6000mm』『hikousen.png』(青)グラフ化。
軌跡グラフ=タートル!作る
「|方向 x y|!(方向)向き (x*ピクセルx+原点x)(y*ピクセルy+原点y)位置」
-10 -145 300 240『10000mm』『8000mm』『ayumi.gif』(赤)グラフ化。
軌跡グラフ:スポット描画=「
!消える。
「|b x y|
b=センサアレイ!(((b−1)!16 進数)+『:』)indexof。
x=センサアレイ!(b+7)(b+11)substring。
y=センサアレイ!(b+12)(b+16)substring。
!ペンなし (x*ピクセルx+原点x)(y*ピクセルy+原点y)位置 8 円 (緑)塗る」!16回 繰り返す。
ポイント!「|亀|
亀!ペンなし (x*亀:ピクセルx+亀:原点x)(y*亀:ピクセルy+亀:原点y)位置。
「h>0」!なら「亀!12 円 (黄)塗る」そうでなければ「亀!7 円 (紫)塗る」実行
」(自分)それぞれ実行。
!ペンなし (初期座標x*ピクセルx+原点x)(初期座標y*ピクセルy+原点y)位置 ペンあり 現れる」。
ラベル!『→ ↑ ←』作る -200 235 位置 150 35 大きさ。
動力バー・左=スライダー!作る 「|v|飛行船!(v)左」-200 200 100 25 バー化。
動力バー・中=スライダー!作る 「|v|飛行船!(v)中」-165 200 100 25 バー化。
動力バー・右=スライダー!作る 「|v|飛行船!(v)右」-130 200 100 25 バー化。
高度ログ=リスト!作る 70 230 位置 80 130 大きさ 『〔高度〕』書く。
方向ログ=リスト!作る 160 230 位置 80 130 大きさ 『〔方向〕』書く。
座標ログ=リスト!作る 260 230 位置 100 130 大きさ 『〔座標〕』書く。
ログファイル読む=「|f|f=file!(ファイルパス!読む)作る。
高度ログ!(f)『高度』ファイル読む。
方向ログ!(f)『方向』ファイル読む。
座標ログ!(f)『座標』ファイル読む」。
ログファイル書く=「file!(ファイルパス!読む)作る
『高度』(高度ログ)書く 『方向』(方向ログ)書く 『座標』(座標ログ)書く」。
再現ボタン=ボタン!『再現』作る -375 -185 位置 70 45 大きさ 18 文字サイズ。
再現ボタン:動作=「画面表示!再現開始」。
読み込みボタン=ボタン!『読む』作る -305 -185 位置 70 45 大きさ 18 文字サイズ。
読み込みボタン:動作=「画面表示!ログファイル読む」。
ファイルパス=フィールド!作る 『file』タイトル -235 -185 位置 150 45 大きさ 『flight1』書く。
書き込みボタン=ボタン!『書く』作る -85 -185 位置 70 45 大きさ 18 文字サイズ。
書き込みボタン:動作=「画面表示!ログファイル書く」。
コンソール=フィールド!作る 『console』タイトル 0 -185 位置 370 45 大きさ。
コンソール:動作=「(『「』+(!読む)+『」!実行。』)!実行」。
更新=「|回 h a x y|
h=飛行制御:高度。a=飛行制御:方向。x=飛行制御:座標x。y=飛行制御:座標y。
高度ログ!(h)書く。
高度グラフ!(回*更新頻度)(h)更新。
方向ログ!(a)書く。
座標ログ!(『』!(x)『,』(y)連結)書く。
軌跡グラフ!(a)(x)(y)更新。
動力バー・中!(飛行船:動力・中)入力。
動力バー・左!(飛行船:動力・左)入力。
動力バー・右!(飛行船:動力・右)入力。
「飛行船:飛行中==いいえ」!なら「!中断」実行」。
開始=「軌跡グラフ!スポット描画。!(更新頻度)間隔 (更新)実行」。
再現=「|回 c|回=回+1。c=座標ログ!(回)読む。
「c!=『』」!なら「
|i|i=c!『,』indexof。
高度グラフ!(回*更新頻度)(高度ログ!(回)読む)更新。
軌跡グラフ!(方向ログ!(回)読む)(c!1(i)substring)(c!(i+1)substring)更新」
そうでなければ「!中断」実行」。
再現開始=「軌跡グラフ!スポット描画。!(更新頻度)間隔 (再現)実行」。
」。画面表示!初期化。
飛行船=シリアルポート!作る。
飛行船:初期化=「
ちょい=0.02秒。// 1バイト読み込む毎のウェイト量【要調整】
高度=0mm。方向=0度。//速度=0mm毎秒。進向=0度。
動力・左=『+00』。動力・中=『+00』。動力・右=『+00』。
文字化=「|v|v=round(v)。
「(-10<v)!(v<10)全部本当」!なら「『+00』」
そうでなければ「v <-99」なら「『-99』」
そうでなければ「v > 99」なら「『+99』」
そうでなければ「v > 0」なら「『+』+v」
そうでなければ 「『』 +v」実行」。
左=「|v|動力・左=!(v)文字化。飛行船」。
中=「|v|動力・中=!(v)文字化。飛行船」。
右=「|v|動力・右=!(v)文字化。飛行船」。
センサファイル=『Sensor』。
センサキー=『p』。
センサ文字列=『』。
読む=「|x 値 エラー 字|値=『』。エラー=いいえ。
「字=!1 値?。!(ちょい)待つ。
「字*1==未定義」!なら「エラー=はい」
そうでなければ「値=値!(字)連結」実行」!(x)繰り返す。
「エラー」!なら「値=『』」実行。値」。
// COMポートが未設定なら動作をシミュレート。
「COM・基地局==『』」!なら「
読む=「|x 値|値=『』。
「x==4」!なら「
値=round(高度+(動力・中−40)/3)。!0.5 待つ」そうでなければ
「x==3」なら「
値=round(乱数(31)−16+(動力・右−動力・左)/7+方向)。
「値<0」!なら「値=値+360」そうでなければ
「値>360」なら「値=値−360」実行」実行。
『』!(値)連結」。
」実行。
直進=「|v|!(v)左 (v)右」。
//左回頭=「|v|!(動力・左−v)左」。
//右回頭=「|v|!(動力・右−v)右」。
転身=「|v|v=v+(「v<0」!なら「-20」そうでなければ「20」実行)。
!(『v:』!(v)連結)p。
!(v*-1)左 (v)右」。// 正で左,負で右
上昇下降=「|v|!(v+ホバリング係数)中」。
動力設定=「|L C R|!(L)左 (C)中 (R)右」。
通信=「|m d h|
「停止命令あり」!なら「!0 0 0 動力設定。飛行中=いいえ」実行。
m=『S』!(動力・中)(動力・左)(動力・右)『$』連結。//!(m)p。
!(COM・基地局)開く (m)出力 0.4 待つ 1バイト 読む。
「d=(!3バイト 読む)*1。d!=未定義」!なら「方向=d」実行。
「h=(!4バイト 読む)*1。h!=未定義」!なら「高度=h」実行。
!1バイト 読む;閉じる。
「地上センサ有効」!なら「センサ文字列=file!(センサファイル)作る (センサキー)読む」実行」。
飛行中=はい。
離陸=「「飛行中」!の間(通信)実行」。
停止命令あり=いいえ。
停止=「停止命令あり=はい」。
」。飛行船!初期化。
競技飛行=「飛行制御!開始。画面表示!開始。飛行船!離陸」。
「リモコンモード」!なら「
リモコン=「
ルート:制限時間=2000秒。
飛行制御:制御モード=「
!座標算出」。
飛行船:飛行中=はい。
飛行制御!開始。画面表示!開始。飛行船!離陸」。
q=「飛行制御!中断。飛行船!停止」。
画面表示:コンソール!『!リモコン』書く」実行。
規定飛行=「
ルート:初期座標x=7878mm。//5000
ルート:初期座標y=4545mm。//5000
ルート:角度補正値=0度。
ルート:ポイント=配列!作る
7878 4545 4000 ポイント追加 //5000 5000 4500
7878 2727 4000 ポイント追加 //5000 3000 4500
7878 2727 0 ポイント追加。//5000 3000 0
飛行制御:待機時間=5秒。 //ホバリング時間の変更 高橋
飛行制御!開始。画面表示!開始。飛行船!離陸。
」。
(ボタン!『競技飛行』作る -375 225 位置 140 45 大きさ):動作=競技飛行。
(ボタン!『規定飛行』作る -375 175 位置 140 45 大きさ):動作=規定飛行。
|