名称 | MIRS2304 ソフトウェア開発報告書 |
---|---|
番号 | MIRS2304-SOFT-0003 |
版数 | 最終更新日 | 作成 | 承認 | 改訂記事 |
---|---|---|---|---|
A01 | 2024.01.29 | 中野光稀,長岡さゆり,野村洸達 | 初版 | |
A02 | 2024.01.29 | 中野光稀,長岡さゆり,野村洸達 | 香川 |
第2版 「7.総括」を修正 |
本ドキュメントはPETBOTのソフトウェアの開発完了報告書である。
自動運搬機能のプログラムはraspberryPiのrun()関数にまとめられており、pilot()関数から呼び出されている。
ペットボトルが投入された回数が規定回に達するとrun()関数が呼びだされる。
モータを駆動させ、直進走行や回転を実行する。
モータのエンコーダの値をArduinoで読み取り、指定された走行速度とエンコーダの値から機体の進んだ距離、速度を計算した。それをPID制御を用いて制御する。
今回用いたモータは左右のギア比が違うため、左右のギア比のための補正値も追加した。
希望通りの距離を進むことはできた。しかし、止まるときに急停止するため機体が揺れる点、モータ駆動時にモータから出る音がうるさい点が改善点としてあげられる。
これの改善点はゲイン調整を細かくする点である。
また、機体が重たいためモータにかかる重量のためにこの音が出ているとも考えられた。
distance.ino run_ctrl.ino vel_ctrl.ino
指定した距離、速度で目的地まで移動する。
raspberryPiから走行モード、距離、速度を指定する。その値をArduinoへシリアル通信を用いて送る。
今回用いた走行モードはSTP,STR,ROT,LINEの4つである。
「STP」はモータを回転させない状態である。
「STR」は指定された距離、速度で直進する。
「ROT」は指定された角度、速度で回転する。回転角は正の値を送ると右回りで回転する。
「LINE」は2.3節にて説明する。
指定した距離を進むことができた。
基本的に用いた速度は直進で30[cm/s]、回転は60[deg/s]である。
回転の方は1080度回転して3度以下の精度であった。
run.c elve.c posi.c
走行モードで「LINE」が指定されたらライントレースを開始する。
基本的な機体下部に取り付けたフォトリフレクタでラインを読み、ライントレースを行う。
ライントレースの走行はすべてArduinoで行っている。2つのフォトリフレクタの値の差をもとにPID制御を用いてライントレースを行った。
フォトリフレクタは機体の中心部に2つ付けている。この2つの距離は、地面にひいたラインの太さ程度である。
フォトリフレクタの読み取りはArduinoのphoto関数で行っている。
アームで毎回ボタンを押せる位置にライントレースをして行くことができた。
ライントレース中の揺れ、ライントレース開始時の角度にもあまり影響されなかった。
ラインに沿って直進するゲイン調整ができた。
posi.c request.c run_ctrl.ino photo.ino
走行中に目の前に障害物が来たら止まる。
関数としては走行の状態を指定したらavoid()関数に入る。
この関数の中では走行中に常に障害物が目の前にあるかどうかを判断している。障害物がないなら通常通り進み、障害物があるなら今まで進んだ距離を保持して停止する。障害物がない状態が1秒以上あるならば、先ほど保持した値で直進を再開する。
障害物があるかないかは超音波センサを用いて判断している。前方につけた2つの超音波センサを読み取り、どちらかが100cmより下の値を返したら障害物があると認識する。
目の前に障害物が来たら停止することができた。その後、最初に指定した目標距離まで進むことができた。
障害物の読み取りも100cm程度でできたため、動かしている最中に障害物にぶつかることはなかった。
しかし、ゆっくり止まることができなかった。停止するときに少し機体が揺れることがあった。そのため、ここが改善点である。
run.c uss.c
アームを指定した角度で動かす。
raspberryPiでarm()関数を呼びだすときにモード用の数字も一緒に記述する。その数値をシリアル通信を用いてarm用のArduinoへ指令値を送る。
送られてきたモードでarmを動かす。ここで、arm用のArduinoにはモードと、そのモードで動かす角度をあらかじめ記述している。
今回使ったモードは「初期位置」「ボタンを押す」「armを戻す」「社会実装用」の4つである。
社会実装用ではペットボトルを回収しているときに、機体の横についている緑のボタンを押すをarmが動くようにした。
自動運搬中だとエレベータのボタンを押せるように動かすことができた。
社会実装中でarmを動かしてもらうことがあった。合計で60回程度押された。
今後の展望として、ボタンの場所を検知し、そこに合わせて動かせるようになると面白いと思った。
arm.c mg4_arm.ino io.c
投入機能のプログラムはraspberryPiの input() 関数にまとめられており、 pilot() 関数から呼び出される。
ペットボトルが1つ投入されると input() 関数が終了する。投入本数の管理は pilot() 関数で行っている。
投入機能のプログラムでは、ペットボトルとキャップの投入判断、ペットボトルの分別判断、そして投入防止板の制御を行っている。
ペットボトルの投入判断は、カラーセンサが受け取る光の強さを見ることによっておこなった。
カラーセンサは常に強い光を発しているため、物体が近くにあると受け取る光の強さが増加する。これを読み取ることによる投入判断を実装した。
カラーセンサはraspberryPiにi2cで接続されており、Pythonのプログラムを用いて制御を行った。
キャップの投入判断には赤外線LEDとフォトリフレクタを用いた。
Arduinoで値を受け取り、raspberryPiに値を送信して投入を判断した。
基本設計の段階ではペットボトルの投入判断を超音波センサで行う予定だったが、超音波センサをロボットの内部に設置すると干渉してしまうため、カラーセンサで投入を判断することになった。
ペットボトルの投入判断は、発表会や社会実装実験でもおおむね正確に判断できていた。
設計どおりに動作させることができた。
発表会や社会実装実験時には、Arduinoのポートが頻繁に変わってしまうという不具合が起こり、Arduinoとの通信を初期化するプログラムを定期的に実行することによって解決した。
その他に、赤外線センサの光が弱いことでキャップの投入を誤判断してしまうことがあったが、電池に繋いだ赤外線LEDをつけておくことで解決した。
input.c water.c color.py cap_photo.ino
ペットボトルの分別判断はカラーセンサの明るさを見ることでおこなった。
はじめはカラーセンサのRGB値と光を使用して分別を判断していたが、様々なペットボトルや液体で実験を行い、分別の有無によって明るさが大きく変化したためこれを使用した。
ラベルについてはおおむね分別を判断できた。
ただし、稀にペットボトルの形状によって誤判断をしてしまうものがあった。
飲み残しについては、不透明な液体では問題なく分別を判断できた。
飲み残しの判断について、水などの光を通してしまう液体については光の強さや色を使っても判断が難しかった。
分別判断の精度を上げるためには、重量や液体検知など他の判断要素を追加する必要があると感じた。
input.c water.c color.py
投入防止板の制御は、Arduinoからサーボモータを動かすことで行った。
raspberryPiからArduinoに投入防止版を動かす司令を送り、Arduinoでサーボモータを動かすことで機能を実現した。
発表会では、Arduinoのポートが頻繁に変わってしまうという不具合が起こり、Arduinoとの通信を初期化するプログラムを定期的に実行することによって解決した。
上記以外の原因での不具合はなく、正常に動作した。
input.c pass.c servo.ino
状態に合わせてLEDを点灯・点滅させ、スピーカーから音声を流す。
スピーカーについてはraspberryPiから、LEDについてはArduinoから制御を行った。
状態に合わせてLEDを点灯・点滅させ、状況にあわせスピーカーから様々な音声を流すことができた。
status.c led.c speak.c led.ino
ソフトウェア詳細設計書、単体試験報告書へのリンクを下に示す。
ソフトウェア詳細設計書PETBOTのソースコードを以下に示す。
PETBOTソースコード
モータ駆動の部分はもう少し詰められると感じた。止まるときにだんだん速度を遅くするプログラムを途中まで使っていたが、原因不明のバグのせいで使えなくなってしまったのが残念である。
しかし、エレベータのボタンはスムーズに押せたため良いプログラムを作れたと思う。
投入部についてはキャップ検知の部分で誤作動があった。しかし、ペットボトルの投入判断については、ほとんど誤動作がなかったため評価できる。
分別判断については透明な液体やラベルが投入されたときに誤動作が目立った。
社会実装実化を経て、カラーセンサーの増設や重量センサの使用が改善案として挙げられた。
全体においては想定通りの動きができたため評価できる。
稼働実績の表を表1に示す。
表1.稼働実績
この表から分かることを以下に示す。ここで、空白部は回収をしなかった時間帯である。
この結果を元に考察する。
朝は回収が1本もされなかったのは、朝は飲み干したペットボトルがないと考えられる。しかし1,2限と3,4限の間には回収されていた。
また、木曜日のデータを見ると放課後も回収されている。これはその日に飲み終わったペットボトルを回収したと考えられる。そのため毎日回収するなら朝に設置し、放課後回収するのがよいと思う。
しかし、量がたまったら自動的に中身を捨てるシステムなため、夜も常設しているのも面白いと思った。
平均して1日に16.2本回収された。放課後までおいてない日は回収量が少ないが、この3日も多くても1日20本程度と考えられる。PETBOTの内容量は27本程度が限界なため1日に1回、放課後に中身を捨てれば人のいない時間に移動することができると考えられる。
また追加の考察として以下の2点があげられる。
稼働中にraspberryPiのバッテリー交換は行わなかった。放課後から次の日にかけてバッテリーを充電していた。そのため、バッテリー残量は1日持ったため回収を行わない時間帯に充電ができればバッテリーは足りる。
駆動用バッテリーは自動運搬にしか使わなかった。
起動は1分もあれば終わったため、気になるほど遅いということもなかった。