Ameba Ownd

アプリで簡単、無料ホームページ作成

Project17 めざせ宇宙開発 - 自律移動ロボット飛行プロジェクト

Aグループ プログラム系

2020.11.11 09:11

ACSの動作、プログラムについて説明します。



動作フロー


プログラム詳細

スケッチ(Arduino) はこちらからダウンロードできます。


ヘッダファイル (.h)

ACS.h:主要となる関数をまとめたもの

STRUCT.h:主要となる構造体をまとめたもの


構造体 (STRUCT.h参照)

GPSData {double lat, double lon, double alt, double mps}

 GPSから得られるデータを表す構造体

 lat…緯度,long…経度,alt…高度,mps…速度

Way {double distance, double direct}

 位置情報を表す構造体

 distance…距離,direct…方向


関数 (ACS.h参照)

Way CalcWay (GPSData nowdata, GPSData targetdata)

 現在位置と目的地の情報から、目的地の距離と方向を計算する

bool Escape (GPSData nowdata)

 GPSから得られた現在の高度・速度の情報を用いて、パラシュートから脱出する

bool _Escape ()

 Escape()が動作しなかった場合、XBee_switchから信号を得て強制脱出をする

void GetDirection ()

 現在の機体の方向を取得する

void _SENSOR ()

 センサの初期設定

void ToPoint (Way way, double direct)

 道のりの情報(way)と機体の向きの情報を用いて、目的地に向かう

void GetGPS ()

 現在のGPS情報(緯度,経度,高度,速度)を取得する

void XBee ()

 受信した緯度,経度,高度,速度,方向,switch_count*を、PC側コンソールに表示する

 *int型 XBee_switch() が起動した回数

bool XBee_switch ()

 PC側XBeeから1文字送信する (他関数の強制起動用)

void ROM (String data)

 EEPROMにdata文字列を書き込む(読み込む)

void MOTOR (double l, double r)

 モータドライバを制御する(PWM制御)

void Draw()

 お絵描きをする関数 (簡単なハート形を描く)


使用したライブラリ

TinyGPS++.h

 GPSのデータをエンコード関数を用いてエンコードすることで扱いやすい形に変換できる

SoftwareSerial.h

 シリアル通信ライブラリ

Wire.h

 I2C通信ライブラリ

EEPROM.h

 EEPROMに書き込む際に用いる

math.h

 数学で用いる関数などを使用することができる

string.h

 文字列操作ができる

stdlib.h

 汎用的な関数を使用できる



実験結果からの変更点

実験結果と、それに基づいて変更したプログラムについて説明します。


実験結果

setup関数の内部でSerial.print(),XBee_switch()を用いて、XBeeを用いてPCコンソール上に動作確認のメッセージを表示させた際、文字化けが起こりました。XBeeを介さず、Nanoを直接繋いでシリアル通信を行い、シリアルポートに表示させた結果も、同様に文字化けしていたので、シリアル通信に問題があったと考えています(Serial.flush()などを用いたけれど文字化けした)。

そのため、実験当日は統合プログラム(ACS.ino)を走らせることはできず、部品ごとに別々に作っていたモータドライバ動作確認用プログラムを用いて、簡易的に走行させました(単に走行させるだけのプログラム)。動作確認用プログラムでもXBee_switch()などを用いていましたが、こちらは問題なく動きました。


変更点

実験後、再度簡易的な実験を行いました(機体の走行実験のみ)。その際に用いたプログラムについて説明します。

まず、Escape系の関数・EEPROM関数・Draw関数は使用しませんでした。単純に、目的地に向かって走行するプログラムとなります。シリアル通信の問題があったため、XBee_switch関数はできるだけ使わず、XBeeで取得する情報を、緯度・経度・向き・val(変数、動作確認用)に絞ってコンソールに表示させました。XBee_switchを使わないため、動作の移行は時間で行うように設定しました。また、Bグループの実験を踏まえて、ゴールから半径5m以内に入ったら停止というプログラムに変更しました。

結果、向きdirectが一定の値を示し、機体は同じ方向にぐるぐると旋回しながらゴールに向かおうとしました。その後、目的地への走行は諦め、プログラムが停止するかを確認するため、機体をゴールから半径5m付近のところに持って行ったところ、ほぼ誤差なく5mに入った時点で停止しました。

後日、怪しい挙動をした9軸センサの動作を調べたところ、加速度のみほぼ0に近い値を示し、ほぼ動作していませんでした。そのため、プログラムの欠陥というわけではなさそうです。代わりに、磁器センサはしっかり動作していたことが確認できたため、今後、磁器センサを用いて方向を取得するプログラムを走行プログラムに組み込んで、再度実験してみようと思います。しかし、時間の都合上、その内容をブログに記載することはかなわないので、以上でプログラムの説明を終わりとさせていただきます。