名称 MIRS2302 ソフトウェア開発報告書
番号 MIRS2302-SOFT-0002

版数 最終更新日 作成 承認 改訂記事
A01 2024.02.16 山本 凜久, 眞辺 開, 池ヶ谷 海 初版
A02 2024.02.16 山本 凜久, 眞辺 開, 池ヶ谷 海 香川 図表番号の修正

目次

  1. ドキュメント概要
  2. LiDARによる自律走行
  3. Webアプリ
  4. セキュリティ
  5. モジュール周辺の制御
  6. マイコン間のシリアル通信
  7. 各ドキュメントへのリンク
  8. ソースコード
  9. 総括



1. ドキュメント概要

本ドキュメントはMIRS2302のソフトウェア開発報告書である。


2. LiDARによる自律走行

ROS・navigation stackによる自律走行について、解説およびTENQにおける実装例を報告書にまとめた。

詳細はMIRS2302-REPT-0007を参照。

ここでは、最終的なノード構成図を示す。

fig1. ノード構成図


3. Webアプリ

3-1. フロントエンド

- 概要 -

raspiでapacheを用いてWebサーバを作成し、Webアプリをローカルネットワーク内に公開した。
実際のWebアプリ画面を以下に示す。ユーザは画面上部のナビゲーションメニューから用途を選択し、formを送信することで手配を行う。

fig2. Webアプリケーション画面

また、機体の最上部に設置されているiPadのWebアプリ画面についても以下に例を示す。
ロボットの状態毎に画面が遷移し、ユーザ向けの情報を表示する。

fig3. iPad - Webアプリケーション画面(集荷待ち状態)

- 評価 -

ユーザのことを考えて見やすく、直感的に操作できるようなUIにできた。


3-2. バックエンド

- 概要 -

[1] オーダー情報について

オーダー情報はcsvファイルを用いて管理するようにした。また、手配formの情報をcsvファイルに書き込むと同時にオーダーIDを発行するようにした。

[2] 手配formの選択肢制限について

手配が重複しないように、jsでサーバ側にオーダー情報を問い合わせ、"集荷/受取時間", "ユーザが使用するボックス"の選択肢を制限するようにした。

[3] メールについて

ユーザが使用(また管理者が管理)しやすいように、メールを送信するようにした。
以下にメールの種類を示す。

ユーザ向け

管理者向け

- 評価 -

[1] オーダー情報について

バグが発生したが社会実装中に修正し、オーダー情報の書き込み, 読み込み共に正常に動作した。

[2] 手配formの選択肢制限について

バグが発生したが社会実装中に修正し、自動で選択肢の制限を行うことができた。

[3] メールについて

form情報の送信中にユーザが送信ボタンを連打するとオーダー受付メールが複数送られてしまうことがあったため、メール送信のタイミングを変更することでより改良できそうだと感じた。
それ以外のメールについては正常に動作した。


4. セキュリティ

"荷物を届ける"という動作をロボットがよりセキュアに行うために、以下の機能を実装した。

4-1. PINコード認証

- 概要 -

集荷/受取の際にPINコードを用いて本人確認を行うようにした。

- 評価 -

不具合なくPINコードの照合ができた。

4-2. モジュール取り外し検知

- 概要 -

モジュール取り外しを検知する。
コネクタに接続されていない場合に識別用アナログピンをGNDに落とすことで接続時との区別を行なった。

- 評価 -

不具合なくモジュールの取り外しを検知できた。

4-3. 扉こじ開け検知

- 概要 -

扉のこじ開けを検知する。
マイクロスイッチを用いて扉の開閉状態を監視し、サーボモータを使用して解錠した場合以外に扉が開くと、こじ開けられたと判定される。

- 評価 -

不具合なく扉のこじ開けを検知できた。

4-4. 管理者へのメール送信

- 概要 -

機体の異常を検知した際に、管理者へメールを送信する。

- 評価 -

不具合なく管理者にメール送信を行うことができた。


5. モジュール周辺の制御

5-1. モジュール識別

- 概要 -

各モジュールの基盤に固有の抵抗値の抵抗素子を配置し、その抵抗値をarduinoで読み取ることでモジュールの識別を行なった。

- 評価 -

読み取ったモジュールの抵抗値が不安定な場合があったが、正確にモジュールを識別できた。

5-2. 自動解錠機能

- 概要 -

ユーザが集荷/受取を行う際、本人確認後に自動でraspiでpwm信号を出力し扉を解錠するようにした。

- 評価 -

不具合なく該当の扉を解錠することができた。

5-3. 保冷保温機能

- 概要 -

サーミスタを用いてモジュール内の温度を測定し、目標温度に近づくようにペルチェ素子の2値制御をarduinoで行なった。

- 評価 -

ペルチェ素子の熱効果が小さく、目標温度に達することはできなかったが、ペルチェ素子の制御自体は正常に動作した。


6. マイコン間のシリアル通信

MIRS2302では3つのマイコンを使用している。それぞれのマイコン間で行っているシリアル通信の詳細を以下に示す。
シリアル通信ではヘッダを255,フッタを254とし,データごとにモードを指定することで複数種類のデータのやり取りを行っている。

6-1. raspi→arduino

raspiからarduinoへのシリアル通信の項目をtableに示す。

table1. raspi→arduinoのシリアル通信項目

モード データ内容 受信後のarduinoの動作
1 右のタイヤの設定したい速度 指定された値に右のタイヤの速度を変更
2 左のタイヤの設定したい速度 指定された値に左のタイヤの速度を変更
3 モジュール抵抗値の問い合わせ 接続されているモジュールの抵抗値を返信
4 パラメータ問い合わせ 現在のパラメータを返信
5 バッテリ電圧問い合わせ バッテリ電圧を返信
6 odom用データの要求 : エンコーダ値,微分された値,速度を指定して要求可能 要求されたデータを返信
7 回転動作の指示 : 角度,速度を指定可能 指定された角度,速度で回転する
8 ゲイン変更 : 変更するゲインと変更後の値を指定 指定された値にゲインを変更
9 パラメータ変更 : 変更するパラメータと新しい値を指定 指定された値にパラメータを変更
10 ロック解錠 : ロック機構のサーボモータの回転方向を指定 ロック機構のサーボを指定された回転方向で制御

6-2. arduino→raspi

arduinoからraspiへのシリアル通信の項目をtableに示す。

table2. arduino→raspiのシリアル通信項目

モード データ内容 受信後のraspiの動作
11 バッテリ電圧値 -
12 現在接続されているモジュールの抵抗値 抵抗値からモジュールの種類を判別
13 現在設定されている走行制御のPIDパラメータ -
14 現在設定されているスピード値 -
15 odom用データ -

6-3. raspi→jetson

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)

6-4. jetson→raspi

jetsonからraspberry piに対する通信は、次の2種類のため行った。

・rosによる速度指令値をarduinoに転送する

・navigation stackのステータス(走行中・到着など)を取得する

それぞれ別のソケットを用意し、メインプログラムの実行中は常に並列させて実行した。


7. 各ドキュメントへのリンク

MIRS2302ソフトウェアの詳細設計書・単体試験報告書へのリンクを以下に示す。

MIRS2302 ソフトウェア詳細設計報告書
MIRS2302 ソフトウェア単体試験報告書

8. ソースコード

MIRS2302のソースコードのgithubリポジトリを以下に示す。

MIRS2302 ソースコード(githubリポジトリ)

9. 総括

LiDARを用いた自律走行については、自己位置推定がズレることが多々あったが、それ以外は理想通りに動作したように思う。
webアプリについては、UIを更に見やすくするためにpc用, モバイル用に分けて作成することができたのではないかと思う。
セキュリティ, モジュール周辺の制御については、ソフトウェアの面では上手く動作したように思う。

全体を通して設計・開発の予定から変更した箇所は多くあったが、やりたかったことの大半をこなせたように思うので良かった。




MIRS2302ドキュメント管理台帳へ