名称 | MIRS2302 ソフトウェア詳細設計書 |
---|---|
番号 | MIRS2302-SOFT-0002 |
版数 | 最終更新日 | 作成 | 承認 | 改訂記事 |
---|---|---|---|---|
B01 | 2024.02.16 | 山本 凜久, 眞辺 開 | 初版 | |
B02 | 2024.02.16 | 山本 凜久, 眞辺 開 | 香川 | 図表番号の修正 |
本ドキュメントはMIRS2302に関するソフトウェア詳細設計についてまとめたものである。
実装する機能とその概要を以下table1に示す。
table1.機能と概要
機能 | 機能概要 | 記述言語 |
---|---|---|
自律走行機能 | ROSのnavigation stackを用いて自己位置推定・経路設定・速度制御を行う | ROS melodic, python, C, C++ |
Webアプリケーション |
フロントエンド
ユーザが 各自のスマホ / iPad のformにて 手配(送る・受け取る・注文する) / PINコードの入力 を行うiPadで ロボットの状態 / ユーザ向けの情報 を表示する バックエンド
オーダー情報を管理するオーダーが重複しないように手配formの選択肢を制限する ユーザにロボットの状態に応じたメールを送信する |
html, JavaScript, css, php, python |
セキュリティ機能 |
PINコードで本人確認を行う モジュールの取り外しを検知する 扉のこじ開けを検知する 異常が検知された際に管理者にメールを送信する |
python, arduino言語 |
モジュール管理機能 |
接続されているモジュールの識別を行う 指定の扉を自動で解錠する 保冷・保温モジュール内の温度調整を行う |
python, arduino言語 |
以下にarduino内のモジュール構成図と動作概要を示す。
fig1. arduino - モジュール構成図
table2. arduino - モジュール動作概要
モジュール名 | 動作概要 |
---|---|
main.ino | setup関数およびloop関数の定義 |
serial.ino | Arduino-Raspi間の情報交換をシリアル通信で行う |
run_ctrl.ino |
モータのエンコーダ値を読み取る モータにかける電圧を制御する |
module_mng.ino |
モジュールに付いている抵抗両端の電圧を読み取る サーボモータをPWMで制御する サーミスタからモジュール内部の温度を取得する 取得した温度をもとにペルチェ素子にかける電圧を制御する |
param.h | ゲインやパラメータ、入出力ピンなどの定義 |
以下にraspberry pi内のモジュール構成図と動作概要を示す。
fig2. raspberry pi - モジュール構成図
table3. raspberry pi - モジュール動作概要(メイン駆動部)
モジュール名 | 動作概要 |
---|---|
main.py | メイン制御モジュール |
serial_com.py | raspi-arduino間の情報交換をシリアル通信で行う |
run_ctrl.ino |
モータのエンコーダ値を読み取る モータにかける電圧を制御する |
ros_to_arduino.py | rosのデータをシリアル通信でarduinoに送信する |
raspi_to_ros.py | raspiのデータをソケット通信でrosに送信する |
run_ctrl.py | arduinoにモータ動作に関する指令値を送信する |
order_mng.py | オーダー情報の書き込み、読み込みを行う |
module_mng.py |
arduinoから受け取った情報をもとにモジュールを識別する 搭載モジュール情報を更新し続ける 指定の扉を解錠する モジュールの取り外しを検知する 扉のこじ開けを検知する |
sock.py | ソケット通信を行う |
web_app.py | ユーザ・管理者へメールを送信する |
config.py | IPやパラメータが定義されている |
robot_state_publisher.py | ロボットのステータスを更新する |
table4. raspberry pi - モジュール動作概要(webアプリバックエンド)
モジュール名 | 動作概要 |
---|---|
authentication.py | PINコードの照合を行う |
confirm.py | PINコードで認証を行う |
select_option_api.py | オーダー情報をもとに手配formの選択肢を制限する |
get_timetable.py | 予約状況のタイムテーブルを取得する |
実装にあたり必要な情報をMIRS2302-REPT-0007-MIRS機体におけるROSを用いた自律走行より抜粋した。
navigation stackにおいて用いるトピックのうち、主要なものを次に示す。
table5. navigation stackの主要トピック
トピック名 | 内容 | メッセージ肩 |
---|---|---|
/odom | エンコーダの値を積分したりsinしたりcosしたりして、求められたロボットの位置情報 並進/回転方向の位置/速度を含む | nav_msgs/Odometry |
/cmd_vel | ロボット速度の指令値 並進方向と回転方向を含む | geometry_msgs/Twist |
/scan | LiDARの測距データ | sensor_msgs/LaserScan |
/map | ROS用のマップデータ(8bitグレースケール)を画像として配信 | nav_msgs/OccupancyGrid |
/move_base_simple/goal | 自動走行の目的地 位置と方向を含む | geometry_msgs/PoseStamped |
/move_base/status | 自動走行のステータス(走行中/完了/失敗など) | actionlib_msgs/GoalStatus |
実装すべきノードを、処理の順番にしたがって示す。
Subscribe : なし
Publish : /odomトピック
ロボットのタイヤの偏角(エンコーダ値)を取得して、ロボットの座標へと変換する。
基本的にはArduinoとのシリアル通信でエンコーダ値を取得するが、TENQにおいてはエンコーダ信号をGPIOに入力し、C言語でこれを計算する。
Subscribe : なし
Publish : /scanトピック
LiDARの測距データを配信する。基本的には、LiDARのメーカや有志によりROS用パッケージが配布されているため、それを使用する。
TENQで使用するRPLiDAR用ノードは、次のgithubリポジトリからcloneする。
https://github.com/Slamtec/rplidar_ros
Subscribe : /odom /map /scan トピック
Publish : map座標系からodom座標系へのtf
odomトピックによる自己位置には、外乱やスリップによる誤差が生じる。また、この誤差は走行を続けるに連れて誇大化していく。
これを修正するため、LiDARの測距データとマップとを照らし合わせて、より正確な自己位置を推測し、提供するのがAMCLである。
Subscribe : 位置情報に関する諸々
Publish : /cmd_velトピック
AMCLによって提供された現在位置から、目的地までのルートを決定する。また、障害物がある場合にはこれを避けるルートを提供する。
ルートに基づきロボットの速度を決定し、これをpublishする。
Subscribe : /cmd_velトピック
Publish : なし
cmd_velトピックは、ロボットの並進方向速度および回転方向速度を司令する。
これを左右モータの速度に変換し、信号をArduinoないしモータドライバに送信する。
基本的には、(1)で行った変換の逆を行えばよい。
以下にwebアプリに関するモジュール構成図と動作概要を示す。
fig4. webアプリ - モジュール構成図(全体)
fig5. webアプリ - モジュール構成図(main/)
fig6. webアプリ - モジュール構成図(about/)
fig7. webアプリ - モジュール構成図(send/)
fig8. webアプリ - モジュール構成図(receive/)
fig9. webアプリ - モジュール構成図(order/)
fig10. webアプリ - モジュール構成図(table/)
fig11. webアプリ - モジュール構成図(ipad/)
table6. webアプリ - モジュール動作概要(ディレクトリごと)
ディレクトリ名 | 動作概要 |
---|---|
main/ |
各種メニューに遷移するボタンを配置したトップページ ページ読み込み時に営業情報を問い合わせ、営業時間外もしくは予約がいっぱいの場合は専用ページに飛ばす |
about/ |
案内用ページ TENQについての説明、利用方法、問い合わせformなどのリンクを記載する |
send/ | 「荷物を送る」手配をするための入力フォーム |
send/accept/ | 「荷物を送る」手配の承認用ページ |
receive/ | 「荷物を受け取る」手配をするための入力フォーム |
receive/accept/ | 「荷物を受け取る」手配の承認用ページ |
order/ | 「商品を注文する」手配をするための入力フォーム |
order/accept/ | 「商品を注文する」手配の承認用ページ |
table/ | 予約状況のタイムテーブルを作成する |
ipad/ |
本体上部に設置されているipadの専用ページ ロボットの現在の状態を取得して表示、またユーザが本人確認を行うページを表示する |
全体のフローチャートを以下に示す。
fig12.全体のフローチャート
モジュール認識のフローチャートを以下に示す。
fig13.モジュール認識のフローチャート
配達手配の成立条件のフローチャートを以下に示す。
fig14.配達手配の成立条件のフローチャート
走行のフローチャートを以下に示す。
fig15.走行のフローチャート
集荷のフローチャートを以下に示す。
fig16.集荷のフローチャート
購入を予定している物品を以下に示す。
table7.購入物品
物品名 | 型番 | 単価(税込) | 数量 | 価格(税込) | 備考 |
---|---|---|---|---|---|
2D LiDAR | RPLiDAR S2M1 | 1 |
MIRS2302の別パートの詳細設計書へのリンクを以下に示す。
MIRS2302 メカニクス詳細設計書