2011年4月14日木曜日

VRS-RTK方式を用いたGPS基準点測量の説明

表題をご覧になって内容がピンとこない方を想定して、ごく大雑把な説明を試みました。「VRS-RTK」と「基準点測量」の意味もしくは内容がイメージできれば、ピンとくるのではないでしょうか。長文ですが順番にお読みください。また、間違いがあればご指摘いただければと思います。随時修正します。

VRS-RTK測量とは

GPS機能搭載の携帯電話などよりもはるかに高精度に、比較的容易に座標を得ることができる観測・計算方法です。

 

基準点測量

地球上のある場所の座標(平面位置や高さ)を求めるための測量を「基準点測量」と呼びます[注1]。

多くの測量作業の基本となる国土交通省「作業規程の準則」には、基準点測量を行うためのいろいろな機器による観測方法が記載されています。代表的なものには、トータルステーション、GPS測量機、レベルなどによる方法があります。観測方法はさまざまですが、その一方で計算は本質的に「平均計算」と呼ばれる方法しかありません[注2]。

[注1] 正確には、ある地域の測量を行うための基準となる点の座標を得るための測量で、位置を求める測量のすべてが基準点測量というわけではありません。

[注2]  [測量]は屋外で観測作業をしているイメージが強いかもしれませんが、観測したデータから座標を計算したり図化したりといったことも重要な作業となります。

 

平均計算

観測値は観測方法によって異なります。トータルステーションであれば距離と角度、GPSであれば2点間のベクトルが観測によって得られます。いずれにせよ、観測値には必ず誤差を含みます。誤差は平均をとることで真値に近づくことが期待できます。基準点測量においても、ある1点に対して複数の観測を行い、これらを平均することで誤差を小さくし、より正しい座標値を計算しています。これが「平均計算」です。
下記はGPSによる観測値であるベクトル(基線ベクトル)からの平均計算の単純化した例です。実際にはもっと多くの観測を組み合わせ、それぞれの観測に含まれるであろう誤差の大きさを考慮して平均計算を行っています。
image

GPSによる測位

「GPS」という言葉が一般に認知されて久しいです。この「GPS」はアメリカの測位(つまり位置を計測するための)衛星を用いた測位システムのことですが、衛星を使って現在位置を計測するための仕組みを総じて「GPS」というのが一般的です。
GPS衛星による測位の方法はさまざまです。代表的なものはカーナビや携帯電話で広く用いられている「単独測位」方式ですが、工事などではより高い精度を得るために「干渉測位」方式という測位方式も使用します。干渉測位方式にもさまざまなバリエーションがありますが、その中のひとつがVRS-RTKと呼ばれる方式です。つまり、VRS-RTKとはGPS衛星を用いた測定方法のひとつであるということになります。
image

 

何を受信しているのか

GPS衛星からはコード情報を含む電波が送信されています。コード測位である単独測位では、このコード情報(衛星の軌道情報や送信時刻など)からそのGPS受信機の座標を計算しています。
一方、VRS-RTKを含む干渉測位方式でもコード情報を使用しますが、基本的には電波の”波”そのものである「搬送波位相」を観測して計算に利用しています。
よくある誤解ですが、カーナビから何かの信号をGPS衛星に送ったり、GPS衛星がカーナビのGPSアンテナを追尾たり、GPS衛星が車の座標を送信したりといったことはありません。

 

干渉測位の特徴

干渉測位では、2か所以上で同時にGPS衛星からの電波を観測する必要があります。例えば、干渉測位方式の一つであるスタティック法では、3台以上のGPS測量機を異なる場所に配置して、1時間以上の観測を同時に行う必要があります。 また、得られた搬送波位相からは座標ではなく、2か所の間のベクトル(基線ベクトル)が得られます。このベクトルを得るための計算を「基線解析」といいます。さらに精度を要する観測では、この基線ベクトルに含まれる誤差を小さくするための平均計算を経て、初めて座標が得られます。このように、基線解析や平均計算が必要となる干渉測位方式では、観測したその場で即座に座標は得ることはできないのです[注3]。
コード情報からその場で座標得ることができる単独測位よりは観測も処理も面倒ですが、この手間によって単独測位とは桁違いに高い精度で座標を得ることができます。

[注3]  無線などを用いて基線解析と単純なベクトル計算を行うことで大まかな座標をリアルタイムで得ることも可能ですが、平均計算を前提とした精密な観測では全ての観測が完了しなければ、正確な座標は得られません。

 

観測の具体例(スタティック方式)

VRS-RTKの前に、干渉測位方式で基本となるスタティック方式での観測について説明します。
スタティック方式では既知点(座標値が分かっている場所)と新点(座標を得るための場所)にGPS測量機を設置して観測する必要があります。下の図では、AセッションとBセッションという2回の観測を行っていますが、それぞれのセッションで3台のGPS測量機を各観測ポイントに配置して同時にGPS衛星からの電波を受信しています。この方式では高い精度で座標が得られるのですが、何台ものGPS測量機が必要であったり観測時間が長くなったりなど、なにかと大掛かりになってしまうという欠点があります。

image
 
スタティック方式による観測

 

観測の具体例(VRS-RTK方式)

一方VRS-RTKでは、1台のGPS測量機を持って既知点と新点を巡回する形で観測します。VRS-RTKも干渉測位なので同時に最低2か所でGPS衛星からの電波を受信する必要があるのですが、そのうち1か所(これを「仮想点」といいます)から得られる情報を、配信会社[注4]から携帯電話などで受信することによって、一台のGPS測量機で干渉測位を行うことができます。仮想点は基線ベクトルを形成するための仮の点なので、実際にその場所に行って観測を行うことはありません。 さらに、スタティック方式に比べて精度はやや劣りますが、観測時間は圧倒的に短くて済みます。
[注4]  配信会社は、仮想点において得られるはずの情報を推定し、利用者にリアルタイムで送信します。計算には全国各地に設置されている「電子基準点」というGPS受信機の受信データを利用しています。


image 

VRS-RTK方式による観測

 

まとめ

このように、VRS-RTK方式は単独測位のように一台で観測しますが、平均計算を行うことによって単独測位よりもはるかに正確な座標を得ることができます。
なお、詳細については作業規程の準則(http://www.gsi.go.jp/KOUKYOU/index.html)なども参照してください。

2011年3月18日金曜日

新潟周辺の放射線推移

新潟県周辺の放射線の推移をグラフ化してみました。


https://spreadsheets.google.com/ccc?key=0ApRiM2fWnWQYdElYYUNaTnRuRG9rTk1rQ0dDdE40VXc&hl=ja

以下がソースです。
 新潟県
http://www.bousai.pref.niigata.jp/contents/538/index.html
山形県健康福祉部
http://www.pref.yamagata.jp/ou/kenkofukushi/
群馬県
http://www.pref.gunma.jp/05/e0900020.html

南魚沼と前橋で3/15の夕方から比較的高い値を示しています。この変化と下記リンクのシミュレーションとは整合がとれているようにみえます(ただし、下記シミュレーションの精度は100km程度だとのことです http://twitter.com/#!/hayano/status/47678704591192066)。

シュピーゲルのシミュレーション
http://www.spiegel.de/images/image-191816-galleryV9-nhjp.gif

また、前橋では3月16日午後に値が急激に下がっている一方、南魚沼ではなかなか数値が下がりませんでした。地形的な影響もあるのでしょうか。ちなみにその先の長岡市や新潟市には顕著な変化はみられませんでした。

新潟で南魚沼の他に阿賀町で数値にやや変化が見られました。しかしその先の新発田までは変化は認められません。

福島市から日本海に抜けるルートとしては、米坂線沿い、飯豊山と朝日連峰との間を抜けるというのもあります。この場合、福島市から米沢市、小国町を経て村上市に至る風の道が考えられます。米沢市でも阿賀町と同程度の変化が認められますが、阿賀町と新発田市との関係から類推すると、この程度では村上市の放射線量に顕著な変化を及ぼすようには思えません。

この数値が健康にダメージを与えるか否かは専門家ではないのでなんとも言えませんが、各種専門家のツイートなどをみると、少なくとも新潟県ではまだ全く問題がない程度なのかなと考えています。
一方で、原発の処理は長期化すると思われるので、花粉症情報みたいな情報を国に出してもらいたいなとは思っています(ないのでグラフ化して傾向を見てみたのですが)。
なお、作成したデータは、pdfのデータを手で入力しているものもあるため、正確性は保証できません。また、なかなか随時更新もできないですが、手があいたらまた更新するかもしれません。

2010年12月25日土曜日

直感でAndroidアプリを作成するための備忘録

アンドロイド携帯を使い始めると、フィールドワークで役たつアプリを作りたくなってきます。しかし難しいプログラミングの事を考えると、その気もなくなってしまっていました。

しかし、お気軽にアプリを作成するための開発環境「App Inventor」がついに一般公開されました。つい最近までは"登録"→"数週間の申請期間"→"App Inventorの利用許可"と面倒でしたが、誰でも利用ができるようになったようです。

App Inventorの紹介動画


このApp Inventorは、Webアプリケーションで、googleのApp Inventorのページにログインして利用します。

App Inventorの画面


この画面では、アプリを動かすためのボタンやテキストボックスなどの操作部品、あるいは方位センサーやGPSなどの情報を得るための部品の中から、必要なものを選択して配置します。

実際の処理の手順や動作は、この画面の右上にある「Open the Block Editor」を押して現れるBlock Editorというアプリで作ります。

Block Editor

ブロックを組み合わせて処理を作っていきます。このスクリーンショットは、緯度経度と標高をリアルタイムで表示するアプリのものです。

作成した処理は、その場でUSBで接続した携帯で動かして、動作を確認することができます。英語ですが、あーでもないこーでもないと小一時間もいじっていれば、なんとなく使い方が分ってくるような。実機で動いたときは、ちょっと感動ものです。

【準備】
じつは、一般公開前から使っていたので、利用に際しての手続きはわかりません。が、多分Googleアカウントがあれば使えるんじゃないかとおもいます。ここらを参考にしてください。

それと必要なのはSunのJavaアプリを動かすためのJREをダウンロードしてインストール。ないとBlock Editorが動きません。

あとは実機の「設定-アプリケーション設定-開発」ですべてにチェックを入れておき、USBで接続することで、即、実機で動作確認ができるようになります。

Inventorでもいろいろなことが出来ますが、より凝ったアプリの開発にはプログラミングで対応することにもなります。また、実機がない場合でも、エミュレーションでの動作確認も可能なようです。こうした場合は別途準備するものがありますが、この話はよく分からないのでやめておきます。詳しくはこちらとかを御覧ください。

現時点ではベータ版だからかもしれないですが、どうやらソースコードにしてくれたり、バックグラウンドで動くようなアプリをつくれなかったりということらしいです。今後のバージョンアップに期待しています。

2010年12月24日金曜日

クロソイド曲線に並行な曲線はクロソイドではないことを示す

道路のカーブには、クロソイド曲線が用いられることが多いらしい。クロソイド曲線とは、直線から徐々にカーブ(曲率)がきつくなっていく曲線。じゃあ、クロソイドの道路に並行に走る道路はクロソイドなのか?ということを考える(ついでに久々にMathematicaとTeXを使ってみた)。

【クロソイド曲線を理解する】

クロソイド曲線を式で表すと、



ここで、
:曲率半径(カーブの一部を描くような円の半径)
:スタート位置からの曲線の長さ

つまり、に反比例して曲率半径が小さくなる(カーブが急になる)
の関係があるような曲線である。

では、この曲線をで表わしてみる。話を簡単にするために、の場合を考えてみる(無次元化)。



Wikipediaの「曲率」にもあるように、曲線長による2階微分ベクトルの大きさが曲率(曲率半径の逆数)なので、これをそのまま式で表すと、



結局この微分方程式の解は、





となる。絵にすると次のようになる。



【クロソイド曲線に並行な曲線を作る】

ここでいう「並行」とは、「同じ幅を保って」という意味。クロソイド曲線の法線方向に同じ距離だけ離れている曲線。

クロソイド曲線での法線ベクトルの各成分は、Lで2回微分することで得られる。






・・・説明が面倒になってきたので、結果を示す。
幅をとしたとき、クロソイド曲線に並行な曲線は、





となる。で絵にすると、

ついでにクロソイド曲線と重ねると、

【結局・・・】
見た目にもクロソイド曲線に並行な曲線はクロソイド曲線になってないです。

【ちなみに】
道路をイメージしているので、「平行」ではなく「並行」としています。

2010年12月23日木曜日

早回し再生動画を作成する

以前の記事「撮影した動画の高度な編集を試す」の続編です。

その後、ビデオのデータから日時を取り出すことを諦めて、手動で字幕に日時を埋め込むことに方針を変えました。その時のメモです。


【目的】
MOVファイルから以下のようなWMVファイルを作成する。

  • 撮影データに日時を入れる。
  • 撮影データの早回し再生動画(360倍速)に変換。
  • オープニング画面を入れる。

【処理手順】

  1. MOD(ビクター製ビデオの保存形式)をmp2に拡張子書き換え(フォーマットはmp2と同じ)。
  2. DGIndex.exe」でd2vファイルに変換。
  3.  撮影データ、水位などの情報、早回し再生、タイトルなどの処理を記述した、AviSynthスクリプト(*.avs)を作成する (変換した動画の確認には、「Area61」にaviファイルを読み込んで行う)。時刻テロップは、オリジナルファイルの更新日時とFPSなどから計算したタイミングに、適切な時刻を表示するスクリプトをエクセルで作成して表示。
  4. 上記avsファイルを「DVD Flick」で読み込み、DVD形式に変換する。ただし、AviSynthにはmpeg2デコードプラグイン(DGDecode.dll)を入れておく必要がある。
  5. 作成したVOBファイル(DVD形式のデータ)の拡張子をmpgに書き換え。
  6. Windows Media エンコーダ」でmpegからwmvへ変換する。

2010年11月12日金曜日

撮影した動画の高度な編集を試す

業務で、ビデオカメラで定点撮影したデータ(*.MOD)を加工する必要がありまして、いろいろ試行錯誤の末の方法をメモっておきます。
元動画データはビクターのビデオカメラの保存形式であるMODファイルですが、内容はmpegと同じだそうです。データサイズは約4GBでした。

【まとめ】
<目的>

  • 撮影日時を入れたい
  • できれば、撮影データの早回し再生動画を作成したい

<作成手順>

  1. MOD(ビクター製ビデオの保存形式)をmp2に拡張子書き換え(フォーマットはmp2と同じ)、
  2. DGIndex.exeでd2vファイルに変換し、 
  3. これをmpeg2デコードプラグイン(DGDecode.dll)を含むAviSynthスクリプトで変換する。 
  4. AviSynthスクリプトファイルであるavsファイルをDVD Flickで読みDVDを作成。
  5. 作成したVOBファイル(DVD形式のデータ)の拡張子をmpgやmp2にすると、そのままmpegとして扱える。 

<結果> 

  • 10倍速AviSynthスクリプトを作成して、以上の手順での変換には成功。 ただし、さらに時刻の挿入AviSynthスクリプトで変換を試みたが、うまくいかなかった。

<参考にしたサイト>

MODファイル=mpg、しかし「動画'タイムスタンプ情報が含まれている小さいMOIをファイルと一緒に伴われる。」らしい
http://bit.ly/hkt9i1A0v
AviSynth 
http://www.avisynth.info
d2vファイルに変換
http://bit.ly/hkt98bvvG
d2vを使ってmpeg2デコードプラグイン(DGDecode.dll)を含むAviSynthスクリプトで変換
http://bit.ly/hktdyzPRF

このサイトが大きなヒントになりました。
http://bit.ly/hktcvccds

http://bit.ly/hktb75ifu
上記サイトにあるスクリプトを参考に、日付を入れようとしたけれど、「Frame# too high」という文字しか挿入されない。そこで、mpegを分割できる編集ソフトMovicaをインストール。
http://bit.ly/hkt92XyzB
結局解消されず。

再生速度を変更する関数とスクリプト
http://bit.ly/hktahAkq2
上記をちょっとだけ書き換えた10倍速のスクリプト
-----------------------------------

#DGDecode.dllを明示的に使う


LoadPlugin("C:\Program Files\AviSynth 2.5\plugins\DGDecode.dll")
# ソース


clip_org =MPEG2Source("C:\tmp\MOVIE\MOV006.d2v")
# 再生速度を 10 倍に変更。フレームレートは変更前のまま。 


clip_new = clip_org.ChangePlaySpeed(10.0)


#そのままビューアに渡す


clip_new
return last


#以下、再生速度を変更する関数
#http://bit.ly/hktahAkq2 function ChangePlaySpeed(clip clip, float speed, float "fps", bool "pitch") {


fps = default(fps, -1.0)
pitch = default(pitch, false)


clip =
\ ((pitch) \ ? clip.TimeStretch(rate=100.0*speed) \ : clip.TimeStretch(tempo=100.0*speed) \ ) rate = clip.Framerate() clip = \ ((0.0 == fps) \ ? clip.AssumeFPS(rate*speed) \ :(fps < 0.0) \ ? clip.AssumeFPS(rate*speed).ChangeFPS(rate) \ : clip.AssumeFPS(rate*speed).ChangeFPS(fps) \ ) return clip }
-----------------------------------

2010年11月6日土曜日

Android(Xperia)でシリアル機器をコントロールするために

まず最初に考えるのは、USB-シリアル変換が可能か、ということですが、
そんな都合の良い製品は、見つけられませんでした。

次に、そもそもUSBでシリアル通信は出来るのかということで、「USBケーブルでのデータ転送アプリの作成」を読むと・・・なんかよく分かりませんが、必ずできる、ってわけではないらしい。
でも、どうやらBluetoothでシリアル通信が実装可能であるらしいことが判明。

じゃあ、シリアル機器をBluetoothに接続できるようにする方法ということで調べると、ありました。


こんなものもあったんですね。
これを挿したシリアル機器とBluetoothでシリアル通信するようなAndroidアプリってApp Inventorとか使って簡単に作れるのだろうか。本当に通信できるのか。やってみたいが、ちょっとした出費だな、こりゃ。