2016年6月22日水曜日

タミヤギヤードモータマウントの寸法

最近ブログのネタが無くてあまり更新がはかどらない。

回転するものを作りたくてギヤードモータを探してる。4.5kgf/cmくらいのトルクで手頃な電圧で動く奴。かつamazonとかモノタロウとかその辺りで1週間位で届く奴。
今のところはタミヤのギヤードモータが一番の候補。

寸法図
http://www.tamiya.com/japan/robocon/robo_parts/g_motor/g_motor_zumen.htm

スペック
http://www.tamiya.com/japan/robocon/robo_parts/g_motor/g_motor_speck.htm

モーターマウント(AO-8055)の寸法図
http://www.tamiya.com/japan/products/72101motor_tire/index.htm


基本的にギアヘッドの出力軸が有る面はすべてのバリエーションで互換性があり、大きなバリエーションとしてモーター違いの3種類、その中でギヤ比が違ういくつかの種類があり、合計で10種類くらい有るみたい。ギア比が変わるとギアヘッドの寸法が変わるので、後からトルクが必要になったとかでギア比を変更したい場合は注意。

取付面はすべてのバリエーションで互換性があるので、モーターマウントは1種類のみ。これはどこにも説明ページがなくて情報不足な感がある。一応上記リンクページの下の方に寸法図が書いてある。

ギヤードモーターのスペックは3種類の代表値?が書いてあるだけなので、トルクや回転数はギヤ比で換算する必要がある。

// タミヤのWebサイトのJavaScriptは軒並み死んでるので画像の拡大だとか、リンクになってるグラフは表示できない。

とりあえず380系の1:150が最有力候補になってる。これならモノタロウに在庫あるし。
工業用のギヤードモーターでもタミヤのと同じ価格帯のものはあるけど、トルクが低いor回転数が低いで、タミヤのものと同程度の性能になるとかなり値段が高くなる。今回は信頼性とか要らないのでホビー向けで十分だと思う。
小学生の頃にタミヤのカタログを見てて、ギヤードモーターは安価なギヤボックスの数倍の値段がして全然手が届かなかったけど、今更使うことになるなんて。
とりあえず図面をCADに入れてみて回す相手との組み合わせとか確認してみるつもり。


#追記:2016-07-04
AO-8023という型番のギヤードモータ、380系の150対1のタイプとモーターマウントを買ってみた。モーターマウントはアルミを加工したものだが、羽のように軽い。こんなのでちゃんと支えられるのかと心配になる程。一方ギヤードモータの方はそれなりに重量感が有る。7.2VのNiMHを繋げばすぐスピンアップするが、停止するには結構時間がかかる。一瞬接続しただけでも1周は回転してしまう。例えば直径5cmのタイヤをつけた場合、一瞬通電しただけでも15cmくらい進んでしまうので、あまり精度は当てに出来ない。
ギヤードモータの付属品としては取付用のビスとかホイールハブが付属している。ギヤの出力軸は6mmのDカットだが、ハブを使えばM4のボルトで出すことができる。ただしM4で出した場合は回転防止の工夫は無いので、ナットの締め込みで固定する必要がある。
今回は相手も6mmのシャフトだったので、カップリング(MOL-20C-6×6 カプリコン・ミニ クランピングタイプ 1個 鍋屋バイテック(NBK) )を使用した。僕が買った個体同士ではいい感じに固定できた。
ギヤードモータの配線はハンダ付け済みだったが、メーカーページの写真だと3633シリーズは配線が写ってないのでシリーズによるかも。ハンダ付け部分は片方はシュリンクチューブで保護されていたが、もう片方は剥き出しだった。配線の端はギボシ端子だが、両方でジェンダーが同じなので誤配線対策が必要だと思う。ギボシ端子は手持ちのエーモンのセットが使えたので、汎用的なモノだと思う。ロボコンとかで使う場合は、配線を黄色と緑で色分けして逆接続を防ぎ、回転方向はソフトウェアで処理する感じになると思う。
動作時はギヤがかなりうるさいので、いかにも「動いてますよ!」って感じはするが、ずーっと動かしてると嫌になると思う。

ギヤードモーターの選択基準はいろいろあって、最初にトルクと回転数、次に値段があると思う。場合によってはその間に重量も有るかもしれない。タミヤのギヤードモーターはそれらの点において素晴らしいというほどではないが、タミヤというブランド力は一考に値すると思う。ロボコンでコストダウンを優先して中国製のギヤードモーターを使ったけど、いざという時に壊れて在庫がないとかになると目も当てられない。しかしこのギヤードモーターはいろんな通販サイトで買うことができるし、それも不可能な時は模型店で取り寄せてもらうこともできるはず。入手性という意味では、かなり高得点だと思う。
あんまり性能とか重量とか制限がないときに「何か良いモーター無いかなー」という時はタミヤのギヤードモーターはかなり便利なカードになるはず。

2016年6月20日月曜日

DMMの3D造形覚書

DMMの出力でナイロンを造形した。半分失敗、半分成功、と言った感じだけど、いろいろちょっと書いておく。

可動部分。

内径42mmの円筒に外径40mmの筒を入れて、円筒の両端は閉じている、という形状。切削加工で作るのは結構面倒なはず。わざわざこんな形状作る必要もないと思うけど、作ることもできる。ただし粉末を除去するのが相当に大変。隙間が1mmくらいあるので、その隙間に薄いプラの板とかを押し込んで粉末を少しずつ削り取っていく。円筒の半分を削れればそっち側にグリグリ動かして反対側を剥がせる。内側の筒は回転するように作っているが、軸受けはベアリングを使用した。

ベアリング(圧入)について。

円筒の軸受けに外径8mm、内径6mmのフランジ付きベアリングを使用した。モデルは8mm、6mmちょうどで作成した。ベアリングは両端に計2個使うが、片側は良い感じに圧入できた。もう片方はスカスカで簡単に落ちてくる。そもそも造形の誤差があるのであんまり圧入とかは考えないほうが良いと思う。
今回は金属シールドのベアリングを使用したが、回転数とか回転抵抗が気にならないならゴムシールのベアリングを使ったほうが良いと思う。粉末を綺麗に除去できないとどんどん粉が出てきて気分的によろしくない。

細い溝を刻みたい。

厚さ0.4mm、幅6mmくらいの板を並べて固定したい部分があった。ということで幅0.7mm、深さ3mmの溝を刻んだ部品を上下に配置して挟むようにした。力を込めて押しこめば入るが、スカスカな感じではない。あとこの板は可動部の隙間に入り込む予定で、可動部の方も0.7mmの隙間を作ったが、こちらも固くてとても稼働するような状態ではなかった。

ネジ止めしたい。

部品を固定するのにネジ止めをしたかった。手持ちにM3のキャップボルトが大量にあるので、それを使えるようにしてみた。とりあえず3mm厚に2.5mmの下穴を開けて、こっちでタップ加工をした。簡単な固定程度なら問題なさそう。もうちょっと厚さを増やせばかなり強固に締め付けれるはず。
保険として幅5.6mmの六角形の穴を付けておいた。タップが使えなかった場合は3mmに広げてM3のナットを入れる予定だったが、この六角形の穴は結構いびつな形になっていた。もっともM3のナットを圧入できるという意味では良かったのかもしれないが。


今回の目的はちゃんと動くものを作ること、その過程で可動部が作れるかどうかを確認すること、だった。可動部が作れる事は確認できたが、ちゃんと(目的通りに)動くものを作るという目的は達成できなかった。
精度の目安として±0.15mm、長軸方向に±0.15% という数字が書いてあるが、体感的にはもっと悪い気がする。計算上は誤差最大でこんな感じになるのかなぁ って程度だけど、とにかく精度はあまり信用しない方がいいと思う。どうしても精度が必要な部分は金属の切削をどっかに頼むとか、いろいろな手段を用意するべき。もっとも精度以上に値段が跳ね上がりそうだけど。

全体的に精度の悪さが気になる結果となった。この辺りは数をこなせばどんな形に作れば狙い通りの機能を果たすかとかわかってくるのかな。今回を除いて大きく分けて2種類くらいのモノを作ったが、2個目とか3個目あたりで狙い通りの機能を実現できてる。今回ももう一回作れば狙い通りになりそうな気がする。あと1ヶ月もすれば値段が下がるみたいなので、そのあとでやってみようかな(7月中旬から値段が変わるみたいだけど、今の値段の設定が書いてないのでどれくらい変わるのかよくわからない)。
DMMである程度精度を求める部品を作る場合、値段は4倍を考えておけば十分足りると思う。それくらいの覚悟をして、2回目か3回目で狙い通りに作って、「思ったよりは安かったな」とか考えたほうが健康に良いと思う。もしくは精度とか関係ないような設計にして一発で目的のものを作るか。

2016年6月18日土曜日

SK11の虹色六角レンチ9本セット

1年ちょっと前に買ったSK11の虹色六角レンチセット、3mmのレンチだが、この間折ってしまった。ソコソコ硬いキャップボルトを緩めようとした時なので、使い方が悪かったのかなと思っていたけど、どうやらレンチ自体の不良っぽい。



ちょうど折れ曲がった部分でポキっと折れて、背中側?に錆びた跡のようなものが有る。たぶん六角レンチの製造過程で曲げた時に裂けたんだと思う。
とりあえず同じ製品を買い足すかな。違うサイズが折れてもニコイチできるし。さすがにまた折れたら違うメーカーを買うと思うけど。

2016年6月17日金曜日

DTMFのソフトウェアデコード

今更DTMFかよ、という気もするけど。



まず123A456B789C*0#DのDTMFを作る。それを読ませてみる。
とりあえず入力したWAVEと予め作った正弦波と余弦波の積を使った。まず正弦波と余弦波の積をそれぞれ計算し、それぞれの積をLPFに通し、その結果を2乗して加算した。
綺麗なDTMFだと結構ちゃんと分離できるっぽい。今回の場合は2500を閾値として、それ以上が一定期間続けばDTMFとして受け取る みたいな処理を行えば良いはず。ただマイク経由だったり無線経由だったりで音量が一定じゃない場合はつらいかも。

DTMFって最近だとデコードICとか入手するの面倒だと思うので、ソフトウェアデコーダを作る必要があると思うんだけど、どういうアルゴリズムで解析するのが良いのかね。

2016年6月12日日曜日

地磁気の偏差を計算する

国土地理院のWebページに地磁気の偏差(の近似値)を計算する式が書いてある。
http://vldb.gsi.go.jp/sokuchi/geomag/menu_04/approximate_expression.html

ということで試してみた。

緯度(北緯):
経度(東経):


一応正しそうな値にはなる。ただしサンプル地点で角度が数分ほど、磁力が50nTほど誤差がある。何に起因する誤差かはわからないけど、磁力成分だと3桁くらいの精度はあるし、磁気偏差もOFジャイロとか使った精密なナビゲーションに使うのでもなければ問題ないと思うので気にしないことにする。
正しい数字が必要な場合は国土地理院のWebページで計算すること。
http://vldb.gsi.go.jp/sokuchi/geomag/menu_04/index.html#keisan

計算に使用する値は5年毎に更新されるとか読んだことがあるけど、今のところ2010年の値が使用されているらしい。国土地理院のWebサイトに有る計算機でも2010年の値が使用されている。

計算に使用する値は6個の値で、偏角、伏角、全地磁気、水平地磁気、鉛直地磁気の5種類がある。計算式は基本的に似たようなものだが、それぞれで加算減算が違ったりするので注意すること。組込み機器で計算するなら、係数の正負を変えてすべて加算で処理できるようにしたほうが便利だと思う。そうすれば2次元配列で係数を保持し、forの中で加算を書けば5種類の計算を1個のループで行えるはず。

DMMの3Dプリント

DMMの3D造形で治具を作ってもらった。素材はナイロン、仕上げは青染という感じ。
さすがに5回も出してると慣れてくるけど、相変わらずDMMのデータアップロードフォームは成功率が低い。ヘタすると成功率1ケタ%くらいになる。ものすごい安定した回線が必要だとおもう。MVNOじゃ昼間はまず無理。




さすがに幅0.7mm深さ11mmだとサポート材が抜けてないところがある。
真ん中辺りに左右に3個連なってる四角は中空の構造で、その部分のサポート材は抜けてる。が、中空を支える壁の部分が抜けていない。
サポート材ってどうやって抜いてるんだろうね。手作業だとこういうふうには残らないと思うので、流体で吹き飛ばしてるだけなのかな?
以前に染無しで頼んだ時は、サポート材はかなり硬く締まっていたけど、それでも棒で引っ掻けば粉になって落ちてきた。でも今回のはかなりしぶとい。染めたことで液で固まったのかも。
それと染色は液にドブ漬けしてるだけのようで、表面にちょっと薄い膜ができてる程度。なのでカッターで引っ掻いたりするとすぐ白くなる。これはカッターのジグなので、あっという間に白くなりそう。表面がひっかかれたりしやすいモノは白(染無し)のほうが良いかも。

DMMの資料によると0.5mm開ければ可動部を作れるって書いてあるけど、サポート材をどうやって抜くつもりなんだろう。厚さ2mm程度のギアくらいなら抜けるのかな?どれくらいの大きさが限界なんだろう。さすがにタービンエンジンみたいな構造は作れないだろうなぁ。ああいう形状の部品を作りたいけど、ステーターはモナカにしないとダメだろうなぁ。

2016年6月10日金曜日

FSXのメーターパネル




とりあえず、練習も兼ねてスロットルとかフラップとかの位置を表示するアプリを作ってみました。まぁあんまり意味は無いですが。

元がC++向けのためか、Managedの方もかなり冗長になっています。結構ソースコード書くのが面倒で、かと言ってコピペするとthrow投げられたりしてデバッグに一苦労とか、結局全部手打ちしたほうが確実というおかしなことに(オートコンプリートがあるので特に)。

FSXのSim Variablesを見るとSettable trueはあまり多くなく、基本的な操作しか行えないようです。ただしエンジン周りは例外で、エンジン/燃料系はかなり細やかな設定ができるようです。たぶん航空機関士席を作ることも可能でしょう。まぁFSX付属の機体にFEが必要な機体って無いと思うんですが。。。

スポイラーARMDにしたければ、スポイラーを30%くらいにするとARMDになるので、スポイラーの操作は可能です。スロットルも前述のように作ることが可能です。スラストリバースはスラストを-25%あたりにすると可能で、これはハードウェア側ではVRを2個使って1セットのスラスト操作を行い、PC側、あるいはマイコン側で-25%から100%の範囲を動くようにすれば可能だと思います。スラストが0%以外の場所ではリバースに入らないようにするのが面倒ですが、これも機械可動部で作ったり、ソレノイドでロックしたり、いろいろやりようは有ると思います。1つ問題なのはフラップの扱いです。MSDNによるとFlaps handle percentのSettableはNoになっており、ハンドル位置を指定することができません。TRAILING EDGE/LEADING EDGEのPercent/AngleはSettable Yesですが、Handle Posに対するLead/Trailのミキシングは各機により異なるため、クライアント側で処理するのは結構面倒な気がします。予めHandleとPercentのテーブルを作っておけばなんとかなるかもしれませんが、どちらにしろ面倒です。

当初の目的は3軸の加速度を取り出すことでしたが、ここまで来るといろいろ操作できるようにしたくなってきました。オートパイロットのノブとか市販品があるけど、あれってどうやってるんだろう。SimConnect以外のSDKを使うとできるのかな?


追記:2016/06/15
存在しないパラメータを読んだ時の挙動について。
スポイラーがついてない機体でスポイラーを読むと-2147483648が読み出される。uint_32とすると0x80000000になる。SIMCONNECT_DATATYPE.FLOAT64を指定しているがこの値が来ている。float32だとこの精度はないはずなので別の値が来るのかもしれないが、自分の環境では64bitを使ってるので不明。必要なら各自の環境で確認すること。

追記:2016/08/02
オートパイロット等の操作を行う方法について。
MapClientEventToSimEventでイベントを追加し、TransmitClientEventによってイベントを送信することができる。イベントを追加する際はイベント名の文字列を渡すが、例えばAP_ALT_VAR_INCを送信した場合はオートパイロットの高度をインクリメントすることができる。AUTOPILOT_ONを送信すればオートパイロットがONになるし、AUTOPILOT_OFFを送信すればオートパイロットをオフにすることができる。
オートパイロットパネルを作りたい場合、ON/OFFスイッチはモーメンタリスイッチでイベントを送信し、AP状態を獲得してLED等に表示すればいい。高度設定ノブなどを作りたい場合はロータリーエンコーダのInc/Decに応じてInc/Decイベントを送信し、現在の設定値を7セグLEDやLCDに表示すればいい、ということになるようだ。
ノブ等はInc/Decしかできないから、テンキーで数字を入力するといった事は難しいかもしれない。ただInc1個での変化値はイベント前後でわかるから、現在値と入力値の差からInc1個分で割った商の回数だけイベントを送る、といったことで可能かもしれない。

ミラージュごっこ




ナイト・オブ・ザ・スカイという映画のワンシーンの再現、をしたつもりになってるけど、全然ダメだね。難しい。
作中ではA340という4発のエアバス機の下にミラージュ2000が入ってレーダーから隠れるというシーンが有る。FSXのAI機であるB738の下にF/A-18で入ろうと思ったが、かなり難しい。上の画像程度の距離感が限界だった。これ以上近づくと画面からB738が消えてしまい場所がわからない。かと言って視点を上にすると水平がわからないので異常な上昇・降下をしてしまう。もしかしたらTrackIRとかOculusとか使えば入れるかもしれないが。
上の画像の距離感だと空中給油にももうちょっと足りない。空中給油だとプローブを見れば良いのかもしれないが、F-22みたいな背中の方にレセプタクルがあるとやっぱり機体を見る必要があるんだろうな。

自分から遠ざかってる方向に巡航している機体はM0.7-0.8くらいあるので、A/Bを使用せずに追いかけようとするととてつもなく時間がかかる。速度差がM0.2くらいで60海里の距離を詰めようとすると30分くらいかかる。M1.2で速度差が0.5くらいあると12分くらい。若干短くなる。

実際のフライトでは別の機体の後ろに入ると様々な気流が発生するから、更に操縦するのが難しくなるんだろうな。

2016年6月9日木曜日

SimConnectで操作

SimConnectの基本的な使い方は例のチュートリアルを見てもらうとして。

とりあえずギアハンドルを例に説明。

MSDNによるとギアハンドルはBoolだが、SIMCONNECT_DATATYPEにはBoolっぽいのは見当たらないのでINT32を使用する。たぶん0がfalseで!0(実質的に1)がtrueだとおもう。C++なら01で分岐できるので問題なかったんだろう。C#だと01をboolとして判定できないので面倒だが。

まずはint32を含む構造体を作る。
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
struct sInt32
{
    public Int32 value;
}

次にFSXにこの構造体をギアハンドルに関連付ける。
simconnect.AddToDataDefinition(DATADEFINEID.GEAR_HANDLE_POSITION, "gear handle position", null,
    SIMCONNECT_DATATYPE.INT32, 0, SimConnect.SIMCONNECT_UNUSED);
simconnect.RegisterDataDefineStruct<sInt32>(DATADEFINEID.GEAR_HANDLE_POSITION);
simconnect.RequestDataOnSimObject(REQUESTS.GEAR_HANDLE_POSITION, DATADEFINEID.GEAR_HANDLE_POSITION,
    SimConnect.SIMCONNECT_OBJECT_ID_USER, SIMCONNECT_PERIOD.SECOND, SIMCONNECT_DATA_REQUEST_FLAG.DEFAULT, 0, 0, 0);

NameはGEAR HANDLE POSITIONを、Unitsにはnullを指定する。nullでも特に問題なく取れてるので、FSX側でうまく処理してくれるんだと思う。これは他のfeetとかを指定する部分でもnullで動作する。単位を明示してないのでちょっと不安になるけど。
変数の型(DATATYPE)にはINT32を指定する。
PERIODにはSECONDを指定した。これで1秒毎にギアハンドルの位置を取得することができる。ただMax1secの遅れが発生するので、リアルタイムに取りたい場合はFRAMEにする。
DATADEFINEIDとかREQUESTSは、こっち側でどういうデータかを判断するのに使うだけなので、オレオレで勝手に列挙型を作ってしまって問題ないと思う。DATADEFINEIDとREQUESTSは一応分けてるけど、たぶん同じ列挙型を与えて問題ないと思う。

FSXからは
private 
void Simconnect_OnRecvSimobjectData(SimConnect sender, SIMCONNECT_RECV_SIMOBJECT_DATA data)
にイベントが来るので、
(REQUESTS)data.dwRequestID
のようにキャストしてswitchとかに渡す。caseでGEAR_HANDLE_POSITIONだった場合は
sInt32 s = (sInt32)data.dwData[0];
のように構造体にキャストする。あとはsのvalueを読めば、ハンドルの位置を獲得できる。0の場合は格納、1の場合は展開になるらしい。


次にC#から操作する場合。とても簡単で、
sInt32 s = new sInt32();
s.value = 1;
simconnect.SetDataOnSimObject(DATADEFINEID.GEAR_HANDLE_POSITION, SimConnect.SIMCONNECT_OBJECT_ID_USER, 
    SIMCONNECT_DATA_SET_FLAG.DEFAULT, s);
のように渡すだけでギアハンドルを展開に移すことができる。s.valueを0にして渡せば収納できる。

注意点として、例のチュートリアルPart4ではギアのイベントを得るが、上記の方法でギアの位置を動かした場合はイベントが発生しない。同じプログラムを2個起動し、片方で操作した場合も他方にはイベントが来ないので、ギアの位置を常に得たい場合はイベントではなくRequestで常に受け取っておいたほうが良いと思う。


それと、C# Formのボタンを操作するとFormがアクティブになり、FSXの音声出力などが止まってしまう。それを回避するにはFormをアクティブにしないようにする。そのためにはFormの適当な場所に以下の処理を追加する。
private const int WS_EX_NOACTIVATE = 0x8000000;
protected override CreateParams CreateParams
{
    get
    {
        CreateParams p = base.CreateParams;
        if (!DesignMode) { p.ExStyle |= (WS_EX_NOACTIVATE); }
        return p;
    }
}
この処理と、常に手前に表示するような属性を合わせれば、FSXの手前に常に表示したりできる。


ギアの上げ下げは今回はFormのButtonイベントに実装したが、必ずしもFormを使う必要はなく、他のタイミングで発生させても問題ないはず。例えばCOMポートから特定の文字列を受信したらギアを展開する という処理をつければ、マイコンのスイッチを押したらギアを展開することができる。
同じようにスロットルハンドルをマイコンでPCに渡せば細かい推力調整ができるし、FSXからスロットル位置を受け取ってモーターでスティックに反映させればオートスロットルにあわせてスティックを動かすこともできる。

FSX SimConnect SDK リンク集

SimConnectを自分で叩くときに参考になるかもしれないリンク集。

In the Pipe, Five By Five: A Ten-Thousand Foot View of SimConnect - Part 1

https://web.archive.org/web/20070301231249/http://www.notasenator.com/blog/2006/12/ten-thousand-foot-view-of-simconnect.html
C#でSimConnectを使う場合のチュートリアル。64bitOSや最近のVisual Studioを使ってる場合の変更点は前々回のエントリを参照。Part4まであり、最後までやるとギアUp/Downイベントを受け取ることができる。そのプロジェクトを雛形にすれば楽にいろいろ作れる。

SimConnect

https://msdn.microsoft.com/en-us/library/cc526983.aspx
SimConnect全般の概要が書いてある。SimConnectの設定ファイルだとか、メソッドの一覧だとか。もっとも、関数名こそManagedと互換だけど、引数については若干取り方が違うので注意。Managedの方はHandleが省略されているので、第1引数を飛ばせば大抵は同じ意味になる。それとC++の方は既定値が設定されているが、Managedの方はすべての引数を与える必要がある。既定値はこのページの関数の説明に書いてある値を使用すればよろしい。

Simulation Variables

https://msdn.microsoft.com/en-us/library/cc526981.aspx
MSDNのSimConnectに関するページ。Aircraft Dataの表には要素を指定する文字列が書かれている。Units of Measurementには単位を指定する文字列が書かれている。かなり長いページなので読むのは大変。でも一覧になってるので全部読めば何が取れるのかわかる(はず)。

Simulation Variables

http://www.prepar3d.com/SDKv3/LearningCenter/utilities/variables/simulation_variables.html
上と同じタイトルだけど別ページ。こちらは「MS FSXの直系の子孫」とも囁かれるLM社のPREPAR3Dのデベロッパ向けページ。内容は上記MSDNのAircraft Dataだけを書いてある。文字列検索するときに便利。

Units Of Measurement

http://www.prepar3d.com/SDKv3/LearningCenter/utilities/variables/units_of_measurement.html
こちらもLMのP3Dのページ。上記MSDNのページのUnits of Measurementだけを書いてある。同じく文字列検索するときに便利。2ページに分けてあってページの長さが短いので読みやすい(気休め程度に)。あとこちらはDistanceとかAngleとかSpeedとか、単位の種類ごとに目次があるので、どの単位が欲しいかで簡単に探せる。

追記:2016/08/02

Event IDs

イベントの一覧。P3Dのページ。MSDNにも同じような表があるが、P3Dのほうがページが軽い気がする。

追記ここまで

他に海外のフォーラムが結構参考になります。

MS FSXのAcceleration

MS FSXのAccというと日本では「栄光の翼」という名前の拡張パッケージがあるが、そっちではなく。

やっとFSXのAccが理解できた気がするのでちょっとまとめ。



赤がX、緑がY、青がZとなっている。上下は1m/s / divくらいのはず。横軸は書いてないですが、1秒で10ピクセルくらいです。
飛行内容としては、滑走路の端にウルトラライトを出して、滑走路上でちょっと浮かぶだけ。そのためX軸(横方向)にはほとんど加速度が発生していません。
青は機体前後軸で、加速時に下向き、減速時に上向きに表示されています。グラフの左側、滑走開始時は下向きの山があり、グラフの右側、ブレーキを掛けた時は急激に加速度が大きくなり、減速に伴い加速度も減っていきます。そして完全に停止すると前後方向は0になります。
緑は機体上下軸で、おそらく下方向が下に引っ張られる向きです。離陸直後に若干加速度が有り、慌てて気体を水平に戻して上向きの加速度が発生しているんだと思います。ただそう考えると着陸時に下向きの強烈な加速度が発生しているのが腑に落ちませんが。
さて、上のグラフの右側、着陸後の加速度を見てみると、すべての軸でほぼ0m/sです。僕らが一般的に計測器で計測した加速度は静止時でほぼ9.8m/sですから、何らかのオフセットが有るんだと思います。と思い込んでいてハマりました。FSXから出力される加速度は、「実際の」加速度を表していて、重力加速度は含んでいないようです。もしかしたら重力加速度を含んだ値を取れるのかもしれませんが、3種類のAccでは獲得できませんでした。

本当にこのグラフが正しいのかは不明ですが、飛行時の動きと考えるとそんなに大きく外しているわけではないようです。

あとはHexapodを作れば、ちゃんと動くフライトシミュが作れます。youtubeだと結構な人数がHexapodに載せてるけど、国内だとどうなんだろう。国内勢は本物のコックピットを再現することで頭がいっぱいな印象ですが、誰かやってたりするのかな。

Hexapodだと高周波の振動は作れますが、低周波の動きは不得手です。ドライビングシミュレータだと3本のアクチュエータで水平のXYと上下軸の回転を作っているものも有るようです。そのテーブルの上にHexapodを載せて、低周波と高周波を振り分けて車の動きを再現しているようです。
ディスカバリーだったかナショジオだったかで、確かスペースシャトルのフライトシミュを紹介していた時に、巨大な縦横のステージを作り、そこで上下左右に動かしているのを見たことが有ります。航空機の場合は前後はあまり重要ではなく、コックピットを前後に傾けて上下に動かせば擬似的に前後の加速度も再現できるので、そういう形になったんだと思います。
でもまぁ個人で作ろうと思えばHexapod単体使用あたりが良いと重いますが。と言っても人間が乗れるHexapodって相当な規模だろうなぁ。。

2016年6月8日水曜日

SimConnectを.netで

.NetでSimConnectを使うチュートリアルを見つけたので試してみた。

元のブログはすでに消えているのでアーカイブで
https://web.archive.org/web/20070301231249/http://www.notasenator.com/blog/2006/12/ten-thousand-foot-view-of-simconnect.html

環境はWin10 x64, FSX Acc, VS Express 2015, C#という感じ。
基本的にブログに書いてあるとおりにすればいいが、一部注意する点が有る。と言っても大したことではないが、SimConnect.dllは32bit動作なので、64bit環境でAny CPUにすると動作しない。それと.NetFWを2にする必要がある。

1) 32bitアプリにする

VSでAny CPUのプルダウンメニューをクリック、構成マネージャーを表示し、"プロジェクトのコンテキスト (ビルドまたは配置する(以下略"のプラットフォームにある"Any CPU"のプルダウンメニューをクリック、新規作成を選択する。新しいプラットフォームでx86を選び、OKをクリック。すると先のAny CPUがx86に変わってるはずなので、構成マネージャーを閉じる。するとVisual Studioのメニューに表示されてるAny CPUもx86に変わる。これで32bit版アプリになった。

2) .Net FWを2.0にする

ブログ通りに作るとソリューションエクスプローラーに"SimConnect_Tutorial"とボールド体で書いてあるはずなので、それを右クリックしプロパティを選択、"対象のフレームワーク"を".NET Framework 2.0"に変更する。ダイアログが出てくるのでそのまま進める。おそらくエラーが4個出てくるはずなので、それぞれusingを丸ごとコメントアウトする。


上記の変更でPart 1を動かすことができる。あとはFSXが起動した状態でデバッグを開始すればFSXのコンソールにOpenと表示される。フォームを閉じればDisconnectedと表示される。

とりあえずPart 4までやって、ギアUp/Downイベントが発生することを確認した。Part 4までしか書かれていないので、これ以上は自分で探していくことになるが、少なくともSDKを使用できることはわかった。あとは加速度とか角速度を50Hzくらいで獲得できれば楽しいかな。


追記
機体の位置を移動するのはなんとなくできるようになった。
http://www.fsdeveloper.com/forum/threads/c-i-can-read-can-i-write.3196/#post-19769
このコードでは機体の位置を高度5000ft(≒1.5km)に移動するというもの。
別のサンプルと合わせて考えると、AddToDataDefinitionの第1引数で構造体を一意に選択する値を、第2引数に変数の意味を、第3引数に変数の単位を、第4引数に型を与えるという処理を、構造体に含まれる変数個分繰り返し、設定したい時にはSetDataOnSimObjectで渡せばいいんだと思う。
まぁ僕がやりたいのは設定ではなく取得なのだが。とりあえず次は似た引数を渡して、構造体を渡さない関数を探せば良いのかな。
英語圏からすると「何を今更」って事をやってるんだろうけど、国内のFSX SimConnectで探して出てくるのはアドオン関係がほとんどなので、自分でFSXを叩くのは楽しい。


追記2
値を獲得する
http://www.fsdeveloper.com/forum/threads/requestdataonsimobject-problem.14892/
上と同じフォーラムだね。感謝。

SimConnectの接続時にOnRecvSimobjectDataイベントを追加しておく。欲しいデータはRequestDataOnSimObjectで設定する。これはAddToDataDefinition、RegisterDataDefineStructで設定した構造体(の識別ID)を引数に与える。第4引数にSIMCONNECT_PERIOD列挙型を与えるが、SECONDを指定すると1秒毎にデータが来る。SIM_FRAMEを指定すれば毎フレームにデータが来る。構造体の説明はMSDNにある

とりあえず、Nameを"VELOCITY BODY [X-Z]"の3個にUnitsを"Knots"にしてやると速度が取れた。Shift Zで表示される速度とおおよそ一致するので、正常に取れてるんだと思う。
ただこのUnitsは適切に設定すれば様々な単位を扱える反面、不適切な単位を与えると意味不明な値が帰ってくる。例えばROTATION VELOCITYの単位はFeet per secondとなっており、おそらくは回転数の変数だが、単位は速度になっている。
Accの単位はFeet per sec^2で一見正しいが、帰ってくる値は0.08ft/sec^2(0.025m/s^2)程度となり、明らかにおかしい。
まずはFSXが認識できるUnitsの文字列一覧みたいなのを探す必要がありそう。
でも一分のデータはちゃんと取れてるから、あとは加速度とか角速度を正確に取り出す方法を調べるだけ。だいぶゴールに近づいてきた気がする。まだ見えないけど。

MS FSXのSim Connect

MS FSXのSDK(API)でSimConnectというのが有るらしい。Microsoftに変数の説明とかが書いてあるが、例えばエンジンの推力を設定したり、機体に加わる加速度3軸を受け取ったりできるらしい。ということで試しにSDKを入れてみたのだが、どうにも調子悪い。というか動かない。

SimConnectの設定ファイルを配置してFSXを起動するとFSXのコンソールが立ち上がり、設定したアドレス・ポートが開かれる。Sampleに入っているEXEを起動するとFSXのコンソールに接続したEXEの名前とかが表示されるが、EXE自体は何のメッセージも出さずにすぐに終了してしまう。Webの情報だと"Connected to Flight Simulator!"みたいなメッセージが出てくるみたいなんだけど、何も無し。
cmdで実行するとすぐにプログラムが終了している感じだが、タスクマネージャではバックグラウンドでそれっぽいプロセスが走っており、そのプロセスを終了させるとFSXのコンソールで切断されたという表示が出る。

少なくともFSXへの接続自体は行われており、プロセスを終了した時にDisconnectが出るということは切断も何らかの形で行われているはず。
ソースコードを見るとmainでは関数を1個呼んでreturn0している。その関数の中では最初に接続を試み、成功すればprintfでメッセージを出し、失敗した場合はmainに戻る。
成功していれば文字列が出てくるはずだし、失敗すればそもそもタスクは残らないはず。
デバッグメッセージを追加しようと思ってソースコードをいじってみたけど、リンクエラーでビルドできない。

FSXのSDKが使えればかなり楽しいと思うんだけど。どうなることやら。

2016年6月7日火曜日

壊れたACスピコン

ACのモーター回転数を調整するコントローラを見せられて「壊れた、直せ」と言われた。もう古いしわざわざ壊れた箇所を探して部品1個を通販で買うのも面倒なので、「どうせすぐ壊れるんだから新しいの買えばいいよ」と言って5000円の新品を買わせた。ということでコイツをゴミ箱に投げ込む口実ができたので、あとのことは気にせず分解して調べてみる。

仕様としては、100V15Aまでで、ボリュームである程度の調整ができる。それと切り替えスイッチが有り、「高速」と「可変」の表示がされている。



ざっと見た感じの回路図はこんな感じ。
1個目のスイッチはメインの電源で、調べてみるとヒューズを内蔵しているようだ。触った感じも通常のスイッチとは違い、なんとなくイメージする「ヒューズらしさ」がある。
2個目のスイッチはロッカースイッチで、本来はONにするとランプが点灯するんであろうが、このコントローラでは電源ONで状態にかかわらずランプが点灯する使い方となっている。スイッチがONの場合は制御対象のACが短絡し、制御回路をブリッジしている。
OFFにすると短絡が解除され、制御回路を通して通電することになる。制御回路はトライアックではなくサイリスタを使用していた。おそらく半波しか使用しないので、Maxに設定しても通常の50%の速度にしかならないんじゃないかな。
ボリュームは500Ω、ボリュームの上の抵抗は6.7kみたいな色のデカい金皮っぽいけど、たぶん6.8kなんだろう。下は半固定抵抗器で抵抗値は未測定。
サイリスタのMaximum Rating, Peak Forward Gate Voltageが10Vなので、抵抗で分圧しつつ、Peak Reverse Gate Voltage -5Vにならないように2個のダイオードで逆流を防いでるんだと思う。サイリスタのゲートは交流の半波整流を分圧してるので、位相は0-90の範囲しかONできない気がする。

アナログ的な回路はほとんど触ったことがないのでイマイチ動作が理解できないが、意外と部品としては簡単っぽい気がする。
サイリスタはヒートシンクの固定とかがあるのでPCBが作ってあるが、ランドは3個しかなく、非常に簡単な作りになっている




分解した時にSW1とSW2の1を接続するジャンパが切れていたので、これが原因かと思って配線を通したけど治らなかった。破裂したとか焦げてるような部品も見当たらないので、何が原因なのかイマイチ分からない。可変抵抗を回すと、VR2側の端子がオープンになるので、AC100Vに近い電圧が入力され、サイリスタが死亡、みたいな流れはありそうな気がしないでもない。サイリスタ自体は秋月で150円で売ってるが、わざわざ送料800円かけて買うのもねぇ。。。


ま、機会が来るまで部屋の片隅で眠っていてもらおう。

2016年6月6日月曜日

Manfrotto 322RC2を買った

Manfrotto 322RC2という雲台を買ってみた。
amazonでも売ってるが、発送予定が長そうだったので今回はヨドバシの通販で買った。ヨドバシはContourを買った時にも使ったけど、相変わらず早い。コンビニ支払いだったけど、支払った数時間後には発送され、翌日には届いた。amazonだと間1日必要だが、ヨドバシは同じ陸地に在庫があるのでつよい。もっとも、一緒に買ったネジ変換は東京から発送されたので間1日必要だったけど。

さて、この雲台だが、商品画像を見るとわかるように、ピストルグリップが付いている。このグリップを握りこむと3軸のロックが解除されてフリーに動かせ、グリップを離せばその場所でロックされる、というものだ。最近だとマルイのM40のPVに使われてた気がする。海外だとAR-15を載せてたりするけど、いちおう撮影用の機材。

雲台のボールジョイントにグリップが付き、シューマウントはグリップにネジ止めする形になっている。ネジ止めはいくつかの場所に可能で、向きの違いも合わせれば6種類くらいの形態になると思う。グリップを水平にして、右出しと左出し、それからグリップを垂直にした状態で、ハンドルが手前になるか奥になるかを選ぶことができる。ノーマルではグリップは右手で操作するが、ネジを付け替えることによって左手で操作することもできる。左手でグリップを操作すれば、右手でカメラを操作できるので、移動と停止を繰り返すような目標を撮るには便利だと思う。

この雲台は3軸をほぼ無制限に回すことができるが、ヨーとロールはボールジョイントで稼働するのに対し、ピッチは別の軸で稼働する。なのでヨー・ロールとピッチの操作感が若干違う。ピッチが若干渋い感じ。使ってると滑るようになる可能性はあるが。

一応グリップ部分のダイヤルでフリクションを調整することは可能だが、一番軽い状態から中間地点までで事足りると思う。グリップの握り具合でも若干フリクションの調整が可能だが、これはあまりレンジは広くない。フリクションを強くした場合、滑るようには動かず、ガクッガクッと動くので、フリクションの調整はあまり使わないだろう。

あまり細かい向きの調整はできないが、それでも10ミリradくらいの調整は可能。ただしかなりゆっくりとした操作になるので、素早い動きをしながらの位置決めはかなりの慣れが必要だと思う。

クイックシューはおそらくManfrottoの標準的なものだと思うが、Manfrotto製品は買ったことがないのでよくわからない。クイックシューを固定するレバーと、レバーを固定するためのロック機構が有り、ロック中はレバーを解除することができない。ロックを解除すればレバーは自由に動くが、レバーを開放中にロックを有効にすると、レバーを閉じることはできるが、開くのにはロックを解除する必要がある。レバーに何かを引っ掛けてカメラなどを落とすのが怖い場合は、クイックシューを外したらすぐロックを有効にするクセを付けておくといいだろう。
クイックシューを外すとレバーは開放状態でロックされ、クイックシューを乗せるとロックピンが押されてレバーも閉じる。ロック機構に慣れるまでは手間取るが、慣れてしまえば着脱は非常に簡単。鳥撮り等でいきなり頭上に鳥が飛んできた場合でもすぐにカメラを外して撮ることができる。

僕の機材にはPeakDesignのCaptureもあり、322RC2との互換性も有るはずだが、あいにくとアダプタ部品を紛失しており確認はしていない。

この雲台自体の剛性は素晴らしいが、カメラを載せた状態だと三脚の剛性が支配的で、ヤワな三脚だとグラグラと揺れる。現在は3000円ほどで買ったSLIKのアルミ製を使用しているが、足を全開まで伸ばすとものすごく揺れる。もっとも、この三脚の耐荷重は1.5kgで、カメラと雲台を合わせると2.5kgになるから、完全に性能外だが。
あぐらで地面に座り、足を短くした三脚を足の間に入れればかなりグラつきは消えるが、それでも三脚に載ってる樹脂の雲台が結構歪む。しっかりと固定してブレを無くしたいならちゃんとした三脚を使うべきだろう。逆に全体の歪みで構図の微調整をしたいならヤワな三脚でも問題ない。

雲台自体は自由に動くが、人間の体の可動限界があるので、撮影範囲は左右40度程度までと考えたほうが良いだろう。三脚を伸ばして立てばもう少し広い範囲に動かせるし、自分も動けば360度の範囲を撮影することができるし、上下の可動域もかなり広く取れる。座った状態では若干左右が狭くなるが、一番問題無のは上下がほとんど動かせない点。これはカメラと雲台の固定方法にもよるが、長焦点距離のレンズではあまり可動範囲は期待しない方がいい。

雲台の固定穴は3/8で、シューは1/4となっている。日本でよく使われているのは1/4なので、一緒に変換ネジも買っておいたほうが良いだろう。

例に漏れず「慣れれば便利」という道具だが、この雲台を装着して不利な点というのはあまり無いだろう。

2016年6月5日日曜日

Foretrex401のETE/ETA

Foretrex401でトラックの誘導を使った場合、ETE/ETAで到着時間を表示することができる。"次のウェイポイント"と"目的地"、"到着までの所要時間"と"到着する時刻"で4種類の値を表示できる。この計算にはどうやら"現在の速度"は使用されず、"ナビゲーション中の平均速度"かそれに近い値を使用しているらしい。例えば駅から徒歩30分の場所へ誘導したい場合、電車の中でナビゲーションを開始してしまうと所要時間が1分とか表示されてしまう。これはおそらく電車の速度が計算に使用されているためと思われる。電車で移動してからFtrx401で目的地までナビゲーションする場合でも、駅に降りてからナビゲーションを始めたほうが良いだろう。

2016年6月2日木曜日

MS FSX 栄光の翼で起動時に落ちる

最近グラボをGT520からGTX950に交換して3Dが快適になったのでMS FSXをよく遊んでる。ただかなり頻繁にソフトがクラッシュする、というかそもそも起動ができない。
症状は、起動しようとしてフライトをクリックしデータを読み込み始めるところで落ちる。ミッションもフリーも関係なく、シーナリや機体も関係なさそう。グラフィックレベルや解像度を変えても変化なし。
とりあえず効果がありそうな方法としては、一旦栄光の翼(Microsoft Flight Simulator X: Acceleration)をアンインストールし、再び栄光の翼をディスクから再インストールする(この際ライセンスキーの入力を求められる)。
フルスクリーンで終了し、次のフライトでフルスクリーンの表示になると再びクラッシュし、また再インストールが必要。フライト中にフルスクリーンに切り替えるのは問題ないが、フルスクリーンで終了すると次回に確実にクラッシュするので、基本的にウインドウモード専用で遊んでいる。



いちおうグラフィックをちょっと高め(最高より少し低いくらい)にしても60fps近く出るし、結構快適に遊べている。
実はi7 4790Kも同時に買ったのだけど、こっちは初期不良で返金サポートとなり、i5に戻して動かしている。AI機はほとんど飛ばしていないので、i5の3.2GHzでもそんなに問題はない。


せっかくグラボをちょっと新し目のやつにしたので、何か3Dゲーで面白そうなの無いかな~と探しているけど、オフライン前提の3Dってあんまり見かけない気がする。
サービス開始が10年以上前のオンラインゲーを昔やっていて、それを久しぶりにプレイしてるんだけど、さすがに古いゲームだけあってグラフィック要求はそんなに高くない。
FPSをやろうかとも思ったりするけど、僕が面白そうだと思ったゲームは基本的に箱○のほうで買っているので、今更PC版買ってもなぁ、という気がする。

しばらくはFSXを遊びながら、GTXの有効活用を探していこうと思う。
動画編集ソフトはいちおうGPUを使用できるが、動画はあんまり撮らないし、Lrも6からはGPUを使用できるが、僕のPCに入ってるのは5だし、なんとも中途半端な現状。そもそも今回のCPUとGPUのアップデートはLrの高速化が目的で、GPUはそのついででしか無かったわけだが。。

Calcsのアップデート

JSOrbitの近くにひっそりと置いてある、Webブラウザ上で角度の単位を変換できるcalcsですが、ちょっと、アップデートしました。

内容はURLパラメータで読み込み時に角度を渡せるようになったことです(だけです)。

http://www13.plala.or.jp/rian/jsOrbit/calcs/angle.html?rad=3.14
のような感じで、「角度の単位」=「値」として渡すことができます。角度の単位は"deg","degree","degrees","rad","radian","radians","degms","dms","hourms","hms","rev"に対応していて、大文字と小文字は区別されません。角度の単位は文字列として受け取り、テキストボックスにそのまま突っ込んで変換しています。
何に使うんだよ、という機能ですが、例えばChromeの検索エンジンにキーワードを"deg="、URLに"http://www13.plala.or.jp/rian/jsOrbit/calcs/angle.html?deg=%s"のような感じで設定すると、アドレスバーに"deg="と入力するとcalcsのアドレスを簡単に入力できます。HourMSをDegに変換したいとか、ちょっとした値の確認には若干便利だと思います。

それからcalcsで入力する値ですが、基本的にはJavaScriptのNumberメソッドを使用しています。ただしDegMSとHourMSは「数字が連続している部分」をNumberに渡し、「数字以外が連続している部分」を区切り文字としています。なので[89° 15′ 50.7923″]のような文字列+空白で句切られている値も入力することができます。文字列の最初の文字が数字でない場合は、最初のフィールド(DMSならDeg、HMSならHour)が0として認識されます。
もう1つ重要な点として、DegMSとHourMSの最初の文字は必ず数字である必要があります。+や-の記号も許可されません。