2013年9月9日月曜日

Makefile の作成

こんにちは。
 今日は、ロボットのプログラムのコンパイル用の Makefile を作成したので、投稿します。
まず、ファイル構造を示します。
Makefile main.c main.h /SUB_A /SUB_B
             |    |
             |      | --sub_b.c sub_b.h _sub_.h
             |
             | --sub_a.c sub_a.h _sub_a.h


次に、依存関係を示します。

main.c
---------------------------------------------------------------------
 #include "./main.h"
#include "./SUB_A/sub_a.h"
#include "./SUB_B/sub_b.h"
.
.
.
.
---------------------------------------------------------------------

./SUB_A/sub_a.c
---------------------------------------------------------------------
#include "./sub_a.h"
#include "./_sub_a.h"
.
.
.
.
----------------------------------------------------------------------

./SUB_B/sub_b.c
----------------------------------------------------------------------
#include "./sub_b.h"
#include "./_sub_b.h"
.
.
.
.
-----------------------------------------------------------------------

main.out は main.o sub_a.o sub_b.o に依存
main.o は main.c main.h に依存
sub_a.o は sub_a.c sub_a.h _sub_a.h に依存
sub_b.o は sub_b.c sub_b.h _sub_b.h に依存 しているとします。

こんな感じだったとき、main.c のあるディレクトリと同じ所にMakefileを作成します。

Makefile
-----------------------------------------------------------------------------------------------------------------
#マクロ定義
 CC = gcc #コンパイラはgccを使用

.PHONY : clean #本当のファイル名ではないターゲットをフォニーターゲット
                                (Phony target=偽のターゲット)といい、
                                明示的にコマンドを実行させたい時にこの名前を利用します #===============================================================
# 何かソースを更新したら...
#
#  1. VPATH にそのソースの置いてあるディレクトリの相対パスを追加する。
#      追加するときは : をつけて追加すること。
#
#  2. SUB_SRC に追加したソースの.cファイルを追加する。
#      追加するときはスペースを開けて追加すること。
#
# 以上が、ソースを追加した時の使い方である。
# デバッグをしたい時は DEBUG のコメントアウトをとる。
# オプションを付けたい時は OPTION のコメントアウトをとる。
# どちらも何か追加したければ、スペースを開けて追加すること。 #===============================================================
PROG        = main

#OPTION  = -Wall
#DEBUG   = -g -O0

VPATH = ./SUB_A:./SUB_B #makeの変数、VPATHの値にはmakeがサーチするディレクトリの
                                                      リストを指定します。ほとんどの場合、
                                                      指定するディレクトリは依存関係にあるが、
                                                      カレントディレクトリにはないファイルを含むディレクトリになります

MAIN_SRC = main.c
SUB_SRC   = sub_a.c sub_b.c
SRCS           = $(MAIN_SRC) $(SUB_SRC)
OBJS           = $(SRCS:%.c=%.o)
HEADS        = $(SRCS:%.c=%.h) $(SUB_SRC:%.c=_%.h)

all: $(PROG)

$(PROG) : $(OBJS) $(HEADS)
              $(CC) -o $@ $(OPTION) $(DEBUG) $(OBJS)

$(PROG).o : $(PROG).c $(PROG).h
              $(CC) -c $(OPTION) $(DEBUG) $<

%.o : %.c %.h _%.h
              $(CC) -c $(OPTION) $(DEBUG) $<

clean : rm $(OBJS) -----------------------------------------------------------------------------------------------------------------------

こんな感じです。詳細を説明するのは骨が折れるので勘弁してください。
もしわからないことがあったら、コードをググったら大概の物は出てきます。
Makefile には色んなオプションや、マクロ定義があるので、調べてみてください。

 Makefileについて参考にさせていただいたサイト↓
GNUMake3.77/make_4.jp

 今載せているコードで何か質問がある場合は、投稿で聞いてください。
できる限り答えます!

 次回は、TCP/IPの通信プログラムを投稿しようと思っているので、宜しくおねがいします。

2013年8月9日金曜日

MacOS X(Mountain Lion)でOpenCVを使ったコードをコマンドラインからコンパイル

OpenCVをMacからも使ってみようということでちょっとやってみたので紹介しようかなと。

環境


  • MacOS X 10.8.4
  • MacPorts 2.2.0
  • OpenCV 2.4.6
  • gcc 4.2.1 (Based on Apple Inc. build 5658)
[追記 2013/11/03]
OS X 10.9(Mavericks)のXcode5のgccでも動作しましたが、OS X 10.8.4からのアップデートした環境です。

やり方

まず、OpenCVをインストールする必要があります。今回はMacPortsを使ってインストールしました。MacPortsを使うにはgccが必要ですので、AppStoreからXcodeをインストールして、Command Line Toolsを入れます。ちなみにLionでgccを入れててMountain Lionにアップデートした場合も再度gccを入れる必要があります。

MacPortsはいろいろググって入れます。んで

sudo port install opencv

を打って放っておくと完了すると思います(パスワード聞かれるので入力してから放置)。そして適当なディレクトリ作ってOpenCVを使ったコードを書きましょう。以下では前回紹介したtrans90.cを使ってやってみます。このままでは通らないのでちょっとソースコードを書き直します。具体的にはincludeの<>を""に書き直し、保存します。そして保存したディレクトリに移動して
gcc -I/opt/local/include  -L/opt/local/lib  trans90.c  -lm -lopencv_core -lopencv_highgui -lopencv_imgproc -o trans90
このように打てばコンパイルが通るとおもいます。 しかし、毎回コンパイルの度にこのように打っていては面倒なのでMakefileをつくってmakeを利用します。テキストエディタで
CC = gcc
CFLAGS = -I/opt/local/include
LDFLAGS = -L/opt/local/lib
LDLIBS = -lm -lopencv_core -lopencv_highgui -lopencv_imgproc
これを書いてMakefileという名前でソースコード(trans90.c)と同じディレクトリに保存します。そして
make trans90
と打てばコンパイルができると思います。Makefileは本来は分割ソースのコンパイルに力を発揮しますが、今回のような場合でも十分便利なので利用しました。

それでは今日はこのへんで。

[追記]

Homebrew 0.9.4の環境が入ったMacOS X 10.8.4でも動作の確認ができました。Homebrewの場合
CC = gcc
CFLAGS = -I/usr/local/Cellar/opencv/2.4.5/include
LDFLAGS = -L/usr/local/Cellar/opencv/2.4.5/lib
LDLIBS = -lm -lopencv_core -lopencv_highgui -lopencv_imgproc
のように赤字の部分のように書き換えることで、ソースコード(trans90.c)がコンパイル出来ました。ただしOpenCVのバージョンが2.4.5の場合です。指定するディレクトリに注意してください。

2013年8月7日水曜日

WebカメラとLRFのドッキング

今日は、つくばチャレンジ2013の課題にある
特定人物の検出」を行うための装置を作りました。

写真を見ていただければわかるかと思いますが、LRFセンサで測定物との距離を測定すると同時に、3台のWebカメラの情報を読み取ることにより、特定人物の検出を行うための装置です。

カメラは真ん中が固定、両サイドは任意角を取れる(手動)ように設計しています。

課題は、測定物の距離により、カメラの角度を変えなければならない(自動)という事です 。
これについては、プログラムがもう少し形になってから考えることにしますが、いずれ改良していかなければならない点だと考えています。
また、このカメラは写真ではすべて縦型で使用していますが、元々は横型で使うものなので視野角についても要改良であると考えています。
いずれにせよ、とにかく動くプログラムを作ってから考えようと思います。

何か動くプログラムができたら、アップしてきます。
では、今日はこのへんで ( 'A' )ノシ

2013年8月6日火曜日

OpenCVでWebカメラの映像を90度変換

2013年7月22日月曜日

[訂正]OpenCVを使った緯度経度のGoogleMap上へのプロット

 前回
OpenCVを使った緯度経度のGoogleMap上へのプロット
 で紹介した「2.やり方」よりもっといいやり方があることに気づいたので、投稿しておきます。

前回のやり方では

 A. 緯度経度座標をメルカトル座標に変換する
 B. 取得した地図の中心点と表示させたい点の距離を測って表示する

というやり方をとっていましたが、このやり方だと

  緯度経度座標を直接ピクセル座標(距離情報)に直接変換できない
  つまり、逆変換する時とか、色々めんどくさい仕様になっている

という事に気が付きました。
そこで、緯度経度座標を直接ピクセル座標に変換できる方法を以下のサイト様を参考に(丸パクリ)させて頂き、作ってみました。

参考にさせて頂いたサイト様↓  本当に感謝です!ありがとうございます!!!!m(_ _)m
グーグルマップ(Google Maps) の座標間変換式について(1)

という事で、c言語で書いた変換式を載せておきます。
上のサイトを読まないとよくわからないと思うのでしっかり読んでからご覧ください。


/*========================================================================================
 Name     : real_frame_to_pix_frame
 Argument : point_data *data : 変換するデータ(緯度経度→ピクセル)
            int zoom         : 地図のズームレベル
 Return   : no return
 About    : 緯度経度座標をピクセル座標に変換する
            ポインタにより、データを直接いじるので注意すること
========================================================================================*/
void real_frame_to_pix_frame(point_data *data, int zoom)
{
  (*data).lo = pow(2,7+zoom) * ((*data).lo/180 + 1);

  (*data).la = pow(2,7+zoom)/PI * (-atanh(sin(PI*(*data).la/180)) + atanh(sin(PI*MAX_LA/180)));
}

/*=======================================================================================
 Name     : pix_frame_to_real_frame
 Argument : point_data *data : 変換するデータ(ピクセル→緯度経度)
            int zoom         : 地図のズームレベル
 Return   : no return
 About    : ピクセル座標を緯度経度座標に変換する
       ポインタにより、データを直接いじるので注すること
========================================================================================*/
void pix_frame_to_real_frame(point_data *data, int zoom)
{
  (*data).lo = 180 * ((*data).lo/pow(2,7+zoom) - 1);

  (*data).la = 180/PI * (asin(tanh(-PI*(*data).la/pow(2,7+zoom) + atanh(sin(PI*MAX_LA/180)))));
}

/*=======================================================================================
 Name     : real_frame_to_picture_frame
 Argument : point_data center : 表示する画像の中心緯度経度座標
            point_data data   : 目標点の緯度経度座標
            int zoom          : 地図のズームレベル
 Return   : no return
 About    : 緯度経度座標を画像座標に変換し、
        CvPoint型 picture_frame に格納する
=========================================================================================*/
void real_frame_to_picture_frame(point_data center, point_data data, int zoom)
{
  picture_frame.x = pow(2,7+zoom) * ((data.lo-center.lo)/180);

  picture_frame.y = pow(2,7+zoom)/PI * (-atanh(sin(PI*center.la/180)) + atanh(sin(PI*data.la/180)));
}

/*========================================================================================
 Name     : picture_frame_to_real_frame
 Argument : point_data center : 表示する画像の中心緯度経度座標
            CvPoint data      : 目標点の画像座標
            int zoom          : 地図のズームレベル
 Return   : no return
 About    : 画像座標を緯度経度座標に変換し、
        point_data型 gps に格納する
========================================================================================*/
void picture_frame_to_real_frame(point_data center, CvPoint2D32f data, int zoom)
{
  gps.lo = 180*data.x/pow(2,7+zoom) + center.lo;

  gps.la = 180/PI * asin(tanh(PI*data.y/pow(2,7+zoom) + atanh(sin(PI*center.la/180))));
}

構造体!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 typedef struct {
  double la;  // la is latitude.  緯度
  double lo;  // lo is longitude. 経度
} point_data;

struct CvPoint{
  int x;
  int y;
}

struct CvPoint2D32f{
  float x;
  float y;
}

必要なinclude, define!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
#include 
#include 
#include 

#define PI 3.141592653589793
#define MAX_LA 85.0511287798066

コードが見えづらいと思いますので、一応スクショも貼っときます。






以上です。
必要ないことも若干書いてあるので、読みづらいと思いますが、ご勘弁ください。

次は、OpenCVを使って、Googleより取得した地図をくっつけて巨大な地図を作り、その地図の任意の点をクリックするとその点の緯度経度情報を.datファイルに出力するプログラムを作りたいと思います。

それではまた ! ('A')ノシ

2013年7月4日木曜日

OpenCVを使った画像認識による人検出、色検出

今日は(OpenCVを使った)画像認識による人検出、色検出を試してみました。
考え方としては、Webcamからキャプチャした画像(!)を、いわゆるクロマキー合成に似た手順で、指定した色領域のみ切り出し、
更にその処理済みの画像をHaar-likeフィルタで人検出をして矩形領域で確認する
といった感じです。ただ、この方法だとWebcamのキャプチャを1枚1枚取ることになったり、
それをさらに重いHaar-like処理にかけたりするためかなりリソースを食ってしまうのが困りものです。
というか、リアルタイムで処理するのはほぼ不可能に近いレベルです。どうにかして軽く出来ないかと悩んでいます。(i7を積んでいるのにCPUを4割食う)
ハードウェア的にはスイッチや配線類のゴチャゴチャした部分をどうにかしてまとめようと奮闘中です。
将来的にはスイッチ類やモニタ、配線まですべてまとめてシートの下に入れてしまい、人が乗れるようにする
というのが理想ですが……理想です。できたらいいな……
それは置いといて、とりあえず、配線はずいぶんすっきりしました。
プラプラしてたスイッチも一列にまとまってわかりやすくなっています。
こういうの
http://www2.elecom.co.jp/cable/accessory/spiral-tube/index.asp
で配線をクルクルしてまとめる作業は楽しいです。

それでは。

2013年7月3日水曜日

雨雨雨

こんばんは。

ところで、キャンパスは北九州にあるのですが、今日は観測史上最大の大雨が降ったそうで、リバーウォークが真のリバーになったとか、ならなかったとか。
最近は天気に恵まれず、外での実験もできず捗らないです。

今日はロボットがバックできないという致命的な不具合を抱えてしまっていたので、コントローラをiMCs01に変更しました。
コンピュータにインタフェイス社のPCを使っているため、OSが特別にカスタマイズされたものです。なので提供されているドライバがそのままは使えなかったので少しだけソースコードをホゲホゲして使っています。

結果的にバックもできるようになったのでメデタシメデタシ。
それではまたー。

[追加]Gnuplotを使ったボード線図の作成

前回のGnuplotを使ったボード線図の作成では縦軸、横軸の名前、キャプションが適当でこのままでは提出できません。したがって今回はそのタイトルをTeXで流しこむ方法で綺麗にグラフを仕上げようと思います。レポートをTeXで書いている人にはあまり抵抗なくできるのでおすすめです(GnuplotのためだけにTeXを導入するのは結構大変です...)。しかし前回の作成したスクリプトファイル(.plt)を少し修正するだけです。
set terminal epslatex 10
#set terminal postscript eps enhancedをepslatex に、数字の10はフォントサイズ
#カラーで出力したい場合は一行目を"set terminal epslatex color 10"に変更
#保存名を決める
set output "graph1.eps"
#虚数単位jの定義
j={0.0,1.0}
# 伝達関数を定義(今回は一次遅れ系)
G(s)=k/(T*s+1)
#ゲインの定義
k=0.9
#時定数の定義
T=0.5
G1(x)=G(j*x)
set angles degrees
set format x "10^%01T"
#ここで横軸を対数軸に
set logscale x
set xtics nomirror
set ytics nomirror
#ここからゲイン線図の定義
set multiplot
set xlabel '$\omega_{i}$[rad/s]'
#書きたい名前をTeXの文法で書く
set size 1.0,0.6
set origin 0.0,0.4
set ylabel '$20\mathrm{log}_{10}|G(j\omega)|$[dB]'
#横軸の範囲
set xrange [0.1: 20]
#縦軸の範囲
set yrange [-25:5]
plot  20*log10(abs(G1(x))) title "同定結果",\
"graph1.dat" using 1:2 with points pt 7 title "実験結果"
# 日本語もOK
#.datファイルから実験値の読み込み(1:2の1は周波数データ列、2は実際に得られたゲインのデータ列)
#ここから位相線図の定義
set size 1.0,0.4
set origin 0.0,0.0
set ylabel '$\angle G(j\omega)$[deg]'
set ytics 45
# 縦軸の範囲
set yrange [-120:0]
plot arg(G1(x)) title "同定結果",\
"graph1.dat" using 1:3 with points pt 7 title "実験結果"
#1:3の1は周波数データ列、3は実際に得られた位相のデータ列
unset multiplot
set output
set terminal windows
#Mac,Linux の場合、次のように書き換え set terminal x11

修正を行ったら前回と同じように文字コードはEUCにして保存して、スクリプトを実行してください。すると今回はEPSだけでなくTeXファイルも同時に出力されたと思います。これを更に編集します。と言っても、そのTeXファイルの文頭と文末に以下の文を加えるだけです。

文頭に以下の文
\documentclass[a4paper,10pt]{article}
\usepackage{graphicx}
\pagestyle{empty}
\begin{document}
\begin{figure}

文末に以下の文
\end{figure}
\end{document}

文頭の記述
文末の記述
これで保存してください。そしてコマンドプロンプトで
latexmk figure1.tex
dvips figure1.dvi
ps2epsi figure1.ps figure.eps

これらのコマンドを順に叩くだけです。最終的に"figure.eps"が出力されたと思います。

プロット結果
特にボード線図の縦軸のlogや角度記号はTeXで頑張ったかいあって綺麗に出てます(^O^)/今まではグラフの要素だけ作ってinkscapeで一生懸命、日本語や数式を打っていましたが、この方法だとちょっとだけ楽ができます。

最後に今回、latexmkをあえて使ったのはlatexやplatexなどではtexのコンパイルの時点で

! Missing $ inserted.
<inserted text>
        $
l.118    \gplbacktext

のようなエラーが出てしまいdviファイルが出力出来ませんでした。ボード線図自体のスクリプトも結構無理やりな感じがあるのでそれが何か悪さをしているのかもしれません。しかしlatexmkだとエラーは同様に出てしまいますが、dviファイルはそれでも出力してくれたので、暫定的にそうしています。latexmkはWindowsならW32TeX、MacならMacTeXでTeXの環境を入れた人なら一緒に入ってるような気がします。Windowsに関してはPerlを入れなければコマンドが通りませんでした。Perlの環境はStrawberry Perlで動作を確認しました。
http://strawberryperl.com/





2013年6月29日土曜日

LRFやGPS,電源等のスイッチの取り付け

 今回のハード班の活動内容は各種スイッチの取り付けです.センサからの配線が多く,実験するときに邪魔になっていたので空いているスペースを有効活用しスッキリとまとめました.
 主にLRF(上),LRF(下),GPS,24V電源,ステッピングモータのスイッチを横一列に並べて配置しました.

2013年6月28日金曜日

Gnuplotを使ったボード線図の作成

こんばんは、今回は実験レポートでボード線図を書く必要があり、描き方に苦労したので記事にします。
今回はExcelではなくGnuplotを用いてグラフを作成しEPS出力する方法です。Gnuplotの基本的な使い方はこの記事では省略します、申し訳ありません。

まず最初にGnuplotを使ってコマンドを一気に通すためにスクリプトファイル(.plt)を作成する必要があります。適当なエディタを使ってもらって構いません。ただし最終的に.pltファイルの文字コードがEUCで保存できるエディタを使ってください。
さっそくGnuplotのコマンドを書いていきます。このコマンドに関しては「なみなみメモ様
www6.atwiki.jp/naminami/pages/6.html
を参考にさせて頂きました。 情報ありがとうございます。
以下の例は一次遅れ系での例です。

set terminal postscript eps enhanced
#保存名を決める
set output "graph1.eps" 
#虚数単位jの定義
j={0.0,1.0}
#伝達関数を定義(今回は一次遅れ系)
G(s)=k/(T*s+1)
#ゲインの定義
k=0.9
#時定数の定義
T=0.5
G1(x)=G(j*x)
set angles degrees
set format x "10^%01T"
#ここで横軸を対数軸に
set logscale x
set xtics nomirror
set ytics nomirror
#ここからゲイン線図の定義
set multiplot
set xlabel 'omega [rad/s]'
set size 1.0,0.6
set origin 0.0,0.4
set ylabel 'Gain [dB]'
#横軸の範囲
set xrange [0.1: 20]
#縦軸の範囲
set yrange [-25:5]
plot  20*log10(abs(G1(x))) title "douteikekka",\
"graph1.dat" using 1:2 with points pt 7 title "jikkenti"
#.datファイルから実験値の読み込み(1:2の1は周波数データ列、2は実際に得られたゲインのデータ列)
#ここから位相線図の定義
set size 1.0,0.4
set origin 0.0,0.0
set ylabel 'Phase [deg]'
set ytics 45
#縦軸の範囲
set yrange [-120:0]
plot arg(G1(x)) title "douteikekka",\
"graph1.dat" using 1:3 with points pt 7 title "jikkenti"
#1:3の1は周波数データ列、3は実際に得られた位相のデータ列
unset multiplot
set output
set terminal windows
#Mac,Linux の場合、次のように書き換え set terminal x11

pltファイルの作成
datファイルの作成


以上のソースをテキストエディタで記述し、「graph1.plt」等で保存します。文字コードをEUCにするのを忘れないようにします。

そして実験値をプロットするためのデータ群 .datファイルはExcelなどで実験データの整理をしなければなりません。datファイルはpltファイルと同じディレクトリに保存します(文字コードは「ANSI」または「Shift JIS」推奨)。
図のようにデータをエクセルで整理し、それをコピーしてテキストエディタに貼り付けてから「graph1.dat」等に名前をつけて保存するが簡単です。

ここまでの作業が終わったら、作ったpltファイルをダブルクリックするか、Gnuplotのコマンド
load ”graph1.plt”
を実行して、〜.epsのデータが出力されれば成功です(*´艸`*)
今回例で作った図は凡例が適当ですがお許し下さい。

コマンド

完成!
















OpenCVを使った緯度経度のGoogleMap上へのプロット

この記事には訂正版があります。そちらもご覧ください。

今日は、以前作成した「緯度経度情報からGooglemap上にその地点をプロットする」プログラムについて紹介したいと思います。

1.原則
 GoogleMap はメルカトル図法によって作図された世界地図を基準に作ってあります。 
 詳しくは参考にさせていただいたサイトをご覧ください。
 ★ GoogleMapの原理
   世界は1枚の画像から : グーグルマップのしくみを探る(1) » Gammasoft Inc.
 ★メルカトル図法について
  メルカトル図法 - Wikipedia
 尚、今回はメルカトル図法上y座標に等長緯度を使用しています。

2.やり方
 A.  マップ上に表示したい地点の緯度経度を取得し、それをメルカトル座標に変換する。
 B.  Googleの「Static Maps API  V2」を使用してプロットしてほしい地点付近の地図を
    取得する。
    本当はGoogle Maps API とか使ってオンラインで地図を取得するのがスマートなん
    ですが、移動型ロボットにのせるということと、C言語でプログラムを書きたいなど
       の理由でオフライン作業で行うことにしました。
    今後、ロボットがオンラインになるかもしれないので、何かいい方法があれば
    是非教えてくださいm(_ _)m
 C.  取得した地図の中心緯度経度をメルカトル座標に変換し、メルカトル座標系で
   x,y座標それぞれ地図の中心からの距離を測る。
 D.  Cで求めた距離をピクセル単位に変換してプロットの中心座標を求める。
 E. 最後にOpenCVを使って地図上にプロットしてます。

3.「2.やり方」で参考にしたサイトやリファレンス
 ★Static Maps API V2 
   Static Maps API V2 デベロッパー ガイド
 ★OpenCV 2.2
      OpenCV 2.2 C リファレンス

4.プロットした画像
  黄色(中心点):(33.894048,130.839786)
    赤色:(33.894449,130.840036)
 

今回はこんな感じです。
これを元に移動型ロボットの現在位置をリアルタイムで地図上で表示してくれる
プログラムを作っていきたいと思います。

2013年6月27日木曜日

GPSを使って目標地点に到達する ~テスト走行1~

こんばんは。CIR-KITです。
今日はGPSを使って目標地点に到達するテスト走行をしました。
----
memo:
Hemisphere A100のGPRMCモードの時に帰ってくるTrack made good(巡航角度)は真北を基準(0deg)として右回りに0-360degを返します。
----
ある程度正しい目標角度は出ているのですが、たまに真後ろに向かったり、Uターンするときにうまくいかないなど問題はまだ残ってます。

GPSの固定方法が(笑)

今後はそのあたりを解決していこうと思います。
それではまた。