Top > 空飛ぶドリトル

飛行船をドリトルから制御するプログラムです。

kcg.png DSCN2243.JPG

// 基本設定 //
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 大きさ):動作=規定飛行。

添付ファイル: filekcg.png 293件 [詳細] fileDSCN2243.JPG 289件 [詳細]

リロード   新規 編集 凍結 差分 添付 複製 名前変更   ホーム 一覧 単語検索 最終更新 バックアップ リンク元   ヘルプ   最終更新のRSS
Last-modified: 2008-01-31 (木) 23:09:06 (945d)