名称 | MIRS2302 ソフトウェア開発報告書 |
---|---|
番号 | MIRS2302-SOFT-0002 |
版数 | 最終更新日 | 作成 | 承認 | 改訂記事 |
---|---|---|---|---|
A01 | 2024.02.16 | 山本 凜久, 眞辺 開, 池ヶ谷 海 | 初版 | |
A02 | 2024.02.16 | 山本 凜久, 眞辺 開, 池ヶ谷 海 | 香川 | 図表番号の修正 |
本ドキュメントはMIRS2302のソフトウェア開発報告書である。
ROS・navigation stackによる自律走行について、解説およびTENQにおける実装例を報告書にまとめた。
詳細はMIRS2302-REPT-0007を参照。
ここでは、最終的なノード構成図を示す。
fig1. ノード構成図
raspiでapacheを用いてWebサーバを作成し、Webアプリをローカルネットワーク内に公開した。
実際のWebアプリ画面を以下に示す。ユーザは画面上部のナビゲーションメニューから用途を選択し、formを送信することで手配を行う。
fig2. Webアプリケーション画面
また、機体の最上部に設置されているiPadのWebアプリ画面についても以下に例を示す。
ロボットの状態毎に画面が遷移し、ユーザ向けの情報を表示する。
fig3. iPad - Webアプリケーション画面(集荷待ち状態)
ユーザのことを考えて見やすく、直感的に操作できるようなUIにできた。
オーダー情報はcsvファイルを用いて管理するようにした。また、手配formの情報をcsvファイルに書き込むと同時にオーダーIDを発行するようにした。
手配が重複しないように、jsでサーバ側にオーダー情報を問い合わせ、"集荷/受取時間", "ユーザが使用するボックス"の選択肢を制限するようにした。
ユーザが使用(また管理者が管理)しやすいように、メールを送信するようにした。
以下にメールの種類を示す。
ユーザ向け
管理者向け
バグが発生したが社会実装中に修正し、オーダー情報の書き込み, 読み込み共に正常に動作した。
バグが発生したが社会実装中に修正し、自動で選択肢の制限を行うことができた。
form情報の送信中にユーザが送信ボタンを連打するとオーダー受付メールが複数送られてしまうことがあったため、メール送信のタイミングを変更することでより改良できそうだと感じた。
それ以外のメールについては正常に動作した。
"荷物を届ける"という動作をロボットがよりセキュアに行うために、以下の機能を実装した。
集荷/受取の際にPINコードを用いて本人確認を行うようにした。
不具合なくPINコードの照合ができた。
モジュール取り外しを検知する。
コネクタに接続されていない場合に識別用アナログピンをGNDに落とすことで接続時との区別を行なった。
不具合なくモジュールの取り外しを検知できた。
扉のこじ開けを検知する。
マイクロスイッチを用いて扉の開閉状態を監視し、サーボモータを使用して解錠した場合以外に扉が開くと、こじ開けられたと判定される。
不具合なく扉のこじ開けを検知できた。
機体の異常を検知した際に、管理者へメールを送信する。
不具合なく管理者にメール送信を行うことができた。
各モジュールの基盤に固有の抵抗値の抵抗素子を配置し、その抵抗値をarduinoで読み取ることでモジュールの識別を行なった。
読み取ったモジュールの抵抗値が不安定な場合があったが、正確にモジュールを識別できた。
ユーザが集荷/受取を行う際、本人確認後に自動でraspiでpwm信号を出力し扉を解錠するようにした。
不具合なく該当の扉を解錠することができた。
サーミスタを用いてモジュール内の温度を測定し、目標温度に近づくようにペルチェ素子の2値制御をarduinoで行なった。
ペルチェ素子の熱効果が小さく、目標温度に達することはできなかったが、ペルチェ素子の制御自体は正常に動作した。
MIRS2302では3つのマイコンを使用している。それぞれのマイコン間で行っているシリアル通信の詳細を以下に示す。
シリアル通信ではヘッダを255,フッタを254とし,データごとにモードを指定することで複数種類のデータのやり取りを行っている。
raspiからarduinoへのシリアル通信の項目をtableに示す。
table1. raspi→arduinoのシリアル通信項目
モード | データ内容 | 受信後のarduinoの動作 |
---|---|---|
1 | 右のタイヤの設定したい速度 | 指定された値に右のタイヤの速度を変更 |
2 | 左のタイヤの設定したい速度 | 指定された値に左のタイヤの速度を変更 |
3 | モジュール抵抗値の問い合わせ | 接続されているモジュールの抵抗値を返信 |
4 | パラメータ問い合わせ | 現在のパラメータを返信 |
5 | バッテリ電圧問い合わせ | バッテリ電圧を返信 |
6 | odom用データの要求 : エンコーダ値,微分された値,速度を指定して要求可能 | 要求されたデータを返信 |
7 | 回転動作の指示 : 角度,速度を指定可能 | 指定された角度,速度で回転する |
8 | ゲイン変更 : 変更するゲインと変更後の値を指定 | 指定された値にゲインを変更 |
9 | パラメータ変更 : 変更するパラメータと新しい値を指定 | 指定された値にパラメータを変更 |
10 | ロック解錠 : ロック機構のサーボモータの回転方向を指定 | ロック機構のサーボを指定された回転方向で制御 |
arduinoからraspiへのシリアル通信の項目をtableに示す。
table2. arduino→raspiのシリアル通信項目
モード | データ内容 | 受信後のraspiの動作 |
---|---|---|
11 | バッテリ電圧値 | - |
12 | 現在接続されているモジュールの抵抗値 | 抵抗値からモジュールの種類を判別 |
13 | 現在設定されている走行制御のPIDパラメータ | - |
14 | 現在設定されているスピード値 | - |
15 | odom用データ | - |
raspberry piからjetsonに対する通信は、navigation stackの目的地設定のために行った。
各スポットにインデックスを割り振り、これをソケット通信で送信し、jetson側で座標に変換した。
table3. raspi→jetsonのシリアル通信項目
インデックス | 場所 | 座標(x,y)[m] |
---|---|---|
0 | ラボ前 | (1.0, 0.0) |
1 | 印刷コーナー前 | (20.32, -8.66) |
2 | 学生課前 | (17.08, -50.46) |
3 | E科棟前 | (-14.48, -50.62) |
4 | S科棟前 | (-50.97, -52.20) |
5 | C科棟前 | (-83.7, -52.53) |
jetsonからraspberry piに対する通信は、次の2種類のため行った。
・rosによる速度指令値をarduinoに転送する
・navigation stackのステータス(走行中・到着など)を取得する
それぞれ別のソケットを用意し、メインプログラムの実行中は常に並列させて実行した。
MIRS2302ソフトウェアの詳細設計書・単体試験報告書へのリンクを以下に示す。
MIRS2302 ソフトウェア詳細設計報告書 MIRS2302 ソフトウェア単体試験報告書MIRS2302のソースコードのgithubリポジトリを以下に示す。
MIRS2302 ソースコード(githubリポジトリ)
LiDARを用いた自律走行については、自己位置推定がズレることが多々あったが、それ以外は理想通りに動作したように思う。
webアプリについては、UIを更に見やすくするためにpc用, モバイル用に分けて作成することができたのではないかと思う。
セキュリティ, モジュール周辺の制御については、ソフトウェアの面では上手く動作したように思う。
全体を通して設計・開発の予定から変更した箇所は多くあったが、やりたかったことの大半をこなせたように思うので良かった。