NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

Arduino IDE(atan2関数の使い方)

atan2関数

 atan2関数はXY平面における二点間のベクトル(X,Y)が分かれば、そこからベクトルの角度(ラジアン)を割り出すことが出来る関数です。
 使用例としてGPS等で現在地と目的地の座標(緯度・経度)が分かれば、atan2関数で目的地の方角を計算する事が出来ます。
 
ラジアンとは?
「円の半径に等しい長さの弧の中心に対する角度」と定義されています。
 参考に円をラジアン単位で区切ると図1左円グラフの様になり、ラジアンに円周率パイ(以下π)を掛けた単位で区切ると図1右円グラフの様になります。
 ラジアンと度の関係を表したものを表1に示します。

 

図1:ラジアンによる円周上の角度(単位:rad)
 
表1:ラジアンと度
ラジアン(rad) 度(°)
0 0
1 57.296・・・
n 180
2n 360
※π=3.14159…
 
 三角関数正接tan(タンジェント)はπ(90°)で無限になってしまうので使いにくいのですが、逆正接atan2(アークタンジェント2)はベクトルの角度(θ)を返すため使いやすいです。
 Arduino IDEで使用するatan2関数の使い方は以下の通りです。
 試しにこのプログラムをArduino UNOで実行すると、図2の様にシリアルモニタ上に「Direction = -135.00 : Distance = 1.00」と出力されます。
#define PI 3.141592653589793
void setup() {
  Serial.begin(9600); //9600bpsでシリアルポートを開く
}

void loop() {                                                      //{}内を無限ループで実行する
  float YA = 0, YB = -0.7071; //点A・BのY座標を宣言(-0.7071)
  float XA = 0, XB = -0.7071; //点A・BのX座標を宣言
  Serial.print("Direction = ");                               //目的地Aの方角(°)
  Serial.print(atan2((YB - YA), (XB - XA)) * 180.0 / PI);
  Serial.print(" : Distance = ");                             //目的地A迄の距離(m)
  Serial.println(sqrt(pow(XB - XA, 2) + pow(YB - YA, 2)), 2);
  delay(1000);                                                    //1000ms(1秒)待ちます
}
イメージ 1
図1:プログラム例

 

atan2 (double y,double x)パラメータ
double y:図3を例にベクトルのY成分(YB-YA)を入力
double x図3を例にベクトルのX成分(XB-XA)を入力

イメージ 1
図2:シリアルモニタ出力結果
 
 図3に三角関数の基礎と応用を示します。
 また図3より、円周上の8方向B点を置いた時、それぞれatan2関数によって得られる戻り値は表2の通りです。

イメージ 2

三角関数の基礎
 sinθ = Y/r、θ = Asin(Y/r)
 cosθ = X/r、θ = Acos(X/r)
 tanθ = Y/X、θ = Atan(Y/X)
atan2関数で方位を計算!
 目的地(A)の緯度(YA)・経度(XA)が既知で、かつ現在地(B)の緯度(YB)・経度(XB)がGPS等で分かっている場合、以下の式で目的地の方角(θ)と距離(r)を算出する事が出来ます。
 前提: X = XB-XA、Y = YB-YA
 目的地迄の距離: r=(X^2+Y^2)^0.5
 目的地の方角 : θ = atan2(Y,X) 
 
図3:三角関数の基礎と応用
 
表2:atan2関数のパラメータと戻り値
y x Θ(°)
-0.7071 -0.7071 -135
-1 0 90
-0.7071 -0.7071 -45
0 1 0
-0.7071 -0.7071 -45
1 0 90
-0.7071 -0.7071 -135
0 -1 180
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【ArduinoIDE reference】目次に戻る