あきらぼ

テック系ブログ

測位技術(GPS/GNSS/GNSS−INS/GNSS-RTK)

最近、仕事で測位装置をよく使うのですが高精度に位置情報を取得する方法が色々あるので、GPSをベースにした測位技術について勉強がてらまとめてみました。

 

 

 

 

概略図はこのような感じです。

GPS

これらの衛星測位技術のベースになる技術。

正式名称はGlabal Positioning Systemです。

 

後述のGNSSと区別するために言及しておきますが、GPSアメリカが運用するシステムとなります。

 

正確な時計(原子時計)と正確な軌道情報を持った衛星から受信する時間と軌道情報を複数(4つ以上)の衛星から得ることで自己位置を特定する技術。

 

原理的には3つの独立な方向の衛星の情報を使えば自己位置が特定できるが、受信機(自己)が正確な時計を持っていないため未知変数が一つ増え、最低4つ以上の衛星が見えないと自己位置推定できない。

 

後述する方法より精度が低い。

GNSS

次に聞きなじみが少ないGNSSです。

正式名称はGlobal Navigation Satellite Systemです。

 

前述したアメリカのGPSに加えて、測位衛星を持っている国は複数あります。

そこで、その世界各国の測位衛星を使ったシステムがGNSSとなります。

 

有名なところでいうと日本の測位衛星、準天頂衛星みちびきGNSSの測位衛星の一つになります。

 

単純に見える衛星数が増えることで位置特定精度が向上します。

とくに日本のみちびきが通る軌道は日本を中心となっているので日本でのGNSSによる位置精度向上に貢献していることが分かります。

 

https://qzss.go.jp/overview/services/isos7j00000003cb-img/isos7j00000003du.jpg

みちびきの軌道|みちびきとは|みちびき(準天頂衛星システム:QZSS)公式サイト - 内閣府

 

また、みちびき等の新しい衛星は複数の周波数をもつことで電離層による電波の伝送の遅延による誤差も改善しています。

衛星測位サービス|みちびきとは|みちびき(準天頂衛星システム:QZSS)公式サイト - 内閣府

 

GPS-INS/GNSS-INS

次はGPS-INS/GNSS-INS手法です。

GPS/GNSSによる位置特定に加えて慣性センサ(加速度・ジャイロセンサ)の値を用いて自己位置精度を補正して精度を向上させる手法です。

 

慣性センサの情報を使えば剛体を仮定すると単純に加速度・角速度を積分することで自己位置がどのように移動したか分かります。

実際にはセンサ値にはノイズが乗っており、積分することでそのノイズが蓄積されて大きな誤差となってしまいます。

 

そこでGPS/GNSSの位置情報が使えない時(精度が低い時に)慣性センサのデータを使って自己位置を補間する手法です。

 

実際に都市部になるとビルの影やトンネルで受信できる測位衛星が少なくなってしまうのでその間を慣性センサで補助します。

RTK-GNSS

最後にRTK-GNSSです。

RTKはReal Time Kinematicの略称となっています。

 

この手法では既知の位置座標にある基地局が受信したGNSSの受信データ(位相データ)を使用して誤差を修正する方法です。

 

なのでGNSSの受信機を自分で持っているだけではなく、基地局がが必要になります。

 

詳細な位相差による修正方法は以下に説明されていそうです。(しっかり見ていない)

http://www.nda.ac.jp/~nami/research/pdf/CGSIC2001.pdf

 

基地局に関しては自身で設置することもできます。

しかし、日本においては全国1300カ所に国土地理院が設置した基地局があり、そのデータを使用することができます。

電子基準点とは | 国土地理院

 

そこでインターネットを使用してこれらの基地局のデータをしようすることで自身で基地局を設置することなくRTK-GNSSを使った高精度な位置測定をすることができます。

これをネットワーク型RTK-GNSSと言います。

 

日本ではソフトバンクジェノバがこれらのネットワーク型のRTK-GNSSのサービスを提供しています。

高精度測位サービス ichimill(イチミル) | 法人向け | ソフトバンク

株式会社ジェノバ

 

以上、測位衛星を使った測位技術まとめでした。

 

 

【Ubuntu】レンタルサーバーにFactorioサーバーを建てる

今回は友人とFactorioを一緒にプレイするのにKagoyaのUbuntuレンタルサーバー(VPS)にFactorioサーバーを建ててみました。

 

 

 

 

 

専用サーバーのメリット

今回は専用サーバーを建てることとしたのですが、別に専用サーバーを建てなくても一緒にプレイする友達の誰かがホストとなれば一緒にプレイすることができるのですが、そのホストが必ずプレイしていないと同じマップをプレイすることができません。

(セーブデータだけを共有するという方法もありますが、面倒くさいです。)

 

そこで今回は専用サーバーを建てることで、友達がいつでも好きな時に入って工場建設できるようにするようにしてみました。

 

専用サーバーを建てるにあたって、やることはポート開放とサーバーソフトのインストール・起動です。

 

ポート開放

まずUDPの34197番ポートをiptableを使って解放します。

sudo iptables -A INPUT -p udp --dport 34197 -j ACCEPT

以下のコマンドで変更を確認します。

sudo iptables -L

 

サーバーソフトインストール

問題なければFactorioのソフトをインストールしていきます。
サーバーソフトダウンロード

まずサーバーソフトをダウンロードしてきます。

(SteamCMDでもインストールできるようですが、サーバー専用版ではなく容量が大きいので専用ソフトを今回は使用します。)

以下のサイトから専用サーバー用のソフトをダウンロードします。

Download | Factorio

ダウンロードしたファイルはtar.xzの圧縮ファイルになります。

次にダウンロードした圧縮ファイルをサーバーに移動してインストールしたい場所で解凍します。

今回私はWinSCPでSFTP経由で移動しました。

(直接サーバー上からコマンドでダウンロードしても構いません。)

 

圧縮ファイルのある場所で以下のコマンドで解凍します。

tar -Jxfv factorio_headless_x64_1.1.70.tar.xz

解凍してしまったら元の圧縮ファイルは削除しても問題ありません。

rm factorio_headless_x64_1.1.69.tar.xz

 

ゲーム起動・設定

解凍したフォルダの中に実行ファイルがあるので、ゲームを設定・起動していきます。

実行ファイルのパスは以下の場所です。

factorio/bin/x64/factorio

 

この実行ファイルに対して操作をしていきます。

なのでこのディレクトリまで移動しましょう。

 

まずはマップを作成します。

実行ファイルに以下のコマンドでマップを作成することができます。

./factorio --create map_114514 --map-gen-seed 114514

ここでmap_114514は保存するマップ名

114514はマップのシード番号になります。

--map-gen-seedで指定しなければランダムなシード番号でマップが生成されます。

作成されたマップが同ディレクトリにZIPファイルで生成されていることが確認できると思います。

 

次にサーバーのセッティングをしていきます。

ベースの設定ファイルはfactorio/data/のパスにあります。

設定ファイル例の名前はserver-settings.example.jsonです。

コピーしてserver-settings.jsonという名前にしました。

このjsonファイルを直接書き換えることでサーバーの設定をすることができます。

 

私の場合はサーバーに入るためのパスワードを追加したかっただけなので先ほどのJSONファイルのgame_passwprdの行を以下のように変更しました。

 "game_password": "PASSWORD",

ここでPASSWORDは実際にこのゲームサーバー(ルーム)に入るためのパスワードとなります。

 

設定を保存したら最後にゲームを起動します。

次に先ほど作成したマップでサーバーソフトを起動していきます。

 ./factorio --start-server map_114514.zip --server-settings ../../data/server-settings.json

これでサーバーが起動するのでゲームからこのIPアドレス指定で入れることを確認してください。

 

nohup等を使ってバックグラウンドで動くようにすればSSH接続を切っても問題ありません。

 

以上で、Factorioのサーバー建設終了です。早速工場を作っていきましょう。

 

 

物体検出モデルYOLOv5を用いて家の前の交通量調査をしてみた

こんにちは。

 

先日、YOLOv5の使い方を確認しました。

aki-lab.hatenadiary.com

 

今度はこのモデルを使って、当初の目的である交通量調査を行いたいと思います。

こんな感じになります。

 

 

 

将来的にはリアルタイムで交通量をモニタしたいのですが、まずはコンセプト検証ということで録画したビデオ映像に対して交通量調査機能を実装していこうと思います。

 

そこで、まずはカメラの出番です。

結構昔のモデルにはなってしまいますがGoPro Hero3になります。

 

バッテリーは死んでいたのですが、互換品購入してバッテリー入れ替えたら時間的には十分な時間録画できそうです。

Amazon | Smatree GoPro Hero3 用1290mAhバッテリー2個 充電器とUSBコード付き CHDHX-301-JP | カメラ用アクセサリキット 通販

 

ベランダのへりに固定したら動画を撮影します。

 

約1時間の動画が撮影できました。

以下がその一部になります。

 

youtu.be

 

この動画に対してYOLOv5の物体検出モデルを使って交通量をカウントしていきます。

 

まず手始めに動画に対して車として認識されたものを四角で囲ってみます。

確度(その物体の確からしさ)が高いものは青色、低いものは緑色で囲うようにしています。

 

youtu.be

 

白いガードレールを誤検出してしまっていますね。

確かに白いハイエースに見えないこともない?

 

次に物体をトラッキングしていきます。

交通量をカウントするためには検出した物体がどのように移動していくのかをトラッキングしていく必要があります。

カルマンフィルタを使って確率論的に処理したり、検出したオブジェクトの特徴量から同じ物体をトラッキングしたりと様々な手法があるようですが、とりあえず思い付きで作ってみました。

 

ラッキングに必要な工程としては以下になります。

1.オブジェクトの新規生成

2.オブジェクトの移動

3.オブジェクトの消失

となります。

 

今回はざっくりいうと、

1.オブジェクトの新規生成は今まで何も近傍にオブジェクトがなかったところにオブジェクトが生成された場合に新規オブジェクトとしてID付与。

2.検出中心の近傍にオブジェクトがあった場合はそのオブジェクトが移動したものとしてIDを継承。

3.オブジェクトの近傍に検出が無い場合はオブジェクトが消失したものとする

といった方式です。

 

このベースに加えて、新規生成場所や消失場所を制限させたり、近傍の定義を左右に長くする(道路的に上下の移動はほとんどない)等でトラッキングしやすいようにしています。

 

とりあえず、作ってみます。

オブジェクト一つ一つに固有の番号(ID)を付与して表示してみます。

youtu.be

 

オブジェクトの消失がうまくいかなかったり、逆に新規オブジェクトとして認識されてしまってIDが変化し続けてしまったりしていますね。

バグを修正していきます。

 

バグを修正したらコントロールライン(検査ライン)を決めて、そこを通過するオブジェクトの数をカウントしてきます。

 

とりあえず左方向の交通量をカウントします。

右下に交通量カウントを表示しています。

 

youtu.be

 

とりあえず私がテキトーに交通量カウントするのと同じぐらいの精度は出せているかなと思います。

 

やはりトラック等の大型車両で奥の車線が見えなくなったり、手前が見切れて上手く検出できなかったりと改善点は多々ありますが、作りたかったものはとりあえず完成です。

 

改善点としてはやはりオブジェクトトラッキングでカルマンフィルタ等の分散を用いた実装にしたいですね。

 

次にやるとしたら、これをリアルタイムで動かすことです。

全日交通量を監視するとなると常にリアルタイムで監視する必要があります。

するとPCはつけっぱなしできないので、低消費電力でギリギリYOLOv5がリアルタイムで動くハードウェアが必要になってきます。

JETSONとかですかね。(笑)

Amazon | NVIDIA Jetson Nano 2GB デベロッパーキット (945-13541-0000-000) | NVIDIA | グラフィックボード 通販

 

RaspberryPiの処理能力でもいけるのでしょうか。

Amazon | RasTech Raspberry Pi 4 Model B(RAM 2GB)ラズベリーパイ4B 技適マーク付き/ 32GBのMicroSDカード/ 5V 3A USB-Type-C ON/OFFスイッチ付き電源アダプター/2つのMicroHDMI-to-HDMIケーブルラインラズパイ専用ケース/冷却ファン/三つヒートシンク/ドライバー/カードリーダ 日本語取扱説明書 | R∞RasTech | ベアボーンPC 通販

 

とりあえずこんなところで、私としては自宅前が20分で片側二車線だけで100台以上通過する騒音ひどい環境だということが認識できたので満足です。

 

今回のコードはこちらになります。

github.com

 

以上、今回の開発でした。

 

追記

物体追跡(Object Tracking)のモデルとしてByteTrackというものをYOLOv5と合わせて使用している人が多いですね。

今度、使ってみようかなと思います。

【やってみた】YOLOv5+ByteTrackでオブジェクトトラッキング! - 神戸のデータ活用塾!KDL Data Blog

 

 

 

自作PCのアップグレード(マザーボード、CPU、メモリ)

こんにちは。

 

今回はPCがいい加減ゲームプレイ時など重いのでアップグレードすることにしました。

 

 

 

 

アップグレード内容・費用

アップグレード前は以下の仕様でした。

 

マザーボード:Z68X-UD3H-B3

CPU:Intel Core i7-2600K @ 3.4GHz

メモリ:DDR3 1600MHz PC3-12800 8GB 二枚

GPUNVIDIA GeForce GTX 1080 Ti

 

PASSMARKのベンチマーク以下でした。

PASSMARK: 2517

CPU MARK: 4267

2D MARK: 397

3D MARK: 11822

MEMORY MARK: 1660

 

そして今回はマザーボード、CPU、メモリをアップグレードしました。

 

 

アップグレード後の構成は以下です。

 

マザーボード:A520M-HDV

CPU:AMD Ryzen 5 5500

メモリ:DDR4 3200Mhz PC4-25600 8GBx2枚

GPUNVIDIA GeForce GTX 1080 Ti

 

購入費は以下です。

マザーボード:¥ 8,055

CPU:¥ 21,500

メモリ:¥ 6,480

計:¥ 36,350

組み替え

OSはWindows10だったので、マザーボード入れ替えてもそのまま動くはずだったのですが、全く認識してくれなくなりました。

 

 

2,3回組み替えて、戻してを繰り返して原因が分かりました。

Windows10のBIOSモードレガシーのままだったのです。

相当昔から一部分だけ変えてを繰り返しているのでこのような事態になったのですが、UFEIモードにWindowsBIOSモードを変更したのちに組み替えると問題なく起動しました。

 

今回はMicroATXマザーボードなので大分すっきりしましたね。

 

アップグレード後のベンチマーク

そして再度ベンチマークを回してみます。

 

PASSMARK: 2517 -> 6008

CPU MARK: 4267 -> 18240

2D MARK: 397 -> 898

3D MARK: 11822 -> 20682

MEMORY MARK: 1660 -> 2710

 

GPUを変えていないにも関わらず3DMARKのスコアがかなり上昇しています。

CPUの低いスペックが全体を引き下げていたことが伺えます。

 

ゲームも快適にプレーできるようになって大満足です。

 

 

3Dプリンタで小物置き作り

こんにちは。

 

今回は3Dプリンタで小物置きを作ってみました。

 

 

 

背景

最近、ヘッドセットのレシーバーにUSBメモリ、SDカードリーダーとPC周りの小物がデスクの上に散らかりっぱなしになっていました。

デスクでの作業性に効いてくるので使いやすい小物置きを作ることにしました。

 

設計

今回は初めてFusion360を使ってモデリングしました。

Fusion 360 | 3D CAD/CAM/CAE/PCB クラウドベースのソフトウェア | Autodesk

 

個人・趣味用であれば無料で使用できます。

今まで使っていたCADは諸事情で使えなくなってしまったのでこれからFusion360になれていかなければ。

 

今回はデスクの脇に置いているカラーボックスに木ねじで止める小物入れを設計してみました。

 

なれないCADを使うとなかなか操作性になれず四苦八苦してしまいました。

 

印刷

あとはSTLで吐き出していつも通りCURAでGコードを出力します。

 

印刷時間は6時間です。

今回も以下のPLA樹脂を使用しています。(室内用途なら大体事足りる)

Amazon.co.jp: 【Amazon.co.jp 限定】STVICTORY 3Dプリンター用 PLAプラス フィラメント 高密度 高強度 PLA樹脂 造形材料 1.75mm 寸法精度+/- 0.03mm 正味量1kg(2.2lbs) 3Dプリンターと3Dプリントペンが適用 ほとんどのFDMプリンターに適合(ブラック) : 産業・研究開発用品

 


印刷できました。

 

サポート材等を取って綺麗にします。

 

実際に使ってみる

できあがったものにとりあえず、散らかっていたUSB用品を入れてみます。

 

想像どおりの収納感です。

あとは木ねじでカラーボックスに取り付けるだけです。

 

と思ったら、木ねじが家に残ってなかったのでガレージまで取りに行きました。

持って帰ってきたらささっと取り付けます。

 

 

良い感じの使い勝手です。

これでデスク周りがすっきりしました。

 

これで今回の3Dプリンタものづくりは終了です。

 

 

物体検出モデルYOLOv5の使い方

こんにちは。

 

今回は物体検出のモデルYOLOv5を使って騒音がすごい住んでいるマンション前の交通量を計ってみるために使い方を確認してみました。

 

 

 

YOLOv5とは

まず、今回参考にしたのはYOLOv5のこちらのレポジトリ。

github.com

 

YOLOv5はその名の通りYOLOというベースのモデルからバージョンアップしていったものになります。

 

2015年にワシントン大学のJoseph Redmon氏によって提案された元々のベース(YOLO)の論文はこちらになります。

[1506.02640] You Only Look Once: Unified, Real-Time Object Detection

 

まずベースのアイデアの説明の前に識別(class probability prediction)と物体検出の違いについて簡単に説明させてください。

 

識別は以前行ったVGG16画像識別のように画像内の特徴量を検出してその画像がなにに該当するのか近しいものを推測します。

aki-lab.hatenadiary.com

 

一方、物体検出はその該当する物体が画像のどの部分にいるのかという追加のタスクが必要になります。

そこで簡単に思いつくのが識別を再帰的に画像の一部分に適応することで物体位置を検出するというスライディングウィンドウ法に代表されるような物体検出方法です。

しかし、こちらの方法では再帰的に識別処理を行わなければいけないので、計算負荷が大きくなってしまいリアルタイム性の高いアプリケーションには使用できません。

 

そこで、YOLOではその名前がYou Only Look Onceを示す通り、単一のNeural Networkで物体検出(物体の場所)と識別(物体が何か)を同時に行うことで一度の推定で物体検出を行おうというモデルになっています。

 

また、単一のNNとなっているので物体検出の最適化(損失)も一緒に評価できるので学習による物体検出性能の改善がしやすいというのも特徴となっています。

 

この論文をベースとしてv5までアップデートされています。

概要はこちらに説明があります。

YOLOv5 Documentation

 

また、YOLOv5はスマホアプリとしてもリリースされているんで簡単に試すことができます。

YOLOv5 🚀 and Vision AI ⭐

 

PyTorchで使ってみる

実際にYOLOv5を使ってみます。

PyTorchから直接モデルをしようできるので、公式のサンプルに従って以下のようにしました。

識別する画像は公式に従ってジダンです。(笑)

 

results.show()

リザルトのオブジェクトに対してshow()を行うと以下のようにラベリングされた画像を表示してくれます。

 

results.crop()

次にcrop()です。

物体の識別ごとに画像を切り出しくれます。

切り出した画像は実行ディレクトリにrunsというディレクトリが作られてその中に保存されます。

ディレクトリはこちら。

 

一点注意ですが、上記のshow()メソッドを一度使用してからcropするとラベルが残ってしまいます。

 

results.print()

次にprintメソッドです。

以下のように何を検出したのかと処理速度を表示してくれます。

image 1/1: 720x1280 2 persons, 2 ties
Speed: 232.0ms pre-process, 447.0ms inference, 6.0ms NMS per image at shape (1, 3, 384, 640)

 

results.pandas()

最後にpandasメソッドです。実際はpandasのxyxy[0]を参照しないと何がどこで検出されているかは分かりません。

複数画像を使うケースだと0番目以外も参照する必要があるのでしょうか。

恐らくこの物体検出モデルを応用していく上でもっとも使用すると思います。

         xmin        ymin         xmax        ymax  confidence  class    name
0  743.290527   48.343781  1141.756470  720.000000    0.879860      0  person
1  441.989594  437.336670   496.585114  710.036255    0.675119     27     tie
2  123.051056  193.238037   714.690674  719.771301    0.666694      0  person
3  978.989807  313.579468  1025.302856  415.526184    0.261517     27     tie

このように検出した物体の位置、物体のクラスがpandasのデータフレームとして取得することができます。

 

次回はこのデータフレームを使って、実際に道路の動画から自動車を検出してみます。

イメージはこんな感じです。

 

以上、YOLOv5の簡単な使い方でした。

 

 

3Dプリンタで歯ブラシ置き

こんにちは。

 

今回は3Dプリンタで歯ブラシ置き用の小物を作りました。

 

 

 

歯列矯正で歯間用の歯ブラシを使うようになったので、コップに立てておくと場所がなくて困っていたので100円ショップで箸置きを買えば済むようなものを作ってみました。

 

 

あとは洗面台に置いてます。

 

 

とりあえず、使ってみて、まぁこんなもんかなと(笑)

50点って感じです。

 

まぁ、やりたかったことはできたのでOKということで。