2018年7月26日木曜日

RTK-GPS:u-blox 6 で raw データを出力させる方法

 C94-M8P で基地局を作ろうと思って調べていたら、ひょんなことから発見。一筋縄ではいかなかったが、取り合えずやり方がわかったのでメモ。

 条件は厳しい。

対象:
 hardware:u-blox 6
  farmware:Ver 7.03(45969)

 使ったのはアンテナ一体型モジュールで、PC とは USB 接続
 買ったのは 2016/01、Amazon から これ。現在は品切れだけど、型名で検索すると google 様が海外の別な店を勧めてくる。ただし、同じように使えるかは不明(2018/08/01 現在)

やり方:
 ・u-blox 6 を PC に接続(電源 ON)、u-center 起動、u-blox 6 と connect
 ・F9 を押して、Message View を開く
 ・Message View の左の window を一番下までスクロールして CUSTOM を開く
 ・右の Window に以下をコピペして Send をクリック

b5 62 09 01 10 00 c8 16 00 00 00 00 00 00 97 69 21 00 00 00 02 10 2b 22

 ・右の Window に以下をコピペして Send をクリック

b5 62 09 01 10 00 0c 19 00 00 00 00 00 00 83 69 21 00 00 00 02 11 5f f0

  [パラメータはこちらから]

 ・Ctrl+F9 を押して、Configure View を開く
 ・左の Window で MSG を選択
 ・右の Window で[02-10 RXM-RAW],[02-11 RXM-SFRB]で出力を選択

(ここまで書いて翌日試したら動かなかった ><  で、さらに調べて以下を発見)
 ・Configure View の左の Window で PRT を開く
 ・右の Window で下の設定をして send をクリック(出力速度が 9600bps だと raw データを流しきれず、コントローラーが勝手に間引いてしまうらしい。今回使ったのは USB 接続なので、UART1 を disable した。ちなみにこの設定だけは不揮発性メモリに反映される)



  ・このまま電源を切らずに RTKNAVI につなぎ変えると、無事、Rover として認識

----
残念ながら、この設定、u-blox 6 の不揮発性メモリには反映させられないみたいなので、電源投入時に毎回設定が必要 ><

ここを何とかすれば、使い道が広がりそう。

----
続きはこちら。RTKLIB/RTKGPS+ のローバーとして u-blox 6 を使えるようになった 。

2018年7月25日水曜日

RTK-GPS:rtklib と遊ぶ - その2

 Windows 上の rtklib が C94-M8P との組み合わせで動いたので、今度は Android 上で rtklib+ と C94-M8P の組み合わせに挑戦。

 Windows と同じような設定をしても、Rover も Base も SNR に信号がでてこない。緑の四角いのは、二つ、チカチカしてるので Rover/Base ともに、それっぽいデータが来ていることは間違いなさそう。
 シリアルターミナルを立ち上げて C94-M8P からのデータを見ると NMEA っぽく見えるし、telnet で Base につないでも NMEA ぽっく見える。
 (ちなみに base は 善意の基準局掲示板 にあるデータ形式 u-blox、接続方法 STRSVRの局)

 最初、Intel CPU の Android タブレットを WiFi 経由で Base につないでいたので、Intel CPU の問題かと思い、Arm CPU の Android phone + WiFi でつないでもダメ、Android では無理なかと、Windows tablet + rtklib + WiFi で試してもダメ。Wndows tablet + rtklib の設定を、動いている Windows PC + rtklib の設定にしてもダメ。

 ただ、Windows tablet + rtklib と Windows PC + rtklib の設定を比較しているときに、設定ダイアログの内容が微妙に違っていることに気が付いた。
 動いている Windows PC 上の rtklib は 2.4.2 p13、動かない Windows tablet 上の rtklib は 2.4.2。Windows tablet の rtklib を 2.4.2 p13 に入れ替えたら動いた。

 Android 上の RtkGps+ のバージョンは 1.0 alpha 23 。さて、ベースの rtklib バージョンは...

2018/08/01 追記:
 RtkGps+ の README.md によれば  RtkGps+ 1.0 alpha 23 の rtklib は "Version pre 2.4.2p9"。C94-M8P の出力が認識されないのはこのせいか?

 

2018年7月23日月曜日

RTK-GPS:rtklib と遊ぶ - その1

 これから需要が伸びそうなのところを目指して、RTK-GPS を研究中。4月に u-blox の C94-M8P を入手したのだが、忙しくて手を付けられず。

 7月になってようやく触り出す。好条件化で Rover が FIX した時の誤差が cm オーダーになる驚異的な精度を体感。

 次は条件の悪いときの精度を調べたいのだが、外での実験にはいろいろと準備がいるし、天候とも相談だしということで腰が重くなる。

  ということで、家で C94-M8P を Windows 上の rtklib につないでみる。動かすためのキモは、

 ・ドライバーを Windows 標準のシリアルドライバーに変更
 ・u-center に接続して ctrl + F9 でConfigure ダイアログを開き UBX-CFG(config)-MSG(Messages) で [02-15 RXM-RAWX] と [02-13 RXM-SFRBX] を USB から出力するように設定する

  [02-15 RXM-RAWX] と [02-13 RXM-SFRBX]については、RTKLIB ver.2.2 Manual の 6 ページに
- ublox Raw : RXMRAW, RXMSFRM

とあるのを見つけていたが、なんのことかわからず無視していた。 動かないのでいろいろ調べていたところ、こちらのページ

u-bloxの受信機をRTKNAVIに接続する場合,受信機出力としてUBXフォーマットのRXM-RAWとRXM-SFRBが必要になります.

 とあったので、「あ、あの設定か!」と気づき設定したら動いた。

 ただし、C94-M8P では、「RXM-RAW」と「RXM-SFRB」は設定できなかったので「RXM-RAWX」と「RXM-SFRBX」を設定した。

 ちなみに u-blox 6 のアンテナ一体型受信機では、上記パラメータは全く設定できなかったので、u-blox 6 は RTK-GPS のローバーになれないっぽい。

 

2018年4月16日月曜日

Xamarin の C# の Android Framework でメニューを使うには?

 Xamarin + Android Framework でアプリ開発中、Menu の追加にてこずった。
 
 後からメニューを追加しようとして、ネットで探した

public override Boolean OnCreateOptionsMenu (IMenu menu)
{
    MenuInflater.Inflate(Resource.Menu.mymenu, menu);
    return base.OnPrepareOptionsMenu(menu);
}

をコピペしたのだが

エラー CS0115 'xxxActivity.OnCreateOptionsMenu(IMenu)': オーバーライドする適切なメソッドが見つかりませんでした。 

エラー CS0246 型または名前空間の名前 'IMenu' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください)。

とエラーが出る。

OnCreateOptionsMenu() は、Android Framework のメソッドそのままなのに、見つかりませんってどういうこと?と悩むこと10数分。名前空間の指定が足りないのは IMenu の方だった

using Android.Views;

を追加して一件落着。

VS のコード補完は Android Studio より弱いのか。


2017年8月7日月曜日

xrea の crontab

Python で作った Web サービスを xrea にデプロイしているのだが、crontab で嵌った。

1.実行結果のメールが来たり来なかったり
  crontab で処理が実行された後には 「結果・エラーメール(stdout と stderr に吐き出された内容)」が届くはずなのだが、届いたり届かなかったり

2.実行されるのは一時間に一回
 「ジョブの間隔は最短で1時間に1回とさせて頂いております」と明記されているのだが、crontab の設定で一時間に2回以上回る場合は、と解釈していたのだが違うようだ。
 crontab には 30件(スロット)設定できるのだが、手作業で起動時刻を設定しなおしても、一つのスロットにつき一時間に二回以上は実行しない様子。実行されるスクリプトを手直しして、再実行させようとして同じスロットで起動時刻を変更しても、最初に実行した時刻から一時間経過しないと実行されない。
 一時間ほど嵌って、あきらめて寝て、布団の中で気が付いた。

2017年1月3日火曜日

Xmarin+Android framework で RunOnUiThread() を使うとデータが化けた話

 Xmarin+Android framework でシステム開発中。

 ストリーミングのデータを処理し、エラーを見つけたらリアルタイムに画面に表示する機能を実装していた。

 表示にはエラーが発生した時刻(ms まで)と期待したデータと実際に受信したデータを表示するようにしたのだが、期待したデータの表示が、こちらが期待した値にならない。データ処理ロジックが間違っているのかと数時間ソースを追ったのだが原因がつかめない。

(ちなみに、どういうわけかブレークポイントが使えない。設定するとプログラムが止まるタイミングでアプリが終了する)

 いろいろやっていくうちに、「画面表示だと、別スレッドだから時間表示がずれる。ログに吐かせてみよう」ということで、同じ内容をログにはかせると期待したデータが表示された!

----
 原因だが、RunOnUiThread() に渡したコードに、クラス内で定義した変数を持たせたために、表示スレッドが実行される前にその変数が更新されてしまうことが原因だった。

class foo
  {
  int LastData;

  void bar (int data)
  {
    ....
    parentActivity.RunOnUiThread(() =>
    {
      parentActivity.UpdateTestInfo("Error Info: " + DateTime.Now.ToString("HH:mm:ss.fff") + ":" + LastData.ToString("x2") + "-" + data.ToString("x2") + "\n");
    }
  }

 というようなコードを書いたのだが、コードが UiThread のキューに積まれるときに、

  • date は関数終了と同時に消滅するローカル変数だから値渡し
  • LastData は、関数が終了しても消滅しないので参照渡し
となったらしい。

 ストリーミングデータを処理しているため LastData は常に更新されていく。そのため画面に表示されるのは、RunOnUiThread() が実行された時点での LastData の値ではなく parentActivity.UpdateTestInfo(...)が実行されるときの LastData の値、
 date の方は値渡しなのでRunOnUiThread() が実行された時の値に。

 変数は参照わたしなんかしないで、キューに積む時点の値で全部値渡しにしてしまえばいいのに。

 

2016年11月25日金曜日

Xamarin の C# の Android には Java.Lang.Object というクラスがある

 Xamarin を Android フレームワークで使っていて、ListView を操作するために View の setTag(), getTag() を使おうとしたのだだが、どうもうまくいかない。

 holder のクラスが Java.Lang.Object にキャストできないと文句を言われる。

 いろいろ調べった結果、holder のクラスを、Java.Lang.Object クラスを継承させれば OK と解った。

 C# に Java.Lang.Object なんてクラスを使うのは、ちょっと気が付かなかった。

参考サイト