移動する物体
RigidChipsで最初に作った移動物体は衛星砲だった。すでにおかしい。当時はネット上にアップロードされているマップやモデルを落としてきて遊ぶスタイルだったのだが、ダウンロードしたマップの中にRCModelMuseumというマップがあった。このマップではRigidChipsの色々な情報がまとめられていたのだが、数あるモデルの展示パネルの中に衛星砲という単語を見つけた。
これが全ての始まりである。
試行錯誤の末出来上がったのがコレ。
これがあと9機あり、何を思ったのか左右非対称な造形となっている。安定しない, 真っすぐ飛ばない, 外乱に弱いの三拍子で制御にものすごく苦労した記憶がある。ARMは16M砲2門, 300M砲1門(1機あたり)である。威力の設定時に一桁多く入力していたらしく、とんでもない火力になっていた。当時の私は気付いていなかったようだ。
このあとに作られた衛星砲には、他に類を見ないパタパタ式装弾機構が搭載されることになる。
このモデルができてからしばらくは衛星砲がブームだったのだが、自動迎撃機銃付き飛行機、重装甲ホバー、航空機エンジン、ヘリオス、ファンネル…と移っていき、今は無人機を作っている。
次に空もの以外のモデルを作る日はいつになるのだろうか
一応の完成
五年前に開発を始めた無人機が、ようやく完成と呼べる状態となった。区切りがついたので無人機の開発記のようなものを書いてみる。
無人機の開発目標
目標は、
- 目標に飛んでいく
- 地形は自動で回避
- 敵の攻撃も回避
- 群飛行する
- 偏差射撃
- 精度は1200m先から1chipを連続して撃ち抜ける程度
- 無人機のカメラ視点が使える
- 大量運用できるように小型化
- 敵味方識別
...いつ見ても無謀な目標である。
最初の無人機”XF-03”
無人機の開発を始めるきっかけとなったのが、この動画である。
「こいつッ !!自動で戦っていやがるッ!」
動きは、追尾して、照準が合ったら撃つだけだな...俺にも作れるのでは?
と、いうことで無人機の開発が始まった。まずは試験機を作ることにした。それがXF-03である。この時はまだPID制御の概念そのものがなかったので、撃っても目標には当たらなかった。
当時考えていた仕様は以下の通り。
- 目標追尾可能
- 速度調整可能
- 射撃精度指定
- 敵味方識別
動かしてみた所、とある問題を発見した。
なんかエルロンが安定しないぞ...?
実はロール制御の問題はこの時点で発覚していたのだ。この問題は、後の無人機開発でも筆者を苦しめることになるのであった...
火器管制を搭載! 完成されるはずだった "TFX-02"
XF-03の問題点を改善し、実際に運用するために作られたのが"TFX-02"である。
要求仕様は以下の通り。
- 目標指定可能
- 速度指定可能
- 射撃精度は0.1度以下
- 切り離して大量に運用
- スモーク
- 火器管制を搭載
- 敵味方識別
- 地形回避
- 3DHUD搭載
- 群飛行可能
- エルロンにもっと安定性を!
要求仕様を満たすまでに2年近くかかった。Luaが複雑化しすぎてヒジョーに整備しずらい。これはマズイ。さらに、ARMのOptionの数値を上げると命中しなくなる。そして動作が重い。
ロール制御は前の記事で解決した。
解決したかに見えたのだが、もう一工夫必要だった。射線が目標に近づけば近づくほど、目に見えてエルロンの反応が鈍くなっていくのである。
ようやく"完成"した無人機 "ADF-01"
型番が完全に"某ゲーム"のものである。仕様は、TFX-02のものに加え、敵弾回避を加えた。火器管制も高級なものへ変更し、ロール制御の問題は解決された。
この機体には、新しく作成した航空機用の動翼システムを利用していて、TFX-02で見られた機体の横滑りを解消している。地形回避は、この動翼システムと統合したため、通常の航空機でも地形回避を利用できる。TFX-02に搭載されていたものをベースに改良をしたため、地形の回避率はほぼ100%となった。トンネルはくぐれない...
開発目標を達成したため、この機体を"完成"とすることにした。完成とはいっても、タイトルにある通り"一応の完成"なのでこれからも改良はつづく。
1年ぶりの更新
2017/12/31に更新が止まっていた無人機を編隊飛行へ向けて大幅な改修をした。
4年もかかったロール制御の安定化
翼の制御を角速度によるものとし、ロール角算出式に改良を施した。これにより前バージョンで問題になっていた、
- 操舵の精度を上げるとエルロンの挙動が不安定になる
- 上の問題を解消しても差角が小さくなるとエルロンの反応が鈍くなる
が一度に解消できた。特に一つ目は、機首に機銃が付いてる機体をatan2とpidで制御しようとすると必ずついて回る問題である。
機体の各翼の角度は、目標座標と自機座標の差をローカル化して(lx, ly, lz)atan2に代入することによって求めているが、私が良く使うエルロンの角度を求める式は、
AIL = math.deg(atan2( lx, ly))
である。機首に機銃を積む以上、目標に命中させるためには目標に機銃を向けなければならないが、そうするとlx,lyがともに小さくなっていき、目標に完全に機銃が向くとlx,lyが0になる。この状態で目標が横方向にスライドすると、lx >> lyとなり、計算される角度が過大になる。これが、操舵の精度を上げるとエルロンの挙動が不安定になる原因であった。
これを解消するために、以前はlxとlyの絶対値が一定以下になたらロールを水平にする制御を入れてごまかしていた。これが原因でエルロンの反応が鈍くなっていた。
しかし今回は、lyの正と負の両方に下限を設けることにした。これだけで、挙動が一気に安定し、無人機視点にしても全く問題がなくなった。
群制御アルゴリズムの改良
群制御のアリゴリズムを見直すことで、それらしい群飛行をすることに成功した。具体的には、「反発距離・平行距離・接近距離を設ける」ことである。これは、群行動をする無人機ではわりとメジャーな制御方式らしい。
以上の二つの改良で、30機以上の無人機を安定して群飛行させることができた。
編隊飛行がいつになるかわからないが、それまでには母機ともに完全な状態にしておきたい
はじめの一歩
ファンネルを作るといったはいいものの、何をどうすればいいのかさっぱりわからんのでファンネルの基本である"浮く"ことについて考えてみる。
欲しい機能は、"狙った座標に飛んでいき、そこで静止する"である。つまり、ファンネルの重心座標と目標座標が一致すればよい。
ということで実験機を組んでみる。X軸, Z軸の制御はよくわからないので高度のみの制御をやってみる。
モデルを読み込んだ直後にJETをSPLITすることで外乱を受けないようにする。シミュレーターならではの方法である。
係数は適当だが、ちゃんと目標値(Y=46)付近で静止してくれている
あとはこれを3軸分やればいいのだが、一つ問題がある。実際には外乱などでファンネルが回転してしまうことである。回転してしまうと、各軸の制御量と実際の制御量がズレてしまい、暴走するのだ(しっくりくる表現が見つからない)
どうすればいいかというと、回転した分だけJetの出力を調整すればいいのである
ファンネルのコアChipから見て、目標座標がどれぐらいズレているのかを3軸分みてやり(World→Local変換)、そのずれが0になるように制御すればいいはずである
さっそく実験。
思った通り動いた。これならファンネルが回転してもその場にとどまり続けることができる
ファンネル完成への道は遠い
FunnelMaster計画
そういえば雑に扱っても平気なファンネルを作ったことがないな、ということでファンネルを作ることにした。
ただ作るだけじゃつまらないので、ライブラリ化してみる。
目標は「これがあればファンネルが簡単に作れる」。この構想はとある方のライブラリが元になっている。
機能は、
・浮く
・目標に機首を向ける
の2つだけ。
ファンネル制御の核として利用する予定なので、値やパラメータを返す関数などはしっかり用意しておく。
最近、「反重力移動」なる単語を聞いたのでそれも実装しておきたい
新システムその2
その1のつづき。空力編。
旧自動可変空力システム
このシステムは、速度によって空力パーツの迎え角を変える、車輪が浮いたら地面に接地するように制御する、地面から離れたら車体を水平に保ち滑空する、という3つの機能を持っていた。実はつい最近まで主力マシンのDF制御に使われていた。
自力で離陸できない、滑空中に進行方向を変えようとすると水平を維持できなくなる、係数をちょっと変えただけで挙動が激変する・走行中に勝手に離陸する、いちいち制御を書かないといけない...など問題が山積みだった。
今後は二度と使われることはないだろう...多分。
アクティブDFシステム
旧システムの機能を基本とし、グリップ制御、地形追従、エアブレーキを追加した新システム。
グリップ制御は、その名の通りWheelのスリップを減らすための制御で、WheelがスリップするとDFを増やして地面にWheelを押し付け、グリップさせる。力業。
地形追従は車体が浮き上がった時にいい感じに地面にくっつけることが目的である。制御は航空機ベースなため、旧システムに比べて機動力は比較にならないほど向上している。アクティブサスペンションと組み合わせればかなり効果があるはずである。
新システムができたので、新車を一台作っておきたいところ。
新システムその1
前回の更新から3ヶ月もたってしまった。基板設計してたし...
最近車用のライブラリを大幅に更新(ほとんど作り直し)したので紹介してみる
アクティブサスペンション
今まで触っていなかったサスペンションを新たに追加した。
今まで路面ギャップによる車体の跳ねをダウンフォースで無理やり抑え込んでいたが、CrossStreamではダート部分で車輪が浮いてしまい、タイムが伸びなかった。そこで2年前に「実用的じゃない」として開発を中止していたアクティブサスペンションに再び手を付けることにした。2年前のものは勘で作った制御だったが、今回は現実にあるものを参考に作ることにした。
調べてみると、どうやら車体に取り付けられたたくさんのセンサで車高を一定に保っているようだ。電車や戦車なんかに搭載されてるらしい。
最近のアクティブサスペンション搭載車にはカメラや音波センサとかいうせこい物を使っているが、RigidChipsにはそんな高性能な関数はない…
え?_RANGE? Chip数増えるし、こういう用途にはあんまり使いたくない…
ということで別の方法を使う。
今回使うのはスカイフック理論。アクティブサスペンションの制御理論の基礎である。
速度系の精度はそこそこいいので、センサにはこれを利用する。乗り心地(?)も良くするために角速度を抑え込む制御も組み込む。
作っていて、「これはいける!」と思っていたのだが、高速域での性能テストをしたところ、サスペンションアームが振動してマトモに走れなくなることが判明。うまくいったと思ったんだがなぁ。。。
今は解決されているのだが、この問題解決のために1ヶ月を費やすことになる。
新システムその2へつづく